Page
131. 例によって、網掛けの部分が今回修正を加えた部分です。<%@ taglib prefix="html" uri="/WEB-INF/struts-html.tld" %>
ここでは、struts-html.tld というタグライブラリ定義ファイルに定義されているタグライブラリの使用を宣言しています。
このタグライブラリは、Strutsで提供されているタグライブラリです。この宣言をすることで、prefixがhtml:というタグ ライブラリをしようすることができるようになります。
<html:html>
・・・
</html:html>
<html:html>タグは、ユーザのLocaleオブジェクトから、適切な言語属性を持つ<html>タグを生成します。
<html:form action="/notice/notice_regist.do" scope="request" >
<html:form>タグは JSP ファイルの中で Struts と連携して動作する<form>タグを生成します。action 属性には、*.do が指定されたときには、struts-tutorial_plus.xml で定義した ActionMapping を呼び出します。ここでは、
/notice/notice_regist
という名前で定義されているActionMappingが呼び出されます。上で編集した、struts-tutorial_plus.xmlと見比べ てみてください。action属性で拡張子を省いた値が、struts-tutorial_plus.xmlの<action>タグで指定したpath属性 の値と同じということが確認できると思います。
scope属性は、ActionFormインスタンスの生存期間を設定します。
Page
132 Copyright 2005 株式会社NTTデータ イントラマート All rights Reserved.Source 3.6-b
<C:/imart/doc/imart/WEB-INF/classes/notice/imart_struts/
NoticeRegistForm.java>
package notice.imart_struts;
import javax.servlet.http.HttpServletRequest;
import org.apache.struts.action.ActionError;
import org.apache.struts.action.ActionErrors;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionMapping;
/**
* @author NTTDATA intra-mart *
*/
public class NoticeRegistForm extends ActionForm { private String title;
private String content;
/**
* デフォルトコンストラクタ */
public NoticeRegistForm() { super();
}
/**
* Returns the content.
* @return String */
public String getContent() { return content;
}
/**
* Returns the title.
* @return String */
public String getTitle() { return title;
}
/**
Page
133. * Sets the content.* @param content The content to set */
public void setContent(String content) { this.content = content;
}
/**
* Sets the title.
* @param title The title to set */
public void setTitle(String title) { this.title = title;
} /**
* @see org.apache.struts.action.ActionForm#validate(ActionMapping, HttpServletRequest) */
public ActionErrors validate(ActionMapping arg0, HttpServletRequest arg1) { ActionErrors errors = new ActionErrors();
if(title != null && title.equals("")){
ActionError error = new ActionError("title_null_error");
errors.add(ActionErrors.GLOBAL_ERROR, error);
}
if(content != null && content.equals("")){
ActionError error = new ActionError("content_null_error");
errors.add(ActionErrors.GLOBAL_ERROR, error);
}
return errors;
}
}
Page
134 Copyright 2005 株式会社NTTデータ イントラマート All rights Reserved.まず、NoticeRegistFormクラスのプライベート変数である、title と content に対する setter メソッドと getter メソッド が記述されています。これは、notice_regist_struts.jsp からページ引数として渡される属性名に対応しています。
次に、validate メソッドは、入力チェックを行うためのメソッドです。ここでは、タイトルと内容が空のときに、エラーを 返しています。返り値には ActionErrors クラスのインスタンスが返却されます。
ここで、struts-tutorial_plus.xml の<action>タグの内容を振り返ってみましょう。
<action path = "/notice/notice_regist"
name = "NoticeRegistForm"
validate = "true"
scope = "request"
input = "/notice_regist_struts.jsp"
type = "notice.imart_struts.NoticeRegistAction" />
エラーが発生したときは、<action>タグの中で、input属性に指定されたパスの JSPファイルが呼ばれます。ここで は、掲示板登録画面自身を指定していますので、インプットチェックに引っかかったときには掲示情報をなにも登 録せず、元の画面に戻るようになっています。