JSF CommandButtonアクションが呼び出されないという問題があります。次のように、マネージドBeanのroleControllerがあります
@ManagedBean(name = "roleController")
@RequestScoped
public class RoleController {
public Role getSelectedRole() {
return selectedRole;
}
public void updateSelectedRole() {
System.out.println(selectedRole.getRole());
}
.jsfファイルで、h:commandButtonのupdateSelectedRoleアクションを呼び出して編集しようとしていますが、機能していないようです。メソッド名を間違ったものに変更しようとしましたが、例外はスローされません-しかし、他のフォームで同じことをすると、例外がスローされます-そのため、アクションは呼び出されません。
<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>
ネストされたフォームが原因である可能性があることがわかりましたが、この例ではそうではありません。この問題の原因が私のナビゲーションルールである可能性はありますか?
<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>
コマンドボタンコンポーネントはレンダリングされないため、アクションは呼び出されません。
フォーム送信の処理中に、親パネルグループコンポーネントのrendered="${param.action == 'edit'}"
が再評価されます(改ざん/ハッキングされたリクエストに対する安全対策として)。ただし、明らかに、ポストバックでそのリクエストパラメータを保持していないため(少なくとも、コード内のその他の要素はそれ以外のことを証明しません)、false
と評価されます。したがって、親パネルグループコンポーネントは、そのすべての子を含めてレンダリングされません。
フォームの送信中に、コマンドボタンのrendered
属性とそのすべての親コンポーネントがtrue
に評価されることを確認する必要があります。この特定のケースでは、コマンドボタン自体に<f:param>
を含めることで要求パラメーターを保持することで、それを実現できます。
<h:commandButton ...>
<f:param name="action" value="#{param.action}" />
</h:commandButton>
具体的な問題とは無関係、JSFでの${}
の使用を禁止することが推奨されます。常に#{}
に固執するだけです。
<h:commandButton value="#{msg.buttonUpdate}"
action="#{roleController.updateSelectedRole()}"/>
に変更する
<h:commandButton value="#{msg.buttonUpdate}"
action="#{roleController.updateSelectedRole}"/>
アクションの呼び出しに角かっこは必要ありません。
public void updateSelectedRole() {
System.out.println(selectedRole.getRole());
}
メソッドアクションメソッドは文字列を返す必要があります
public String updateSelectedRole() {
System.out.println(selectedRole.getRole());
return "true";
}
クライアントからの要求はHTTPフォーム内にカプセル化する必要があります