Strutsを使ってみよう

作成: 2004/10/13 マイクロ情報通信 田中 晃

JavaでWebアプリケーションを開発するのに便利なフレームワーク「Struts」を利用した
Webアプリケーション開発手順をここに記します。

※開発環境などはあらかじめインストールされていることを前提としています。
また、Strutsのバージョンは1.1を想定しています。

今回作ってみるWEBアプリの概要

ログイン画面(login.jsp)でIDとPasswordを入力し、
認証失敗ならエラーページ(loginError.jsp)へ飛び、
認証がOKならログイン成功画面(loginSuccess.jsp)へ進む。
次のページ(nextPage.jsp)には次のページ(nextPage.jsp)へ再度アクセスするボタンがついており、
そのボタンを押すと セッションが切れない限り 次のページ(nextPage.jsp)を読み込む。
セッションが切れている場合はエラーページ(loginError.jsp)へ飛ぶ。
_________
| ログイン画面 |
|  login.jsp .|
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
    ↓  認証失敗    _________
   .認証――――――――→|  エラーページ |
    |         .| loginError.jsp |
    |           ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
    |認             ↑
    |証             |
    |成             |
    |功             |
    ↓              |
__________         |
| ログイン成功画面|         |
| loginSuccess.jsp |         |
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄         |
    |              |
    |              |
    ↓       エラー    |
 セッションチェック――――――――→|
    |              |エ
    |成             |ラ
    |功             ||
    ↓              |
__________ ボタン押下    |
| 次のページ   |――――→セッションチェック
| nextPage.jsp  |         |
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄         |
    ↑               |OK
    |_______________|


このように極めて単純なWEBアプリですが、 この一連の動作が今後のWEBアプリ開発のキモとなるのは言うまでもありません。

画面の作成

画面用のJSPファイルを作成します。

ログイン画面

配置場所 
WEBアプリのルート/pages/login.jsp
ソース
<%@ page language="java" contentType="text/html; charset=Shift_JIS" %>
<%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %>

<html:html>
<head>
<title>ログイン画面</title>
</head>
<body>
<html:errors/>
<html:form action="/login" method="post">
ユーザID : <html:text property="id"/><br>
パスワード: <html:password property="password"/><br>
<html:submit value="ログイン"/>
</html:form>
</body>
</html:html>

エラー画面

配置場所 
WEBアプリのルート/pages/loginError.jsp
ソース
<html:html>
LoginError...
</html:html>

ログイン成功画面

配置場所 
WEBアプリのルート/pages/loginSuccess.jsp
ソース
<%@ page language="java" contentType="text/html; charset=Shift_JIS" %>
<%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %>

<html>
LoginSuccess!!
<html:form action="/nextpage" method="post">
<html:submit value="次のページ"/>
</html:form>
</html>

次のページ画面

配置場所 
WEBアプリのルート/pages/nextPage.jsp
ソース
<%@ page language="java" contentType="text/html; charset=Shift_JIS" %>
<%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %>

<html>
This is NextPage...
<html:form action="/nextpage" method="post">
<html:submit value="次のページ"/>
</html:form>
</html>

Actionクラスの作成

処理を行うActionクラスを作成します。

LoginAction.java

ログイン認証を行うActionクラスです。
ログイン画面で「ログイン」ボタンが押されたときに実行されます。
配置場所 
WEBアプリのルート/WEB-INF/hoge/LoginAction.java
ソース
package hoge;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionErrors;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.DynaActionForm;

public class LoginAction extends Action {
	
	public ActionForward execute(
			    ActionMapping mapping,
			    ActionForm form,
			    HttpServletRequest request,
			    HttpServletResponse response)
			    throws IOException, ServletException {

		//DynaFormからメッセージを取得
		DynaActionForm df = (DynaActionForm)form;
		String id = (String)df.get("id");
		String password = (String)df.get("password");
		System.out.println("id=" + id + " password=" + password);
		
		//IDが"foo"、Passwordが"bar"の場合、認証OKということにしておく
		//実際はこのデータベースの認証テーブルへアクセスしていろいろやるわけですw
		if(id.equals("foo") && password.equals("bar")){
			// セッションを開始します
			HttpSession session = request.getSession(true);
			// セッションに情報を設定します
			session.setAttribute("id" , id);
			//論理名"success"に該当するページへ移動(struts-config.xmlを参照)
			return mapping.findForward("success");	
		}else{
			//論理名"error"に該当するページへ移動(struts-config.xmlを参照)
			return mapping.findForward("error");
		}

	}
	
}

NextAction.java

セッションチェックを行うActionクラスです。
ログイン成功画面で「次のページ」ボタンが押されたときに実行されます。
配置場所 
WEBアプリのルート/WEB-INF/hoge/NextAction.java
ソース
package hoge;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionErrors;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.DynaActionForm;

public class NextAction extends Action {
	
