10

しばらくの間 S​​truts 2.1.8 で実行しており、すべての Struts アクションは期待どおりに動作しています。つまり、Struts アクションへの href は拡張子なしのアクション名でレンダリングされます。

リンクを設定する JSP コードは次のとおりです。

<ul id="top_menu">
  <li id="itemHome" class="active"><s:a action="viewHome">Home</s:a></li>
  <li><s:a action="viewSearch">Search</s:a></li>
  <li><s:a action="viewBookMarks">My Bookmarks</s:a></li>
  <li><s:a action="viewSupport">Support</s:a></li>
</ul>

2.1.8http://localhost/viewHomeで、 などに正しくレンダリングされたリンクhttp://localhost/viewSearch

Struts 2.2.1 にアップグレードしたところ (v2.3.4.1 までのすべてのバージョンを確認済み)、Struts アクション リンクが 、 などとしてレンダリングされていることがわかりhttp://localhost/viewHome.actionますhttp://localhost/viewSearch.action

私の調査によると、一般的に推奨される解決策は使用することです

<constant name="struts.action.extension" value=""/>

struts.xml で .action サフィックスを削除します。これにより、URL が正しくレンダリングされますが、予期しない副作用が発生します。Struts は、すべての URL が .css、.png などのリクエストを含むアクションであると考えるようになりました。

web.xml のフィルタ マッピングは変更されていません。/* を Struts に送信しますが、この動作は 2.1.8 では見られませんでした。

<filter>
   <filter-name>struts2</filter-name>
   <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>   
</filter>

<filter-mapping>
   <filter-name>struts2</filter-name>
   <url-pattern>/*</url-pattern>
</filter-mapping>

これに対抗するために、excludePatternを使用して、これらのリクエストをアクションとして処理しようとする Struts を停止する必要がありました。

<constant name="struts.action.excludePattern" value="/index.html,/images/.*,/js/.*,/css/.*"/>

これは機能しますが、最後のハードルは、ログが Struts アクションとして処理されている Struts タグ リクエストからのエラーでいっぱいになることです。これらの URI を除外パターンに追加すると、一部のページで Struts Dojo タグが機能していないように見えます。

影響を受ける struts.xml の部分は次のとおりです。

<constant name="struts.devMode" value="true" />
<!-- Set URL's to have no .action extension -->
<constant name="struts.action.extension" value=""/>
<constant name="struts.action.excludePattern" value="/index.html,/images/.*,/js/.*,/css/.*"/>

ログ内の Struts エラーの例は次のとおりです。

2012-09-26 17:12:57,984 [http-bio-8080-exec-9] ERROR org.apache.struts2.dispatcher.Dispatcher- Could not find action or result
/struts/dojo/struts_dojo.js
There is no Action mapped for namespace [/] and action name [struts_dojo.js] associated with context path []. - [unknown location]
    at com.opensymphony.xwork2.DefaultActionProxy.prepare(DefaultActionProxy.java:185)
    at org.apache.struts2.impl.StrutsActionProxy.prepare(StrutsActionProxy.java:63)
    at org.apache.struts2.impl.StrutsActionProxyFactory.createActionProxy(StrutsActionProxyFactory.java:39)
    at com.opensymphony.xwork2.DefaultActionProxyFactory.createActionProxy(DefaultActionProxyFactory.java:58)
    at org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:501)
    at org.apache.struts2.dispatcher.ng.ExecuteOperations.executeAction(ExecuteOperations.java:77)
    at org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.doFilter(StrutsPrepareAndExecuteFilter.java:91)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:225)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:927)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1001)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:579)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310)
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
    at java.lang.Thread.run(Thread.java:680)

Struts Dojo リクエストが実際の URI なのか、仮想なのか、それ以外なのかはわかりません。

この時点で、URL から .action 拡張子を削除するという本質的に単純な問題を修正するために、かなりの数のフープを飛び越えたと感じています。2.1.8 JAR に戻るとすべてが解決しますが、できれば前向きに。

どんな助けでも大歓迎です。

4

1 に答える 1

19

このようにコンマを使用してstrutsアクション拡張を使用してみてください
<constant name="struts.action.extension" value=","/>
struts2プロパティファイルから:

DefaultActionMapperで使用次のようにコンマ区切りのリストを指定できます。struts.action.extension=action、jnlp、do空白の拡張子を使用すると、静的リソースに干渉することなく、ディレクトリリストと純粋なアクション名を照合できます。カンマの前の空の文字列(例:struts.action.extension =、またはstruts.action.extension = x、y、z ,, struts.action.extension = action ,、

于 2012-09-27T21:00:09.710 に答える