質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Struts 2

Apache Struts 2は、Apache Strutsプロジェクトにて開発されているオープンソースのJavaベースのWebアプリケーションフレームワークです。Sturts1に比べ、設定ファイルの削減、依存性の注入、POJO等の改善がなされています。

Q&A

1回答

899閲覧

フレームワーク(Struts2)の挙動について知りたいです。

nvOSji1879

総合スコア2

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Struts 2

Apache Struts 2は、Apache Strutsプロジェクトにて開発されているオープンソースのJavaベースのWebアプリケーションフレームワークです。Sturts1に比べ、設定ファイルの削減、依存性の注入、POJO等の改善がなされています。

0グッド

1クリップ

投稿2022/10/29 15:19

前提

Javaについての学習を行い、フレームワーク(struts2)で簡単なWebアプリを作成してみましたが、フレームワークが裏側で何を実行しているのかまったく理解できません。
下記の抜粋したソースコードだと画面でフォームに入力した文字列が、testAction.javaのString firstNameに代入されますが、なぜgetter, setterを書くだけでそうなるのか知りたいのですが、Eclipseでデバッグしようと思い、Actionクラスにブレイクポイントを置いても既に、値が格納されているため、過程を知ることができません。

また、以下の投稿に「リクエストパラメータに対するActionクラスのフィールドとget/setメソッドがなかった場合は、そのパラメータは破棄されます。」と記載がありますが、これもどこ(どのクラス?)で判断されているのか知りたいです。
https://qiita.com/alpha_pz/items/d377f832ee662e2bd50c

該当のソースコード

[test.jsp]

<s:form action="testAction"> <s:textfield name="firstName" label="Your Name"></s:textfield> <s:submit value="Submit"></s:submit> </s:form>

[testAction.java]

public class TestAction { String firstName; public String execute() { System.out.println("My name is " + firstName); return "success"; } public String getFirstName() { return firstName; } public void setFirstName(String firstName) { this.firstName = firstName; } }

試したこと

以下のURLからStruts 2.3.37のSource
・struts-2.3.37-src.zipをダウンロードしてみましたが、ファイルの数が多すぎでどこを見ればよいのか見当もつきませんでした。
https://struts.apache.org/download.cgi

知識に乏しく抽象的な質問になってしまいましたが、ご回答いただければ幸いです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

html (jsp がどのような html に展開され、ブラウザが form をどう送信するか)、サーブレット(送信されたデータをどう扱えるか)、リフレクション(オブジェクトのフィールドやメソッドの調査・使用)等が分かれば想像が付くと思います。


リフレクションとしては

java

1package teratail_java.q_8p0wb9a9zo3w32; 2 3import java.lang.reflect.Constructor; 4import java.lang.reflect.Method; 5 6public class Main { 7 public static void main(String[] args) throws Exception { 8 if(args.length != 2) { 9 System.err.println("Usage: Main <class-name> <parameters>"); 10 System.err.println(" parameters: name1=value1&name2=value2&..."); 11 System.exit(1); 12 } 13 14 Class<?> actionClass = Class.forName(args[0]); 15 Constructor<?> constructor = actionClass.getConstructor(); 16 Object instance = constructor.newInstance(); 17 18 for(String arg : args[1].split("&")) { 19 String[] tokens = arg.split("="); 20 if(tokens.length == 2) { 21 String setterName = "set" + tokens[0].substring(0,1).toUpperCase() + tokens[0].substring(1); 22 Method method = actionClass.getDeclaredMethod(setterName, String.class); 23 if(method != null) method.invoke(instance, tokens[1]); 24 } 25 } 26 27 Method method = actionClass.getDeclaredMethod("execute"); 28 method.invoke(instance); 29 } 30}

といったコードで、

java

1package teratail_java.q_8p0wb9a9zo3w32; 2 3public class TestAction { 4 String firstName; 5 public String execute() { 6 System.out.println("My name is " + firstName); 7 return "success"; 8 } 9 public String getFirstName() { 10 return firstName; 11 } 12 public void setFirstName(String firstName) { 13 this.firstName = firstName; 14 } 15}

という(質問に出た)クラスを用いるように指定すると

plain

1> java teratail_java.q_8p0wb9a9zo3w32.Main teratail_java.q_8p0wb9a9zo3w32.TestAction firstName=ABC 2My name is ABC

となります。 Main クラスには TestAction クラスに関することは全く書かれていませんが、クラス名等を文字列として渡すことで、オブジェクトの生成・メソッドの検索・実行が出来るということです。
ここでは setter を名前しか見ていませんが、アノテーションで探したり、フィールドでも同様のことが出来ます。
そしてこの main のように"有ったらそれで処理する"形であれば、もし TestAction に setFirstName が無かったら処理せずに次のパラメータに移ってしまいますので、結果的に「そのパラメータは破棄されます」。


クラスに値を設定しているツールの個所を調べるのでしたら、ツールが setFirstName を呼んで値を設定しているのであれば、 setFirstName 内にブレイクポイントを設定し、止まったらステップで進めて『どこに戻るか』で追えると思います。
セッターが無く直接フィールドに設定しているようであれば、コンストラクタで止めてその戻り先を追う手もあると思います。
またデバッガを使わなくても(setFirstName やコンストラクタで)スタックトレースを表示させるという方法もあります。

java

1(new Throwable()).printStackTrace();

投稿2022/10/29 15:38

編集2022/10/31 01:56
jimbe

総合スコア12545

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問