Javaに関する様々な情報をご紹介します。

Javaに関する様々な情報をご紹介します。

基本操作

ここでは、Strutsの基本動作、サンプルプログラムの作成について解説します。

実行環境
  • ・WindowsXP Home Edition
  • ・J2SDK 1.4.2_04
  • ・Tomcat 5.0.18
  • ・Struts 1.2.4

基本動作

Strutsの主要構成要素として以下の要素があります。

  • アクション・サーブレット
    ブラウザからの要求を振り分ける制御機能を担っています。
  • アクション・コンフィギュレーション・ファイル
    アクション・サーブレットがどこに要求を振り分ければ良いかが記載されている設定ファイルです。
  • アクション・フォームBean
    ブラウザから送信されるデータを格納している領域です。
  • アクション・クラス
    ブラウザからの要求に基づき、処理を実行する機能を担っています。処理内容によってはStruts外のプログラム(JavaBeans、EJBなど)を呼び出します。
  • JSP
    ブラウザに実行結果を表示する機能を担っています。
Struts_基本
  1. (1)ブラウザからの要求は、まずアクション・サーブレットで受信されます。
  2. (2)アクション・サーブレットはブラウザから送られたデータを該当するアクション・フォームBeanに格納します。
  3. (3)アクション・サーブレットは該当するアクション・クラスを呼び出します。
  4. (4)アクション・クラスは必要に応じてアクション・フォームBeanからデータを参照します。
  5. (5)アクション・クラスは実行結果をアクション・サーブレットに返します。
  6. (6)アクション・サーブレットは実行結果に応じ該当するJSPファイルを呼び出します。
  7. (7)JSPファイルが実行され、ブラウザに実行結果が返されます。
  8. ※1アクション・サーブレットは適宜、アクション・コンフィギュレーション・ファイルを閲覧し、処理の振り先(どのアクション・フォームBean、どのアクションクラスに振り分けるかなど)を決定します。
  9. ※2アクション・クラスは処理内容によっては、Struts外のプログラム(JavaBeans、EJBなど)を呼び出し、実行します。

サンプルプログラム

Strutsを使用したサンプルプログラムを作成します。サンプルプログラムはログイン画面を表示し、OKであればウェルカム画面を、NGであればエラーメッセージを表示するものです。サンプルプログラムは以下の手順で作成していきます。

  1. ブラウザに表示されるJSPファイルの作成。
  2. 入力されたID・パスワードを保持するアクション・フォームBeanの作成。
  3. ID・パスワードの認証処理を行うアクション・クラスの作成。
  4. Struts処理の振り先を決めるアクション・コンフィギュレーション・ファイルの作成。
  5. ファイルの配置。
  6. Tomcatの設定。

※ アクション・サーブレットはStrutsであらかじめ用意されているものを使用します。

1. JSPファイルの作成

作成するJSPファイルはログイン画面(login.jsp)とウェルカム画面(welcome.jsp)の2つです。JSPファイルでは可読性を考慮し、Javaコードをじかに書くのではなく、可能な限りタグライブラリを使用します。

login.jsp

<%-- (1) --%>
<%@ page contentType="text/html; charset=Shift_JIS" %>
<%-- (2) --%>
<%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %>

<html>
<head><title>login画面</title></head>
<body>

<html:errors/>  <%-- (3) --%>

ID・パスワードを入力してください。
<html:form action="/authentication" focus="id">  <%-- (4) --%>
    <html:text property="id" size="16"/>  <%-- (5) --%>
    <br>
    <%-- (6) --%>
    <html:password property="pass" size="16" redisplay="false"/>
    <br>
    <html:submit property="submit" value="送信"/>
    <html:reset value="リセット"/>
</html:form>

