How to set recursively component properties using Java Server Faces (JSF)
I am using a piece of code that setting disabled=true and readonly=true to all components inside of a Form, but you can use this in other situations:
In your .jspx File:
<f:view beforePhase="#{someController.makeFormReadOnly}">
In your .java File:
import javax.faces.application.Application; import javax.faces.context.FacesContext; import javax.faces.component.UIComponent; import javax.el.ELContext; import javax.el.ExpressionFactory; import javax.el.ValueExpression; import java.lang.reflect.Method; public void makeFormReadOnly(FacesContext facesContext, UIComponent component) { try { Method[] methods = component.getClass().getMethods(); for (Method method : methods) { if (method.getName().equals("getChildren")) { List<UIComponent> listaComp = (List<UIComponent>)method.invoke(component); for (UIComponent comp : listaComp) { makeFormReadOnly(facesContext, comp); } } } component.setValueExpression("readOnly", getValueExpression(facesContext, "#{true}")); component.setValueExpression("disabled", getValueExpression(facesContext, "#{true}")); } catch (Exception e) { throw new RuntimeException(e); } } private ValueExpression getValueExpression(FacesContext facesContext, String name) { Application app = facesContext.getApplication(); ExpressionFactory elFactory = app.getExpressionFactory(); ELContext elContext = facesContext.getELContext(); return elFactory.createValueExpression(elContext, name, Object.class); }