0

データベースからの日付と説明を表示している JSP があります。すべてのエントリには一意の ID がありますが、ページには表示されません (チェックボックスを表示) これらのエントリは「ロジック:反復」を使用してスローされるため、エントリに基づいて行数が常に変化します。現在、これらのフィールドはテキスト フィールドとして表示されるため、ユーザーは日付や説明を更新することもできます。チェックボックスが左側にあるため、ユーザーは更新するすべての値を選択できます。上記の logic:iterate を思い出してください。チェックボックスは name を使用して定義する必要があり、id を持つことはできません。

 ...
 ...
 <logic:notEmpty name="specialResult" scope="request">
    <logic:iterate name="specialResult" id="specialResult" indexId="index">
        <tr align="center">
            <td width="15%">
            <input type="checkbox" name="upisActive" property="upisActive"
                                value="<bean:write name="specialResult" property="upId"/>"></input></td>
            <td width="15%"><input type="text" name="upDate" value="<bean:write name="specialResult" property="upDate"/>"
                                property="upDate" size="20" class="Date" id="Date"></input></td>
            <td width="15%"><input type="text" name="upDesc" value="<bean:write name="specialResult" property="upDesc"/>"
                                property="upDesc" size="20" id="Desc"/></td>
        </tr>
    </logic:iterate>

...

私のエラーは、3 つの行があり、3 番目の行を更新して 3 番目のチェックボックスを選択したい場合です。私の Action クラスは、最初の行の日付と説明を取得しています。アクション クラスを編集して、チェックされたチェックボックスに対して値を取得するにはどうすればよいですか?

 public ActionForward class(ActionMapping mapping, ActionForm theForm,
        HttpServletRequest request, HttpServletResponse response) throws IOException,
        SQLException, ServletException
{
    Connection conn = null;
    Service Serv = new Service();
    List updList = new ArrayList();
    Form upForm = (Form) theForm;
    String[] values = request.getParameterValues("upisActive");
    try
    {
        conn = getConnection(request, false);
        for (int i=0;i<values.length;i++){
            VO hdvo = new VO(); //Vo class with getters and setters
            val = values[i];
            hdvo.setDate(upForm.upDate[i]);
            hdvo.setDesc(upForm.upDesc[i]);
            updList.add(hdvo);

        }
        hdServ.updTest(updList, conn);
        ...
4

1 に答える 1

1

問題は、ページの設定方法にあります。すべてのチェックボックスが同じ名前(標準設定)になっていますが、フィールドupDateupDescフィールドも同じ名前で設定されています。

つまり、フォームを送信すると、サーバー上で(例を考慮して)3つのupDate値のリスト、3つのupDesc値のリスト、および3つのupisActiveチェックボックスのリストが表示されます。ええと...そうではありません!

問題は、チェックボックスと、更新する値を読み取るために使用するコードです。

まず、チェックボックスがチェックされていない場合、チェックボックスはリクエストで送信されません。つまり、選択に応じて、サーバー上upisActiveで長さ0、1、2、または3の値のリストを取得します。

次に、サーバーに次のコードがあります。

String[] values = request.getParameterValues("upisActive");
...
for (int i = 0; i < values.length; i++) {
  ...
  val = values[i];
  hdvo.setDate(upForm.upDate[i]);
  hdvo.setDesc(upForm.upDesc[i]);
  ...
}

この例では、3番目のチェックボックスをオンにして、フォームを送信します。これはString[] values、選択したチェックボックスのみがサーバーに送信されるため、長さが1になることを意味します。ただし、入力フィールドは常に3upDescと3で送信されupDateます。

次に、ループします-それを(1回)抽出して抽出upForm.upDate[0]upForm.upDesc[0]ます。このように、3番目のチェックボックスをオンにして最初の行を更新します。

その他の問題:

1)次のコードで同じ識別子を使用しました(問題が発生しています)。

<logic:iterate name="specialResult" id="specialResult"...

2)クラシック入力を使用していて、それにproperty属性を追加しています:

<input type="text" ... property="upDate" />" property="upDate" ...

3)ブラウザがフィールドが毎回完全に一致する順序で送信されることを保証していないので、単一のカウンタを使用することは、おそらく同じ順序を「期待」しているだけです。

4)また、これを読んでください

于 2010-08-26T20:26:36.567 に答える