【问题标题】:Using .xhtml and JSP in same application在同一应用程序中使用 .xhtml 和 JSP
【发布时间】:2011-12-07 17:32:33
【问题描述】:

我在寻找同时使用 .jsp 和 .xhtml 的方法时发现了这个Mixing JSP and XHTML (Facelets) in JSF2 Project - possible?

这个问题通过一个 FAQ 的链接得到了回答,该链接指出我必须使用前缀映射,但我不知道如何使用。我知道我必须添加 facelets.VIEW_MAPPINGS 但我无法理解“您必须使用前缀映射”的措辞。

基本上我应该使用 /faces/ 访问我的页面,例如:“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。

【问题讨论】:

    标签: jsp xhtml jsf-2 facelets


    【解决方案1】:

    前缀映射是像/faces/* 这样的文件夹映射。后缀映射是类似*.jsf 的扩展映射。您的欢迎文件使用了一个更改位置的 hacky JS 行(为什么不直接在 &lt;welcome-file&gt; 中指定该 URL?)。此位置 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>
    

    我没有在您链接的问题中回答它,因为当时我不知道。

    另见:

    【讨论】:

    • 谢谢!这很好用。使用 html 页面的原因是(我认为)清除缓存和其他一些与登录页面无关的东西,所以这是某人的设计选择。我不明白为什么在我尝试解决了很长时间的地方找不到此信息!
    【解决方案2】:

    虽然上述建议确实奏效了,但我不想每次都更改网址,并且通过使用正确的参数,我得到了序言映射。

    不起作用:

    <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> 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-06
      • 2010-09-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-12
      • 2010-12-10
      相关资源
      最近更新 更多