naobe @ ウィキ

Struts1

最終更新:

Bot(ページ名リンク)

- view
管理者のみ編集可
Strutsに戻る


ダウンロード


カスタムタグ

htmlタグ

radio

Strutsの<html:radio>タグにはcheckedという属性がない。。
そんなわけで、チェックは、<html:radio>タグを含んだ
<html:form />に関連付けられたActionForm Beanのラジオボタンの
プロパティにチェックをつけたい値をセットします。

例)
<html:radio property="id" value="1" />
<html:radio property="id" value="2" />
<html:radio property="id" value="3" />
と定義していて、valueが1のラジオボタンにチェックを付けたい場合
ActionForm Beanのプロパティ”id”に”1”をセットしておくと

<input type="radio" name="id" value="1" checked="checked">
<input type="radio" name="id" value="2">
<input type="radio" name="id" value="3">

と、[[HTML]]のコードが生成されます。

【例】
<jsp:setProperty name="menuForm" property="kubun" value="shusiHyouji"/>
                       --> menuFormは、struts-config.xmlで定義。
<tr>
<td><html:radio property="kubun" value="nyuuryoku"/></td><td>入力</td>
<td></td>
</tr>
<tr>
<td><html:radio property="kubun" value="shusiSettei"/></td><td>収支項目設定</td>
<td></td>
</tr>
<tr>
<td><html:radio property="kubun" value="shosaiSettei"/></td><td>収支項目詳細設定</td>
<td></td>
</tr>
<tr>
<td><html:radio property="kubun" value="shusiHyouji"/></td><td>収支表示</td>
<td>


簡単なアプリケーション

初期画面

regist.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib uri="http://struts.apache.org/tags-bean" prefix="bean" %>
<%@ taglib uri="http://struts.apache.org/tags-html" prefix="html" %>
<%@ taglib uri="http://struts.apache.org/tags-logic" prefix="logic" %>

<html:html>
<head><title>追加</title></head>
<body>
<h1>追加</h1>
<html:form action="/registWord">
英語:<html:text property="english"/><br>
日本語:<html:text property="japanese"/><br>
<html:submit property="submit" value="追加"/>
</html:form>
</body>
</html:html>

ライブラリ

以下のファイルをWEB-INF/libにコピー
  • antlr-2.7.2.jar
  • commons-beanutils-1.8.0
  • commons-chain-1.2.jar
  • commons-digester-1.8.jar
  • commons-logging-1.0.4.jar
  • commons-validator-1.3.1.jar
  • oro-2.0.8.jar
  • log4j-1.2.13.jar
  • struts-core-1.3.10.jar
  • struts-taglib-1.3.10.jar
  • struts-tiles-1.3.10.jar

ActionForm継承クラスの作成

画面の入力をBeanにまとめたクラスを作成。以下にregist.jspの入力をBeanにしたクラスを示す。
Beanのプロパティにregist.jspのプロパティ(HTMLのときのname)が設定されていることがわかる。

package suna;

import org.apache.struts.action.ActionForm;

public class WordForm extends ActionForm {

   /** シリアルバージョンID */
   private static final long serialVersionUID = 7580324238159300357L;

   private String english;
    
   private String japanese;

   public String getEnglish() {
       return english;
   }

   public void setEnglish(String english) {
       this.english = english;
   }

   public String getJapanese() {
       return japanese;
   }

   public void setJapanese(String japanese) {
       this.japanese = japanese;
   }
}

Action継承クラスの作成

リクエストを受けて、処理し、JSPへ転送するクラス。

package suna;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.logging.impl.Log4jFactory;
import org.apache.log4j.Logger;
import org.apache.log4j.spi.LoggerFactory;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;

public class RegistWordAction extends Action {

   Logger logger = Logger.getLogger(RegistWordAction.class);
     
   public ActionForward execute(ActionMapping mapping, ActionForm form,
                   HttpServletRequest request, HttpServletResponse response)
       throws Exception {
       
       WordForm wf = (WordForm)form;
       String eng = wf.getEnglish();
       String jap = wf.getJapanese();

       logger.info("eng : " + eng);
       logger.info("jap : " + jap);
       
       return mapping.findForward("success");
   }
}

【注意】eclipse - tomcatでは、log4jのログファイルは、eclipseインストールディレクトリからの相対パスになる。

設定ファイル

【WEB-INF/struts-config.xml】
画面遷移を設定する。
<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE struts-config PUBLIC
         "-//[[Apache]] Software Foundation//DTD Struts Configuration 1.3//EN"
         "http://struts.apache.org/dtds/struts-config_1_3.dtd">
<struts-config>
 <form-beans>
   <form-bean name="wordForm" type="suna.WordForm" />
 </form-beans>
 <action-mappings>
   <!-- /registWord.doを指定したときは、suna.RegistWordActionを実行する -->
       <!-- リクエストを表すビーンは、wordForm(suna.WordForm)になる  -->
   <action path="/registWord" type="suna.RegistWordAction"
       name="wordForm" scope="request">
     <!-- Actionクラスからsuccessが返ったときは、registfinish.jspにフォワードする -->
     <forward name="success" path="/registfinish.jsp" />
   </action>
 </action-mappings>
</struts-config>

【WEB-INF/web.xml】
servletタグと、servlet-mappingタグにstruts専用の設定を追加する。
<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_ID" version="2.4"
xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
         ・
         ・
         ・
