2012-09-26 21 views
9

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.

+0

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

Trả lời

17

Hãy thử sử dụng lệnh chặn hành động với dấu phẩy như sau
<constant name="struts.action.extension" value=","/>.
Từ các tính chất struts2 file:

Được sử dụng bởi các DefaultActionMapper Bạn có thể cung cấp một danh sách dấu phẩy tách ra, ví dụ struts.action.extension = action, jnlp, do Tiện ích mở rộng trống cho phép bạn so khớp danh sách thư mục cũng như tên hành động thuần túy mà không can thiệp vào tài nguyên tĩnh, có thể được chỉ định dưới dạng chuỗi trống trước dấu phẩy. struts.action.extension =, hoặc struts.action.extension = x, y, z ,, struts.action.extension = hành động ,,

+1

Điều đó có hiệu quả. Cảm ơn bạn Aleksandr. Khi tôi đã thêm dấu phẩy để dòng ghi: '' mọi thứ quay lại hành vi trước 2.2.1. Tôi cũng không cần loại trừ rõ ràng nội dung tĩnh với '' và cũng có thể thực hiện điều đó. –

+0

Tôi rất vui vì tôi có thể giúp đỡ. –

+0

Nó cũng giúp thiết lập 'name =" struts.action.extension "value =", action "', sao cho .action cũng như không có hậu tố nào hoạt động. – Akku

Các vấn đề liên quan