ラベル java webapp の投稿を表示しています。 すべての投稿を表示
ラベル java webapp の投稿を表示しています。 すべての投稿を表示

2009年11月12日木曜日

JSF 2.0/h:datatable/Paginator

h:datatable の ページ切り替えを考えてみた。 基本的には、以下のような Paginator になるんじゃないだろうか。
package study.jsf.pagination;

import java.util.List;

public abstract class Paginator<T> {
   private final int size; 
   private int page = 0;

   public Paginator(int size) {
      this.size = size;
   }
   public abstract List<T> currentElements();

   public abstract int itemsCount();
   
   public int start() {
      return page * size; 
   }
   public int size() { 
      return size; 
   }
   public boolean isHasNextPage() {
      return (page + 1) * size() + 1 <= itemsCount();
   }
   public void nextPage() {
      if (isHasNextPage()) page++;
   }
   public boolean isHasPreviousPage() {
      return page > 0;
   }
   public void previousPage() {
      if (isHasPreviousPage()) page--;
   }
   public int getPageSize() { 
      return size(); 
   }
}
ManagedBean など、これを使う側で itemsCount()と currentElements()メソッドを実装し、型パラメータに具体型を与える。適当すぎるサンプルだが、例えば以下のように書く。
package study.jsf.pagination;

import 略

@ManagedBean(name="memberList")
@SessionScoped
public class PersonListBean {
   private static final List MEMBERS_LIST = Arrays.asList(
      new Person(1, "Wilhelm"),
      new Person(2, "Hendrik"),   
      new Person(3, "Pieter"),   
      new Person(4, "Antoine"),
      new Person(5, "Pierre"),
      new Person(6, "Marie"),
      new Person(7, "John"),
      new Person(8, "Philipp")   
   ); 
   private Paginator paginator = new Paginator(3) {
      @Override
      public List currentElements() {
         return MEMBERS_LIST.subList(start(), 
               Math.min(start() + size(), itemsCount()));
      }
      @Override
      public int itemsCount() {
         return MEMBERS_LIST.size();
      }
   };
   public Paginator getPaginator() {
      return paginator;
   }
   public List getMembers() {
      return paginator.currentElements();
   }
   public void next() {
      paginator.nextPage();
   }
   public void previous() {
      paginator.previousPage();
   }
}
faces ファイルはこんな感じになる
<?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:f="http://java.sun.com/jsf/core"
   xmlns:h="http://java.sun.com/jsf/html">
<h:head>
   <title>ajax-dataTable</title>
</h:head>
<h:body>
  <h:form>
   <h:dataTable 
      id="partyTable" 
      value="#{memberList.members}"
      var="member">
     <h:column>#{member.id}</h:column>
     <h:column>#{member.name}</h:column>
   </h:dataTable>
   <h:commandLink id="prevLink" action="#{memberList.previous}"
      value="前 #{memberList.paginator.pageSize}件"
      rendered="#{memberList.paginator.hasPreviousPage}">
      <f:ajax execute="@this" render="@form"/>
   </h:commandLink>
   &#160; 
   <h:commandLink
      id="nextLink" action="#{memberList.next}"
      value="次#{memberList.paginator.pageSize}件"
      rendered="#{memberList.paginator.hasNextPage}">
      <f:ajax execute="@this" render="@form"/>
   </h:commandLink>
  </h:form>
</h:body>
</html>
実行すると、Person オブジェクトから 3つずつ(3ページ目は2つ)がテーブルに表示され、また 3ページ目以外では「次3件」リンクが、1ページ目以外では「前3件」リンクが表示される。 あと考える事は以下のような感じか
  • currentElements() は List<T>じゃなくて、DataModel<T>を返す方がいいかもしれない。
  • 呼び出し側では無駄に currentElements()を呼ばずにすむような仕組みを考える必要があるかも

JSF 2.0/JCR 2.0/JSR-250/JNDI

