5

为了让问题更清楚,我举了一个例子:

  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类定义所有这些字段然后评估该类中的用户实例看起来非常烦人和多余。

我应该如何解决这个问题?

4

2 回答 2

8

这比你想象的要容易。

你已经很接近了,你已经为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;
于 2012-12-30T03:05:24.153 回答
1

我想您是在问如何在内存中持久保存一个将在多个操作中使用的用户对象。

如果我正确理解您的问题,您有几个选择。

一种不太像 Struts 的选项是将 User 对象添加到会话变量中。您可以按照此处所述访问会话变量。

如果您计划在会话中为一组特定的操作(或步骤,例如应用程序的“向导”部分)维护对象,我会推荐另一个选项是 ScopeInterceptor。你可以在这里这里阅读。

希望有帮助。

于 2012-12-30T01:43:44.533 回答