JSF 1.1のサンプルをTomcat5上で動かしてみる

このページで扱うサンプルは、Backing Bean 1個だけのプログラミングで実装する、 大変簡単なWebアプリケーションです。 Backing Bean (Managed Beanとも言い、両者は同じ意味らしいです)とは、 StrutsでいうアクションフォームBeanみたいなものです。 基本的な処理であれば、アクションに相当するクラスをプログラミングすることなく、 Webアプリケーションを作ることができます。
また、作るJSPページも1つだけです。 つまり、同じJSPに業務処理の入力と処理結果を繰り返し再表示する形になります。 業務パラメータの入力も業務処理結果の出力も、 Backing Beanのプロパティとして格納されます。
ここでは、J2SE SDK 1.4.2_x、Jakarta Tomcat 5.0.xをインストール済みとし、 これらを使います。

  1. まず、通常のJ2EE Webアプリケーションと同様、 コンテキストルートに当たるディレクトリ(ここでは"app01"とします)を作り、 その中にWEB-INF、WEB-INF/lib、WEB-INF/classesディレクトリを作ります。
  2. JSF 1.1 RI(Reference Implementation)に入っている、次のjarファイルを取り出して、 WEB-INF/libに置きます。
    • jsf-api.jar
    • jsf-impl.jar
    • commons-beanutils.jar
    • commons-collections.jar
    • commons-digester.jar
    • commons-logging.jar
    • jstl.jar
    • standard.jar
  3. Backing Beanを開発します。 ここで開発するアプリケーションは、シンプルながら大変実用的?なものです。 2つの日付をYYYYMMDD形式で入力すると、その間の日数を返すというものです。 入力プロパティは2つの日付、startDateとendDate、 出力プロパティは日数です。日数は普通intなのですが、 画面の表示上、intでは「何も表示しない」ということができないので、 文字列(String)で返すようにしています。

    package jsfcl01.beans;
    
    import java.io.Serializable;
    import java.text.ParseException;
    import java.text.SimpleDateFormat;
    import java.util.Date;
    
    public class PeriodBean implements Serializable {
         private String startDate;
         private String endDate;
         
        /**
         * @return Returns the endDate.
         */
        public String getEndDate() {
            return endDate;
        }
        
        /**
         * @param endDate The endDate to set.
         */
        public void setEndDate(String endDate) {
            this.endDate = endDate;
        }
        
        /**
         * @return Returns the startDate.
         */
        public String getStartDate() {
            return startDate;
        }
        
        /**
         * @param startDate The startDate to set.
         */
        public void setStartDate(String startDate) {
            this.startDate = startDate;
        }
        
        /**
         * startDateプロパティの値とendDateプロパティの間の差を日数で返します。
         * @return
         */
        public String getPeriod(){
            if(getStartDate() == null || getEndDate() == null){
                return "";
            }
            SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd");
            long msec;
            try {
                Date d1 = format.parse(getStartDate());
                Date d2 = format.parse(getEndDate());
                msec = Math.abs(d1.getTime() - d2.getTime());
            } catch(ParseException ex){
                return "";
            }
            return String.valueOf(msec / (24 * 60 * 60 * 1000));
        }
    }
    

    Backing Beanはごく普通のJava Beanです。 但し、サーブレット/APIでいう一般のBean(本来のBeanより決まりが厳格でない)と異なり、 java.io.Serializableを実装する必要があります。
  4. 次に、作ったBacking Beanを登録します。 これは、次のようなWEB-INF/faces-config.xmlを作って行います。 このファイルには、JSP間のフローも書くのですが、 このアプリケーションでは単一のJSPを毎回再描画するので、それは今回書いていません。

    <?xml version="1.0"?>
    <!DOCTYPE faces-config PUBLIC
      "-//Sun Microsystems, Inc.//DTD JavaServer Faces Config 1.1//EN"
      "http://java.sun.com/dtd/web-facesconfig_1_1.dtd">
    
    <faces-config>
      <managed-bean>
        <managed-bean-name>Period</managed-bean-name>
        <managed-bean-class>jsfcl01.beans.PeriodBean</managed-bean-class>
        <managed-bean-scope>session</managed-bean-scope>
      </managed-bean>
    </faces-config>
    

  5. そして、WEB-INF/web.xmlは次のようになります。

    <?xml version="1.0"?>
    <!DOCTYPE web-app PUBLIC
      "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
      "http://java.sun.com/dtd/web-app_2_3.dtd">
    
    <web-app>
      <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>
      </servlet-mapping>
    </web-app>
    

    JSFでは、Strutsと異なり、JSPカスタムタグのTLD(タグライブラリデスクリプタ) がJARファイルの中に入っているので、WEB-INFにTLDを配置する必要がありません。 最低限、web.xmlとfaces-config.xmlだけ配置すれば動作します。 なおfaces-config.xmlのファイル名やパスは、web.xmlのFacesServletのパラメータで変更できます。
  6. JSPファイルを作ります。 置き場所は通常のJSPと同じくどこでも構いませんが、ここではコンテキストルートに当たる位置に、 そのまま置きます。ファイル名はperiod.jspとでもします。

    <%@ page contentType="text/html;charset=Windows-31J" %>
    <%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %>
    <%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %>
    <html>
    <head><title>サンプル</title></head>
    <body>
    <f:view>
    <h2>サンプル</h2>
    <h:form>
    日付1:
    <h:inputText id="sdate" value="#{Period.startDate}"/>
    〜
    日付2:
    <h:inputText id="edate" value="#{Period.endDate}"/>
    <br/>
    <h:commandButton value="計算"/>
    <p>日数=<h:outputText id="output" value="#{Period.period}"/></p>
    </h:form>
    </f:view>
    </body>
    </html>
    

  7. 以上で準備は完了です。JSFのサンプルに従うと、 faces/*というURLパターンのときに独自の処理が行われるようになっているので、 ここでもTomcatを起動して、http://localhost/app01/faces/period.jsp にアクセスして、動作を確認します。

Server Side Java Index Top

(first uploaded 2004/10/31 last updated 2006/03/15, URANO398)

テレワークならECナビ Yahoo 楽天 LINEがデータ消費ゼロで月額500円〜!
無料ホームページ 無料のクレジットカード 海外格安航空券 海外旅行保険が無料! 海外ホテル