私はJava EE(私はかなり新しい)Webアプリケーション(JSF、JPA、EJB)に取り組んでおり、人間が読める/ブックマーク可能なURLにPrettyFacesを組み込む過程にあります。私は 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>