tutorial faces example español ejemplo java jsf java-ee

java - faces - jsf pdf



Acción JSF CommandButton no invocada (4)

Estoy teniendo un problema con la acción JSF CommandButton que no se invoca. Tengo un bean gestionado roleController, como en

@ManagedBean(name = "roleController") @RequestScoped public class RoleController { public Role getSelectedRole() { return selectedRole; } public void updateSelectedRole() { System.out.println(selectedRole.getRole()); }

En mi archivo .jsf, estoy tratando de editar la acción invocar updateSelectedRole en h: commandButton, pero parece que no funciona. He intentado cambiar el nombre del método por uno incorrecto, y no se lanza ninguna excepción, pero cuando hago lo mismo con otra forma, se lanza la excepción, por lo que es muy probable que la acción ni siquiera se haya invocado.

<h:panelGroup rendered="${param.action == ''edit''}"> <h:form> <ol> <li> <label for="ID"> <h:outputText value="#{msg.roleEditID}" /> </label> <h:inputText readonly="true" value="#{roleController.selectedRole.id}" /> </li> <li> <label for="Role"> <h:outputText value="#{msg.roleEditRole}" /> </label> <h:inputText value="#{roleController.selectedRole.role}" /> </li> <li> <h:commandButton value="#{msg.buttonUpdate}" action="#{roleController.updateSelectedRole()}"/> </li> </ol> </h:form> </h:panelGroup>

Descubrí que puede deberse a formas anidadas, pero ese no es el caso en este ejemplo. ¿Es posible que la raíz de este problema sea mi regla de navegación?

<navigation-rule> <from-view-id>/admin/roles.xhtml</from-view-id> <navigation-case> <to-view-id>/admin/roles.xhtml</to-view-id> <from-outcome>true</from-outcome> <redirect> <view-param> <name>action</name> <value>edit</value> </view-param> </redirect> </navigation-case> </navigation-rule>


Este cambio de orden funcionó en mi caso:

<h:form> <h:panelGroup rendered="${param.action == ''edit''}"> . . . </h:panelGroup> </h:form>


La acción no se ha invocado, porque el componente del botón de comando no se representa.

Durante el procesamiento del envío del formulario, el componente rendered="${param.action == ''edit''}" en el componente del grupo del panel principal se ha reevaluado (como medida de protección contra solicitudes manipuladas / manipuladas). Sin embargo, como aparentemente no está reteniendo ese parámetro de solicitud en la devolución de datos (al menos, nada en el código prueba lo contrario), se evalúa como false . Y, por lo tanto, el componente del grupo del panel principal no se procesa, incluidos todos sus hijos.

Debe asegurarse de que el atributo rendered del botón de comando y todos sus componentes principales se evalúe como true durante el envío del formulario. En este caso particular, puede lograrlo manteniendo el parámetro de solicitud incluyendo un <f:param> en el propio botón de comando.

<h:commandButton ...> <f:param name="action" value="#{param.action}" /> </h:commandButton>

Ver también:

Sin relación con el problema concreto, se recomienda prohibir el uso de ${} en JSF, ya que de lo contrario se producirían confusiones y preguntas innecesarias. Solo quédate con #{} todo el tiempo.


la solicitud del cliente debe estar encapsulada dentro de un formulario HTTP


<h:commandButton value="#{msg.buttonUpdate}" action="#{roleController.updateSelectedRole()}"/>

cambiarlo a

<h:commandButton value="#{msg.buttonUpdate}" action="#{roleController.updateSelectedRole}"/>

No necesitas los paréntesis para tu llamada de acción.

public void updateSelectedRole() { System.out.println(selectedRole.getRole()); }

y el método de acción de método necesita devolver una cadena

public String updateSelectedRole() { System.out.println(selectedRole.getRole()); return "true"; }