Siamo stati in esecuzione su Struts 2.1.8 per un po 'di tempo e tutte le azioni Struts hanno funzionato come previsto, cioè href alle azioni Struts sono renderizzate con il nome dell'azione senza estensione.Estensione Struts2 .action causando CSS, JavaScript e Struts Dojo per rompere
Ecco il codice JSP che di impostare il link:
<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>
I collegamenti resi correttamente http://localhost/viewHome
, http://localhost/viewSearch
, ecc sotto 2.1.8
Abbiamo appena trasferiti in Struts 2.2.1 (uno ha controllato tutte le versioni da questo fino alla v2.3.4.1) e ora sta vedendo le azioni di Struts i link sono visualizzati come http://localhost/viewHome.action
, http://localhost/viewSearch.action
, ecc.
La mia ricerca ha dimostrato che il generale suggerisce La soluzione è quella di utilizzare
<constant name="struts.action.extension" value=""/>
in struts.xml per rimuovere il suffisso .action. Mentre questo rende il rendering degli URL correttamente sta causando un effetto collaterale inaspettato. Struts ora pensa che ogni URL sia un'azione che include richieste di .css, .png, ecc.
La mia mappatura del filtro in web.xml non è cambiata. E anche se manda/* a Struts non abbiamo visto questo comportamento sotto 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>
Per contrastare questo ho dovuto usare il excludePattern di smettere di Struts cercare di curare queste richieste come azioni.
<constant name="struts.action.excludePattern" value="/index.html,/images/.*,/js/.*,/css/.*"/>
Anche se questo funziona, l'ultimo ostacolo è che i miei registri sono pieni di errori da Struts tag richieste che vengono trattati come azioni Struts. Quando aggiungo questi URI al modello di esclusione, i tag Dojo di Struts non sembrano funzionare in alcune pagine.
Le parti interessate sono 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/.*"/>
E un esempio degli errori Struts nel registro è:
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)
io non sono sicuro se i montanti Dojo richieste sono URI reale o virtuale o qualcos'altro.
Sembra a questo punto che ho fatto un bel po 'di tentativi per risolvere quello che è essenzialmente un semplice problema di rimuovere l'estensione .action da URL dato che tornare al 2.1.8 JAR risolve tutto tranne I' Sono determinato a trovare una via da seguire se possibile.
Qualsiasi aiuto è molto apprezzato.
Humm, sembra che una pagina richiede i struts_dojo.js lib . Stai usando il plugin dojo per Struts? È deprecato. In caso contrario, puoi fornire il codice che richiede tale libreria? –