JSF 2.0 と JCR 2.0(Jackrabbit)を併用してみる。 JDBC の DataSource に JNDI 経由でアクセスするのと同じやり方で、JCR の Repository を扱いたい。ただし ManagedBean が Repository にアクセスするときには、JNDI は使わずに、標準アノテーション(JSR-250)によりインジェクトされたリソースとして扱いたい。 ■ 前提
  • プロジェクトディレクトリ直下に、既に Jackrabbit の repository.xml と repository フォルダがある。
  • このリポジトリの /hello/world@message に、文字列"Hello, World!"が格納されている。(前ポスト参照)
■ プロジェクトを作る
  • 適当に Dynamic Web Project を作って Maven 管理にする(例えばこんなやり方)。(Maven プロジェクトを作って Dynamic Web Project ファセットを与えるやり方でも可。)プロジェクト名はここでは "jcr-tomcat" とした。
  • pom.xml の dependency に 以下を指定。
    groupIdartifactIdversion
    javax.jcrjcr2.0
    org.apache.jackrabbitjackrabbit-core2.0-beta1
    org.slf4jslf4j-log4j121.5.5
    com.sun.facesjsf-api2.0.2-b02
    com.sun.facesjsf-impl2.0.2-b02
  • META-INF 下に、Tomcat の context.xmlを書く
    <?xml version="1.0" encoding="UTF-8"?>
    <Context>
       <Resource name="jcr/repository" auth="Container" type="javax.jcr.Repository"
          factory="org.apache.jackrabbit.core.jndi.BindableRepositoryFactory"
          configFilePath="C:/devel/ws/java/eclipse/standards1/jcr-tomcat/repository.xml" 
          repHomeDir="C:/devel/ws/java/eclipse/standards1/jcr-tomcat/repository" />
    </Context>
  • お決まりのファイルを用意する。
    • log4j.propertiesを適当に書く
    • web.xml に faces 関連のサーブレット定義を追加。
■ コードを書く 以下のような ManagedBean を書いてみる。
package mypackage;

import 略

@ManagedBean
public class JcrBean {
   private static final String USERNAME = "username";
   private static final char[] PASSWORD = "password".toCharArray();

   @Resource(name="jcr/repository", type=Repository.class)
   private Repository repository;
   
   public String getGreet() {
      Session session = null;
      try {
         session = repository.login(
                   new SimpleCredentials(USERNAME, PASSWORD));
         Node node = session.getNode("/hello/world");
         return node.getProperty("message").getString();
      } catch (RepositoryException e) {
         return e.getMessage();
      } finally {
         if (null != session) session.logout();
      }
   }
}
この管理 bean を使う jcrtext.xhtml を書く。
<!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:f="http://java.sun.com/jsf/core"
   xmlns:h="http://java.sun.com/jsf/html">
   <h:body>#{jcrBean.greet}</h:body>
</html>
■ 確認
  • ブラウザでhttp://localhost:8080/jcr-tomcat/jcrtest.faces を見てみる
  • "Hello, World!"が表示されたら JSF から Jackrabbit まで疎通OK
