PrettyFaces,Filter和url-pattern问题

时间:2012-03-29 16:07:24

标签: jsf-2 java-ee-6 prettyfaces

我正在研究Java EE(我相当新)Web应用程序(JSF,JPA,EJB),并且正在将PrettyFaces合并到人类可读/可收藏的URL中。我一直在使用过滤器有两个原因。

  1. 确保用户已登录。
  2. 在事务中包含对filterChain.doFilter(...)的调用,因此JPA延迟加载在生成视图时起作用(例如,我可以在支持bean中设置Department对象,并使用#{backingBean.department .employees}获取.xhmtl文件中的关联员工列表。
  3. 在合并PrettyFaces之前,我在使用* .xhmtl的url-pattern(在web.xml中)(虽然过滤器并不真正需要为登录页面运行)。使用PrettyFaces,尝试为Filters指定url-pattern似乎有点问题,主要是由于url-pattern规则缺乏灵活性(缺乏对正则表达式的支持)。有没有另一种方法可以完成我需要的东西而不使用过滤器(而不必重复代码)?

    另外,我知道我可以在URL的开头添加一个静态部分(例如,/ dept /#{deptName} / ...然后使用带有/ dept / *的url-pattern的Filter,但是我希望从/#{deptName} / ...开始(并使用/ *的url-pattern运行所有内容的过滤器,包括图像,javascript,css等)。

    基本上,过滤器注入了一个事务......

    @Resource UserTransaction tx;
    

    做了类似的事。

    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) throws IOException, ServletException {       
        HttpServletRequest httpReq = (HttpServletRequest) request; 
        HttpServletResponse httpRes = (HttpServletResponse) response;
    
        HttpSession session = httpReq.getSession();
        User currentUser = (User)session.getAttribute("userInSession");
    
        if (currentUser == null) {
            httpRes.sendRedirect("...")    //redirect to LoginServlet
        } else {        
        try {
            tx.begin();
            chain.doFilter(httpReq, httpRes);
        }
        catch (Exception e) { } 
        finally {
            try {
                 tx.commit();
            }
            catch (Exception e) { }
        }
    }
    

    我有一个像这样的托管bean ......

    @ManagedBean
    @RequestScoped
    @URLMapping(
      id="uutSerialNumber",
      pattern="/#{uutSerialNumberController.programId}/uut/#{uutSerialNumberController.uutId}",
      viewId="/uutSerialNumber.xhtml"
    )
    public class UutSerialNumberController {
      @EJB private ProgramServiceBean programServiceBean;
      @EJB private UutServiceBean uutServiceBean;
    
      private Integer programId;
      private Integer uutId;
    
      private Program program;
      private Uut uut;
    
      @URLAction
      public String loadData() {
        program = programServiceBean.findByProgramId(programId);
        uut = uutServiceBean.findUutByUutId(uutId);
        return null;
      }
    
      //other stuff, setters/getters
    }
    

    在视图uutSerialNumber.xhmtl中,我做了类似的事情(这需要延迟加载,除非我想在我的uutServiceBean.findUutByUutId()中手动预取集合的麻烦)...

    <ul>
    <c:forEach var="serialNumber item="#{uut.serialNumbers}>
       <li>#{serialNumber.description}</li>
    </c:forEach>
    </ul>
    

2 个答案:

答案 0 :(得分:3)

原来我没有正确配置PrettyFaces(doh!)。这有点令人困惑,因为在PrettyFaces Reference Guide中,它表示如果使用Servlet 3.0(我是),您不需要编辑web.xml。但是,做到以下几点解决了我的问题。

<!-- PrettyFaces Filter -->
<filter>
  <filter-name>Pretty Filter</filter-name>
  <filter-class>com.ocpsoft.pretty.PrettyFilter</filter-class>
</filter>
<!-- My own view Filter -->
<filter>
  <filter-name>View Filter</filter-name>
  <filter-class>com.jasoni.ViewFilter</filter-class>
</filter>
<!-- mappings -->
<filter-mapping>
  <filter-name>Pretty Filter</filter-name>
  <url-pattern>/*</url-pattern>
  <dispatcher>FORWARD</dispatcher>
  <dispatcher>REQUEST</dispatcher>
  <dispatcher>ERROR</dispatcher>
</filter-mapping>
<filter-mapping>
  <filter-name>View Filter</filter-name>
  <url-pattern>*.xhtml</url-pattern>
  <dispatcher>FORWARD</dispatcher>
  <dispatcher>REQUEST</dispatcher>
  <dispatcher>ERROR</dispatcher>
</filter-mapping>

有了这个,我就可以在我的视图上运行一个过滤器并使用一个事务视图模式(类似于Pro JPA 2中提到的模式,除了使用Filter而不是Serlvet,所以延迟加载适用于JPA),并检查用户是否进行了会话。

答案 1 :(得分:0)

我无法看到使用PrettyFaces如何影响您的过滤器 - 您始终可以从PrettyContext获取HttpServletRequest并获得处理网址所需的全部内容,包括正则表达式。至于JPA和延迟加载 - 这是一个完全不同的故事,我建议在这方面更具体,并提供更多细节,代码片段等,以便我们能够提供帮助。