Strutsで遊ぶ
トップ 戻る
Strutsとは、・・・
フレームワークである。
大まかな枠組みは出来てるから、必要な部分は個別に作ってくれ、といった感じだろうか。
ダウンロードしたら解凍。解凍すると
\jakarta-struts-1.1\webapps に *.war がいくつかあるが、サンプルとして
struts-example.war を動かしてみる。
【PR】ネットワークを基礎から学びたい!
最小限の構成となっている struts-blank.war をもとに何か作ることにする。
struts-blank.war をコピーして名前を myworks-struts.war としてデプロイする。
Tomcatの起動→ web.xmlの読み込み
↓
struts-config.xmlの読み込み
↓
各種設定の読み込み
といった順番で読まれる。というか、web.xml に struts-config.xml を読むように書かれている。
まずはテキストボックスに入力した文字列を受け取って、次のページに表示するだけの簡単なサンプルを作ってみる。
とりあえず入力チェックも行うことにする。(ヌルか空白だったら次の画面へ行かずエラーメッセージを表示することにする)
新規に以下の4つのファイルを作る。
input.jsp ・・・ 文字列を入力する画面
output.jsp ・・・ 入力した文字列を出力する画面
TestAction.class ・・・ Actionを継承したクラス
(入力したデータを使って画面遷移先などを決めるクラス)
TestActionForm.class ・・・ (入力したデータを持っているクラス。
入力内容のチェックを行い正しいか間違っているかを返すクラスでもある)
jspファイルは \jakarta-tomcat-4.1.29\webapps\myworks-struts\pages 以下に。
classファイルは \jakarta-tomcat-4.1.29\webapps\myworks-struts\WEB-INF\classes 以下に。
(私は面倒なのでソースもclasses内に置いてしまった。
本来 \jakarta-tomcat-4.1.29\webapps\myworks-struts\WEB-INF\src\java だと思う。)
Test01ActionForm.java import javax.servlet.http.HttpServletRequest;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionError;
import org.apache.struts.action.ActionErrors;
public class Test01ActionForm extends ActionForm{
private String msg;
public void setMsg(String msg) {
this.msg = msg;
}
public String getMsg() {
return msg;
}
public ActionErrors validate(ActionMapping mapping,
HttpServletRequest request){
//エラーオブジェクトを作成
ActionErrors errors = new ActionErrors();
//入力データがnullか長さ0の文字列だったらエラー
//"error.msg.required"を返す
if (msg == null || msg.equals("")) {
errors.add("errorMsg", new ActionError("error.msg.required"));
}
return errors;
}
}
Test01Action.java import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionMapping;
public class Test01Action extends Action {
public ActionForward execute(ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response) {
//入力データ(アクションフォーム)を取得
Test01ActionForm formBean = (Test01ActionForm)form;
//ここでアクションホームのデータを使ってどうのこうの・・・
//ビジネスロジックってやつ。
//今回は簡単な例なので何もせず、正常終了
//フォワード先"success"を返す
return (mapping.findForward("success"));
}
}
input.jsp <%@ page contentType="text/html; charset=Shift_JIS" %>
<%@ taglib uri="/tags/struts-html" prefix="html" %>
<html:html locale="true">
<body>
<html:form action="/pages/actionName">
<html:text property="msg" />
<html:submit property="submit" value="送信"/>
</html:form>
<html:errors property="errorMsg" />
</body>
</html:html>
output.jsp <%@ page contentType="text/html; charset=Shift_JIS" %>
<%@ taglib uri="/tags/struts-html" prefix="html" %>
<%@ taglib uri="/tags/struts-bean" prefix="bean" %>
<html:html locale="true">
<body>
<bean:write name="actionFormName" property="msg" scope="request"/>
</body>
</html:html>
コンパイル。・・・失敗。クラスパスの設定を忘れてた。前に作ったバッチファイルを編集する。
set CATALINA_HOME=C:\myfolder\program\tomcat\jakarta-tomcat-4.1.29
set JAVA_HOME=C:\jdk1.3.1_09
set CLASSPATH=%CATALINA_HOME%\common\lib\servlet.jar;%CATALINA_HOME%\webapps\myworks-struts\WEB-INF\lib\struts.jar
PATH C:\myFolder\tomcat\jakarta-tomcat-4.1.29\bin;C:\jdk1.3.1_09\bin
javac Test01Action.java Test01ActionForm.java
(・・・片方だけコンパイルしたい場合、どうやるんだっけ?importか・・・)
【PR】“誌面で学ぶパソコン教室”
コンパイルができたら、
\jakarta-tomcat-4.1.29\webapps\myworks-struts\WEB-INF
にある struts-config.xml を編集する。
これに今作ったJSPやらclassやら、主に画面遷移の仕方を記述する必要がある。
追加したところを赤くしておく。一応編集前にバックアップを取っておく。
struts-config.xml (略)
<form-beans>
<form-bean
name="actionFormName"
type="Test01ActionForm"
/>
</form-beans>
(略)
<action-mappings>
(略)
<action
path="/pages/actionName"
type="Test01Action"
name="actionFormName"
scope="request"
input="/pages/input.jsp"
validate="true">
<forward name="success" path="/pages/output.jsp"/>
</action>
(略)
</action-mappings>
(略)
あともう1つ忘れてた。
\jakarta-tomcat-4.1.29\webapps\myworks-struts\WEB-INF\classes\resources
に
application.properties
というファイルがあり、これにメッセージをまとめて書いておける。
そしてそのメッセージの名前をソースから呼べばメッセージを取得することができる。
これに先ほどの Test01ActionForm.java 内の入力チェックでのメッセージ名、
error.msg.required
を追加する。
application.properties
(略)
# -- Test --
error.msg.required=Message required!!
【PR】IT技術者のために、役立つ実務情報を提供します。
そうすると action="/pages/actionName" を呼ぶように書いてある。
この遷移先が呼ばれたときの設定が struts-config.xml に下のように書いてあり、
<action
path="/pages/actionName"
type="Test01Action"
name="actionFormName"
scope="request"
input="/pages/input.jsp"
validate="true">
<forward name="success" path="/pages/output.jsp"/>
</action>
type="Test01Action"この記述からアクションクラスTest01Actionが呼ばれる。
scope="request"で。(一度遷移したらデータはクリアされる。保持しておきたければsessionとする)
path="/pages/actionName"への遷移を行うと、name="actionFormName"を見て
この遷移で入力されたデータを格納するアクションフォームを認識する。
<form-bean
name="actionFormName"
type="Test01ActionForm"
/>
そして、入力データをセット。
アクションクラスTest01Actionでアクションフォーム(への参照かな?)が作られる。
public ActionForward execute(
ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response) {
Test01ActionForm formBean = (Test01ActionForm)form;
Test01ActionFormのインスタンスformBeanがformを参照するようにすることで
アクションフォームTest01ActionFormを操作できるようになる。(実体はformか?)
また、validate="true"とすることで入力チェックを行う。
(自動的にデータセット後、Test01ActionFormのvalidateメソッドが実行される)
この validateメソッド でエラー(エラーオブジェクトに値がセットされたもの)が返されると input="/pages/input.jsp"
へ遷移するようになっている。
Test01ActionForm の
errors.add("errorMsg" , new ActionError("error.msg.required"));
で、エラーオブジェクト(errors)に "errorMsg" という名前で "error.msg.required" のメッセージが関連付けられる。
"error.msg.required" は application.properties に記述した。(error.msg.required=Message required!!)
(これって結局はセッションにerrorMsgという名前で入ってるのかな?後で調べたい。)
それがinput.jsp の
<html:errors property="errorMsg" />
の記述によって表示される。
入力エラーがないと今回のサンプルはフォワード先を返して終わりである。
Test01Action で
return (mapping.findForward("success"));
フォワード先"success"を返したときの設定を struts-config.xml に書いた。/pages/output.jsp へ遷移する。
<forward name="success" path="/pages/output.jsp"/>
流れはこんなものだろうか・・・。
【PR】技術スキルとビジネススキルの向上、キャリア形成
そういえばJSPのほうは、ほったらかしだった。
とりあえずStrutsタグライブラリを使うと以下のHTMLが生成されたのを記しておく。
input.jsp <html lang="ja">
<body>
<form name="actionFormName" method="post" action="/myworks-struts/pages/actionName.do">
<input type="text" name="msg" value="">
<input type="submit" name="submit" value="送信">
</form>
</body>
</html>
output.jsp ( input.jspで TEST と入力した結果 ) <html lang="ja">
<body>
TEST
</body>
</html>
input.jsp ( 何も入力しなかった結果 ) <html lang="ja">
<body>
<form name="actionFormName" method="post" action="/myworks-struts/pages/actionName.do">
<input type="text" name="msg" value="">
<input type="submit" name="submit" value="送信">
</form>
<UL>
<LI>Message required!!.
</LI></UL>
</body>
</html>
【PR】ネットワークを基礎から学びたい!
strutsはwarを置いてtomcatを起動するだけで解凍され、
サンプルなどにアクセス可能になる。
server.xmlに書いていないのになぜ?
C:\myfolder\program\tomcat\jakarta-tomcat-4.1.29\webapps>jar cvf myworks-struts.war myworks-struts
で作成したstrutsのサンプルをデプロイしてみようと
warファイルを作成した。
別フォルダにtomcatを持っていって、webapps以下に置いて
起動。解凍される、がフォルダ構成がおかしい。
これを手動で直してtomcatを起動しなおすと、起動メッセージが
変わった。どうやら何か中にあるらしい。どれを読んでいるのか?
デプロイしたweb.xmlのファイル名を変更してみる。
起動メッセージが認識していないときのものに戻った。
これか。そういやweb.xmlってtomcat起動時に読み込まれる
設定ファイルだった。
これをうまく書けばserver.xmlに書かなくてもいいわけ?
web.xmlを眺める。わからん。
の初期化パラメータに
<init-param>
<param-name>config</param-name>
<param-value>/WEB-INF/struts-config.xml</param-value>
</init-param>
とある。web.xmlを読んでstruts-config.xmlを
読んでいるようだ。
tomcat起動メッセージと見比べるとよくわかる。
ここで/path=とかの設定がされているので
このおかげでserver.xmlの変更がいらないように見える・・・。
デプロイの件。下のようにやったらできた。
C:\myfolder\program\tomcat\jakarta-tomcat-4.1.29\webapps\myworks-struts>jar cvf myworks-struts.war ./pages ./WEB-INF
tomcat起動中にwarファイルもっていったらデプロイされた。
へぇ~、起動しなおさなくていいんだ。すごいな。
Copyright© 2002-2003 Kasaharan All rights reserved
最終更新:2007年01月14日 18:01