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:
- CommandButton / commandLink / ajax action / listener método no invocado o valor de entrada no actualizado : el punto 5 se aplica a usted
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";
}