	public ActionForward execute(
			    ActionMapping mapping,
			    ActionForm form,
			    HttpServletRequest request,
			    HttpServletResponse response)
			    throws IOException, ServletException {

		//セッションを取得します
	    	HttpSession session = request.getSession(false);
	    	
		//セッション変数に格納された"id"をチェックする
		//nullではなければセッションは確立されていることにしておく。。。
		if(session.getAttribute("id") !=null){
			//論理名"success"に該当するページへ移動(struts-config.xmlを参照)
	    		return mapping.findForward("success");
		}else{
			//論理名"error"に該当するページへ移動(struts-config.xmlを参照)
	    		return mapping.findForward("error");
		}
	    	
	}
}

struts-config.xmlの編集

Strutsの設定ファイルstruts-config.xmlを編集します。
ここは最も肝心な部分かも知れません。。。
eclipseプラグインとかで自動化するツールがありそうな気もしますがここではとりあえず手作業でやりながら知識を深めてみましょう。。。
配置場所 
WEBアプリのルート/WEB-INF/struts-config.xml

<form-beans>に定義を追加

<form-beans>
	
	<!--
	loginForm用の設定
	ログイン画面のidpasswordをプロパティとして定義します。
	-->
	
	<form-bean
		dynamic="true"
		name="loginForm"
		type="org.apache.struts.action.DynaActionForm">
		<form-property name="id" type="java.lang.String"/>
		<form-property name="password" type="java.lang.String"/>
	</form-bean>
	
	
	<!--
	nextForm用の設定
	-->
	
	<form-bean
		dynamic="true"
		name="nextForm"
		type="org.apache.struts.action.DynaActionForm">
	</form-bean>
	
</form-beans>

<action-mappings>に定義を追加

<action-mappings>
	
	<!--
	LoginAction用の設定
	path : 論理パス
	name : Form名
	type : 呼び出すActionクラス
	input    : validateするページ
	validate : validateするかしないか
	<forward name="論理名" path="遷移する画面(jsp)のパス" />
	ここではログイン成功時の画面をsuccess、失敗のときをerrorと定義しています。
	-->
	
	<action path="/login"
		name="loginForm"
		type="hoge.LoginAction"
		input="/pages/login.jsp" validate="true">
		<forward name="success" path="/pages/loginsuccess.jsp" />
		<forward name="error" path="/pages/loginerror.jsp" />
	</action>
	
	
	<!--
	NextAction用の設定
	path : 論理パス
	name : Form名
	type : 呼び出すActionクラス
	<forward name="論理名" path="遷移する画面(jsp)のパス" />
	ここではログイン成功時の画面をsuccess、失敗のときをerrorと定義しています。
	-->
	
	<action path="/nextpage"
		name="nextForm"
		type="hoge.NextAction">
		<forward name="success" path="/pages/nextpage.jsp" />
		<forward name="error" path="/pages/loginerror.jsp" />
	</action>
	
</action-mappings>

★validateを行う場合★
<message-resources>に定義を追加

<struts-config>
・・・(省略)

	<message-resources parameter="ApplicationResources" />
	<plug-in className="org.apache.struts.validator.ValidatorPlugIn">
		<set-property property="pathnames" value="/WEB-INF/validator-rules.xml,/WEB-INF/validation.xml" />
	</plug-in>

</struts-config>


★validateを行う場合★
ApplicationResources.properties(プロパティファイル)の定義

Struts1.1のValidatorプラグインは.propertiesファイルでエラーメッセージを管理しています。
validateでエラーメッセージを使う場合はこのファイルも編集する必要があります。
※native2asciiコマンドなどを使って必ずUnicodeで保存してください!

ApplicationResources.properties
errors.required ={0}はかならず入力してください。
errors.maxlength={0}は{1}文字以内で入力してください。
errors.integer ={0}は整数で入力してください。
errors.invalid ={0}は正しい形式で入力してください。 

★validateを行う場合★
validation.xmlの定義

<?xml version="1.0" encoding="Shift_JIS" ?>
<!DOCTYPE form-validation PUBLIC  "-//Apache Software Foundation//DTD Commons Validator Rules Configuration 1.0//EN" "http://jakarta.apache.org/commons/dtds/validator_1_0.dtd">
<form-validation>

	<formset>

		<!-- ログイン画面(loginForm)のvalidation -->
		<form name="loginForm">

			<!-- loginForm.id -->
			<field property="id" depends="required,maxlength">
				<arg0 key="ユーザID" resource="false" />
				<arg1 name="maxlength" key="${var:maxlength}" resource="false" />
				<var>
					<var-name>maxlength</var-name>
					<var-value>16</var-value>
				</var>
			</field>

			<!-- loginForm.password -->
			<field property="password" depends="required,maxlength">
				<arg0 key="パスワード" resource="false" />
				<arg1 name="maxlength" key="${var:maxlength}" resource="false" />
				<var>
					<var-name>maxlength</var-name>
					<var-value>8</var-value>
				</var>
			</field>

		</form>

	</formset>

</form-validation>

以上で準備完了です!

実行してみよう

ではTomcatを再起動し、以下のURLへアクセスしてみましょう。
http://localhost:8080/アプリ名/pages/login.jsp
ログイン画面が現れますので以下のことを試してみましょう。
以上のチェック項目がすべてtrueなら成功です!
▲このページの一番上へ