ICEfaces 2.0 Alpha 2
久しぶりにICEfacesを触ってみました。というのも、JSFが2.0になってからなかなかICEfacesがJSF2.0で正常に動作しなかった上に、そもそもICEfacesを利用するメリットが薄れてきて遠ざかることに。ただ、やっぱりICEfacesのコンポーネントは秀逸であるため利用したい、とは常々考えていたところ、Alpha2のリリースがやってきました。
Mavenにも対応したということなので、pom.xmlに以下ICEfacesのリポジトリの場所を追記。JBossのリポジトリは、後述するdependencyを追加すると依存ライブラリとして参照されているjsf-api-2.0.2.FCS.jarとjsf-impl-2.0.2.FCS.jarを取り込むために必要となります。
<repository> <id>org.icefaces</id> <name>Repository hosting the icefaces artifacts</name> <url>http://anonsvn.icefaces.org/repo/maven2/snapshots/</url> </repository> <repository> <id>JBOSS</id> <name>JBoss Repository</name> <url>http://repository.jboss.org/maven2/</url> </repository>
あとは、以下のdependencyを追加すればOK。
<dependency> <groupId>org.icefaces</groupId> <artifactId>icefaces-comps-compat</artifactId> <version>2.0-A2</version> <scope>compile</scope> </dependency>
Mavenなので依存ライブラリも自動的に取り込まれます。取り込まれたライブラリは以下のようになりました。結構いろいろなライブラリが必要なようです。
- icefaces-com-ps-compat-2.0-A2.jar
- icefaces-compat-2.0-A2.jar
- icefaces-2.0-A2.jar
- jsf-api-2.0.2.FCS.jar
- jsf-impl-2.0.2.FCS.jar
- jstl-1.1.2.jar
- servlet-api-2.3.jar
- commons-beanutils-1.8.0.jar
- commons-collections-3.2.jar
- commons-digester-1.8.jar
- commons-fileupload-1.2.1.jar
- commons-logging-1.1.jar
次にweb.xmlです。ICEfaces1.8の頃までは結構色々と設定しなければならなかったと記憶しているのですが、2.0では下記があれば良いようです。
<servlet> <servlet-name>Faces Servlet</servlet-name> <servlet-class>javax.faces.webapp.FacesServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>Faces Servlet</servlet-name> <url-pattern>*.jsf</url-pattern> </servlet-mapping>
もしICEfacesで用意しているcssなどを利用したい場合は、さらに下記を追記する必要があります。
<servlet> <servlet-name>Resource Servlet</servlet-name> <servlet-class>com.icesoft.faces.webapp.ResourceServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>Resource Servlet</servlet-name> <url-pattern>/xmlhttp/*</url-pattern> </servlet-mapping>
ICEfacesのcssは下記のコードで参照することが可能です。
<ice:outputStyle href="/xmlhttp/css/rime/rime.css"/>
ICEfacesの設定はこれだけで良いのですが、実際にxhtmlを実装してみて気がついたこと。FacesMessageを利用してエラーメッセージを表示しているのですが、bodyタグをice:outputBodyにしておかないとf:messagesタグにエラーメッセージが表示されないようです。
例:
Javaソースコード中で下記のようにエラーメッセージを設定している場合
FacesContext ctx = FacesContext.getCurrentInstance(); ctx.addMessage(null, new FacesMessage("エラーです。")));
- h:body -> 表示されない
- ice:outputBody -> 表示される
あとは、ICEfacesを利用した場合にf:ajaxタグがうまく動作してないように感じられるぐらい。今のところ、f:ajaxタグは部分再描画にしか利用していないので、非同期で画面を再描画してくれるICEfacesにすべてをお任せする形で良いのかもしれません。