JSFのFormを出力するタグ h:form
には method
属性がない。強制的に POST
でリクエストされる。
登録や更新ならそれでもいいけれど、検索フォームの時に POST
は違和感が残る。リロードすると「フォームの内容を再送信しますか?」のようなメッセージがでてしまうからだ。
要するに GET
で
http://hoge.com/search?id=2&name=taro
のようにしたいのでやってみる。
View
<f:metadata>
<!-- クエリパラメータをセットして初期化処理を呼ぶ -->
<f:viewParam name="id" value="#{sampleController.id}" />
<f:viewParam name="name" value="#{sampleController.name}" />
<f:viewAction action="#{sampleController.init()}" />
</f:metadata>
<h:form>
<!-- 普段と変わらないForm -->
<h:inputText value="#{sampleController.id}" />
<h:inputText value="#{sampleController.name}" />
<h:commandButton value="検索" action="#{sampleController.search()}" />
</h:form>
BackingBean
@Getter
@Setter
private String id;
@Getter
@Setter
private String name;
public void init(){
//idとnameを条件にして検索
}
public String search(){
//パラメータをつけてリダイレクト
//※ パラメーターに null とかでないようにちゃんとしてね
return String.format("search.xhtml?faces-redirect=true&id=%s&name=%s",id,name);
}
こんなふうにすると
検索ボタン
- POST -> アクションメソッド
- GET -> 検索メソッド
のような流れになって GET
で検索しているようにできる。なので もどき
。
h:commandButton
と f:param
と includeViewParams=true
を組み合わせればアクションメソッドなしでもできるかもしれない。
以上。