【问题标题】:Process table's data in servlet在 servlet 中处理表的数据
【发布时间】:2014-12-27 09:26:47
【问题描述】:

我在 jsp 中填充一个动态表并将该表提交给 Servlet 。在 Servlet 中,我只能得到 String[]request.getParametersMap() 的每一列,但我想一一处理每一行的数据。 .知道如何实现这一目标吗?

我的桌子是:

<form method=POST action="ProcessTableDataServlet">
   <table>
        <tr>
            <th><input type=text name=city></th>
            <th><input type=text name=employe></th>
            <th><input type=text name=salary></th>
            <th><input type=text name=companyName></th>
            <th><input type=text name=experience></th>
            <th><input type=text name=Gender></th>
            <th><input type=text name=Age></th>
            <th><input type=text name=post></th>
            <th><input type=text name=hasPassport></th>
</tr>
       <tbody>
          <tr>
           <!-- populating data dynamically -->
           <c:forEach var="result" varStatus="status" items="${list}">
             <TD>
               <input type="text" name="${status.index}" value="${result}" />
            </TD>
          </c:forEach>

           </tr>
        </tbody>
    </table>
    <input type=submit>
    </form>

现在我想要的是一个一个地处理每个员工的数据,但是我不能像employee[]city[]salary[]company[] 那样得到每个field[]。等等我的问题是如何逐行处理数据?

【问题讨论】:

  • 这个问题还有其他建议吗?我有点卡在这里?

标签: html jsp servlets html-table jstl


【解决方案1】:

终于意识到,我走错了方向。与其在服务器端填充列的数据,为什么不使用(jquery/javascript)将每一行的数据推送到数组中,然后将其转换为 JSONArray。一旦我们有 JSONArray 对象将其发送到服务器,并在服务器端将此 JSONArray 转换为 dataBean。

以下是步骤:- 1. 遍历整个表,将每一行的数据压入数组。 2. 将此数组转换为 JSON 格式。 3. 通过 POST/GET 将此 JSONArray 对象发送到 Servlet。 4. Servlet 会将此 JSON 对象转换为 List。 5.每个bean代表一个完整的表行数据,可以通过getterMethod()获取任意列的值。

希望这对某人有所帮助。

【讨论】:

    【解决方案2】:

    您需要将要传递的所有信息输入或使用 URL 将其告知 servlet。

    首先,您可能需要考虑以下几点:

    1)Use only one form tag in your page instead of using one for each row.
    2)Enclose the whole table within your form tag.
    

    你会得到这样的结果:

    <FORM NAME="actionForm" action="ProfCourseUpdate" method='post'>
    <table border="2">
    <tr>
        <th>CourseID</th>
        <th>SectionNo</th>
        <th>Add Info</th>
    </tr>
    <% while(rs.next()){    %>  
    <tr>
        <td> <%=rs.getString("CourseID") %> </td>
        <td> <%=rs.getInt("SectionNo") %> </td>
        <td> <input type="submit" name="ProfCourseUpdate" value="Update Course Info"></td>
    </tr>
    <% } %>
    </table>
    </FORM>
    

    现在,所有这些都已清除,您可能想要使用不同的方法。如果您希望您的表格用于选择课程/部分的目的,您甚至不需要表格(或提交按钮)。

    你可以替换这个:

    <td><input type="submit" name="ProfCourseUpdate" value="Update Course Info"></td>
    

    有了这个:

    <td><a href="/ProfCourseUpdate?CourseID=<%=rs.getString("CourseID") %>&SectionNo=<%=rs.getInt("SectionNo") %>">Update</a></td>
    

    这样,您的 ProfCourseUpdate servlet 将接收检索和更新该行所需的两个变量(CourseID 和 SectionNo)。

    如果您必须使用按钮,您可以使用相同的技术,但在值上编码 CourseID 和 SectionNo。但我不会推荐它。

    【讨论】:

    • 感谢 Avnish 的建议,但我认为我不够清楚。让我更新我的问题
    【解决方案3】:

    我建议在这里创建一个DTO类,它代表你的表数据,你可以在JSP中设置你的请求范围。下面给出了sn-p代码,只是为了提供一种方法,我们如何解决这个问题,它还没有准备好生产:):)

    class Employee{
    
      private String name;
      private String city;
      ---------------
      ------getter && setter------
    
    }
    

    您可以在 JSP 页面中创建员工列表。

    List<Employee> empList = new ArrayList<Employee>();
    

    然后在 JSP 中迭代列表的过程中,您可以创建 Employee 类的对象,它代表行。

              <c:forEach var="result" varStatus="status" items="${list}">
                 <TD>
                   <input type="text" name="${status.index}" value="${result}" />
                </TD>
              <% Employee emp = new Employee(); //set the value for the current row %>
              </c:forEach>
    

    然后您可以在您的 jsp 中将其设置为请求范围,如下所示。

    request.setAttribute("empList",empList);
    

    稍后在您的 servlet 中,您可以通过以下方式从请求中获取此列表:

    List<Employee> empList = (List<Employee>)request.getAttribute("empList");
    

    然后您可以轻松地迭代 empList,empList 中的每个对象代表表中的一行,所以现在您无需迭代单个数组来获取一行数据。

    【讨论】:

    • 感谢 RE350,能否请您告诉我如何在不使用 scriptlet 的情况下设置 Employee Bean 中当前行的值?
    【解决方案4】:

    正如 re350 指出的,使用 bean (DTO) 来支持数据。在循环中,为 bean 中的每个字段创建一个 td 标记。每次通过循环都是一整行

           <c:forEach var="result" varStatus="status" items="${list}">
            <tr>
                <TD>
                    <input type="text" name="${status.index}" value="${result.name}" />
                </TD>
                <TD>
                    <input type="text" name="${status.index}" value="${result.city}" />
                </TD>
                ...
            </tr>
          </c:forEach>
    

    回应关于填充豆的评论:

    问题是表达式语言 (EL) 和 scriptlet 在创建页面之前在服务器上运行。 EL 比 scriptlet 好,但两者都有相同的限制。浏览器中的数据会根据用户输入发生变化。 EL 和 scriptlet 无法检测到这一点。唯一要做的就是提交数据并在 servlet 中解析。

    如果你尝试类似的东西

    ${result.setName("Fred")}
    

    它会在页面发送到浏览器之前计算出来。

    允许用户一次编辑表中所有数据的另一种方法是在表中静态显示数据并为每一行添加一个按钮。单击该按钮时,打开一个仅编辑该行数据的新页面。许多网站都使用这种方法。

    回复评论页面过多:

    不必为每条记录创建一个新页面。每条记录将使用相同的页面。使用 bean 填充页面中允许用户编辑值的字段。与您现在所做的类似,但只需要显示一行的数据。

    不要将整个列表传递给页面,只发送正在编辑的记录。

    表格中的每一行都需要一个带有按钮的表单。包括一个标识行记录的隐藏字段。每个表单的操作都是相同的,因此只需要创建一个新页面。在 servlet 中,检索隐藏字段,然后检索相应的记录。将该记录发送到页面进行编辑。

    【讨论】:

    • 谢谢唐尼,你能告诉我如何在不使用scriptlet的情况下设置Employee Bean中当前行的值吗?
    • 我的问题是我有这么大的表,所以对于每一行打开一个新页面并编辑该行的数据不是这里的选项。有什么办法可以在我的jsp页面中设置Employee Bean数据(在用户输入一些数据之后)?我在这里有点困惑
    猜你喜欢
    • 2011-11-24
    • 2011-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-27
    • 1970-01-01
    • 2012-11-06
    • 1970-01-01
    相关资源
    最近更新 更多