我正在研究Java EE(我相当新)Web应用程序(JSF,JPA,EJB),并且正在将PrettyFaces合并到人类可读/可收藏的URL中。我一直在使用过滤器有两个原因。
在合并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>
答案 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和延迟加载 - 这是一个完全不同的故事,我建议在这方面更具体,并提供更多细节,代码片段等,以便我们能够提供帮助。