2012-03-29 35 views
2

私はJava EE(私はかなり新しくなっています)のWebアプリケーション(JSF、JPA、EJB)に取り組んでいて、人間が読めるようにPrettyFacesを組み込んでいます/ブックマーク可能なURL。私は2つの理由でフィルターを使用しています。PrettyFaces、Filter、およびURLパターンの問題

  1. ユーザーがログインしていることを確認する。
  2. JPA遅延ロードが生成するビューが(例えば、私は設定することができたときに動作しますので、取引にfilterChain.doFilter(...)への呼び出しをラップしますバッキングBeanのDepartmentオブジェクトを使用し、#{backingBean.department.employees}を使用して.xhmtlファイル内の従業員の関連リストを取得します)。

PrettyFacesを組み込む前に、* .xhmtlというurlパターン(フィルタはログインページ用に実際には実行する必要はありません)を使用していました。 PrettyFacesでは、フィルタのURLパターンを指定しようとすると、URLパターンルールの柔軟性が欠如していることが原因です(正規表現のサポートが不足しているため)。フィルタを使用して(そしてコードを複製することなく)必要なものを達成する別の方法がありますか?

また、私は、/ dept /#{deptName}/...のようにURLの先頭に静的な部分を追加してから、/ dept/*のurl-patternでフィルタを使用して、 /#{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) { } 
    } 
} 

I持って、このようなものです管理対象Bean ...ビューuutSerialNumber.xhmtlで

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

、私はのトラブルに行きたいしない限り、私は、遅延ロードを必要とし、このような何かを(行います私uutServiceBean.findUutByUutIdで手動プリフェッチコレクション())...

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

答えて

3

私はPrettyFacesが正しく設定されていませんでした(doh!)。 PrettyFaces Reference Guideでは、サーブレット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> 

、私は怠惰なローディングはで動作する、Serlvetの代わりにフィルターを使用したことを除いて、Pro JPA 2で述べたのと同様の取引表示パターンを(私のビューにフィルタを実行し、使用することができますよJPA)を確認し、ユーザーがセッションを行っていることも確認します。

+0

共有ありがとう! –

0

私はPrettyFacesを使用すると、あなたのフィルタに影響を与える可能性があるかを確認傾ける - あなたは常にHttpServletRequestからPrettyContextを取得し、あなたはURLのを処理するために必要なすべてを取得することができ、正規表現を含むJPAと遅延ロードに関しては、これはまったく別の話ですが、私はこの分野でより具体的で、より多くの詳細、コードスニペットなどを提供して助けてくれることをお勧めします。

+1

ご返信ありがとうございます。 PrettyFacesはフィルタに影響しませんが、URL(とURLマッピング)に影響します。かわいらしい顔がなければ、すべての.xhtmlファイル(web.xmlのurl-patternを\ *。xhtmlに設定)に対してフィルタを実行するように指定するのは簡単です。PrettyFacesではURLの拡張子は.xhtmlではありません。 /#{department}/{#employee}のようなパターンを持つページに対して実行するフィルタには、どのようなurl-pattern(web.xml内)を使用しますか? 最初の投稿をコードスニペットで編集してより明確にします。 – JasonI

+0

私はこれをいくつかの小さな質問に分割するかもしれないと思います。これは少し読み込まれています。 – JasonI

関連する問題