2009-07-01 23 views
10

Nếu tôi có một hành động trong đó kết quả là chuyển hướngHành động đến một hành động khác trong một lớp khác, có thể nhận được các lỗi xác thực để hiển thị trong hành động kết quả không? Ví dụ. trong ví dụ sau, nếu người dùng thực thi actionA (không có lượt xem nào được liên kết với nó) và có lỗi, có cách nào để hiển thị các lỗi đó trong kết quả actionB (foo.jsp) không? Hoặc tôi đang đi về điều này một cách hoàn toàn sai?Tôi có thể nhân đôi struts2 ActionErrors giữa các lớp hành động khác nhau không?

<package name="a" extends="struts-default" namespace="/a"> 
    <action name="actionA" class="actionAClass"> 
     <result name="input" type="redirectAction"> 
      <param name="actionName">actionB</param> 
      <param name="namespace">/b</param> 
     </result> 
     <result type="redirectAction"> 
      <param name="actionName">actionB</param> 
      <param name="namespace">/b</param> 
     </result> 
    </action> 
</package> 
<package name="b" extends="struts-default" namespace="/b"> 
    <action name="actionB" class="actionBClass"> 
     <result>/foo.jsp</result> 
    </action> 
</package> 
+0

Hãy thử sử dụng MessageStore Interceptor - http://struts.apache.org/release/2.3.x/docs/message-store-interceptor.html –

Trả lời

4

Có thể có cách để làm điều đó, nhưng tôi không nghĩ đó là cách rất tốt để sử dụng thanh chống. Nếu actionA không xác thực, bạn rất có thể sẽ muốn có kết quả đầu vào không chuyển hướng cho nó hiển thị lỗi hoặc có thể là trang lỗi toàn cầu có thể hiển thị nó.

Tôi cho rằng bạn có thể lưu trữ các lỗi hành động ở đâu đó như phiên giữa chuyển hướng, nhưng bạn sẽ không thực sự sử dụng khung làm cách nó được thiết kế.

0

Chức năng này không được Struts2 hỗ trợ theo mặc định. Giải pháp tồn tại mặc dù (nó được thực hiện bằng cách đánh chặn thanh chống đơn giản lưu trữ tin nhắn trong phiên).

solution with source code

7

Về cơ bản bạn phải sử dụng tên lửa đánh chặn được xác định trước gọi là cửa hàng mà mất operationMode: cửa hàng và lấy:

<package name="a" extends="struts-default" namespace="/a"> 
    <action name="actionA" class="actionAClass"> 
     <!-- Here you are storing the Error messages --> 
     <interceptor-ref name="store"> 
      <param name="operationMode">STORE</param> 
     </interceptor-ref> 

     <!-- include your default stack in case you need to load other interceptors --> 
     <interceptor-ref name="defaultStack" /> 

     <result name="input" type="redirectAction"> 
      <param name="actionName">actionB</param> 
      <param name="namespace">/b</param> 
     </result> 
     <result type="redirectAction"> 
      <param name="actionName">actionB</param> 
      <param name="namespace">/b</param> 
     </result> 
    </action> 
</package> 
<package name="b" extends="struts-default" namespace="/b"> 
    <action name="actionB" class="actionBClass"> 

     <interceptor-ref name="store"> 
      <param name="operationMode">RETRIEVE</param> 
     </interceptor-ref> 

     <!-- include your default stack in case you need to load other interceptors --> 
     <interceptor-ref name="defaultStack" /> 

     <result>/foo.jsp</result> 
    </action> 
</package> 
10

struts2 theo mặc định có một đánh chặn cửa hàng. Nó lưu trữ actionMessages, actionErrors và fieldErrors trong phiên ở chế độ STORE và bạn có thể lấy lại tương tự trong lần chuyển hướng tiếp theo bằng cách sử dụng cùng một trình chặn bằng cách sử dụng nó trong chế độ RETRIEVE. Thông tin chi tiết có thể được tìm thấy here

2

Sử dụng ActionContext.getContext().getSession().put(key, value) trong hành động đầu tiên và lấy nó bằng cách sử ActionContext.getContext().getSession().get(key) trong redirectedActionaddActionErrors phần Action chính

+0

Tôi đoán MessageStoreInterceptor sẽ là một cách tốt hơn. –

+0

MessageStoreInterceptor - http://struts.apache.org/release/2.3.x/docs/message-store-interceptor.html –

0

Bạn có thể sử dụng loại quả "chuỗi".

<action name="delete" class="com.example.Delete"> 
    <result name="error" type="chain"> 
     <param name="actionName">show</param> 
    </result>   
</action> 
<action name="show" class="com.example.Show"> 
    <result name="success" type="dispatcher">/jsp/show.jsp</result>      
</action> 

trong show.jsp bạn có thể hiển thị các lỗi hành động hoặc tin nhắn hành động mà bạn thiết lập trong hành động xóa

+0

Sử dụng 'chuỗi' không được khuyến khích. –

6

