Chúng tôi đã chạy trên Struts 2.1.8 trong một thời gian và tất cả các hành động Struts đã hoạt động như mong đợi, tức là hành động của Struts được kết xuất với tên hành động không có phần mở rộng.Struts2 .action mở rộng gây ra CSS, JavaScript và Struts Dojo để phá vỡ
Đây là mã JSP rằng thiết lập của lên các liên kết:
<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>
Các liên kết trả lại một cách chính xác để http://localhost/viewHome
, http://localhost/viewSearch
, vv theo 2.1.8
Chúng tôi chỉ nâng cấp lên Struts 2.2.1 (một đã kiểm tra tất cả các phiên bản từ này lên đến v2.3.4.1) và bây giờ nhìn thấy liên kết hành động Struts được hiển thị như http://localhost/viewHome.action
, http://localhost/viewSearch.action
, v.v.
Nghiên cứu của tôi đã chỉ ra rằng d giải pháp là sử dụng
<constant name="struts.action.extension" value=""/>
trong struts.xml để xóa hậu tố .action. Trong khi điều này làm cho các URL hiển thị chính xác nó đang gây ra một tác dụng phụ không mong muốn. Struts giờ nghĩ rằng mỗi URL là một hành động bao gồm các yêu cầu cho .css, .png, v.v.
Ánh xạ bộ lọc của tôi trong web.xml không thay đổi. Và mặc dù nó sẽ gửi/* để Struts chúng tôi đã không nhìn thấy hành vi này theo 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>
Để chống lại điều này tôi đã phải sử dụng excludePattern ngừng Struts cố gắng đối xử với những yêu cầu như hành động.
<constant name="struts.action.excludePattern" value="/index.html,/images/.*,/js/.*,/css/.*"/>
Trong khi điều này xảy ra, rào cản cuối cùng là nhật ký của tôi có đầy đủ các lỗi trong thẻ Struts yêu cầu đang được xử lý như hành động Struts. Khi tôi thêm các URI này vào mẫu loại trừ thì các thẻ Struts Dojo dường như không hoạt động trong một số trang.
Các bộ phận của struts.xml bị ảnh hưởng là:
<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/.*"/>
Và một ví dụ về các lỗi Struts trong nhật ký là:
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)
Tôi không chắc chắn nếu struts yêu cầu Dojo là URI thực hoặc ảo hoặc cái gì khác. Nó cảm thấy vào thời điểm này mà tôi đã nhảy qua khá một vài hoops để sửa chữa những gì về cơ bản là một vấn đề đơn giản của việc loại bỏ phần mở rộng .action từ URL cho rằng quay trở lại 2.1.8 JAR giải quyết mọi thứ nhưng tôi ' m quyết tâm tìm cách tiến lên nếu có thể.
Bất kỳ trợ giúp nào được đánh giá rất nhiều.
Humm, có vẻ như một trang được yêu cầu struts_dojo.js lib . Bạn đang sử dụng plugin dojo cho Struts? Nó không được chấp nhận. Nếu không, bạn có thể cung cấp mã yêu cầu thư viện đó không? –