■ 後記
  • ここでやった JNDI のセッティングは、アプリ毎に別々のリポジトリを使うやり方だけど、共有するとか、他にも構成のパターンがある。(参考URL
  • 試行錯誤しながらやってると、いろんなタイミングでしょっちゅう.lock ファイルが残って面倒くさい。本番で使うときは、なんか考えておいた方がいいかも。

2009年11月9日月曜日

JSF2.0/jBPM4.1/Maven2/WTP/Galileo

JSF2.0 と JBoss jBPM の併用。

Eclipse 3.5 上 で、WTP と m2eclipse を使ってやってみる。試しに、jBPM のプロセス定義をJSF 2.0の表で表示してみる。

■ 使用プロダクト

  • Eclipse 3.5 Galileo
  • Maven 2.2.1
  • WTP 3.1.1
  • MySQL 5.0.45
  • JSF 2.0.1
  • jBPM 4.1

■ プロジェクトの作成

  • 名前:jsf-jbpm2 で Dynamic Web Projectを作成。
  • プロジェクトのコンテキストメニューから [Maven]->[Enable Dependency Management]を実行
  • pom.xml の dependencies に以下を追記
    <dependency>
       <groupId>mysql</groupId>
       <artifactId>mysql-connector-java</artifactId>
       <version>5.1.10</version>
    </dependency>
    <dependency>
       <groupId>org.jbpm.jbpm4</groupId>
       <artifactId>jbpm-jboss4</artifactId>
       <version>4.1</version>
       <exclusions>
          <exclusion>
             <groupId>juel</groupId>
             <artifactId>juel</artifactId>
          </exclusion>
       </exclusions>
    </dependency>
    <dependency>
       <groupId>javax.faces</groupId>
       <artifactId>jsf-api</artifactId>
       <version>2.0.1-FCS</version>
    </dependency>
    <dependency>
       <groupId>javax.faces</groupId>
       <artifactId>jsf-impl</artifactId>
       <version>2.0.1-FCS</version>
    </dependency>
  • もし、なんかの jar が 無いとか言われたら repositories に、例えば以下の URL とかを追加するといいかもしれない。ダメかもしれない。 http://repository.jboss.com/maven2/
  • プロジェクトの Properties の[Java EE Module Dependencies] で、Maven Dependencies にチェックを入れる

■ JSF 2.0 の確認

  • Servers ビューで jsf-jbpm2 プロジェクトを追加する
  • WebContent 直下に以下の test.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">
    <h:body>
       <h:outputLabel for="text1">
          <h:outputText id="text1" value="Hello, World!" />
       </h:outputLabel>
    </h:body>
    </html>
    
  • Servers ビューから Tomcat v6.0 を起動する
  • 適当なブラウザで、http://localhost:8080/jsf-jbpm2/test.faces を見てみる
  • ”Hello, World!”が表示されて、ソースにも怪しいところが無ければ成功。
■ jBPMの確認

※ 以下、すでにプロセス定義がいくつか登録されている前提

  • ソースフォルダ resources を新規作成する
  • resources 下で、以下のファイルを作成する
    • jbpm.cfg.xml
      <?xml version="1.0" encoding="UTF-8"?>
      <jbpm-configuration>
         <import resource="jbpm.default.cfg.xml" />
         <import resource="jbpm.jpdl.cfg.xml" />
         <import resource="jbpm.tx.hibernate.cfg.xml" />
         <import resource="jbpm.identity.cfg.xml" />
      </jbpm-configuration>
      
    • jbpm.hibernate.cfg.xml (MySQL サービスが立ち上がっている前提。データベースは適当でOK。)
      <?xml version="1.0" encoding="utf-8"?>
      
      <!DOCTYPE hibernate-configuration PUBLIC
                "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
                "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
      
      <hibernate-configuration>
        <session-factory>
          <property name="hibernate.dialect">org.hibernate.dialect.MySQLInnoDBDialect</property>
          <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
          <property name="hibernate.connection.url">jdbc:mysql://localhost/jbpm</property>
          <property name="hibernate.connection.username"></property>
          <property name="hibernate.connection.password"></property>
          <property name="hibernate.hbm2ddl.auto">verify</property>
          <property name="hibernate.format_sql">true</property>
      
          <mapping resource="jbpm.repository.hbm.xml" />
          <mapping resource="jbpm.execution.hbm.xml" />
          <mapping resource="jbpm.history.hbm.xml" />
          <mapping resource="jbpm.task.hbm.xml" />
          <mapping resource="jbpm.identity.hbm.xml" />
      
        </session-factory>
      </hibernate-configuration>
      
    • log4j.properties を適当に書く
      log4j.rootLogger=DEBUG, CONSOLE
      log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
      log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
      log4j.appender.CONSOLE.layout.ConversionPattern=%d{HH:mm:ss,SSS} %-5p %C{1} : %m%n
      log4j.logger.org.jbpm=DEBUG
      log4j.logger.org.hibernate=INFO
      
  • ソースフォルダ src を新規作成する
  • 以下のクラスを src 下に作成する
    package mypackage;
    
    import 略
    
    @ManagedBean(name="definitionList")
    public class ProcessDefinitions {
       public List<ProcessDefinition> getItems() {
          ProcessEngine engine = Configuration.getProcessEngine();
          RepositoryService rs = engine.get(RepositoryService.class);
    
          return rs.createProcessDefinitionQuery().list();
       }
    }
  • resources 下に以下のようにmessages.properties を作成する
    idLabel=ID
    keyLabel=KEY
    nameLabel=NAME
    versionLabel=VERSION
    
  • WebContent 下に、以下のようにprocessDefinitions.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"
       xmlns:f="http://java.sun.com/jsf/core">
    <h:head>
       <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
       <title>rules</title>
       <style>
       .list-background{border-collapse:collapse;border:1px solid grey;}
       .list-header{background-color:Plum;border:1px solid grey;width:96px;}
       .col-center{border-right:1px solid grey;}
       .row-odd{background-color:moccasin;}
       .row-even{background-color:mistyRose;}
       </style>
    </h:head>
    <h:body>
       <f:loadBundle basename="messages" var="msg" />
       <h:dataTable id="processDefinitionList"
          columnClasses="col-center,col-center,col-center"
          headerClass="list-header" rowClasses="row-odd,row-even"
          styleClass="list-background" value="#{definitionList.items}" 
          var="definition"
          cellpadding="0"
          cellspacing="0">
          <h:column>
             <f:facet name="header">#{msg.idLabel}</f:facet>
             #{definition.id}
          </h:column>
          <h:column>
             <f:facet name="header">#{msg.keyLabel}</f:facet>
             #{definition.key}
          </h:column>
          <h:column>
             <f:facet name="header">#{msg.nameLabel}</f:facet>
             #{definition.name}
          </h:column>
          <h:column>
             <f:facet name="header">#{msg.versionLabel}</f:facet>
             #{definition.version}
          </h:column>
       </h:dataTable>
    </h:body>
    </html>
    

・以下のように内容が表示されれば、JSF と jBPM の両方がちゃんと使えてる事になる。

2009年11月8日日曜日

JSF 2.0/tomahawk/失敗

JSF2.0 で Tomahawk を使おうとして諦めたレポート。

■ 作業 A
  1. JSF2.0 を使った簡単な Webアプリを用意する。
  2. Tomcat v6.0で正常動作を確認。
  3. pom.xml で tomahawk 1.1.9を指定する。
  4. 再デプロイを試みる。
  5. 以下の例外発生で、デプロイ失敗。
      java.lang.NoClassDefFoundError: com/sun/facelets/tag/jsf/ComponentHandler


■ 作業 B
  • FACELETを使わないので、以下のパラメータを web.xml で指定して再デプロイ
    <context-param>
    <param-name>javax.faces.DISABLE_FACELET_JSF_VIEWHANDLER</param-name>
    <param-value>true</param-value>
    </context-param>
  • 5)の例外は出ずにデプロイは成功する。
  • 2)と同じことをやって動作確認失敗。以下のような例外。
      java.lang.IllegalStateException: レスポンスをコミットした後でフォワードできません


