【问题标题】:JSF tags not rendered after filter implementation过滤器实现后未呈现 JSF 标记
【发布时间】:2015-04-13 12:29:32
【问题描述】:

在我决定实施过滤之前,我一直在做一个运行良好的项目。 我关注了BalusC's JSF HTTP Session Login 上的帖子。 现在,没有呈现任何 jsf 标记。这是我的 web.xml 文件

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app version="3.1" xmlns="http://xmlns.jcp.org/xml/ns/javaee"        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd">
<context-param>
    <param-name>javax.faces.PROJECT_STAGE</param-name>
    <param-value>Development</param-value>
</context-param>
<filter>
    <filter-name>UserFilter</filter-name>
    <filter-class>servlet.UserFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>UserFilter</filter-name>
    <url-pattern>/faces/*</url-pattern>
</filter-mapping>
<servlet>
    <servlet-name>Faces Servlet</servlet-name>
    <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet>
    <servlet-name>ImageServlet</servlet-name>
    <servlet-class>servlet.ImageServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>Faces Servlet</servlet-name>
    <url-pattern>/faces/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
    <servlet-name>ImageServlet</servlet-name>
    <url-pattern>/ImageServlet</url-pattern>
</servlet-mapping>
<session-config>
    <session-timeout>
        30
    </session-timeout>
</session-config>
<welcome-file-list>
    <welcome-file>faces/admin/login.xhtml</welcome-file>
</welcome-file-list>
<context-param>
    <param-name>primefaces.THEME</param-name>
    <param-value>blitzer</param-value>
</context-param>

当我删除过滤器时,一切正常。

【问题讨论】:

    标签: jsf-2 primefaces


    【解决方案1】:

    该答案基于*.xhtml 的 FacesServlet 映射。但是,您已经有了 /faces/* 的旧 JSF 1.0/1.1 样式映射。换句话说,FacesServlet 永远不会被调用,而您只是看到了后果。

    你有两个选择:

    1. 修复过滤器以重定向到与您的 FacesServlet 映射匹配的 URL。

      res.sendRedirect(req.getContextPath() + "/faces/login.xhtml");
      
    2. 将 FacesServlet 映射更改为 *.xhtml,就像每个理智的 JSF 2.x 开发人员都会做的那样。这使您不必一直摆弄虚拟 URL。

    另见:


    与具体问题无关,如果您打算让过滤器挂钩特定的 servlet,则最好不要复制其 URL 模式,如下所示:

    <filter-mapping>
        <filter-name>UserFilter</filter-name>
        <url-pattern>/faces/*</url-pattern>
    </filter-mapping>
    

    相反,您最好直接映射到 servlet 名称:

    <filter-mapping>
        <filter-name>UserFilter</filter-name>
        <servlet-name>Faces Servlet</servlet-name>
    </filter-mapping>
    

    而且,如果您在过滤器和 servlet 名称中遵循 Java 变量命名约定,那就太好了:

    <filter-name>userFilter</filter-name>
    ...
    <servlet-name>facesServlet</servlet-name>
    

    你可以这样想:

    UserFilter userFilter = new UserFilter();
    

    【讨论】:

    • 鉴于您对我有帮助的答案的数量,我什至在看到答案的作者姓名之前就能认出任何新答案:) 谢谢
    • 我将 web.xml 文件从 /faces/* 修改为 *.xhtml。现在页面显示没有 css(既不是默认的 jsf css 也不是用户定义的)。
    • 这是一个不同的问题。您当前的问题已解决。以后只要问一个新问题或搜索以前没有问过的问题,就像这样stackoverflow.com/questions/14526574/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-20
    • 2011-03-20
    • 2011-01-13
    • 2015-03-29
    • 2012-01-26
    • 1970-01-01
    • 2013-05-17
    相关资源
    最近更新 更多