2012-09-26 18 views
9

Hemos estado ejecutando en Struts 2.1.8 durante un tiempo y todas las acciones de Struts han estado funcionando como se esperaba, es decir, las acciones de href a Struts se representan con el nombre de la acción sin extensiónStruts2 .action extensión que causa CSS, JavaScript y Struts Dojo para romper

Este es el código JSP que se ha configurado el enlaces:

<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> 

Los enlaces representan correctamente a http://localhost/viewHome, http://localhost/viewSearch, etc., bajo 2.1.8

Nos pasaron a Struts 2.2.1 (un haber comprobado todas las versiones de este hasta v2.3.4.1) y ahora están viendo las acciones de Struts enlaces están prestando como http://localhost/viewHome.action, http://localhost/viewSearch.action, etc.

Mi investigación ha demostrado que la suggeste generales d solución es usar

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

en struts.xml para eliminar el sufijo .action. Si bien esto hace que las URL se procesen correctamente, está causando un efecto secundario inesperado. Struts ahora piensa que cada URL es una acción que incluye solicitudes para .css, .png, etc.

Mi asignación de filtros en web.xml no ha cambiado. Y a pesar de que envía/* a Struts no vimos este comportamiento bajo 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> 

Para contrarrestar esto he tenido que usar el excludePattern para detener puntales intentar tratar estas solicitudes como las acciones.

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

Mientras que esto funciona, el último obstáculo es que mis registros están llenos de errores de Struts etiquetas solicitudes que se manejan como acciones de Struts. Cuando agrego estos URI al patrón de exclusión, las etiquetas de Struts Dojo no parecen funcionar en algunas páginas.

Las partes de struts.xml afectadas son:

<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/.*"/> 

Y un ejemplo de los errores en el registro de Struts es:

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) 

no estoy seguro de si los puntales solicitudes son Dojo URI reales o virtuales o algo más.

Creo que en este punto he superado bastantes problemas para solucionar lo que es esencialmente un problema simple al eliminar la extensión .action de las URL dado que volver al 2.1.8 JAR resuelve todo, pero yo ' Estoy decidido a encontrar un camino para seguir si es posible.

Cualquier ayuda es muy apreciada.

+0

Humm, parece que una página está solicitando los struts_dojo.js lib . ¿Estás usando el complemento dojo para Struts? Está en desuso. De lo contrario, ¿puede proporcionar el código que solicita esa biblioteca? –

Respuesta

17

Trate de usar la resistencia a la acción de los puntales con una coma como esta
<constant name="struts.action.extension" value=","/>.
partir de las propiedades struts2 del archivo:

Utilizado por el DefaultActionMapper Usted puede proporcionar una lista separada por comas, por ejemplo, struts.action.extension = action, jnlp, do La extensión en blanco le permite hacer coincidir los listados de directorios y los nombres de acciones puras sin interferir con los recursos estáticos, que se pueden especificar como una cadena vacía antes de una coma, p. struts.action.extension = o struts.action.extension = x, y, z ,, struts.action.extension = acción ,,

+1

Eso funcionó. Gracias Aleksandr. Una vez que agregué la coma, la línea dice: '' todo volvió al comportamiento previo a los puntales 2.2.1. Tampoco necesité excluir explícitamente el contenido estático con '' y fue capaz de eliminar eso también. –

+0

Me alegro de poder ayudar. –

+0

También ayuda a establecer 'name =" struts.action.extension "value =", action "', de modo que funcione .action y no sufijo. – Akku

Cuestiones relacionadas