執筆のきっかけ
最初にJavaを業務で触れた際のフレームワークが「Struts1」でした![]()
現在はSpring系が主流ですが、保守案件やフレームワーク移行等で稀に触れる機会があると思います。
この記事では、Java/Struts初学者向けに、基本とつまずきやすいポイントをまとめたいと思います![]()
前提
この記事は以下の方を想定した内容となります![]()
- Java / Struts1 初学者
Struts1とは?
Struts1は「MVCモデル」を基本とし、主にwebアプリケーションの開発を効率よく行えるフレームワークです。
正式名称はApache Strutsです。
Struts1は2013年にサポートが終了しています。
Struts2というバージョンが異なるフレームワークもありますが、本記事ではStruts1を対象としてまとめています。
(以下より、Struts1を"Struts"と表記しています)
ざっくりとした役割は、以下のイメージと理解しています![]()
| 役割 | 内容 |
|---|---|
| Model | 業務ロジックを処理する担当 |
| View | JSP(画面)描画を行う担当 |
| Controller | リクエストからModel・Viewをつなぐ担当 |
全体の処理の流れ
Strutsの大まかな処理の流れは以下のイメージです![]()
① ブラウザからリクエスト(/login.do)
② ActionFormに値が詰められる
③ Actionクラスが呼ばれる
④ 処理を実行
⑤ forwardで遷移先を決定
⑥ JSPが表示される
ざっくりとした構成
① struts-config.xml
画面遷移の設定ファイル
「どのURLで、どの処理を呼び、どこに遷移するか」を管理しています。
<struts-config>
<form-beans>
<form-bean name="loginForm" type="com.xxx.LoginForm"/>
</form-beans>
<action-mappings>
<action path="/login" type="com.xxx.LoginAction" name="loginForm">
<forward name="success" path="/home.jsp"/>
</action>
</action-mappings>
</struts-config>
② ActionForm
入力データ管理担当
画面(JSP)から送られてきた入力値を受け取ります。
public class LoginForm extends ActionForm {
private String username;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
}
③ Action
メイン処理担当
Formを受け取り、実際の業務処理を実行します。
public class LoginAction extends Action {
public ActionForward execute(ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response) {
LoginForm loginForm = (LoginForm) form;
String user = loginForm.getUsername();
return mapping.findForward("success");
}
}
④ JSP
画面表示担当
処理結果を画面に表示します。
<html:form action="/login">
<html:text property="username"/>
<html:submit value="ログイン"/>
</html:form>
つまずいたポイント
① 「画面遷移しない」問題
ちゃんと設定したはずなのに画面遷移しない...
Actionクラスにブレークポイントを貼っても呼ばれたことを確認できない。
原因
- forward名のタイポ
- pathの指定ミス
- struts-config.xmlの設定漏れ
なかなか遷移してくれないと焦りから更にはまってしまうこともありましたが、
結局はこれらの凡ミスであることが大半なため落ち着いて見直しましょう![]()
② 値がフォームに入らない
原因
- property名が一致していない
NG例
<html:text property="username"/>
private String userName;
値がなかなか取れずにはまり、原因はプロパティ名のタイポというオチは
実装を初めて間もない頃は特にやりがちでした。
少し慣れてきたと思っても、冷静に確認しながら実装しましょう![]()
③ Actionにクラス変数を持ってしまう
よくやってしまった経験がありますが、
Actionにクラス変数(フィールド)を持たせてはなりません。
public class loginAction extends Action {
private String tempName; //NG
}
理由
Actionクラスは、「シングルトン」という設計になっており、システム全体でインスタンスが1つしか生成されません。
そのため、クラスメ変数(フィールド)に一時データを保持すると、他のリクエストとデータが混ざってしまう不具合が発生します。
不具合の原因になるため、Actionクラスにはフィールドを持たないように実装しましょう![]()
Actionクラスのメソッド内で定義したフィールド(ローカル変数)は問題なく使用可能です![]()
まとめ
Strutsについて私が感じていることをまとめました![]()
- まずは基本となる処理の流れを理解することが重要 (なんとなくで実装してはまった経験)
- XML設定を正確に書く (動かない場合は落ち着いて設定を見直すこと)
- MVCの仕組みが理解できると、他言語・他フレームワークの習得につながる(Spring等)
おわりに
Strutsは今でこそややレガシー寄りのフレームワークの印象ですが、
Webフレームワークの基本構造をStrutsで学習することができました![]()
細かい設定ファイルについてはStruts特有のため一旦置いておくとしても、
処理の概要を理解していた結果、私がその後に触れたSpring Frameworkの知識も多少は吸収が早かったという体感です![]()
雑多に書き記してしまいましたが、私はStrutsで基本が構築できたと感じています。
StrutsからJavaを始める方は少ないかもしれませんが、同じ境遇の方がいましたら参考になると幸いです![]()