</body>
</html>
  1. (1)pageディレクティブを使用し、JSPファイルの属性を指定します。
  2. (2)taglibディレクティブを使用し、JSPファイルで使用するタグライブラリを指定します。ここでは、Strutsであらかじめ用意されているStrutsタグライブラリのうち、struts-html.tldの使用を指定します。prefix属性により、struts-html.tldを使用する場合は、タグにhtmlを指定します。
  3. (3)<html:error/>タグはエラーが生成されている場合は、エラーメッセージを表示し、 エラーが生成されていない場合は、何も表示しないタグです。
  4. (4)<html:form>タグはHTMLの<form>タグとほぼ同様の振舞いをするタグです。action属性はsubmitボタンが押された時の遷移先を指定します。focus属性はこのJSPファイルが開かれた時にどのフォーム項目を初めに選択可能にするかを指定します。
  5. (5)<html:text>タグはHTMLの<input type=text>タグとほぼ同様の振舞いをするタグです。property属性はHTMLのname属性、size属性はHTMLのsize属性と同様の働きをします。
  6. (6)<html:pasword>タグはHTMLの<input type=password>タグとほぼ同様の振舞いをするタグです。redisplay属性は直前に入力した値を再表示するかどうかを指定します。

welcome.jsp

<%@ page contentType="text/html; charset=Shift_JIS" %>
<%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %>
<%@ taglib uri="/WEB-INF/struts-logic.tld" prefix="logic" %>

<logic:notPresent name="id" scope="session">  <%-- (1) --%>
    <logic:redirect forward="fail"/>
</logic:notPresent>

<html>
<head><title>welcom画面</title></head>
<body>

ようこそ
<bean:write name="id" scope="session"/>  <%-- (2) --%>
さん

</body>
</html>
  1. (1)logicタグライブラリの<logic:notPresent>タグはname属性で指定したオブジェクトが生成されていない場合、<logic:redirect>タグで指定されたページへ遷移する処理を行います。 <logic:redirect>タグのforward属性で指定されたキーワードに合致する遷移先のページがアクション・コンフィギュレーション・ファイルに指定されます。 struts-config.xmlファイルの(2)で説明している個所です。
  2. (2)beanタグライブラリの<bean:write>タグはname属性で指定されたオブジェクトが生成されている場合、その値を表示します。ここでは、login.jspファイルの(5)で説明したフォームに入力された値が表示されます。

2. アクション・フォームBeanの作成

アクション・フォームBeanとしてAuthenticationForm.javaを作成します。login.jspで入力された値を保持するプログラムです。

AuthenticationForm.java

package struts;

import org.apache.struts.action.*;

public final class AuthenticationForm extends ActionForm {    //(1)

    //(2)値を保持する変数の宣言
    private String id;
    private String pass;

    //(3)値を操作するアクセスメソッドの宣言
    public void setId(String id) {this.id = id;}
    public String getId() {return id;}
    public void setPass(String pass) {this.pass = pass;}
    public String getPass() {return pass;}

}
  1. (1)ActionFormクラスをスーパークラスとして、AuthenticationFormクラスを宣言します。
  2. (2)login.jspから送信される値を保持する変数を宣言します。
  3. (3)値を操作するアクセスメソッドを宣言します。値を入力するアクセスメソッドはset+変数名(最初は大文字)、値を取り出すアクセスメソッドはget+変数名(最初は大文字)で宣言します。login.jspのタグ内のproperty属性の値、AuthenticationFormクラスの変数名、アクセスメソッド名は統一する必要があります。

3. アクション・クラスの作成

アクション・クラスとしてAuthenticationAction.javaを作成します。login.jspで入力されたID・パスワードが正しいものか判別する処理を記載します。正しくない場合はエラーを生成します。生成されたエラーはlogin.jspファイルの(3)で説明した<html:errors/>タグに表示されます。エラーの表示に使用されるエラーメッセージをapplication.propertiesファイル(メッセージ・リソース・ファイル)に設定します。

AuthenticationAction.java

package struts;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import javax.servlet.ServletContext;
import org.apache.struts.action.*;

