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

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

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

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

Java

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

Struts 2

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

Q&A

解決済

3回答

5353閲覧

JSPの暗黙のオブジェクトexceptionをStruts2のプロパティとして扱えるようにする

naomi3

総合スコア1105

JSP

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

Java

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

Struts 2

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

1グッド

1クリップ

投稿2016/10/08 06:15

編集2016/10/08 13:24

###前提・実現したいこと
JSPの暗黙のオブジェクトexceptionをStruts2のプロパティとして扱えるようにする
###発生している問題・エラーメッセージ
・errorPage="exception.jsp"とisErrorPage="true"を使って、暗黙のオブジェクトexceptionを有効にし、エラーメッセージとスタックトレースを表示できました。

JSP

1<p>エラーメッセージ</p> 2<%= exception.getMessage() %> 3<p>詳細</p> 4<% for (StackTraceElement element : exception.getStackTrace()) { %> 5 <%= element.toString() %> 6<% } %>

・ActionEventListenerを実装したクラスで、Actionでの例外を捕捉しHashMapで"exception"と名付けてValueStackにpushし、

Java

1@Results({ 2 @Result(name="exception", value="exception.jsp") 3}) 4public class SampleAction extends ActionSupport { 5 6 public String execute() throws Exception { 7 throw new Exception("意図的な例外"); 8 } 9} 10 11 12public class SampleActionEventListener implements ActionEventListener { 13 14 @Override 15 public Object prepare(Object action, ValueStack stack) { 16 17 return action; 18 } 19 20 /* 21 * 例外発生時の制御。 22 */ 23 @Override 24 public String handleException(Throwable thrown, ValueStack stack) { 25 26 HashMap<String, Throwable> namedThrown = new HashMap<String, Throwable>(); 27 namedThrown.put("exception", thrown); 28 stack.push(namedThrown); 29 30 return "exception"; 31 } 32}

例外表示JSPに遷移、Struts2カスタムタグを使ってエラーメッセージとスタックトレースを表示できました。

JSP

1<p>エラーメッセージ</p> 2<s:property value="%{exception.message}" /> 3<p>詳細</p> 4<s:iterator value="%{exception.stackTrace}"> 5 <s:property value="%{toString()}" /> 6</s:iterator>

エラーメッセージとスタックトレースの表示のコードはいずれもわずか数行ですが、Struts2カスタムタグを使う方に統一したいと思っています。

前者の場合も、<s:debug />で表示されるValueStackに"exception"もエラーメッセージも見えているのですが、findValue()の引数の指定が良くないのか、どうしてもexceptionを取得できません。

どうすればよいのかご教示ください。

できない場合は、逆に、後者の方を前者の方に統一する、すなわち、Actionでの例外をJSPの暗黙のオブジェクトexceptionとして扱うにはどうすればよいでしょうか。

どうか宜しくお願いいたします。

A-pZ👍を押しています

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

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

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

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

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

guest

回答3

0

OGNLのマニュアルを読んで答えます。

JSP

1<s:property value="#root['exception'].message /> 2<s:property value="#root.exception.message" />

rootはスタックを表しているそうです。

やってもダメな場合の理由として考えられるのが、messageプロパティが見えないから。PropertyDescripterを使ってプロパティを取得する場合、getter/setterのペアがなければならない。つまり、getMessage()だけが例外クラスに定義されているので見えない。これが正しければ、getStackTrace()/setStackTrace()はThrowableに存在するので、見えることになります。

投稿2016/10/12 10:22

編集2016/10/12 10:53
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

Struts2のActionEventListenerについては Qiita:隠し機能:ActionEventListenerここにも記載しておりますが、現在のStruts2ではあまり使用しません。
どちらかというと、例外クラスによってはAction処理中断後に何らかのリソース開放や、共通のエラーログを出力する方法に向いており、例外発生時の制御はExceptionMappingで行います。

例外発生時の制御については、おそらくConventionプラグインを利用されているようですので、Actionクラスに @ExceptionMappings を定義して、例外発生時の遷移先を決めるのが正しい実装方法です。

java

1@Namespace("/") 2@ParentPackage("struts-default") 3@Results({ 4 @Result(name=ActionSupport.SUCCESS, location="hello.jsp"), 5 @Result(name=ActionSupport.ERROR, location="error.jsp") 6}) 7@ExceptionMappings({ 8 @ExceptionMapping(exception="java.lang.Exception",result=ActionSupport.ERROR) 9}) 10 11public class HelloAction extends ActionSupport { 12 ......... 13}

例外発生時に表示するJSPは次のようになります。

html

1<%@ page contentType="text/html; charset=UTF-8" isErrorPage="true"%> 2<%@ taglib prefix="s" uri="/struts-tags" %> 3<html> 4<head> 5 <title>エラー画面</title> 6</head> 7 8<body> 9<s:property value="%{exception.message}" /> 10<hr /> 11<p>詳細</p> 12<s:iterator value="%{exception.stackTrace}"> 13<s:property value="%{toString()}" /><br /> 14</s:iterator></body> 15</html>

投稿2016/10/11 17:11

A-pZ

総合スコア12011

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

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

0

自己解決

ありがとうございます。いろいろヒントを頂いたおかげをもちまして無事に解決できました。

JSP

1<%@ page isErrorPage="true" contentType="text/html; charset=UTF-8" %> 2<%@ taglib prefix="s" uri="/struts-tags" %> 3<!DOCTYPE html> 4<html> 5 <body> 6 <s:action name="hyPrepException" executeResult="true" rethrowException="true" ignoreContextParams="false" /> 7 </body> 8</html>

Java

1public class HyPrepExceptionAction extends AbstractAction { 2 3 /** 4 * executeメソッド<br> 5 * JSPの例外をValueStackより拾って、ログ出力、再び例外を投げる 6 */ 7 @SkipValidation 8 public String execute() throws Exception { 9 10 ValueStack stack = ActionContext.getContext().getValueStack(); 11 12 // リクエストアトリビュートのコレクションをValueStackより取得 13 RequestMap requestMap = (RequestMap)stack.findValue("#request"); 14 log.debug("ValueStack#requestMap:{}", requestMap.toString()); 15 16 // 例外が発生したJSPのURIを取得 17 String jspURI = (String)requestMap.get("javax.servlet.error.request_uri"); 18 19 // JSPの例外を取得 20 // ※JspExceptionというクラスがあるが、使ってはならない。(クラスキャスト例外が発生する) 21 Exception exception = (Exception)requestMap.get("javax.servlet.jsp.jspException"); 22 23 log.info("JSP {} の例外: {}", jspURI, exception.toString()); 24 25 throw exception; 26 } 27}

投稿2016/10/13 06:17

naomi3

総合スコア1105

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問