2

Struts 2 とのインターフェイスを使用して動的な Web アプリケーションを作成しようとしていModelDrivenます。Struts1 を使用したことはありますが、Struts 2 での試みはこれが初めてです。

データベースに保存されている値からフォームを作成できますが、値を変更してデータベースを更新しようとすると、フォームの値がモデルに読み込まれません。

プロジェクト全体をここにアップロードしました(この時点で実行するには MySQL データベースが必要です)。

プロジェクトをロードしたら:

  1. に進みhttp://localhost/Vikos/secure/userます。
  2. ログインページに移動します。次を入力logon email = consumer@test.compassword = passwordます。
  3. Userデータベースから入力されたフォームを含むページが表示されます。Last Name フィールドを更新して<Update>ボタンをクリックすると、データベース内の値が更新されますが、値が返されません。

HTMLフォームからモデルに値を取得する方法は?

アップデート:

この投稿のタイトルを変更し、内容を少し修正して、何が起こっているかをより正確に説明しました。また、メソッドにいくつかのデバッグ コードを追加しましたUserAction.prepare()。Struts2 は、パラメータ配列の最初の要素 ( ) ではなくUserModel、文字列配列 ( ) を使用してプロパティをロードしようとしているようです。parmValuescorrectVal

public void prepare() throws Exception {

    // BEGIN - ADDED FOR DEBUGGING PURPOSES         
    Map parameters = request.getParameterMap();
    Set keys = parameters.keySet();
    Iterator iter = keys.iterator();
    String key;
    String[] parmValues;
    while (iter.hasNext()) {
        key = iter.next().toString();

        parmValues = (String[])(String[])parameters.get(key);
        if (parmValues.length == 1) {
            String correctVal = parmValues[0];
            System.out.println(correctVal);  // This is printing out the correct updated form values.
        }
    }
    // END - ADDED FOR DEBUGGING PURPOSES
    
    determineCrudType();
}

13:21:42.773 [http-bio-80-exec-7] エラー coxiParametersInterceptor

  • 開発者への通知 (struts.devMode を false に設定して、このメッセージを無効にします): 'クラス com.codedeart.vikos.action.UserAction で 'email' を設定中に予期しない例外がキャッチされました: 値 '[Ljava.lang.String' で式 'email' を設定中にエラーが発生しました;@7e227c19'

13:21:42.775 [http-bio-80-exec-7] エラー coxiParametersInterceptor

  • 開発者通知 (このメッセージを無効にするには、struts.devMode を false に設定します): 'class com.codedeart.vikos.action.UserAction で 'firstName' を設定中に予期しない例外がキャッチされました: 値 '[Ljava.lang.String で式 'firstName' を設定中にエラーが発生しました;@378da3ff'

13:21:42.776 [http-bio-80-exec-7] エラー coxiParametersInterceptor

  • 開発者通知 (このメッセージを無効にするには、struts.devMode を false に設定します): 'class com.codedeart.vikos.action.UserAction で 'lastName' を設定中に予期しない例外がキャッチされました: 値 '[Ljava.lang.String' で式 'lastName' を設定中にエラーが発生しました;@3409d6d7'

13:21:42.778 [http-bio-80-exec-7] エラー coxiParametersInterceptor

  • 開発者通知 (struts.devMode を false に設定して、このメッセージを無効にします): 'class com.codedeart.vikos.action.UserAction で 'middleName' を設定中に予期しない例外がキャッチされました: 値 '[Ljava.lang.String' で式 'middleName' を設定中にエラーが発生しました;@13b29db7'

更新 2:

この問題は、 Custom Type Convertersを使用して修正した他の人によって報告された問題と似ているようです。このチュートリアルに基づいて、カスタム型コンバーターを実装しようとしました。私のメソッドが起動していないため、実際に型変換を行う段階にはまだ達していませUserTypeConverterん。最新のコードを BitBucket にアップロードしました。

PS:

JSP とバックエンド Struts の実装に問題がありました。答えは、以下の Uchenna と Roman の両方から提供されたアドバイスに従うことです。私は BitBucket で自分のプロジェクトを更新し続けるので、他の人がこれらの間違いを犯す必要がなくなることを願っています。

4

2 に答える 2

0

まずは

あなたの に問題がありますjspstruts2にタグ ライブラリ(s:textfield)を使用しないのはなぜですかinput。それを変更できるかどうかを確認してください。また、要素に追加namespace="/"しますform

第二に

UserModelコンストラクタを次から変更

public class UserModel extends BaseModel {    
    private UserVo userVo;      
    public UserModel() {
        super();
    }
}

public class UserModel extends BaseModel {    
    private UserVo userVo;      
    public UserModel() {
        super();
            userVo = new UserVo();
    }
}

第三に

あなたBaseModelに実装してjava.io.Serializableもらう

public abstract class BaseModel implements java.io.Serializable
于 2014-01-21T06:47:13.863 に答える
0

userフォームをアクションに間違ってマップしました。userアクションはデフォルトの名前空間にマップされますが、フォームは/modelDriven名前空間にマップされます。したがって、フォームを送信すると、404 エラーが発生するはずです。namespacestruts タグである必要がある form タグから属性を削除します。form タグの名前空間属性を設定しない場合、アクションはデフォルトの名前空間を使用する可能性があります。名前空間とその構成の詳細については、こちらを参照してください。置き換えるコード

<s:form accept-charset="UTF-8" action="user" method="POST" theme="simple">

simpleHTML デザインに影響を与えないようにフォームにテーマを追加したことに注意してください。また、開発者モードで実行している場合、struts フォーム タグのアクションが正しくマップされていれば、警告は表示されなくなります。

equalsまた、Java の文字列はではなくメソッドと比較されることに注意してください==。そのため、crudType変数が変更されない可能性があり、更新操作が妨げられます。

于 2014-01-19T12:03:50.253 に答える