作成 2004/4/7
もくじ
ここでは、JSFのHTMLタグの"サンプル"を示します。HTMLタグのAPIリファレンスは、例えばSunのJSF RIのドキュメント内にありますが、サンプルがないので、最初どう書いていいのかよくわかりません。ここでは、JSFのHTMLタグの使い方、理解を深めたいと思います。まだ、最低限のサンプルしかありませが、そのうち、もうちょっと複雑な(というか他のオプション属性も使った)サンプルや、補足説明を追加していきたいと思います。
JSFのJSPタグは2種類あります。それはCoreタグとHTMLタグ。HTMLタグはHTMLを出力する場合のタグです。対して、CoreタグはビューがHTMLであるかどうかに関わらないJSF共通のタグです。このページでは、HTMLタグについて見ていきます。
サンプルは次のような形式で記述しています。ソースは、元となるJSFタグを含むJSPのソース。レンダリングはブラウザ上での表示のされ方。HTMLソースは出力されたソースです。
ソース | レンダリング | HTMLソース |
<h:outputLink value="http://muimi.com"> <h:outputText value="muimi.com"/> </h:outputLink> | muimi.com |
<a href="http://muimi.com">muimi.com</a> |
HTMLソースは、実行させて、ソースを表示して貼り付けたものですが、見やすくするように、フォーマットをととのえています(故意に改行やスペースを入れてある)。
また、レンダリングは、実行結果をコピーして、見た目を再現させたものです。一部、リンク先などを変更してあります(リンク先がないので)。
@TODO
UIForm Component
h:form
<h:form> .... </h:form>
h:formの中に入力コンポーネントを配置していく。 HTML全体のソースで見るとこうなる。
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %> <%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %> <html> <body> <f:view> <h:form> <h:inputText value="#{myBean.userId}"/> </h:form> </f:view> </body> </html>
ソース | レンダリング | HTMLソース |
<h:outputText value="I am hungry"/> | I am hungry |
I am hungry |
ソース | レンダリング | HTMLソース |
<h:outputLink value="http://muimi.com"> <h:outputText value="muimi.com"/> </h:outputLink> | muimi.com |
<a href="http://muimi.com">muimi.com</a> |
ソース | レンダリング | HTMLソース |
<h:outputLabel for="userId"> <h:outputText id="userId" value="USERID"/> </h:outputLabel> | USERID |
<span id="userId">USERID</span> |
ソース | レンダリング | HTMLソース |
<h:outputFormat value="I am {0}"> <f:param value="Happy"/> </h:outputFormat> | I am Happy |
I am Happy |
@TODO もうちょっと現実的な例
UIInput Component
h:inputText
ソース | レンダリング | HTMLソース |
<h:inputText value="#{myBean.userId}"/> |
<input type="text" name="_id0:_id1" value="beckham" /> |
ソース | レンダリング | HTMLソース |
<h:inputSecret value="#{myBean.password}"/> |
<input type="password" name="_id0:_id1" value="" /> |
ソース | レンダリング | HTMLソース |
<h:inputTextarea value="#{myBean.comment}"/> |
<textarea name="_id0:_id1">hoge hoge</textarea> |
ソース | レンダリング | HTMLソース |
<h:inputHidden id="aaa" value="bbb"/> | (レンダリングなし) |
<input id="_id0:aaa" type="hidden" name="_id0:aaa" value="bbb" /> |
静的なアクションの例
ソース | レンダリング | HTMLソース |
<h:commandButton value="PUSH" action="nextPage"/> |
<input type="submit" name="_id0:_id1" value="PUSH" /> |
faces-config.xmlでactionに対応するnavigation-ruleが定義されている必要がある。
<navigation-rule> <navigation-case> <from-outcome>nextPage</from-outcome> <to-view-id>/dummy.jsp</to-view-id> </navigation-case> </navigation-rule>
動的なメソッドアクションなアクションの例
ソース | レンダリング | HTMLソース |
<h:commandButton value="PUSH" action="#{myBean.doLogin}"/> | Eample1と同じ | Example1と同じ |
サブミット時に、myBeanの次のような、"Stringを返り値に持つ引数なし"のdoLogin()メソッドが呼ばれる。
public String doLogin(){ //... if(loginOk){ return "ok"; }else{ return "ng"; } }
返り値の文字列により、navigation-ruleでページが遷移する。
<navigation-rule> <navigation-case> <from-outcome>ok</from-outcome> <to-view-id>/welcome.jsp</to-view-id> </navigation-case> </navigation-rule> <navigation-rule> <navigation-case> <from-outcome>ng</from-outcome> <to-view-id>/fail.jsp</to-view-id> </navigation-case> </navigation-rule>
指定したactionはHTML FORMのactionに出力されるわけではないようだ。 HTML FORMのactionは現在のFaces JSPページのパスが指定されている。 なので、サブミットしてもブラウザ上のURLは変わらない。 (JSFの仕様なのかSunのRI特有の動作なのかは不明)
<form id="_id0" method="post" action="/jsf3/faces/commandButton.jsp" ←現在のFaces JSPページ enctype="application/x-www-form-urlencoded"> <input type="submit" name="_id0:_id1" value="PUSH" /> <input type="hidden" name="_id0" value="_id0" /> </form>
ソース | レンダリング | HTMLソース |
<h:commandLink action="nextPage"> <h:outputText value="PUSH"/> </h:commandLink> | PUSH |
<form id="_id0" method="post" action="/jsf3/faces/commandLink.jsp" enctype="application/x-www-form-urlencoded"> <a href="#" onclick="document.forms['_id0']['_id0:_id1'].value='_id0:_id1'; document.forms['_id0'].submit(); return false;">PUSH</a> <input type="hidden" name="_id0" value="_id0" /> <input type="hidden" name="_id0:_id1" /> </form>(太字部分は実際は一行) |
commandLinkタグ内に出力するテキストは、普通に文字列をはさんでも<a href="...">ここ</a>に表示されません。
誤った例
<h:commandLink action="nextPage"> リンクをクリック </h:commandLink>
actionやnavigation-ruleは <h:commandButton> と同じです。
出力されたHTMLソースが、commandButtonより複雑なのではなんでだろう?
UIGraphic Component
h:graphicImage
ソース | レンダリング | HTMLソース |
<h:graphicImage id="duke" url="/images/duke.gif"/> |
<img id="duke" src="/jsf3/images/duke.gif" alt="" /> |
出力
ソース | レンダリング | HTMLソース |
<h:form> <h:inputText value="#{myBean.userId}" required="true"/> <h:commandButton value="PUSH" action="nextPage"/> <h:messages/> </h:form> |
<form id="_id0" method="post" action="/jsf3/faces/messages.jsp" enctype="application/x-www-form-urlencoded"> <input type="text" name="_id0:_id1" value="" /> <input type="submit" name="_id0:_id2" value="PUSH" /> Validation Error: Value is required. <input type="hidden" name="_id0" value="_id0" /> </form> |
出力
ソース | レンダリング | HTMLソース |
<h:form> <h:inputText id="userId" value="#{myBean.userId}" required="true"/> <h:commandButton value="PUSH" action="nextPage"/> <h:message for="userId"/> </h:form> </pre> |
message(sなし)の方は、メッセージの対象のコンポーネントを指定できます。
UIData / UIColumn Component
h:dataTable
ソース | レンダリング | HTMLソース | ||||||||
<h:dataTable value="#{catalog.items}" var="item" border="1"> <h:column> <f:facet name="header"> <h:outputText value="name"/> </f:facet> <h:outputText value="#{item.name}" /> </h:column> <h:column> <f:facet name="header"> <h:outputText value="price"/> </f:facet> <h:outputText value="#{item.price}" /> </h:column> </h:dataTable> |
|
<table border="1"> <thead> <tr> <th scope="col">name</th> <th scope="col">price</th> </tr> </thead> <tbody> <tr> <td>item1</td> <td>100</td> </tr> <tr> <td>item2</td> <td>200</td> </tr> <tr> <td>item3</td> <td>300</td> </tr> </tbody> </table> |
dataTableを参照
UIPanel Component
h:panelGrid
出力
ソース | レンダリング | HTMLソース | |||||||||||
<h:panelGrid columns="3"> <f:facet name="header"> <h:outputText value="it's header"/> </f:facet> <h:outputText value="A" /> <h:outputText value="B" /> <h:outputText value="C" /> <h:outputText value="D" /> <h:outputText value="E" /> <f:facet name="footer"> <h:outputText value="it's footer"/> </f:facet> </h:panelGrid> |
|
<table> <thead> <tr> <th colspan="3" scope="colgroup">it's header</th> </tr> </thead> <tfoot> <tr><td colspan="3">it's footer</td></tr> </tfoot> <tbody> <tr> <td>A</td> <td>B</td> <td>C</td> </tr> <tr> <td>D</td> <td>E</td> </tr> </tbody> </table> |
たとえばログイン画面でテキストや入力フィールドの整列用に
出力
ソース | レンダリング | HTMLソース | ||||
<h:panelGrid columns="2"> <h:outputText value="userId" /> <h:inputText value="#{login.userId}"/> <h:outputText value="password" /> <h:inputSecret value="#{login.password}"/> </h:panelGrid> |
|
<table> <tbody> <tr> <td>userId</td> <td><input type="text" name="_id0:_id3" /></td> </tr> <tr> <td>password</td> <td><input type="password" name="_id0:_id5" value="" /></td> </tr> </tbody> </table> |
@TODO 用途が不明
UISelectBoolean Component
h:selectBooleanCheckbox
出力
ソース | レンダリング | HTMLソース |
<h:selectBooleanCheckbox value="#{profile.alive}" /> |
<input type="checkbox" name="_id0:_id1" /> |
profileビーンはaliveプロパティーをもっていること。
public boolean isAlive() { return alive; } public void setAlive(boolean alive) { this.alive = alive; }
出力
ソース | レンダリング | HTMLソース | |||
<h:selectManyCheckbox value="#{profile.favorites}"> <f:selectItem itemLabel="Movie" itemValue="Movie"/> <f:selectItem itemLabel="Walk" itemValue="Walk"/> <f:selectItem itemLabel="Karate" itemValue="Karate"/> </h:selectManyCheckbox> |
|
<table> <tr> <td> <label for="_id0:_id1"> <input name="_id0:_id1" value="Movie" type="checkbox"> Movie</input </label> </td> <td> <label for="_id0:_id1"> <input name="_id0:_id1" value="Walk" type="checkbox"> Walk</input> </label> </td> <td> <label for="_id0:_id1"> <input name="_id0:_id1" value="Karate" type="checkbox"> Karate</input> </label> </td> </tr> </table> |
profileビーンは、favoriteプロパティーを持つ。
public Object[] getFavorites() { return favorites; } public void setFavorites(Object[] favorite) { this.favorites = favorite; }
ソース | レンダリング | HTMLソース |
<h:selectManyCheckbox value="#{profile.favorites}"> <f:selectItems value="#{favoriteList}"/> </h:selectManyCheckbox> | Example1と同じ | Example1と同じ |
HTMLにベタ書きせずに、selectItemsで値をひぱってくる例。 #{favoriteList}の定義は、faces-config.xmlのmanaged-beanで行う。
<managed-bean> <managed-bean-name>favoriteList</managed-bean-name> <managed-bean-class>java.util.ArrayList</managed-bean-class> <managed-bean-scope>application</managed-bean-scope> <list-entries> <value-class>javax.faces.model.SelectItem</value-class> <value>#{favoriteList0}</value> <value>#{favoriteList1}</value> <value>#{favoriteList2}</value> </list-entries> </managed-bean> <managed-bean> <managed-bean-name>favoriteList0</managed-bean-name> <managed-bean-class>javax.faces.model.SelectItem</managed-bean-class> <managed-bean-scope>none</managed-bean-scope> <managed-property> <property-name>label</property-name> <value>Movie</value> </managed-property> <managed-property> <property-name>value</property-name> <value>Movie</value> </managed-property> </managed-bean> <managed-bean> <managed-bean-name>favoriteList1</managed-bean-name> <managed-bean-class>javax.faces.model.SelectItem</managed-bean-class> <managed-bean-scope>none</managed-bean-scope> <managed-property> <property-name>label</property-name> <value>Walk</value> </managed-property> <managed-property> <property-name>value</property-name> <value>Walk</value> </managed-property> </managed-bean> <managed-bean> <managed-bean-name>favoriteList2</managed-bean-name> <managed-bean-class>javax.faces.model.SelectItem</managed-bean-class> <managed-bean-scope>none</managed-bean-scope> <managed-property> <property-name>label</property-name> <value>Karate</value> </managed-property> <managed-property> <property-name>value</property-name> <value>Karate</value> </managed-property> </managed-bean>
ツールならいいが、手書きでこれを書くのはダルいだけである。
@TODO Javaクラスに書いてひっぱってくる方法
@TODO UISelectItemGroup
h:selectManyListbox
ソース | レンダリング | HTMLソース |
<h:selectManyListbox value="#{profile.favorites}"> <f:selectItems value="#{favoriteList}"/> </h:selectManyListbox> |
<select name="_id0:_id1" multiple size="3"> <option value="Movie">Movie</option <option value="Walk">Walk</option> <option value="Karate">Karate</option> </select> |
selectItem、selectItemsの利用については、 <selectManyCheckbox> を参照
h:selectManyMenu
ソース | レンダリング | HTMLソース |
<h:selectManyMenu value="#{profile.favorites}"> <f:selectItems value="#{favoriteList}"/> </h:selectManyMenu> |
<select name="_id0:_id1" multiple size="1"> <option value="Movie">Movie</option> <option value="Walk">Walk</option> <option value="Karate">Karate</option> </select> |
selectItem、selectItemsの利用については、 <selectManyCheckbox> を参照
UISelectOne Components
h:selectOneMenu
ソース | レンダリング | HTMLソース |
<h:selectOneMenu value="#{profile.mostFavorite}"> <f:selectItems value="#{favoriteList}"/> </h:selectOneMenu> |
<select name="_id0:_id1" size="1"> <option value="Movie">Movie</option> <option value="Walk">Walk</option> <option value="Karate">Karate</option> </select> |
selectItem、selectItemsの利用については、 <selectManyCheckbox> を参照
h:selectOneListbox
ソース | レンダリング | HTMLソース |
<h:selectOneListbox value="#{profile.mostFavorite}"> <f:selectItems value="#{favoriteList}"/> </h:selectOneListbox> |
<select name="_id0:_id1" size="3"> <option value="Movie">Movie</option> <option value="Walk">Walk</option> <option value="Karate">Karate</option> </select> |
selectItem、selectItemsの利用については、 <selectManyCheckbox> を参照
h:selectOneRadio
ソース | レンダリング | HTMLソース | |||
<h:selectOneRadio value="#{profile.mostFavorite}"> <f:selectItems value="#{favoriteList}"/> </h:selectOneRadio> |
|
<table> <tr> <td> <label for="_id0:_id1"> <input type="radio" name="_id0:_id1" value="Movie"> Movie</input> </label> </td> <td> <label for="_id0:_id1"> <input type="radio" name="_id0:_id1" value="Walk"> Walk</input> </label> </td> <td> <label for="_id0:_id1"> <input type="radio" name="_id0:_id1" value="Karate"> Karate</input> </label> </td> </tr> </table> |
selectItem、selectItemsの利用については、 <selectManyCheckbox> を参照
参考
Sun JSF RI タグリファレンス
http://java.sun.com/j2ee/javaserverfaces/1.0/docs/tlddocs/index.html
Sun J2EE 1.4 Tutorial
http://java.sun.com/j2ee/1.4/docs/tutorial/doc/index.html
Chapter 18 Using the HTML Component Tags
Exadel JavaServer Faces HTML Tags
http://www.exadel.com/tutorial/jsf/jsftags-guide.html
HTMLタグサンプル。まとまってます。
次のページ(サンプルアプリケーション)