JavaのWebアプリケーションフレームワークであるJSFを仕事で使う機会があったので、
備忘録を残そうと思います。
- 使用環境
- NetBeans8.2
- JavaEE7.0
- GlassFish4.1.1
JSFのAjaxでui:repeatを再描画
JSFの画面でAjaxを活用したい時は専用のf:ajax要素が用意されている。
これを活用して、繰り返し表示の際によく使用されるui:repeat要素の部分を再描画してみる。
【実行イメージ】
つまり、テキストボックスの入力内容によって、リスト部分だけを再描画するサンプルです。
【view】
<?xml version='1.0' encoding='UTF-8' ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://xmlns.jcp.org/jsf/html" xmlns:ui="http://xmlns.jcp.org/jsf/facelets" xmlns:f="http://xmlns.jcp.org/jsf/core"> <f:metadata> <f:viewAction action="#{ajaxTestBean.init()}" /> </f:metadata> <h:head> <title>Ajaxtest</title> </h:head> <h:body> <h:form prependId="false"> <h:inputText id="input" value="#{ajaxTestBean.inputText}" /> <h:commandButton value="送信" > <f:ajax render="listarea" event="click" execute="input" listener="#{ajaxTestBean.changeDispList()}" /> </h:commandButton> <h:panelGroup id="listarea"> <ui:repeat value="#{ajaxTestBean.dispList}" var="item"> <li><h:outputText value="#{item.title}" /><br/> <h:outputText value="#{item.message}" /></li> </ui:repeat> </h:panelGroup> </h:form> </h:body> </html>
【ManagedBean】
import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.enterprise.context.ApplicationScoped; import javax.inject.Named; @Named(value = "ajaxTestBean") @ApplicationScoped public class AjaxTestBean { private String inputText; private Map<Object,List<Message>> messageList; private List<Message> dispList; public void init(){ List<Message> messageList1 = new ArrayList<>(); messageList1.add(new Message("タイトル1","メッセージ1")); messageList1.add(new Message("タイトル2","メッセージ2")); messageList1.add(new Message("タイトル3","メッセージ3")); List<Message> messageList2 = new ArrayList<>(); messageList2.add(new Message("題名1","本文1")); messageList2.add(new Message("題名2","本文2")); messageList2.add(new Message("題名3","本文3")); messageList = new HashMap<>(); messageList.put("1",messageList1); messageList.put("2",messageList2); } public void changeDispList(){ dispList = messageList.get(inputText); } public String getInputText() { return inputText; } public void setInputText(String inputText) { this.inputText = inputText; } public Map<Object, List<Message>> getMessageList() { return messageList; } public void setMessageList(Map<Object, List<Message>> messageList) { this.messageList = messageList; } public List<Message> getDispList() { return dispList; } public void setDispList(List<Message> dispList) { this.dispList = dispList; } }
【Bean】
public class Message { private String title; private String message; public Message(String title,String message){ this.title = title; this.message = message; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } }
処理の流れをまとめると
- 最初のリクエスト時に、viewのf:metadata要素のf:viewActionに定義されたinitメソッドの処理を実行
- ページ表示
- テキストボックスに「1」を入力して、送信ボタンをクリック
- 送信ボタンの要素であるh:commandButtonの子要素に、f:ajaxが設定されているので以下の処理が行われる
- event属性に設定されたイベント名がトリガー(今回はクリック)
- execute属性に設定されたidを持つコンポーネントを処理。(今回はテキストボックスの値がManagedBeanの変数inputTextに設定される)
- listener属性に設定されたManagedBeanのメソッドの実行(今回はchangeDispList()メソッドの実行)
- render属性に設定されたidを持つコンポーネントの再描画(今回はui:repeatの親要素であるh:panelGroup)
ちなみにui:repeatはHTML変換時の要素が存在しないので、今回みたいにh:panelGroupなどの設定したidが画面表示後に残る要素の子要素に設定する必要があります。
コメント