Как стать автором
Обновить

Работа с get-запросами в JSF

Время на прочтение4 мин
Количество просмотров3.6K
Как известно JSF умеет работать только с post-запросами, однако существет метод, который позволяет разбирать и get.


Делается это примерно так:

1. Создаем реквестный бин чтобы извлечь параметры запроса.
package ru.beans;<br><br>import javax.faces.context.FacesContext;<br>import javax.servlet.http.HttpServletRequest;<br><br>public class EntryBean {<br><br>  // название параметра в строке get-запроса<br>  private static final String PARAM_ID = "id";<br><br>  private Integer id = null;<br><br>  // в конструкторе получаем необходимые параметры запроса<br>  public EntryBean() {<br>    HttpServletRequest req = (HttpServletRequest)FacesContext.getCurrentInstance().getExternalContext().getRequest();<br><br>    String id = req.getParameter(PARAM_ID);<br>    if(id != null) {<br>      setId(Integer.parseInt(id));<br>    }<br>  }<br><br>  public void setId(Integer id) {<br>    this.id = id;<br>  }<br><br>  public int getId() {<br>    return id;<br>  }<br><br>  // здесь определяем на какую страницу надо перейти<br>  public String getEntryLocation() {<br>    String result = "/userList.jsf";<br><br>    if (getId() != null) {<br>      result = "/userDetail.jsf";<br>    }<br><br>    return result;<br>  }<br>}<br><br>* This source code was highlighted with Source Code Highlighter.

2. Реализуем интерфейс PhaseListener:
pacakage ru.lifecycle;<br><br>import javax.faces.component.UIViewRoot;<br>import javax.faces.context.FacesContext;<br>import javax.faces.event.PhaseEvent;<br>import javax.faces.event.PhaseId;<br>import javax.faces.event.PhaseListener;<br>import javax.servlet.http.HttpServletRequest;<br><br>import ru.beans.EntryBean;<br><br><br>public class RedirectPhaseListener implements PhaseListener {<br><br>    // на какой фазе будем выполнять<br>    public PhaseId getPhaseId() {<br>    return PhaseId.RESTORE_VIEW;<br>    }<br><br>    // выполненение до фазы<br>    public void beforePhase(PhaseEvent event) {<br>        FacesContext ctx = event.getFacesContext();<br>        HttpServletRequest request = (HttpServletRequest)ctx.getExternalContext().getRequest();<br>        <br>        String path = request.getServletPath();<br>        EntryBean entry = null;<br>    if ((path != null) && path.endsWith("/entry.jsf")) {<br>      // находим бин в контексте<br>      entry = (EntryBean)ctx.getApplication().evaluateExpressionGet(ctx, "#{EntryBean}", EntryBean.class);<br>      try {<br>        String location = entry.getEntryLocation();<br>        <br>        // создаем ViewRoot для новой страницы<br>        UIViewRoot newPage = ctx.getApplication().getViewHandler().createView(ctx, location);<br>        ctx.setViewRoot(newPage);<br>        <br>        // сюда пишем код, который устанавливает необходимые значения, например:<br>        if(entry.getId() != null) {<br>          customersBean.setCustomerId(entry.getId());<br>        }<br><br>      // если что-то пошло не так...<br>      } catch (Throwable e) {<br>            log.error("Failed to redirect", e);<br>         }<br>      // отображаем то, что накреативили<br>      ctx.renderResponse();<br>    }<br>  }<br><br>  // оставляем пустым<br>  public void afterPhase(PhaseEvent event) {<br>  }<br>}<br><br>* This source code was highlighted with Source Code Highlighter.

3. В faces-config.xml создаем категорию
<lifecycle><br>  <phase-listener>ru.lifecycle.RedirectPhaseListener</phase-listener><br></lifecycle><br><br>* This source code was highlighted with Source Code Highlighter.
Теги:
Хабы:
Всего голосов 5: ↑5 и ↓0+5
Комментарии3

Публикации