<!-- Standard Action Servlet Configuration -->
<servlet>
	<servlet-name>action</servlet-name>
	<servlet-class>
		org.apache.struts.action.ActionServlet
	</servlet-class>
	<init-param>
		<param-name>config</param-name>
		<param-value>/WEB-INF/struts-config.xml</param-value>
	</init-param>
	<load-on-startup>1</load-on-startup>
</servlet>
<!-- Standard Action Servlet Mapping -->
<servlet-mapping>
	<servlet-name>action</servlet-name>
	<url-pattern>*.do</url-pattern>
</servlet-mapping>
</web-app>


バリデータ

設定ファイルのみで、入力チェックを可能にする。

  • ValidatorFormを継承したActionFormクラスを作成する
  • JSPには、クライアントサイドでのチェックを行うには<html:javascript formName="フォーム名" />を含む。
  • バリデーションルールをXMLファイルに記述する

設定

strus-config.xml

  • 最後に、下記にしめすようにstruts-config.xmlの中にバリデータプラグインを設定する
     <plug-in className="org.apache.struts.validator.ValidatorPlugIn">
     <set-property
     property="pathnames"
     value="/org/apache/struts/validator/validator-rules.xml,
         /WEB-INF/validation.xml"/>
     </plug-in>
validation.xmlは、ルール設定ファイル、validation-rules.xmlはルール設定のメタファイル(ルール自体の定義、validation.xmlに設定する値の定義)。validation-rules.xmlは、struts-core-1.X.jarの中にある。

validation.xml

  • 入力チェックルールを設定する。form、field要素で、チェックするフォームフィールドを決定する。
  • field要素のdepends属性で、フィールドに対してチェックするルールを列挙する。ルールは、validation-rules.xmlに設定されているものを設定する
  • msg要素は、固有のメッセージキーを使用する場合に使う。デフォルトのメッセージキーは、validation-rules.xmlのvalidator要素のmsg属性に設定されたものになる。
  • arg要素は、メッセージのプレースフォルダを設定する。key属性は、デフォルトではリソースバンドルのキーになる。resource属性をfalseに設定すると、keyの値が、プレースフォルダになる。
  • key属性に${var:変数名}を設定すると、変数値が返る。
 <form-validation>
   <formset>
     <form name="inputForm">
       <field property="kingaku" depends="required,integer,maxlength">
         <msg name="required" key="inputForm.kingaku.001" />
         <msg name="integer" key="inputForm.kingaku.002" />
         <msg name="maxlength" key="inputForm.kingaku.003" />
         <arg name="maxlength" key="${var:maxlength}" resource="false" position="0"/>
         <var>
           <var-name>maxlength</var-name>
           <var-value>7</var-value>
         </var>
         
       </field>
     </form>
   </formset>
 </form-validation>

入力エラーがあったときの画面遷移の追加

struts-confix.xmlのaction要素にinput属性を追加。
 :例:
 <struts-config>
   ...
   <action-mappings>
     <action path="/sample/productInput"
             type="sample.ProductInputAction"
             name="productForm"
             scope="request"
             input="/sample/productInput.jsp">
     </action>
   </action-mappings>
 </struts-config>

注釈)プリミティブタイプのフォームプロパティを扱うときはアクションサーブレットのconvertNull initパラメータをtrueに設定する。これらの値はデフォルトが0であるため、設定しないときは失敗に終わる。



任意のタイミングで、validateするには

DBへのデータ入力を行わず単に他の画面に遷移する場合は、入力チェックは不要。しかしstrutsのデフォルトのvalidationでは、Actionクラスが動作する前にvalidateしてしまい問題。よってActionクラスの中でのvalidate実行を試みる。

struts-config.xml

validateしない設定にする。
【例】
  <action path="/inputExec" type="suna.screen.kakeibo.input.InputAction"
      name="inputForm" scope="request" validate="false">

Actionクラス修正

Actionform#validate()を実行して、requestのorg.apache.struts.Globals.Globals.ERROR_KEYに戻り値を設定する。
struts-config.xmlにエラー用の画面遷移も追加する。

 public ActionForward execute(ActionMapping mapping, ActionForm form,
 	HttpServletRequest request, HttpServletResponse response) throws Exception {
 
 	InputForm inputForm = (InputForm) form;
 	//実行ボタン押下
 	if(InputForm.EXEC.equals(inputForm.getEventId())) {
 		// 入力チェック
 		ActionErrors errors = inputForm.validate(mapping, request);
 		if(errors != null && errors.get().hasNext()) {
 			// エラーメッセージがあれば、終了
 			request.setAttribute(Globals.ERROR_KEY, errors);
           // エラーが発生したときの結果コード
 			resultCode = InputForm.SHUSI_INPUT_GAMEN;
 		}
 	}
 			・
 			・
 	return mapping.findForward(resultCode);
 }

フォームのプロパティをエラーメッセージに表示するには

Validatorのuserguideを見ると、メッセージの引数には、リソースのキーかvalidation.xmlに設定したvarしか出力できない。


例外処理

struts-config.xmlに以下のタグを追加。

<global-exceptions>
	<exception type="例外クラス" key="メッセージID" path="遷移先のパス" />
</global-exceptions>

keyは、<message-resources parameter="resource.message" />に設定したメッセージID


【記述例】
<global-exceptions>
	<exception type="java.lang.Exception" key="message1" path="WEB-INF/jsp/Error.jsp" />
</global-exceptions>
人気記事ランキング
ウィキ募集バナー