2

これは単純化された(実際の世界ではない) 例です。アクターのリストを持つクラスMovieであるドメイン モデルがあるとします。クラスActorには 3 つのフィールド ( namebirthDaterolesNumber ) があります。次のコードは、このシナリオを示しています。

ムービー.java

public class Movie {

    // some fields

    private List<Actor> actors;

    // getters and setters
}

Actor.java

public class Actor {

    private String name;

    private Date birthDate;

    private int rolesNumber;

    // getters and setters
} 


また、具体的なムービーで演じるすべてのアクターに関する情報をループで出力する JSP ページもあり、ユーザーは対応するテキスト フィールドの値を更新して変更をサーブレットに送信できます。

ActorsUpdate.jsp

...
<c:forEach items="${movie.actors}" var="actor">
    <table>
        <tr>
            <th>Name</th>
            <td><input type="text" value="${actor.name}" /></td>
        </tr>
        <tr>
            <th>Birth Date</th>
            <td><input type="text" value="${actor.birthDate}" /></td>
        </tr>
        <tr>
            <th>Number of Previous Roles</th>
            <td><input type="text" value="${actor.rolesNumber}" /></td>
        </tr>
    </table>
    <hr />
</c:forEach>
...


サーブレットでテキスト フィールドを取得するために、またはなどのServletRequest のメソッドを使用できることが知られていgetParameter()ますgetParameterValues()。しかし、更新された入力フィールドをオブジェクトのリストとして取得する方法 (3 つの関連する値ごとにグループ化されるように) は?

Spring プロジェクトの場合は、Spring の<form:form modelAttribute="modelName">
タグを使用して、 modelAttributeでバッキング オブジェクトを定義できます。しかし、純粋な JSP/サーブレット プロジェクトはどうでしょうか。

考えられる解決策

考えられる解決策の 1 つは、テキスト入力の「 name 」属性に名前を割り当て、次のようにvarStatus.indexを追加することです。

<c:forEach items="${movie.actors}" var="actor" varStatus="counter">
    <table>
        <tr>
            <th>Name</th>
            <td><input type="text" name="name${counter.index}" value="${actor.name}" /></td>
        </tr>
        ...
    </table>
    <hr />
</c:forEach>

したがって、このインデックスを使用すると、1 つのオブジェクトに関連する値を識別できますまた、ループ カウント(アクターの数)を格納できる非表示の入力フィールドを生成し、サーブレットで次のように 1 つのオブジェクトに関連する値を取得することもできます。

List<Actor> actors= new ArrayList<Actor>();
DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
for (int i = 0; i < count; i++) {
    String name= request.getParamater("name" + i);
    Date birthDate = dateFormat.parse(request.getParamater("birthDate" + i));
    int rolesNumber = Integer.parseInt(request.getParamater("rolesNumber" + i));

    Actor actor = new Actor(name, birthDate, rolesNumber);
    actors.add(actor);
}

私の質問は次のとおりです。

  1. 更新されたテキスト フィールドの値をオブジェクトの Listとしてサーブレットに渡す、よりエレガントで効果的な別の方法はありますか?

  2. 純粋な JSP/JSTL/EL/サーブレットの世界で、Spring のタグと同様または同等のソリューションはありますか?<form:form>


アップデート

上記の質問に対する答えは誰も知らないようです。受け入れられた答えは、私が求めたものとまったく同じではありません(私のコメントを参照してください)。

<form:form modelAttribute>純粋なサーブレット/JSP の世界では、Spring のタグに相当するものや類似のものはないようです。

まあ、完全なJava EE、またはSpring FrameworkApache Struts、または別の強力なWeb アプリケーション フレームワークが助けになります!

4

2 に答える 2

3

すべての入力に同じ名前(revisionNumber)を使用して使用できます

String[] revisionNumber = request.getParamaterValues("revisionNumber") 配列を取得します。

于 2012-12-09T03:51:26.423 に答える
0

これを jsp ページに戻す場合は、オブジェクト アクターを直接リストに戻して、直接リストに表示することをお勧めします。コード内でクラスのセッションに設定します。

次に、JSP ページでは、リストは次のようになります。(actorsList はオブジェクト セットです。act のような名前を付けます。その後、オプションでリストの最初の初期静的フィールドを設定できます。リストは getProperty でループし、オブジェクトからプロパティ「name」を取得します。

<ffi:list collection="actorsList" items="act">
  <option value="">(Select An Actor)</option>
  <ffi:getProperty name="act" property="name"/>
</ffi:list>
于 2014-02-20T09:37:12.120 に答える