Я работаю над веб-приложением Java EE (которое я довольно новичок) (JSF, JPA, EJB) и нахожусь в процессе включения PrettyFaces для удобочитаемых / закладываемых URL-адресов.Я использую фильтр по двум причинам.
- , чтобы убедиться, что пользователь вошел в систему.
- , чтобы обернуть вызов filterChain.doFilter (...) втранзакция, поэтому отложенная загрузка JPA работает при генерации представлений (например, я могу просто установить объект Department в компоненте поддержки и использовать # {backingBean.department.employees}, чтобы получить связанный список сотрудников в файле .xhmtl).
До включения PrettyFaces я использовал URL-шаблон (в web.xml) * .xhmtl (хотя на самом деле фильтр не должен запускаться для страницы входа в систему) для фильтра.При использовании PrettyFaces попытка указать шаблон URL для фильтров, кажется, представляет собой небольшую проблему, в основном из-за недостаточной гибкости правил шаблона URL (отсутствие поддержки регулярных выражений).Есть ли другой способ выполнить то, что мне нужно, без использования фильтров (без необходимости дублирования кода)?
Кроме того, я знаю, что могу добавить статическую часть в начало URL (например, / dept/ # {deptName} / ... и затем использовать фильтр с URL-шаблоном / dept / *, но я надеялся просто начать с чего-то вроде / # {deptName} / ... (и использовать URL-адресpattern of / * запускает фильтр для всего, включая изображения, javascript, css и т. д.)
По существу, в фильтр вводится транзакция ...
@Resource UserTransaction tx;
И делает что-то вродеthis.
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>