■ 作業 C
  • 作業 Bの変更を戻す
  • WEB-INF/faces-config.xml を作成。
  • 5)の例外は出ずにデプロイは成功するが、作業 Bと同じ結果。


上記作業と逆に、JSF 1.2 + Tomahawk のWebアプリを作って、それをJSF 2.0に移行しようとしても、結局、上と同じになる。

・・・もういい。諦めた。

2009年10月29日木曜日

JSF2.0/Ajax/Tomcat6.0/Eclipse3.5

JSF2.0 ajax の、簡単な getting started 的なものを作ったので記録。 ■ 環境
  • Eclipse 3.5
  • Tomcat v6.0:(Eclipse の Servers ビューでこの定義を追加しておく)
  • JSF 2.0:mojarra-2.0.0-RC-binaryに入ってるやつ。https://javaserverfaces.dev.java.net/ から持ってこられる。
■ 作る
  • Dynamic Web Project を作成。プロジェクト名はここでは trial1 とした。Tomcat の場合、デフォルトでこの名前がコンテキストパスに使用される。
  • WebContent/WEB-INF/lib に、mojarra-2.0.0-RC-binaryに含まれてる jsf-api.jar とjsf-impl.jar を入れる。
  • web.xml に、以下のような faces 関連のサーブレット定義を追加する。
    <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>/faces/*</url-pattern>
      <url-pattern>*.faces</url-pattern>
    </servlet-mapping>
    
  • WebContent 下に pages ディレクトリを作り、以下の内容の update.xhtml を作る
    <!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">
      <h:head>
        <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"/>
        <title>Ajax-ServerTime</title>
      </h:head>
      <h:body>
        <h:form id="form1" prependId="false">
          <h:outputScript name="jsf.js" library="javax.faces" target="head"/>
          <h:outputText id="textServerTime" value="#{serverTimeBean.time}"/>
          <br/>
          <h:commandButton id="update" value="update"
              onclick="jsf.ajax.request(this, event, {execute:'update', render: 'textServerTime'}); return false;"
              actionListener="#{serverTimeBean.update}"/>
        </h:form>
      </h:body>
    </html>
    
  • 適当なパッケージに以下のように ServerTimeBeanクラスを作る
    package net.xad.web.jsf20.trial1;
    
    import java.text.SimpleDateFormat;
    import java.util.Date;
    
    import javax.faces.event.ActionEvent;
    import javax.faces.bean.ManagedBean;
    import javax.faces.bean.SessionScoped;
    
    @ManagedBean(name = "serverTimeBean")
    @SessionScoped
    public class ServerTimeBean {
       private String serverTime = "";
       public ServerTimeBean() {
          updateTime();
       }
       public String getTime() {
          return serverTime;
       }
       public void update(ActionEvent ae) {
          updateTime();
       }
       private void updateTime() {
          SimpleDateFormat format = new SimpleDateFormat("yy/MM/dd HH:mm:ss");
          serverTime = format.format(new Date());
       }
    }
  • Eclipse の Servers ビューから、[Add and Remove...]でTomcat サーバにプロジェクトを追加
■ 確かめる Servers ビューから、Tomcat サーバを起動する。確認には FireFox から FireBugを使ってみる。次のような URLを打ち込むと下図のような初期表示が得られる。 http://localhost:8080/trial1/pages/update.faces F12 で FireBug を開いて、[Net]プルダウンで Enabled に切り替えると、通信内容がモニタリングされるようになる。ここで update ボタンを押下すると、時刻表示が更新されると同時に、FireBug のペインにも一行追加される。これを展開する。 Post タブでリクエストの内容が表示される。 Response タブでは、返された XML が表示される。読みづらいので整形すると以下のようになる。
<?xml version="1.0" encoding="utf-8"?>
<partial-response>
  <changes>
    <update id="textServerTime">
      <![CDATA[<span id="textServerTime">09/10/29 11:26:33</span>]]>
    </update>
    <update id="javax.faces.ViewState">
      <![CDATA[5735020966984487302:3643923077241363467]]>
    </update>
  </changes>
</partial-response>
HTML タブで現在の DOMツリーを表示して、id=textServerTime の<span>要素を観察すると、レスポンスで返されたXML の小片を使って、HTML の小部分のみを更新しているらしいのが分かる。 後ついでに、デバッガで ServerTimeBean の呼ばれ方なども観察してみる。 ■ 課題 maven (m2eclipse) とWTPが上手く連携しないので、今回は WTP のみでやってみた。maven で作ったプロジェクトを Dynamic Web Project にする事も、Dynamic Web Project に maven の依存性管理を与えることも、どちらもできないことは無いけど、面倒な上に、その後の eclipse からの起動がすんなり行かなくて更に一手間二手間かかる。依存性管理はなるべく maven に全部任せたいけど、なかなかうまくいかない。

2009年10月14日水曜日

JSF2.0 追試

JSF 2 を試したくて、developerworks に載ってる記事を追試してみた。

サンプルコードをdownload して、readme.txtを読んでやってみたが、動かすまでに一苦労あったので、動かすまでの手順などを書いておく。

■ javac でビルドしようとして失敗

サンプルコードをダウンロードすると Readme.txt があって動かす手順があるが、さっぱり動かない。動かす以前に、JavaファイルとGroovyファイルがあり、互いのクラスファイルを参照していたりして、そもそもビルドの仕方がよく分からない。

Groovyファイルのコンパイルってどうするんだっけ?
何やら ant タスクもあるらしいが、記事中でEclipse プラグインについて言及があったので、それを使うことにした。となるとGroovyのコンパイルだけ Eclipse というのも変だし、いっそ Eclipse ベースでやってみる事にした。

■ Eclipse ベースに移行
と言うわけで Dynamic Web Project を作成(すでにGroovyプラグインが入っている前提)。これだけではGroovyファイルがコンパイルできないので、プロジェクトのコンテキストメニューから Configure>Convert to Groovy Project を選択。Groovy nature が追加されてプロジェクトのアイコンがちょっと変わる。output フォルダはWEB-INFしたのclassesを指定しておく。あとビルドパスの設定で、Server Runtime>Apache Tomcat 6.0を追加する。


■ 必要ファイルをプロジェクトに追加

サンプルコードの必要ファイルを、Eclipse上のプロジェクトに以下のようにコピー。
  • places下のフォルダdecorators, pages, resources, sections, templatesとindex.htmlを
    WebContent 下にコピー
  • WEB-INF直下の3つのxmlを WEB-INF直下にコピー
  • src 以下のファイルをsrc下にコピー


続いて以下の jarをネットで漁るなどして集めて、WEB-INF/lib 下にコピー。
  • asm-all-2.2.jar
  • commons-beanutils-1.8.0.jar
  • commons-codec-1.3.jar
  • commons-fileupload-1.1.1.jar
  • commons-httpclient-3.1-alpha1.jar
  • commons-io-1.2.jar
  • groovy-1.6.5.jar
  • gwt-servlet.jar
  • hibernate3.jar
  • jsf-api.jar (mojarra-2.0.0-RC-binary)
  • jsf-impl.jar (同上)
  • jstl-1.1.0.jar
  • mysql-connector-java-3.1.13-bin.jar
(サンプルコードのreadmeで指定されているjarと若干違うが、Tomcat のバージョンでも違ったりするのか、そのままだと動かなかった(ClassNotFountException等)ので、試行錯誤して動く組合せをみつけた。)

■ 動かしてみる
http://localhost:8080/places/にアクセスするとユーザ名とパスワードを聞いてくる。なんのユーザ名かわからなかったが、ソースを見るとユーザ名:William, パスワードjsfで固定らしい。それを入力するとログイン成功。

「Go」ボタンを押すと地図が表示される。最初は例外が出るばかりで困ったが、スタックとレースを見ながら上述のようにjar の組合せを変えるとだんだん動くようになった。まだ何やら怪しい動きが多いが、ここまでくるとデバッガやログでいろいろ調べられる。徐々に改造してみようと思う。

■ とりあえずの雑感
  • Eclipse で Groovy と java が同じプロジェクトで同じようにコンパイルできて、ぜんぜん区別なく使えるのは初めて知った。Java プロジェクトに導入する敷居はかなり低いはず。特にEDSLに使えそう。上級プログラマが EDSL を開発して、若干スキルの低いプログラマが業務仕様をEDSL を用いて実装するような形で効果がありそう。
  • 最初の JSFはいまいち盛り上がらなかったけど、JSF2はどうなんだろうなあ。Struts 2とどっちがいいだろう。有用性とか生産性が同程度なら当然 JSF だけど、そのためにもやっぱり正式リリースをさっさと済ましてほしい。