2009-05-11 25 views
14

Chúng tôi đã cố gắng chuyển hướng từ hành động này sang hành động khác, hy vọng dữ liệu đó sẽ được chuyển giữa các hạt đậu tương ứng ActionForm tương ứng. Hành động đầu tiên nhận được yêu cầu từ trình duyệt, in một trường dữ liệu và chuyển tiếp nó đến một hành động khác, nó in cùng một trường và chuyển hướng đến một JSP.Java Struts 1: chuyển tiếp từ hành động đến hành động. Truyền dữ liệu qua ActionForms

Vấn đề là ActionTo đang in giá trị không chính xác - commonInt có giá trị mặc định là 0, trong khi chúng tôi mong đợi 35.

Dưới đây là một ví dụ đại diện:

public class ActionFrom extends DispatchableAction{ 

    public ActionForward send(ActionMapping mapping, ActionForm form, HttpServletRequest request,HttpServletResponse response){ 
     FormA formA = (FormA)form; 

     formA.commonInt = 35; 
     System.out.println("sent: "+formA.commonInt); 
     return mapping.findForward("send"); 
    } 
} 

public class ActionTo extends DispatchableAction{ 

    public ActionForward recv(ActionMapping mapping, ActionForm form, HttpServletRequest request,HttpServletResponse response){ 
     FormB formB = (FormB)form; 

     System.out.println("recv= "+formB.commonInt); 

     return mapping.findForward("send"); 
    } 
} 

Và ActionForms là:

public class FormA extends ActionForm { 
    public int intA; 
    public int commonInt; 
} 

public class FormB extends ActionForm{ 
    public int intB; 
    public int commonInt; 
} 

Mappings:

<action path="/from" type="EXPERIMENT.ActionFrom" name="formA" scope="request" 
     input="something.jsp" parameter="dispatch" unknown="false" validate="false"> 
<forward name="send" path="/to.do?dispatch=recv" redirect="false"/> 
</action> 

<action path="/to" type="EXPERIMENT.ActionTo" name="formB" scope="request" 
     input="something.jsp" parameter="dispatch" unknown="false" validate="false"> 
     <forward name="send" path="/login.do" redirect="false"/> 
</action> 

Có cách nào để thực hiện điều này? Hoặc cả hai hình thức phải giống nhau?

Cách giải quyết mà chúng tôi đã cố gắng là vượt qua mọi thứ thông qua yêu cầu, nhưng nó có thể trở nên lớn và lộn xộn.

+0

Tôi xin lỗi vì thời lượng này. – Tom

Trả lời

6

Cách để thực hiện việc này là sử dụng cùng một dạng hành động cho cả hai hành động. Có lý do cụ thể nào khiến bạn cần hai dạng hành động khác nhau không? Nếu không thử sửa đổi ánh xạ hành động thứ hai thành name = "formA" và bản thân hành động để sử dụng FormA hơn là FormB.

+0

'Điều' ở đây là chúng tôi đang cố gắng thêm một số mô-đun vào chức năng hiện có. Cả hai hình thức này đều khá lớn và không có nhiều trường chung. Chúng tôi muốn giữ mọi thứ gọn gàng và không tạo ra một hình thức rất lớn. – Tom

+3

Trong trường hợp đó, bạn có thể muốn xem lớp Actionredirect sau đó. Bạn có thể thêm các tham số được gửi đến hành động tiếp theo. Kể từ khi thanh chống 1.2.7. –

0

Âm thanh như thế này có thể lộn xộn, tôi sẽ đơn giản hóa việc này và chỉ sử dụng ActionForm để lưu trữ dữ liệu Request.

public class FormA extends ActionForm { 
    public int intA; 
    public int commonInt; 
} 

Khi Request đã được đệ trình lấy dữ liệu ra khỏi ActionForm và các công cụ nó vào phiên giao dịch ở đâu đó, hoặc trực tiếp, hoặc vào một người giữ dữ liệu trong phiên để duy trì loại thông tin này.

public class ActionTo extends DispatchableAction { 
    public ActionForward recv(ActionMapping mapping, ActionForm form, HttpServletRequest request,HttpServletResponse response) { 
    FormA form = (FormA)form; 

    DataHolder dataHolder = request.getSession().getAttribute("dataHolder"); 
    dataHolder.setCommonInt(commonInt); 
    dataHolder.setIntA(intA); 

    return mapping.findForward("send"); 
    } 
} 

Lý tưởng nhất, nếu bạn không đầu tư mạnh vào Struts 1 Tôi muốn có một cái nhìn tại Struts 2.

10

Tom, sử dụng bạn giải pháp và kết hợp với ActionRedirect, được đề xuất bởi Vincent Ramdhanie, tôi đã những gì bạn muốn quá.

Mã đơn giản như vậy và cho phép bạn có Biểu mẫu riêng cho từng Hành động.

ActionRedirect redirect = new ActionRedirect(mapping.findForward("send")); 
redirect.addParameter("commonInt", formA.getCommonInt()); 
return redirect; 
formB.setCommonInt(request.getParameter("commonInt")); 

endend này lên tiết kiệm ngày của tôi và giúp tôi không phải có các nỗ lực để thay đổi điều đó trực tiếp trong JSP, những gì sẽ là khủng khiếp.

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