Struts2 .action 扩展导致 CSS、JavaScript 和 Struts Dojo 损坏

标签 struts2 dojo jsp-tags struts-config action-mapping

我们已经在 Struts 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.8 下正确呈现到 http://localhost/viewHomehttp://localhost/viewSearch 等的链接

我们刚刚升级到 Struts 2.2.1(已检查从该版本到 v2.3.4.1 的所有版本),现在看到 Struts 操作链接呈现为 http://localhost/viewHome.actionhttp://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 可以解决所有问题,但我决心尽可能找到前进的道路。

非常感谢任何帮助。

最佳答案

尝试使用带有逗号的 struts Action 扩展,如下所示
<constant name="struts.action.extension" value=","/>
来自struts2属性文件:

Used by the DefaultActionMapper You may provide a comma separated list, e.g. struts.action.extension=action,jnlp,do The blank extension allows you to match directory listings as well as pure action names without interfering with static resources, which can be specified as an empty string prior to a comma e.g. struts.action.extension=, or struts.action.extension=x,y,z,, struts.action.extension=action,,

关于Struts2 .action 扩展导致 CSS、JavaScript 和 Struts Dojo 损坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12607075/

相关文章:

java - Struts 2 将数据从 JSP 传递到操作类

javascript - Dojo build 1.7 内置包不起作用

java - 默认页面上的应用程序- tomcat/java

java - 如何将 Javascript 变量发送到服务器端?

java - tomcat输出一些乱码

Spring 安全不工作

java - Displaytag 导出选项不起作用

javascript - 如何检查下拉列表是否为只读?

dojo - dojoAttachpoint 和 id 的区别

java - 标签库的目的?