PrettyFaces, фильтр и шаблон URL - PullRequest
2 голосов
/ 29 марта 2012

Я работаю над веб-приложением Java EE (которое я довольно новичок) (JSF, JPA, EJB) и нахожусь в процессе включения PrettyFaces для удобочитаемых / закладываемых URL-адресов.Я использую фильтр по двум причинам.

  1. , чтобы убедиться, что пользователь вошел в систему.
  2. , чтобы обернуть вызов 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>

Ответы [ 2 ]

3 голосов
/ 31 марта 2012

Оказывается, у меня не были настроены PrettyFaces правильно (дох!). Это немного сбивало с толку, потому что в справочном руководстве PrettyFaces говорится, что вам не нужно редактировать web.xml при использовании Servlet 3.0 (который я). Но выполнение следующей задачи решило мою проблему.

<!-- 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 , за исключением использования фильтра вместо Serlvet, поэтому отложенная загрузка работает с JPA), а также проверьте, что у пользователя идет сеанс.

0 голосов
/ 30 марта 2012

Я не вижу, как использование PrettyFaces может повлиять на ваш фильтр - вы всегда можете получить PrettyContext из HttpServletRequest и получить все, что вам нужно для обработки URL, включая регулярные выражения.Что касается JPA и отложенной загрузки - это совсем другая история, я бы посоветовал быть более конкретным в этой области и предоставить больше подробностей, фрагментов кода и т. Д., Чтобы мы могли помочь.

...