public final class AuthenticationAction extends Action {  //(1)
    public ActionForward execute(ActionMapping mapping,
            ActionForm form,
            HttpServletRequest req,
            HttpServletResponse res) {

        HttpSession session = req.getSession();  //(2)
        ActionMessages errors = new ActionMessages();  //(3)

        //(4)アクション・フォームBeanから値の取り出し
        AuthenticationForm authenticationForm
            = (AuthenticationForm)form;
        String id = authenticationForm.getId();
        String pass = authenticationForm.getPass();


        if(!(id.equals("java") && pass.equals("road"))) { //(5)
            errors.add(ActionMessages.GLOBAL_MESSAGE,
                new ActionMessage("errors.login")); //(6)エラー生成
            saveErrors(req, errors); //(7)
            return (mapping.findForward("fail")); //(8)遷移先の指定
        } else {
            session.setAttribute("id", id); //(9)
            return (mapping.findForward("success"));  //(10)遷移先の指定
        }
    }
}
  1. (1)Actionクラスをスーパークラスに指定して、AuthenticationActionクラスを宣言します。
  2. (2)getSessionメソッドを使用し、HttpSessionオブジェクトを取得します。
  3. (3)ActionMessagesオブジェクトのerrosを生成します。
  4. (4)アクション・フォームBeanからID・パスワード情報を取り出し、それぞれ変数id・passに格納しています。
  5. (5)if文により、IDがjava、パスワードがroadの場合は正常処理を行い、そうでない場合はエラー処理を行います。
  6. (6)addメソッドにより、エラーを生成します。第一引数にはエラーを識別する任意の文字列を、第二引数にActionMessageオブジェクトを指定します。ActionMessageクラスのコンストラクタに指定された"errors.login"は、 application.propertiesファイルに指定されるエラーメッセージを参照します。
  7. (7)saveErrorsメソッドを使用し、エラーメッセージを保存します。
  8. (8)エラー処理の場合の遷移先をreturnメソッドで指定します。 "fail"にマッピングした遷移先がアクション・コンフィギュレーション・ファイルに指定されています。
  9. (9)正常処理の場合、setAttributeメソッドを使用し正常処理されたID情報を保存します。welcome.jspファイルの(2)の個所に値が表示されます。
  10. (10)正常処理の場合の遷移先をreturnメソッドで指定します。 "success"にマッピングした遷移先がアクション・コンフィギュレーション・ファイルに指定されています。

application.properties

# AuthenticationAction.javaの(6)で生成されるエラーの
# エラーメッセージを指定します。
errors.login=<font color="red">id password is invalid.</font><br>

4. アクション・コンフィギュレーション・ファイルの作成

アクション・コンフィギュレーション・ファイル(struts-config.xml)を作成します。login.jspファイルからの遷移情報、AuthenticationAction.javaファイルからの遷移情報など、Struts処理に関わる制御情報を指定します。

struts-config.xml

<?xml version="1.0" encoding="Shift_JIS"?>
<!DOCTYPE struts-config PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 1.2//EN"
"http://struts.apache.org/dtds/struts-config_1_2.dtd">

<struts-config>

    <!-- (1)アクション・フォームBeanの指定 -->
    <form-beans>
        <form-bean
                name="AuthenticationForm"
                type="struts.AuthenticationForm"/>
    </form-beans>

    <!-- (2)JSPからの遷移先指定 -->
    <global-forwards>
        <forward name="fail" path="/login.jsp"/>
    </global-forwards>

    <!-- (3)アクション・クラスの振る舞いを指定 -->
    <action-mappings>
        <action path="/authentication"
                    type="struts.AuthenticationAction"
                    name="AuthenticationForm"
                    scope="session">
            <forward name="success" path="/welcome.jsp"/>
            <forward name="fail" path="/login.jsp"/>
        </action>
    </action-mappings>

    <!-- (4)メッセージ・リソース・ファイルの指定 -->
    <message-resources parameter="resources.application"/>

</struts-config> 
  1. (1)アクション・コンフィギュレーション・ファイル内で使用されるアクション・フォームBeanの名前を指定します。name属性に使用される名前を、type属性にアクション・フォームBeanのクラス名を指定します。
  2. (2)JSPファイルから呼び出される、遷移先を指定します。name属性で指定される"fail"がJSPファイルから呼び出された場合、login.jspファイルに遷移します。welcome.jspファイルの(1)で"fail"を呼び出しています。
  3. (3)アクション・クラスが使用するアクション・フォームBeanの指定、アクション・クラスからの遷移先を指定します。
    <action>タグのpath属性には各ファイルから呼び出される際のアクション・クラスの名前を指定します。login.jspファイルの(4)でアクション・クラスauthenticationを呼び出しています。type属性にはアクション・クラスのクラス名を、name属性には関連するアクション・フォームBeanを指定します。ここでは、(1)で指定したAuthenticationFormを指定しています。
    <forward>タグでは、アクション・クラスから呼び出されるページの遷移先を指定します。name属性で指定された"success"がアクション・クラスから呼び出された場合welcome.jspファイルに遷移します。 AuthenticationAction.javaファイルの(10)で"success"を呼び出しています。"fail"はAuthenticationAction.javaファイルの(8)で呼び出されています。
  4. (4)メッセージ・リソース・ファイル(application.properties)の配置先を指定しています。ディレクトリ情報を.(ピリオド)で指定します。拡張子のpropertiesは指定する必要はありません。

