Как известно JSF умеет работать только с post-запросами, однако существет метод, который позволяет разбирать и get.
Делается это примерно так:
1. Создаем реквестный бин чтобы извлечь параметры запроса.
2. Реализуем интерфейс PhaseListener:
3. В faces-config.xml создаем категорию
Делается это примерно так:
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.