Как передать объект из формы JSP в класс Action в Struts2, не определяя все поля формы как свойство класса?

Чтобы вопрос был понятен, приведу пример:

  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, а затем оценка экземпляра пользователя в этом классе выглядит очень раздражающим и избыточным.

Как мне решить эту проблему?


person Johnny    schedule 30.12.2012    source источник


Ответы (2)


Это проще, чем вы думаете.

Вы очень близки, и вы уже сделали это для атрибута value (используется для предварительной установки значения элемента на странице): теперь просто сделайте это для атрибута name (используется для отправки значения в действие), например это:

<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;
person Andrea Ligios    schedule 30.12.2012
comment
Спасибо. Così funziona bene! :D Вы очень точно указали проблему! - person Johnny; 31.12.2012

Я думаю, вы спрашиваете, как сохранить в памяти объект пользователя, который будет использоваться в нескольких действиях.

У вас есть несколько вариантов, если я правильно понял ваш вопрос.

Один из вариантов, который не очень похож на Struts, — добавить объект User в переменную сеанса. Вы можете получить доступ к переменной сеанса, как описано здесь. .

Другой вариант, который я бы порекомендовал, если вы планируете поддерживать объект в своем сеансе для определенного набора действий (или шагов, таких как часть «мастера» вашего приложения), — это ScopeInterceptor. Вы можете прочитать об этом здесь и здесь.

Надеюсь, это поможет.

person Michael Freake    schedule 30.12.2012
comment
Спасибо! Ваш пост в целом был для меня полезен и я узнал несколько интересных вещей, но я не это имел в виду. Я хочу узнать, есть ли в struts автоматизированный способ инициализации объекта Java, определенного как атрибут в классе действий! Если вы посмотрите на мой пример, он станет более очевидным. Я хочу избежать переопределения всех атрибутов пользовательского класса в классе действия. Я ожидаю, что стойки сделают это за меня! - person Johnny; 30.12.2012