okinawa

勉強メモ

Struts基本のキ

Struts1と2の内容が混在しています。完全に自分用メモです。

Struts2

参考

qiita.com

リクエスト送信→受け取り→レスポンスまでの流れ

jspのformタグからリクエスト送信

f:id:dodosu:20210909133214p:plain

index.jsp

<body>
        <s:form action="message">
            <s:textfield name="age"/>
            <s:submit value="年齢送信"/>
</body>

s:~~~はStrutsのタグライブラリ。

  • s:form action="message":struts.xmlのaction name="message"が呼び出される
  • <s:textfield name="age"/>:アクションクラスのprivate int ageに代入される
struts.xmlで動きを制御
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
    <!-- アクションのパッケージ定義 -->
    <package name="default" extends="struts-default">
        <action name="message" class="sample.MessageAction" method="ageMessage">
            <result name="fortune">/view/sample/fortune.jsp</result>
            <result name="good">/view/sample/good.jsp</result>
        </action>
    </package>
</struts>
  • action name="message":呼び出し用の名前
  • class="sample.MessageAction":呼び出されるクラス
  • method="ageMessage":呼び出されるメソッド
  • <result name="fortune" /view/sample/fortune.jsp:return "fortune"すると呼び出されるjsp
  • <result name="good" /view/sample/good.jsp:return "good"すると呼び出されるjsp
アクションクラスが呼び出される

MessageAction.java

package sample;

public class MessageAction {
    private int age;

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String ageMessage() {
        if (this.age >= 70) {
            return "good";
        }
        return "fortune";
    }
}

struts.xmlに対応したActionクラス、Actionメソッドを作る。

  • private int age:index.jspの<s:textfield name="age"/>の値が入る。勝手にgetter/setterが動くらしい
  • return "good":/view/sample/good.jspが呼び出される
  • return "fortune":/view/sample/fortune.jspが呼び出される
リクエストで受け取った値をjspで表示

f:id:dodosu:20210909133306p:plain

good.jsp

<body>
<s:property value="age"/>才。よく生きましたね。<br>あなたの人生に幸あらんことを。
</body>

fortune.jsp

<body>
<s:property value="age"/>才、あなたの人生に幸あらんことを。
</body>

簡易まとめ

jspでAction名「message」を指定して呼び出す

struts.xml内で「message」を検索

→該当のActionメソッドが呼び出される

→Actionメソッドがreturn forutune or good する

struts.xml内でresultName「'fortune' or 'good'」を検索

→fortune.jsp or good.jspに遷移

jsp内の<s:property value="age"/>は、Actionクラスのage変数から取ってくる

Struts1

参考

非常にわかりやすいのでこっち見たほうが早いかも↓

atmarkit.itmedia.co.jp

Actionクラス

MVCで言うところのController。Actionクラスを継承する。

下記がActionクラスとActionメソッドの基本の書き方。

public class SampleAction extends Action {
  public ActionForward execute (ActionMapping map, ActionForm form, HttpServletRequest request, HttpServletResponse response) {
    SampleAction newForm=(SampleForm)form;
    request.setAttribute("newForm",newForm);
    return map.findForward("success");
  }
}

ActionFormクラス

MVCのModelクラス。ActionFormクラスを継承。

public final class SampleForm extends ActionForm {
  private String name;
  public void setName(String name) {this.name=name;}
  public String getName() {return name;}
}

WebページのForm要素にあるパラメータ値を格納するためのJavaBean。

引用元:2. ActionForm | TECHSCORE(テックスコア)

ActionFormを継承してFormクラスを作るとHTMLのformタグから送られた値をget/setできる。

struts-config.xml

の重要な部分だけ。

下記サイトの画像による説明がめっちゃわかりやすいのでそれを見よう↓

参考:Strutsフレームワークの「枠組み」を学ぶ:Strutsを使うWebアプリケーション構築術(2)(2/2 ページ) - @IT

  • form-beans:Formクラスの場所と名前を定義するだけ。
  • action-mappings:アクションの定義
    • path:jspからの呼び出し名
    • name:アクションクラスが実行された時に実行されるアクションフォームBeanの名前
    • type:アクションクラスの完全修飾名
    • scope:request/sessionのどちらかを設定できる。
  • forward
    • name:Actionクラスでreturn "success"すると呼び出される。
    • path:呼び出されるファイル
<struts-config>
    <form-beans>
   <form-bean name="SampleForm" type="struts.SampleForm" />
  </form-beans>
  
  <action-mappings>
   <action path="/SampleAction" type="struts.BeginProcess"
     name="SampleForm" scope="request">
      <forward name="success" path="/result.jsp" />
    </action>
  </action-mappings>
</struts-config>

ActionMessagesクラス

ページにメッセージを渡すクラス。

エラーメッセージ表示とかに使う。

ActionErrorsというクラスもあり、使い方もほぼ同じ。

メッセージ本文はmessages.propertiesとかから取得。

messages.add(プロパティ, ActionMessage);// メッセージを追加
saveMessages(request, messages); // メッセージを保存

参考:いまさらながらStruts – ActionMessages | 雑廉堂の雑記帳

ActionMappingクラス

struts-config.xmlでアクション名とか決めてる所。

ActionMapping.getAttributeとかでname要素を取得できるんだと思う。

// こんな感じでアクションメソッドの引数にとりあえず入れておく
public ActionForward executeAction(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response)

参考:Strutsリファレンス<action-mapping>

.doの謎

.doが付いてたり、付いてなかったりで混乱した。

  • <html:form>要素内だと.doいらない。自動でつく。
  • その他は.doいる。

.doをつけないとアクションサーブレットが呼ばれない。

呼ばれないとstruts-config.xmlを経由しないのでAction呼べない。

つまり直リンクで画面遷移しかできない。

参考↓ 下のほう、まとめの上あたりに書いてある

atmarkit.itmedia.co.jp

簡易まとめ

jspでActionのpath名「/SampleAction」で呼び出す

struts.xml内で「/SampleAction」を検索

→該当のActionクラスのexecuteメソッドが呼び出される

→同時に「name="SampleForm"」の部分で、SampleFormクラスに値がセットされる。

→Actionメソッドがreturn success する

struts.xml内でforward name「success」を検索

→result.jspに遷移

もっと新しい技術を触りたいなあ(´;ω;`)