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

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

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

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

Struts 2

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

受付中

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

nvOSji1879
mami_fullkawa.

総合スコア2

Java

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

Struts 2

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

1回答

0グッド

1クリップ

407閲覧

投稿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

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

以下のような質問にはグッドを送りましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

グッドが多くついた質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

2022/10/29 15:37

こちらの質問が他のユーザーから「問題・課題が含まれていない質問」という指摘を受けました。

回答1

3

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

総合スコア10791

YT0014, Luice, m.ts10806👍を押しています

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

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

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

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

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

ただいまの回答率
86.12%

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

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

質問する

関連した質問

同じタグがついた質問を見る

Java

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

Struts 2

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