Gre*_*edy 9 dojo struts2 jsp-tags struts-config action-mapping
我们已经在Struts 2.1.8上运行了一段时间,并且所有Struts操作都按预期工作,即strref操作的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>
Run Code Online (Sandbox Code Playgroud)
正确地呈现给链接http://localhost/viewHome
,http://localhost/viewSearch
2.1.8下,等等.
我们刚刚升级到2.2.1的Struts(一个已检查从这个高达v2.3.4.1所有版本)和现在看到的Struts动作链接被渲染为http://localhost/viewHome.action
,http://localhost/viewSearch.action
等等.
我的研究表明,一般建议的解决方案是使用
<constant name="struts.action.extension" value=""/>
Run Code Online (Sandbox Code Playgroud)
在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>
Run Code Online (Sandbox Code Playgroud)
为了抵消这一点,我必须使用excludePattern来阻止Struts尝试将这些请求视为操作.
<constant name="struts.action.excludePattern" value="/index.html,/images/.*,/js/.*,/css/.*"/>
Run Code Online (Sandbox Code Playgroud)
虽然这有效,但最后一个障碍是我的日志充满了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/.*"/>
Run Code Online (Sandbox Code Playgroud)
而日志中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)
Run Code Online (Sandbox Code Playgroud)
我不确定struts Dojo请求是真正的URI还是虚拟或其他东西.
感觉到这一点,我已经跳过了相当多的箍来修复从URL中删除.action扩展本质上是一个简单的问题,因为回到2.1.8 JAR解决了一切,但我决心找到如果可能的话,前进的方向
很感谢任何形式的帮助.
Ale*_*r M 18
尝试使用像这样的逗号struts action exstension
<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 ,,
归档时间: |
|
查看次数: |
6751 次 |
最近记录: |