PostBack no JSF
June 6, 2008 Java EE, Programação 2 CommentsUm 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.