如何将对象从JSP表单传递到Struts2中的Action类而不将所有表单字段定义为类属性?

Joh*_*nny 5 java jsp struts struts2 ognl

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

  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>
    
    Run Code Online (Sandbox Code Playgroud)
  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;
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)
  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;
    }
    
    Run Code Online (Sandbox Code Playgroud)

我已经定义了所有访问器方法.事实上,问题是为nextAction类定义所有这些字段然后评估该类中的用户实例看起来非常烦人和多余.

我该如何解决这个问题?

And*_*ios 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" />
Run Code Online (Sandbox Code Playgroud)

(Key此处不需要属性)

请注意,要使其工作,您将需要一个带有无参数构造函数的bean(就像您一样).

避免自己初始化.

改变这个:

private Subscriber user = new Subscriber();
Run Code Online (Sandbox Code Playgroud)

对此

private Subscriber user;
Run Code Online (Sandbox Code Playgroud)