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属性(アクションに値を送信するために使用される)に対してそれを行います:

<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

複数のアクションで使用されるUserオブジェクトをメモリに保持する方法を尋ねていると思います。

私があなたの質問を正しく理解していれば、いくつかの選択肢があります。

Strutsのようなものではない1つのオプションは、Userオブジェクトをセッション変数に追加することです。ここで説明するように、セッション変数にアクセスできます。

特定のアクションのセット(またはアプリの「ウィザード」部分などのステップ)のセッションでオブジェクトを維持することを計画している場合に推奨するもう1つのオプションは、ScopeInterceptorです。あなたはここここでそれについて読むことができます。

お役に立てば幸いです。

于 2012-12-30T01:43:44.533 に答える