異なる (HTML および JSON ) 結果タイプを持つ Struts 2 アクションがあります。彼らは共通のインターセプターを使用します。
リクエストをインターセプトする必要がある場合、特定のアクション結果タイプに基づいて結果を返す方法は?
たとえば、Action.ERROR
JSP ページに転送します。アクションが JSON タイプの場合、代わりに JSON エラーを転送します。
異なる (HTML および JSON ) 結果タイプを持つ Struts 2 アクションがあります。彼らは共通のインターセプターを使用します。
リクエストをインターセプトする必要がある場合、特定のアクション結果タイプに基づいて結果を返す方法は?
たとえば、Action.ERROR
JSP ページに転送します。アクションが JSON タイプの場合、代わりに JSON エラーを転送します。
Struts2 では、アクションに型がありません。これは、アクションのタイプを構成できないことを意味します。代わりに、xml 構成で結果タイプを構成できます。xml 構成ファイルでは、これはresult-type
タグとして定義されています。result
タグを使用して結果を構成するtype
場合、対応する結果タイプを決定するために使用される属性を指定します。結果型の結果と言うname="success"
か。name="error"
dispatcher
アクションが傍受されると、結果を取得できます
Map<String, ResultConfig> results = actionInvocation.getProxy().getConfig().getResults();
結果のタイプを決定するために使用できる属性が ResultConfig
あります。className
異なる (HTML および JSON ) 結果タイプを持つ Struts2 アクションがあります。彼らは共通のインターセプターを使用します。リクエストをインターセプトする必要がある場合、指定されたアクションの結果タイプに基づいて結果を返す方法は?
たとえば、私の Action.ERROR は JSP ページに転送されます。アクションが JSON タイプの場合、代わりに JSON エラーを転送します。ご意見をお聞かせください。
Action にtypeがないことは事実ですが、JSON を返すアクションのように Action が AJAX の方法で呼び出される場合、そのすべての結果は同じ結果タイプ (この場合は JSON) を持つ必要があることも事実です。単一のアクションを使用して、さまざまな論理アクション (ajax 操作と非 ajax 操作、つまりアンチパターン) を実行しています。
そうは言っても、適切なGLOBAL エラー resultを返したい場合は、すべてのアクション (それぞれがその結果タイプを持つ) によって使用される Interceptor の内部から、他の結果タイプに基づいて(たとえばSUCCESS
、すべてのアクションが結果) 、SUCCESS
これはそれを行う方法です:
public String intercept(ActionInvocation invocation) throws Exception {
// Get the action configuration defined in struts.xml
ActionConfig config = invocation.getProxy().getConfig();
// Get the SUCCESS result configured for that Action
ResultConfig success = config.getResults().get("success");
// Get the class of the SUCCESS result
Object clazz = success.getClass();
/* .... oops, some error occurred !!
We now need to redirect to the right global error result .... */
if (clazz instanceof org.apache.struts2.dispatcher.ServletDispatcherResult) {
log.debug("Struts2 Result type: CLASSIC");
return "error";
} else if (clazz instanceof org.apache.struts2.json.JSONResult) {
log.debug("Struts2 Result type: JSON");
return "jsonError";
} else {
log.debug("Struts2 Result type: SOMETHING ELSE, returning default ");
return "error";
}
}
これは技術的には可能ですが、それを行う本当の理由がないため、お勧めしません。
目的のために、各グローバル結果のスコープは <package>
;内にあることに注意してください。
<package>
クラシック アクション (拡張struts-default
) と JSON アクション (<package>
拡張)に対して 2 つの異なるパッケージを使用できる (/すべき)ため、パッケージごとに名前は同じで結果タイプが異なる 2 つの異なるグローバル エラー結果を定義するjson-default
だけで済みます。このようにして、インターセプターは現在のアクションのパッケージに関連するものを呼び出し、目的の種類の結果を出力します。