当我搜索一起使用.jsp和.xhtml的方法时,我发现了这个Mixing JSP and XHTML (Facelets) in JSF2 Project - possible?。
这个问题的答案是一个FAQ的链接,该链接指出我必须使用前缀映射,但我无法弄清楚如何。我知道我必须添加facelets.VIEW_MAPPINGS但是这个措辞在"你必须使用前缀映射"是我无法理解的。
基本上我应该使用/ faces / include来访问我的页面,例如:" http://localhost:8080/webapp/faces/mypage.xhtml"
但是如果我尝试添加/ faces /手动它会变成404.我不确定是否应该在运行应用程序时自动添加它。
我的欢迎文件是一个使用以下内容的html页面:<body bgcolor="#FFFFFF" onload="window.location='/portal/login/login.xhtml'">
它真的应该是.xhtml而不是.jsf吗?
在尝试与JSP页面混合并尝试使用JSF2之前,我成功地运行了它:
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>*.jsf</url-pattern>
</servlet-mapping>
<context-param>
<param-name>javax.faces.DEFAULT_SUFFIX</param-name>
<param-value>.xhtml</param-value>
</context-param>
<servlet>
<servlet-name>Faces Servlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
使用/ faces / *似乎是必须的,但我不理解如何正确使用它。
我试着这样:
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>/faces/*</url-pattern>
</servlet-mapping>
<!-- Use extensions mapping for Faces servlet -->
<context-param>
<param-name>facelets.VIEW_MAPPINGS</param-name>
<param-value>*.xhtml</param-value>
</context-param>
<context-param>
<param-name>javax.faces.DEFAULT_SUFFIX</param-name>
<param-value>.jsp</param-value>
</context-param>
<servlet>
<servlet-name>Faces Servlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
这是一个用纯jsp页面构建的大型应用程序和带有JSF 1.2的jsp页面。基本上我将所有jsf页面转换为jsf2,从而转换为xhtml。
答案 0 :(得分:2)
前缀映射是一个像/faces/*
这样的文件夹映射。后缀映射是类似*.jsf
的扩展映射。您的欢迎文件使用的hacky JS行更改了位置(为什么不在<welcome-file>
中指定该URL?)。此位置网址还应包含/faces
映射。
JSF 2.0中的另一个(IMO更好)解决方案是使用*.jsf
代替并删除所有其他上下文参数配置并保留默认值。 JSF将首先扫描page.xhtml
,如果它不存在,则它将扫描page.jsp
。所以,web.xml
中的所有内容都应该是:
<servlet>
<servlet-name>facesServlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>facesServlet</servlet-name>
<url-pattern>*.jsf</url-pattern>
</servlet-mapping>
我没有在您链接的问题中回答这个问题,因为那时我还不知道。
答案 1 :(得分:0)
虽然上面的建议确实有效,但我并不想更改每个网址,而是通过使用正确的参数让前言映射工作。
不起作用:
<context-param>
<param-name>facelets.VIEW_MAPPINGS</param-name>
<param-value>*.xhtml</param-value>
</context-param>
工作的:
<!-- Facelets pages will use the .xhtml extension -->
<context-param>
<param-name>javax.faces.FACELETS_VIEW_MAPPINGS</param-name>
<param-value>*.xhtml</param-value>
</context-param>