使用 JSP 處理多筆更新的方法



在Javaworld也貼了一份 http://www.javaworld.com.tw/jute/post/view?bid=6&id=9675&tpg=1&ppg=1&sty...

有個需求是要在畫面上顯示類似 grid 的畫面, user 可以同時改很多欄位,
然後一次存檔. 我使用的方法如下, 供大家參考.

本來是想都用 JSTL 來實作, 後來在傳回值的地方碰到一些困難
(可參考 http://www.javaworld.com.tw/jute/post/view?bid=6&id=4653&sty=1&tpg=1&age=0)
所以就直接用 JSP 寫了.

FORM 的部分如下:

<c:set var="noOfRows" value="10" />
<sql:query var="queryResults" dataSource="jdbc/myDataSource"
           startRow="${param.start}" maxRows="${noOfRows}">
 select *
   from <c:out value="${initParam.my_table}"/>
  where name like ?
 <sql:param value="${param.name}"/>
</sql:query>
 
<form name="modify_stage" method="post" action="my.jsp">
  <c:set var="i" value="1" />
  <c:forEach var="row" items="${queryResults.rows}">
    <tr>
      <td align="center">
          <input type="hidden" name="yield[<c:out value="${i}"/>][1]"   value="<c:out value="${row.name}"/>" size="5" maxlength="5">
          <input type="text"   name="yield[<c:out value="${i}"/>][2]"   value="<c:out value="${row.phone}"/>" size="5" maxlength="5">
          </td>
      <td><c:out value="${row.update_dt}"/></td>
      <td align="center">
    </tr>
    <c:set var="i" value="${i+1}" />
  </c:forEach>
  <tr><td colspan="3">
    <hr>
    <input type="Submit" name="action" value="SAVE" />
    <input type="Reset" name="action" value="RESET" /></td>
  </td></tr>
  <input type="hidden" name="cnt" value="<c:out value="${i-1}" />" />
</form>

後續處理的 JSP 如下:

<%
Context ctx = new InitialContext ( );

DataSource dataSource = (DataSource) ctx.lookup ( "dsMydb" );
Connection connection = dataSource.getConnection ( );
Statement statement = connection.createStatement ( );

String table_name = new String(application.getInitParameter("my_table"));

String[][] yield = new String[10][10];
for(int i = 1; i < 5; ++i) {
  for(int j = 1; j < 3; ++j) {
    yield[i][j] = request.getParameter("yield["+i+"]["+j+"]");
    out.print(i + ", " +  j + ", " + yield[i][j] + "<br/>");
  }
  statement.execute( "update " + table_name + " set yield=" + yield[i][2] + " where name = '" + yield[i][1] + "'" );
}
 
  connection.close ( );
%>