那不是问题。这是预期的行为。您只是误解了基本Servlet
API的工作方式。您已经配置了JSF标准
FacesServlet来侦听URL匹配,
/faces/*并且已经配置了Apache
MyFaces专门
MyFacesServlet侦听URls匹配
*.jsf和
*.faces。
要运行JSF,您必须在浏览器中通过与的映射相匹配的URL打开页面
FacesServlet。鉴于您已经有了一个
index.jsp文件,并且上下文路径为
Graph并且已经在三种不同的URL模式上配置了两个JSF
servlet,您可以通过以下URL打开JSP:
- http:// localhost:8080 / Graph / faces / index.jsp(调用
FacesServlet
) - http:// localhost:8080 / Graph / index.jsf(调用
MyFacesServlet
) - http:// localhost:8080 / Graph / index.faces(调用
MyFacesServlet
)
也就是说,您的配置不必要地过于复杂。删除该
MyFacesServlet条目及其所有关联的URL映射(servlet名称为
faces)。只需遵循标准
FacesServlet并使用其映射即可,或更改它。我个人建议使用
*.jsf。
<servlet> <servlet-name>facesServlet</servlet-name> <servlet-class>javax.faces.webapp.FacesServlet</servlet-class> <load-on-startup>1</load-on-startup></servlet><servlet-mapping> <servlet-name>facesServlet</servlet-name> <url-pattern>*.jsf</url-pattern></servlet-mapping>
然后,您可以通过http:// localhost:8080 / Graph /
index.jsf打开页面。
与具体问题无关,您
welcome-file将无法那样工作。Tomcat会给出一个HTTP
404错误(找不到页面/资源)。您需要指定
index.jsf为,
welcome-file并在与相同的文件夹中提供一个具体但 空的
index.jsf文件
index.jsp。这样,Tomcat将通过仅调用http:// localhost:8080 /
Graph来欺骗文件存在并显示页面。
如果您担心是否可以通过
*.jsp扩展名打开JSF页面而导致扩展名,
RuntimeException: FacesContext notfound并且实际上没有一个JSP文件可以作为纯香草提供,那么可以通过以下安全约束来限制对JSP文件的直接访问在
web.xml:
<security-constraint> <display-name>Restrict direct access to JSP files</display-name> <web-resource-collection> <web-resource-name>JSP files</web-resource-name> <url-pattern>*.jsp</url-pattern> </web-resource-collection> <auth-constraint /></security-constraint>
(在JSF 2.0中,不再需要这种方式,使用默认的查看技术Facelets可以映射FacesServlet
on just*.xhtml
,这与Facelets文件的默认扩展名相同)



