我在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>
现在我想要的是逐个处理每个员工的数据,但我无法像field[]
,employee[]
,city[]
那样得到每个salary[]
。 ,company[]
....等。我的问题是如何逐个处理每一行的数据?
答案 0 :(得分:0)
终于意识到,我的方向是错误的。而不是在服务器端填充列的数据,为什么不使用(jquery / javascript)将每行的数据推送到数组中,然后在JSONArray中转换它。一旦我们将JSONArray对象发送到服务器并在服务器端将此JSONArray转换为dataBean。
以下是步骤: - 1.遍历整个表并将每行的数据推入数组。 2.以JSON格式转换此数组。 3.通过POST / GET将此JSONArray对象发送到Servlet。 4. Servlet会将此JSON对象转换为List。 5.每个bean代表一个完整的表行数据,你可以通过getterMethod()得到任何列的值。
希望这有助于某人。
答案 1 :(得分:-1)
您需要将所有要传递的信息放在输入上或使用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。但我不推荐它。
答案 2 :(得分:-1)
我建议在这里创建一个DTO类,它代表你的表数据,你可以在JSP.Below代码片段中设置你的请求范围,只是为了提供一种方法,我们如何解决这个问题,它是不准备生产:):))
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中的每个对象代表一个表中的一行,所以现在你没有迭代单个数组来获取一行的数据。
答案 3 :(得分:-1)
正如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>
对填充bean的评论的回复:
问题是表达式语言(EL)和scriptlet在创建页面之前在服务器上运行。 EL比scriptlet更好,但两者都有相同的限制。响应用户输入,数据在浏览器中发生变化。 EL和scriptlet无法检测到这一点。唯一要做的就是提交数据并在servlet中解析它。
如果您尝试类似
的话${result.setName("Fred")}
将在页面发送到浏览器之前计算。
允许用户一次编辑表中所有数据的另一种方法是在表中静态显示数据,并为每一行添加一个按钮。单击该按钮时,打开仅编辑该行数据的新页面。许多网站都使用这种方法。
回复有关网页太多的评论:
没有必要为每条记录创建一个新页面。每条记录都将使用相同的页面。使用bean填充允许用户编辑值的页面中的字段。与您现在正在执行的操作类似,但只需要显示一行的数据。
不是将整个列表传递给页面,而是仅发送正在编辑的记录。
表格中的每一行都需要一个带按钮的表格。包含标识行记录的隐藏字段。每个表单的操作都是相同的,因此只需要创建一个新页面。在servlet中,检索隐藏字段,然后检索相应的记录。将该记录发送到页面进行编辑。