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

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

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

JSP(Java Server Pages)とは、ウェブアプリケーションの表示レイヤーに使われるサーバーサイドの技術のことです。

Java

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

Struts 2

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

Q&A

解決済

2回答

5361閲覧

Struts2 ScopedModelDrivenについて

cray

総合スコア29

JSP

JSP(Java Server Pages)とは、ウェブアプリケーションの表示レイヤーに使われるサーバーサイドの技術のことです。

Java

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

Struts 2

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

1グッド

1クリップ

投稿2016/07/28 04:16

編集2016/07/28 04:53

こちらのサイトを参考にScopedModelDrivenを使用したアプリを作成しています。

http://codezine.jp/article/detail/4060

しかし画面遷移するともともとのオブジェクトが破棄されてしまうのか変数の値が消えてしまいます。

ソースコードを記述します。

##ProModel.java

package part2; public class ProModel { // 入力フィールドに対応したメンバ変数 private String name; private String email; private int age; private String career; public String getName(){ return name; } public void setName(String name){ this.name = name; } public String getEmail(){ return email; } public void setEmail(String email){ this.email = email; } public int getAge(){ return age; } public void setAge(int age){ this.age = age; } public String getCareer(){ return career; } public void setCareer(String career){ this.career = career; } }

#Research.java

package part2; import org.apache.struts2.convention.annotation.InterceptorRef; import org.apache.struts2.convention.annotation.InterceptorRefs; import com.opensymphony.xwork2.ActionSupport; import com.opensymphony.xwork2.interceptor.ScopedModelDriven; @InterceptorRefs({ @InterceptorRef(value="scopedModelDriven",params={"scope","session"}), @InterceptorRef("defaultStack") }) public class Research extends ActionSupport implements ScopedModelDriven<ProModel> { private ProModel model; private String scopeKey; @Override public ProModel getModel() { return model; } @Override public void setModel(ProModel model) { this.model = model; } @Override public String getScopeKey() { System.out.println("getScope"); return this.scopeKey; } @Override public void setScopeKey(String key) { System.out.println("setscope"); this.scopeKey = key; } // デフォルトのActionメソッド public String execute() throws Exception { System.out.println("defo"); return "success"; } // submit時のActionメソッド public String confirm() throws Exception { System.out.println("conf"); return "success"; } }

#Reserch.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib prefix="s" uri="/struts-tags" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html><head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>アンケート</title></head> <body> <s:form action="Research" > <s:textfield label="名前" name="name" scope="session"/> <s:textfield label="メールアドレス" name="email" scope="session"/> <s:textfield label="年齢" name="age" /> <s:radio label="どの携帯のCMが好き?" name="career" list="#{'1':'ドコモ', '2':'au', '3':'ソフトバンク'}"/> <s:submit value="確認" action="ResearchConfirm" /> <s:debug /> </s:form> </body> </html>

#confirm.jsp

<%@ page language="java" contentType="text/html; charset=Windows-31J" pageEncoding="Windows-31J"%> <%@ taglib prefix="s" uri="/struts-tags" %> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>確認</title> </head> <body> <s:form action="Research"> 名前:<s:property value="name"/><br /> メールアドレス:<s:property value="email"/><br /> 年齢:<s:property value="age"/><br /> キャリア:<s:property value="career"/><br /> <s:submit value="確定" action="ResearchConfirm1" /> <s:debug /> </s:form> </body>

#conform1.jsp

<%@ page language="java" contentType="text/html; charset=Windows-31J" pageEncoding="Windows-31J"%> <%@ taglib prefix="s" uri="/struts-tags" %> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>確認</title> </head> <body> 名前:<s:property value="name"/><br /> メールアドレス:<s:property value="email"/><br /> 年齢:<s:property value="age"/><br /> キャリア:<s:property value="career"/><br /> <s:debug /> </body>

#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="Pro" extends="struts-default"> <action name="Hello" class="part1.Hello"> <result name="success">/index.jsp</result> </action> <action name="Research" class="part2.Research"> <result name="success">/part2/research.jsp</result> </action> <action name="ResearchConfirm" method="confirm" class="part2.Research"> <result name="success">/part2/confirm.jsp</result> </action> <action name="Research" class="part2.Research"> <result name="success">/part2/research.jsp</result> </action> <action name="ResearchConfirm" method="confirm" class="part2.Research"> <result name="success">/part2/confirm.jsp</result> <result name="input">/part2/research.jsp</result> </action> <action name="ResearchConfirm1" method="confirm" class="part2.Research"> <result name="success">/part2/conform1.jsp</result> </action> </package> </struts>

書ききれないのでweb.xmlは省略しますがそこに問題がありそうなら記載します。
環境は先ほどのサイトと同じのはずです。

ScopedModelDrivenでセッションに値が保存されているはずですが保存されません。

confirmからconform1に画面遷移する際にコンソールに

情報: At least one JAR was scanned for TLDs yet contained no TLDs. Enable debug logging for this logger for a complete list of JARs that were scanned but no TLDs were found in them. Skipping unneeded JARs during scanning can improve startup time and JSP compilation time.

と赤字で表示されました。
どこを修正したらいいでしょうか。

A-pZ👍を押しています

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

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

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

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

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

A-pZ

2016/07/28 04:38

当該Actionのstruts.xmlを記載していただければ明確な回答が得られると思います。
cray

2016/07/28 04:47

struts.xmlを追記いたしました。
guest

回答2

0

ベストアンサー

ActionクラスのアノテーションでScopedModelDrivenの設定を書き換えていますが、struts.xmlでも同じActionクラスの設定を書かれているため、アノテーション@InterceptorRefで設定した内容が上書きされてしまいます。

Conventionプラグインを利用している場合、部分的にはstruts.xmlの内容を継承しますが、設定箇所が重複した場合は、 どちらが動くかは正しく制御できません
具体的にはstruts.xmlで設定している extends属性があるため 他のstruts.xmlならびにstruts-default.xmlの設定内容を上書きします。

正しくは次のように記載します。

java

1@ParentPackage("struts-default") 2@Namespace("/") 3@InterceptorRefs({ 4 @InterceptorRef(value="defaultStack",params={"scopedModelDriven.scope","session"}), 5}) 6@Results({@Result(name=ActionSupport.SUCCESS,location="scoped.jsp")}) 7public class SampleAction extends ActionSupport implements ScopedModelDriven<T> { 8 @Action("scoped") 9 public String execute() throws Exception { 10 // TODO 11 return ActionSupport.SUCCESS; 12 } 13}

投稿2016/07/28 07:18

編集2016/07/28 08:29
A-pZ

総合スコア12011

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

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

A-pZ

2016/07/28 07:18

ちなみに、struts.xmlからは当該Actionクラスの定義は削除しましょう。
A-pZ

2016/07/28 07:34

※ScopedModelDrivenインターセプタが2重に動いてしまう問題がありましたので、回答を訂正しました。
cray

2016/07/28 08:07

ご回答ありがとうございます。 @ParentPackage("struts-default") @Namespace("/") @InterceptorRefs({ @InterceptorRef("defaultStack",params={"scopedModelDriven.scope","session"}), }) @Results({@Result(name=ActionSupport.SUCCESS,location="scoped.jsp")}) を記述したところ、 @InterceptorRef("defaultStack",params={"scopedModelDriven.scope","session"}), のところでコンパイルエラーになってしまいました。 "defaultStack"がおかしいようです。 何が原因でしょうか。
A-pZ

2016/07/28 08:28

おっと失礼しました、訂正します。value属性を忘れておりました。
cray

2016/07/28 08:37

@ParentPackage("struts-default") @Namespace("/") @InterceptorRefs({ @InterceptorRef(value="defaultStack",params={"scopedModelDriven.scope","session"}), }) @Results({@Result(name=ActionSupport.SUCCESS,location="conform1.jsp")}) public class Research extends ActionSupport implements ScopedModelDriven<ProModel> { @Action("scoped") public String execute1() throws Exception { // TODO return ActionSupport.SUCCESS; } private ProModel model; private String scopeKey; @Override public ProModel getModel() { return model; } @Override public void setModel(ProModel model) { this.model = model; } @Override public String getScopeKey() { System.out.println("getScope"); return this.scopeKey; } @Override public void setScopeKey(String key) { System.out.println("setscope"); this.scopeKey = key; } // デフォルトのActionメソッド public String execute() throws Exception { System.out.println("defo"); return "success"; } // submit時のActionメソッド public String confirm() throws Exception { System.out.println("conf"); return "success"; } } という内容に変更しました。 それと、struts.xmlから <action name="ResearchConfirm1" method="confirm" class="part2.Research"> <result name="success">/part2/conform1.jsp</result> </action> の定義を削除しましたところ、conform1.jspに画面遷移ができなくなってしまいました。 struts.xmlの定義を変更しないで実行したらオブジェクトは破壊されてしまうようで 変数の値は消えてしまいました。 どこがおかしいでしょうか?
A-pZ

2016/07/28 08:43

struts.xmlからActionクラスの定義を破棄したら、Actionメソッドのところに@Action("URL")を宣言しましょう。ソースを見るに、confirm()メソッドに@Actionがありません。
cray

2016/07/29 01:09

confirm()メソッドの前に @Action("conform1.jsp")や@Action("/part2/conform1.jsp") 等記述してみたのですが画面遷移ができませんでした。ひょっとしてweb.xmlやほかのファイルの編集が必要なのでしょうか?それともURLの指定の仕方がおかしいでしょうか。
cray

2016/07/29 04:54

ゼロコンフィグレーションを使用したら解決しました!ありがとうございました!
guest

0

ProModel クラスが java.io.Serializable インタフェース を実装していないからだと思いますが

追記

その設定だと以下の順序になるんで競合しているんじゃないんですか?

xml

1<interceptor-ref name="scopedModelDriven"> 2 <!-- あなたが設定した インターセプター --> 3 <param name="scope">session</param> 4</interceptor-ref> 5<interceptor-ref name="exception"/> 6<interceptor-ref name="alias"/> 7<interceptor-ref name="servletConfig"/> 8<interceptor-ref name="i18n"/> 9<interceptor-ref name="prepare"/> 10<interceptor-ref name="chain"/> 11<!-- 標準のインターセプター --> 12<interceptor-ref name="scopedModelDriven"/> 13<interceptor-ref name="modelDriven"/> 14<interceptor-ref name="fileUpload"/> 15<interceptor-ref name="checkbox"/> 16<interceptor-ref name="datetime"/> 17<interceptor-ref name="multiselect"/> 18<interceptor-ref name="staticParams"/> 19<interceptor-ref name="actionMappingParams"/> 20<interceptor-ref name="params"/> 21<interceptor-ref name="conversionError"/> 22<interceptor-ref name="validation"> 23 <param name="excludeMethods">input,back,cancel,browse</param> 24</interceptor-ref> 25<interceptor-ref name="workflow"> 26 <param name="excludeMethods">input,back,cancel,browse</param> 27</interceptor-ref> 28<interceptor-ref name="debugging"/>

一応 DTD 対応

Struts 2.0.0+

xml

1<!DOCTYPE struts PUBLIC 2 "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" 3 "http://struts.apache.org/dtds/struts-2.0.dtd">

Struts 2.1.x

xml

1<!DOCTYPE struts PUBLIC 2 "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" 3 "http://struts.apache.org/dtds/struts-2.1.dtd">

Struts 2.1.7+

xml

1<!DOCTYPE struts PUBLIC 2 "-//Apache Software Foundation//DTD Struts Configuration 2.1.7//EN" 3 "http://struts.apache.org/dtds/struts-2.1.7.dtd">

Struts 2.3.0+

xml

1<!DOCTYPE struts PUBLIC 2 "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" 3 "http://struts.apache.org/dtds/struts-2.3.dtd">

Struts 2.5.0+

xml

1<!DOCTYPE struts PUBLIC 2 "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN" 3 "http://struts.apache.org/dtds/struts-2.5.dtd">

競合回避

変更前

@InterceptorRefs({ @InterceptorRef(value="scopedModelDriven",params={"scope","session"}), @InterceptorRef("defaultStack") })

変更後

@InterceptorRefs({ @InterceptorRef("defaultStack"), @InterceptorRef(value="scopedModelDriven",params={"scope","session"}) })

でいいとおもいますがどうでしょう?

解決案

とりあえず struts.xml の記述か annotation での記述かどっちかで統一してみましょう。
何かココらへんが原因なきがしてきた。

Struts2-convention-plugin の設定

公式サイト をみてください。
長いのです

投稿2016/07/28 04:53

編集2016/07/28 07:02
asahina_dev

総合スコア610

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

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

cray

2016/07/28 05:04

ご回答ありがとうございます。 ProModelクラスにSerializableをimplementsしました。 情報: At least one JAR was scanned for TLDs yet contained no TLDs. Enable debug logging for this logger for a complete list of JARs that were scanned but no TLDs were found in them. Skipping unneeded JARs during scanning can improve startup time and JSP compilation time. というエラーは表示されなくなりましたが、オブジェクトは消えてしまっているようです・・
cray

2016/07/28 05:35

struts2.1.6を使用していましたのでstruts.xmlにStruts 2.1.x の内容で変更しましたが 変化はありませんでした。struts.xmlに原因があるのでしょうか。
cray

2016/07/28 05:53

競合を避けるにはどうしたらいいのでしょうか。
cray

2016/07/28 06:02

@InterceptorRefs({ @InterceptorRef("defaultStack"), @InterceptorRef(value="scopedModelDriven",params={"scope","session"}) }) と変更しましたが、変化はありませんでした。 他のサイトでは @InterceptorRef(value="scopedModelDriven",params={"scope","session"}) の記述が違ったりしているのですが、ここが間違っているのでしょうか? 別サイトでは @InterceptorRefs({ @InterceptorRef(value="defaultStack" , params={"scopedModelDriven.name","sessionModel", "scopedModelDriven.scope","session" } ), }) という記述でした。それも実行しましたが、動きませんでした。
cray

2016/07/28 06:16

アノテーションの方で統一したいです。struts.xmlのどこを編集したらいいのでしょうか・・。 struts初心者でわからないことが多く質問ばかりになってしまいすいません・・・。
cray

2016/07/28 08:08

いろいろありがとうございました!翻訳しながら公式サイトを読んでみます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問