5. ファイルの配置

サーブレット/JSPコンテナで動作させるために作成したプログラムファイル、Strutsに必要なファイルを配置していきます。

  1. コンテキストのルートディレクトリ作成
    今回はサーブレット/JSPコンテナにTomcatを使用します。コンテキストのルートディレクトリSExamを、$CATALINA_HOME\webapps配下に作成します。$CATALINA_HOMEはTomcatのインストールディレクトリを表します。
  2. Struts構成ファイルの設置
    Strutsのダウンロードファイルに含まれるstruts-blank.warファイルをjarコマンドで解凍します。
    E:\jakarta-struts-1.1\jakarta-struts-1.1\webapps>jar xvf struts-blank.war
    解凍してできたWEB-INFディレクトリをコンテキストのルートディレクトリSExam配下に設置します。
  3. プログラムファイルのコンパイル
    作成したプログラムの内、AuthenticationForm.java、AuthenticationAction.javaをコンパイルします。コンパイルする際、CLASSPATHにservlet-api.jar、struts.jar、カレントディレクトリを設定します。servlet.jarはTomcatインストールディレクトリ配下に、struts.jarはstruts-blank.warを解凍したWEB-INFディレクトリ配下にあります。
    D:\JAVA>javac -classpath "C:\java\Tomcat 5.0\common\lib\servlet-api.jar";"C:\java\Tomcat 5.0\webapps\SExam\WEB-INF\lib\struts.jar";. *.java
    
    D:\JAVA>
  4. 作成したプログラムファイルの設置

    以下の配置図に従い、今回作成したプログラムファイルなどを設置します。struts-blank.warのWEB-INFに含まれていたjarファイル、tldファイルなどはそのまま配置しておきます。

    Struts_配置

6. Tomcatの設定

Tomcat上でプログラムを動作させるためにTomcatの設定ファイルweb.xml、コンテキスト.xmlを設定します。web.xml、コンテキスト.xmlの詳細についてはJavaの道:Tomcat(プログラム配置・実行)を参照してください。

  1. web.xmlの設定
    web.xmlにはコンテキストにアクセスした際、初めに表示されるファイルを指定します。<welcome-file>~</welcome-file>タグの要素としてlogin.jspを指定します。 web.xmlは$CATALINA_HOME\webapps\SExam\WEB-INFディレクトリ配下にあります。

    web.xml

    <welcome-file-list>
        <welcome-file>login.jsp</welcome-file>
    </welcome-file-list>
  2. コンテキスト.xmlの設定
    コンテキスト.xmlはコンテキストの設定を行うファイルです。ファイル名はコンテキスト名.xml(ここでは、SExam.xml)になります。<context>タグのdocBase属性は$CATALINA_HOME\webapps\SExamの値です。$CATALINA_HOMEを実行環境に沿った値に置き換えて設定してください。SExam.xmlはデフォルトの設定では$CATALINA_HOME\conf\Catalina\localhostディレクトリ配下に設置します。

    SExam.xml

    <Context path="/SExam"
                                docBase="docBase="C:\java\Tomcat 5.0\webapps\SExam"
    reloadable="false"/>

動作確認

Tomcatを起動させhttp://localhost:8080/SExamにアクセスします。以下のような画面が表示されれば、プログラムが正常に動作しています。ID「java」、パスワード「road」を入力し、正しくログイン処理が行われること、誤ったID・パスワードを入力しエラー処理が行われることなどを確認してください。

Struts_動作確認

2基本動作