Tôi tìm thấy một giải pháp tốt hơn để vượt qua lỗi hành động và tin nhắn trong actionRedirect loại kết quả. Đó là làm việc cho tôi.

<action name="action1" class="action.Action1" > 
    <result>/abc.jsp</result> 
    <result name="input" type="redirectAction"> 
    <param name="actionName">action2</param> 
    <param name="param1">${param1}</param> 
    <param name="param2">${param2}</param> 
    <param name="actionErrors">${actionErrors}</param> 
    </result> 
    </action> 
    <action name="action2" class="action.Action2" > 
    <result>/def.jsp</result> 
    <result name="input">/def.jsp</result> 
    </action/> 

Đây là nó ..... Chúc mừng mã hóa

+0

' $ {actionErrors}' điều này làm tất cả sự kỳ diệu. – Jibran

+0

Điều này có vượt qua cả lỗi hành động và thông báo hay bạn cần ' $ {actionMessages}' để chuyển một tin nhắn? – ponder275

+1

' $ {actionMessages}' không chuyển các tin nhắn. Cảm ơn! – ponder275

3

Kết quả chuỗi loại sẽ sao chép tin nhắn/lỗi để dẫn đến hành động nếu bạn làm như sau trong struts.xml hoặc struts.properties tập tin -

struts.xwork.chaining.copyErrors - set to true to copy Action Errors 
struts.xwork.chaining.copyFieldErrors - set to true to copy Field Errors 
struts.xwork.chaining.copyMessages - set to true to copy Action Messages 

Ví dụ (struts.xml) -

<constant name="struts.xwork.chaining.copyErrors" value="true"/> 
0

công việc trong tôi này

thêm dòng này vào thanh chống.xml:

<constant name="struts.xwork.chaining.copyErrors" value="true"/> 
<constant name="struts.xwork.chaining.copyMessages" value="true"/> 

sử dụng kết quả kiểu "dây chuyền" và thêm kết quả với cái tên "đầu vào":

<package name="a" extends="struts-default" namespace="/a"> 
    <action name="actionA" class="actionAClass"> 
     <result name="input" type="chain"> 
      <param name="actionName">actionB</param> 
      <param name="namespace">/b</param> 
     </result> 
     <result type="chain"> 
      <param name="actionName">actionB</param> 
      <param name="namespace">/b</param> 
     </result> 
    </action> 
</package> 
<package name="b" extends="struts-default" namespace="/b"> 
    <action name="actionB" class="actionBClass"> 
     <result>/foo.jsp</result> 
     <result name="input">/foo.jsp</result> 
    </action> 
</package> 
1

Các đánh chặn cửa hàng (MessageStoreInterceptor) có thể được sử dụng để lưu trữ và lấy actionErrors, actionMessagesfieldErrors.

Bạn có thể thay đổi các hoạt động của cửa hàng đánh chặn một cách nhanh chóng bằng cách truyền tham số operationMode hành động

http://localhost/sample.action?operationMode=STORE

Bạn có thể thiết lập các cửa hàng đánh chặn trong chế độ STORE trong ngăn xếp mặc định của bạn cho phép tất cả các thông điệp hành động để được lưu trữ trong phiên.

<interceptor-ref name="store"> 
      <param name="operationMode">STORE</param> 
    </interceptor-ref> 

Để có được những thông điệp bạn cần phải thêm store đánh chặn trong chế độ RETRIEVE đến hành động cụ thể mà cần những thông điệp này.

Đây là một trang lỗi toàn cầu mẫu được chuyển hướng đến, hành động này có thể đọc actionErrors, fieldErrorsactionMessages khi chúng ta thêm store đánh chặn để nó và thiết lập operationMode-RETRIEVE:

@Action(value = "error-page" , 
       interceptorRefs = 
        {@InterceptorRef(value = "store", params = {"operationMode", "RETRIEVE"})} 
      ) 
public String execute() throws Exception {  
    LOG.error("An error accrued during action ActionErrors '{}' , FieldErrors '{}' " , getActionErrors() , getFieldErrors()); 
    //Rest of the code 
} 

Các MessageStoreInterceptor remove các lỗi trước đó trước khi thêm các lỗi mới.

Bạn có thể đặt cửa hàng trong AUTOMATIC trong ngăn xếp mặc định của mình. Bằng cách này tất cả các tin nhắn được lưu trữ luôn và sẽ tự động thử lại khi kết quả hành động là loại ServletRedirectResult (Ví dụ: nếu hành động 'chuyển hướng hành động', 'chuyển hướng') Vì vậy, bạn không cần phải xác định trình chặn chặn store rõ ràng ở chế độ RETRIEVE.

Mặc dù đây không phải là cách tiếp cận tốt nhưng bạn có thể truy cập vào thông báo cửa hàng trong phiên bằng các phím này.

session.get(MessageStoreInterceptor.fieldErrorsSessionKey) 
session.get(MessageStoreInterceptor.actionErrorsSessionKey) 
session.get(MessageStoreInterceptor.actionMessagesSessionKey) 
Các vấn đề liên quan