JSF 1とJSF 2の違い
たまには技術的なものも。
こういうエントリかかないとどうなるかと見ていたが、基本的なアクセス数はさほど変わっていないが
http://tophatenar.com/view/shin
をみているとブックマークだけはぴたりととまったらしい。
id:yone098氏にも技術系エントリなくなったの?といわれたので復活。
というわけで(?)今回はJSF 1.2と2.0の比較。どれだけJSF2が楽になったかというお話。メッセージを一行出すだけの簡単なもので。RIのMojarraだけじゃなく、MyFacesも2.0がでたようだしJSFの導入は加速している模様。
JSF 1.2
対応するBean。わざとタグをかいてエスケープされるかをチェックしている。
package managed; public class Hoge { public String getMessage(){ return "<b>はろー</b>"; } }
設定ファイル。hogeという名前でrequestスコープにおいているのがわかる。configのバージョンが2.0のを使っているが、中身は変わっていないので気にせぬよう。
<?xml version='1.0' encoding='UTF-8'?> <faces-config version="2.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_2_0.xsd"> <managed-bean> <managed-bean-name>hoge</managed-bean-name> <managed-bean-class>managed.Hoge</managed-bean-class> <managed-bean-scope>request</managed-bean-scope> </managed-bean> </faces-config>
テンプレート。JSPで記述する必要がある。
<%@page contentType="text/html" pageEncoding="UTF-8"%> <%@taglib prefix="f" uri="http://java.sun.com/jsf/core"%> <%@taglib prefix="h" uri="http://java.sun.com/jsf/html"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <f:view> <html> <head> <title>HOGE</title> </head> <body> <h:outputText value="#{hoge.message}"/> <br/> ${hoge.message} </body> </html> </f:view>
outputTextで文字を出力している。${hoge.message}は文字は出力できるが、そのまま出力するためエスケープはされないし、JSP側での処理となるので注意。JSF 1.1だとダメだったと思う。
JSF 2.0
設定ファイル…は必要なし。中身を空にするのではなくファイルそのものがいらない。
Bean。JSF管理であること、Requestスコープであることのアノテーションがあるだけ。名前の指定をしないとクラス名の先頭を小文字にした名前で登録される(この場合はHogeなのでhoge)。
package managed; import javax.faces.bean.ManagedBean; import javax.faces.bean.RequestScoped; @ManagedBean @RequestScoped public class Hoge { public String getMessage(){ return "<b>はろー</b>"; } }
テンプレートファイル。JSPのほか、XHTMLで記述が可能になった。こっちが推奨される。
<?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://java.sun.com/jsf/html"> <head> <title>HOGE</title> </head> <body> <h:outputText value="#{hoge.message}" /> <br/> #{hoge.message} </body> </html>
ポイントとしては#{hoge.message}を単独で記述が可能になってることと、その場合エスケープが自動でされるということ。つまり
<h:outputText value="#{hoge.message}" />
と
#{hoge.message}
は結果は同一。エスケープしたくないときだけh:outputTextを指定してescape="false"とする必要がある。ここは非常に便利だと思う。