2

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

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

PrettyFaces を組み込む前は、*.xhmtl の URL パターン (web.xml 内) をフィルターに使用していました (ただし、ログイン ページに対してフィルターを実行する必要はありません)。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>
4

2 に答える 2

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で言及されているものと同様であるため、遅延読み込みは JPA で機能します)。ユーザーがセッションを行っていることを確認します。

于 2012-03-31T00:02:23.337 に答える
0

PrettyFaces使用がフィルタにどのように影響するかわかりません。正規表現を含め、URL の処理に必要なものはいつでも取得できますPrettyContextHttpServletRequestJPA と遅延読み込みに関しては、これはまったく別の話です。この分野をより具体的に説明し、詳細やコード スニペットなどを提供して支援できるようにすることをお勧めします。

于 2012-03-29T20:56:08.600 に答える