Um grande problema com o JSF é que na especificação 1.1 não existe algum método para saber se a página está sendo executada no postback (quando você reenvia os dados para ela mesma). Mas existe o seguinte workaround:
package web.jsf.vh; import java.io.IOException; import java.util.Locale; import java.util.Map; import javax.faces.FacesException; import javax.faces.application.ViewHandler; import javax.faces.component.UIViewRoot; import javax.faces.context.FacesContext; public class PostBackViewHandler extends ViewHandler { protected ViewHandler baseViewHandler; public CustomViewHandler(ViewHandler viewHandler) { super(); this.baseViewHandler = viewHandler; } public Locale calculateLocale(FacesContext facesContext) { return baseViewHandler.calculateLocale(facesContext); } public String calculateRenderKitId(FacesContext facesContext) { return baseViewHandler.calculateRenderKitId(facesContext); } public UIViewRoot createView(FacesContext facesContext, String arg1) { setPostback(facesContext, false); return baseViewHandler.createView(facesContext, arg1); } public String getActionURL(FacesContext facesContext, String arg1) { return baseViewHandler.getActionURL(facesContext, arg1); } public String getResourceURL(FacesContext facesContext, String arg1) { return baseViewHandler.getResourceURL(facesContext, arg1); } public void renderView(FacesContext facesContext, UIViewRoot arg1) throws IOException, FacesException { baseViewHandler.renderView(facesContext, arg1); } public UIViewRoot restoreView(FacesContext facesContext, String arg1) { setPostback(facesContext, true); return baseViewHandler.restoreView(facesContext, arg1); } public void writeState(FacesContext facesContext) throws IOException { baseViewHandler.writeState(facesContext); } public Map getRequestScope(FacesContext facesContext) { return (Map)facesContext.getApplication().createValueBinding(“#{requestScope}”).getValue(facesContext); } public void setPostback(FacesContext facesContext, boolean value) { getRequestScope(facesContext).put(“ispostback”, new Boolean(value)); } }
O código acima é um View Handler do JSF, agora basta registrá-lo no “facesconfig.xml”:
<application> <view-handler>web.jsf.vh.PostBackViewHandler</view-handler> </application>
E para saber em sua página se é um postback:
public boolean isPostback() { FacesContext facesContext = FacesContext.getCurrentInstance(); Map requestScope = (Map)facesContext.getApplication().createValueBinding(“#{requestScope}”).getValue(facesContext); boolean ispostback = ((Boolean)requestScope.get(“ispostback”)).booleanValue(); return ispostback; }
Obs.: Esse workaround só funciona se o estado da view não é salva no servidor.
2 respostas em “PostBack no JSF”
Você diz que isso é um grande problema, mas você tem que ter em mente que jsf e outras tecnologias são totalmente diferentes. E através do PhaseListener você tem muito mais controle e sabe de muitas outras variáveis. Além de saber se é um postback, dá pra saber mais sobre o estado da aplicação. Então não é um problema como você disse, e também tem como saber sim se é postback, não vou acrescentar detalhes aqui mas basta você procurar sobre PhaseListener e Lifecycle na internet…
Portanto nao vem falar mal do jsf hehehe
Realmente isso não é um problema, por isso foi alterado na versão 1.2:
http://java.sun.com/javaee/javaserverfaces/1.2/docs/api/javax/faces/render/ResponseStateManager.html
Se estivesse falando mal não teria colocado uma forma de fazer isso, teria corrido pra outra linguagem / tecnologias.