-1

これをダウンロードして実行してください。少し面倒でもやってみる価値はあると思います。

アクションクラスのexecuteメソッドで、beanを返すメソッドでbeanをセットすると、JSPでModeldrivenが動かない(動かない<s:property "someField" />のでbeanのインスタンス名をこのよう に打ち込む<s:property "myBean.someField" />)。

ただし、Bean のフィールド値を設定すると、Modeldriven が機能します。

あなたが私を信じていないかもしれませんし、私が間違ったことをしたと思っているかもしれません. しかし、それは真実ではありません!やってみなよ..

public class DefaultClass extends ActionSupport implements ModelDriven<TestBean>    {
        TestBean test = new TestBean();
        DAO db = DAO.getInstance();

        public String access() throws Exception {
            //Beans setter doesn't work!
            setTest( db.getTest() );

            return SUCCESS;
        }
        public String access2() throws Exception    {
            //Field setter works! 
            test.setA(db.getA());
            test.setB(db.getB());

            return SUCCESS;
        }

何を見つけたのかわかりませんでした。だから私はこの質問をします。そして、私自身の答えとして、Bean を値スタックにプッシュすると、モデル駆動型が機能します。

なぜこれについて疑問がないのだろうか。深刻な問題だと思います。

4

1 に答える 1

1

何を見つけたのかわかりませんでした。だから私はこの質問をします。

あなたは質問をしましたが、あなたに与えられた答えを無視しました... モデル駆動型インターセプターは、準備インターセプターの後に配置されますが、アクションの実際の実行のかなり前に配置されます。つまり、モデル クラスのインスタンスを取得する場合は、「準備」メソッドで作業を行う必要があります。アクションで getModel() が呼び出されると、いずれかのアクション メソッドのロジックの前に TestBean への参照になります。リンクした他の質問で、本で読んだので順序が異なると予想していたと述べましたが、それはどの本でしたか? Manning の Struts 2 In Action ではありませんでした。

避けるべき 1 つの落とし穴に注意する必要があります。ModelDriven アクションの execute() メソッドが呼び出されるまでに、フレームワークはモデル オブジェクトへの参照を取得しており、それがリクエスト全体で使用されます。

于 2010-09-03T16:05:37.257 に答える