簡體   English   中英

如何將對象從JSP表單傳遞到Struts2中的Action類而不將所有表單字段定義為類屬性?

[英]How to pass an object from a JSP form to an Action class in Struts2 without defining all form fields as a class property?

為了使問題清楚,我舉了一個例子:

  1. 考慮theSubscriber在波紋管所的形式first.jsp

     <s:form id="theSubscriber" name="theSubscriber" method="post" action="next.action"> <s:bean name="my.hibernate.actors.Subscriber" var="user"> <s:hidden name="id" key="id" value="%{user.id}" /> <s:textfield id="subscriberForename" name="forename" key="forename" value="%{user.forename}" label="Forename" /> <s:textfield id="subscriberSurname" name="surname" key="surname" value="%{user.surname}" label="Surname" /> </s:bean> </s:form> 
  2. 考慮next.action的以下動作類

     public class NextAction extends ActionSupport { private Subscriber user = new Subscriber(); private String forename; public String getForename() { return forename; } public void setForename(String forename) { this.forename = forename; } public ManageSubscriber() { // TODO Auto-generated constructor stub } public ManageSubscriber(Subscriber user) { this.user = user; } public Subscriber getUser() { return user; } public void setUser(Subscriber user) { this.user = user; } public String execute() { System.out.println(getUser());//This prints out null System.out.println(getForename());//This prints out the posted forename return SUCCESS; } } 
  3. 問題是:我知道將所有表單字段定義為操作類屬性可讓類正確填充它們。 但我想讓它填充另一個包含所有必要屬性的類中的相關字段。 用戶/訂閱者類是這樣的:

     public class User { private long id; private String username; private String password; private UserLevel userLevel; private String forename; private String surname; private String email; private String phoneNumber; private String address; private Date birthday; private Date registrationDate; } 

我已經定義了所有訪問器方法。 事實上,問題是為nextAction類定義所有這些字段然后評估該類中的用戶實例看起來非常煩人和多余。

我該如何解決這個問題?

這比你想象的要容易。

你非常接近,你已經完成了value屬性(用於預先設置頁面上項目的值):現在只需為name屬性(用於將值發送到Action),就像這個:

<s:hidden name="user.id" key="id" value="%{user.id}"  />
<s:textfield id="subscriberForename" name="user.forename"
    value="%{user.forename}" label="Forename" />
<s:textfield id="subscriberSurname" name="user.surname" 
    value="%{user.surname}" label="Surname" />

(此處不需要Key屬性)

請注意,要使其工作,您將需要一個帶有無參數構造函數的bean(就像您一樣)。

避免自己初始化。

改變這個:

private Subscriber user = new Subscriber();

對此

private Subscriber user;

我想你是在問如何在內存中保留一個將在多個動作中使用的User對象。

如果我正確理解您的問題,您有幾個選擇。

一個不太像Struts的選項是將User對象添加到會話變量中。 您可以按此處所述訪問會話變量。

另一個選項,如果您計划在會話中為特定的一組操作(或步驟,例如應用程序的“向導”部分)維護對象,我建議使用ScopeInterceptor。 你可以在這里這里閱讀。

希望有所幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM