2012-03-29 31 views
2

我正在研究一個Java EE(我相當新的)Web應用程序(JSF,JPA,EJB),並且正在將PrettyFaces合併爲人類可讀/可收藏的網址。我一直在使用過濾器有兩個原因。PrettyFaces,Filter和url-pattern問題

  1. ,以確保用戶已登錄。
  2. 包調用filterChain.doFilter(...)在交易所以JPA延遲加載生成視圖時的工作(例如,我可以只設置後臺bean中的Department對象,並使用#{backingBean.department.employees}獲取.xhmtl文件中的關聯員工列表)。

在合併PrettyFaces之前,我在過濾器中使用* .xhmtl的url-pattern(雖然過濾器並不需要爲登錄頁面運行)。使用PrettyFaces,試圖爲過濾器指定url模式似乎有點問題,主要是由於url模式規則缺乏靈活性(缺少對正則表達式的支持)。有沒有另外一種方法可以完成我不需要使用過濾器(而不必複製代碼)的需要?我知道我可以在URL的開頭添加一個靜態部分(比如/ dept /#{deptName}/...,然後使用一個帶有/ dept/*的url模式的過濾器,但我希望只是從/#{deptName}/...開始(並且使用/ *的url模式在所有內容上運行過濾器,包括圖像,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> 

回答

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提到的,除了使用過濾器代替的Serlvet的,所以延遲加載與工作JPA),並檢查用戶是否有會話。

+0

感謝分享! – 2016-11-29 14:31:37

0

我不能看到如何使用PrettyFaces可能會影響您的過濾器 - 你總是可以從HttpServletRequest得到PrettyContext並得到所有你需要處理的URL,包括正則表達式。至於JPA和延遲加載 - 這是一個完全不同的故事,我建議在這方面更具體,並提供更多的細節,代碼片段等,以便我們能夠提供幫助。

+1

感謝您的回覆。 PrettyFaces不會影響我的過濾器,但它會影響我的URL(以及URL映射)。如果沒有漂亮的表情,指定過濾器將運行所有.xhtml文件(將url-pattern設置爲web.xml中的\ *。xhtml)非常容易。使用PrettyFaces時,網址沒有.xhtml擴展名。什麼url-pattern(在web.xml中)將用於您想要爲/#{department}/{#employee}模式的頁面運行的過濾器? 我將用代碼片段編輯我的初始文章,以便更清楚。 – JasonI 2012-03-29 22:16:59

+0

我想我可以把它分解成幾個小問題。這是有點加載。 – JasonI 2012-03-30 01:09:58