如何将键值对从 jsp 传递给 servlet?
How to pass key-value pair from jsp to servlet?
我有一个教师实体、主题和标记实体。每个学院都有一份预备科目清单。
当参赛者想申请一些教员时,他应该输入他在预备科目中的分数和他的学校文凭(大学,无论什么)的分数。
而且我希望能够像 subject-mark
一样将此值作为 key-value
对获取。
所以现在我将作为请求属性传递给 apply.jsp
第二页 List<Subject>
。一个 List
包含 all subjects
- 这是文凭,另一个 List
包含 faculty subjects
- 它们是初步的。
我的 apply.jsp
页面如下:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Apply for ${faculty.name}</title>
</head>
<body>
You are in client apply for faculty view!
<h1>${name}</h1>
<ul>
<li><label>Faculty name: </label> <c:out value="${name}"></c:out></li>
<li><label>Total seats: </label> <c:out value="${total_seats}"></c:out></li>
<li><label>Budget seats: </label> <c:out value="${budget_seats}"></c:out></li>
</ul>
<form action="controller" method="POST">
<input type="hidden" name="command" value="applyFaculty" /> <input
type="hidden" name="show" value="false" /> <input type="hidden"
name="facultySubjects" value="${facultySubjects}" /> <input
type="hidden" name="allSubjects" value="${allSubjects}" />
<h1>Your preliminary marks</h1>
<table id="preliminary">
<c:forEach var="facultySubject" items="${facultySubjects}">
<tr>
<td><c:out value="${facultySubject.name}">${facultySubject.name}</c:out>
</td>
<td><input type="text" name="preliminaryMark" value="" /></td>
</tr>
</c:forEach>
</table>
<h1>Your diploma marks</h1>
<table id="diploma">
<c:forEach var="subject" items="${allSubjects}">
<tr>
<td><c:out value="${subject.id}">${subject.name}</c:out></td>
<td><input type="text" name="diplomaMark" value="" /></td>
</tr>
</c:forEach>
</table>
<p>
<input type="submit" value="OK">
</p>
</form>
</body>
</html>
那么我应该如何改造它以实现所需的功能?
PS。如果它更简单 - 实际上我只需要知道 Subject
id
字段即可在数据库中生成所需的 insert
。
请尝试以下操作:
<c:forEach var="facultySubject" items="${facultySubjects}">
<tr>
<td><c:out value="${facultySubject.name}">${facultySubject.name}</c:out>
</td>
<td><input type="text" name="subject_${facultySubject.id}" value="" /></td>
</tr>
</c:forEach>
并在您的 servlet 中执行以下操作:
Map<String, String[]> parameterMap = request.getParameterMap();
for (String key: parameterMap.keySet()) {
if (key.startsWith("subject_")) {
// do what ever you want here
}
}
希望对您有所帮助。
Amrola 提出了自己的想法,我认为这非常好。
在这个答案中,我将添加我的代码示例,它更符合我的目的。
所以 apply.jsp
看起来像:
<form action="controller" method="POST">
<input type="hidden" name="command" value="applyFaculty" />
<input type="hidden" name="facultyId" value="${id}" /><input
type="hidden" name="show" value="false" />
<h1>Your preliminary marks</h1>
<table id="preliminary">
<c:forEach var="facultySubject" items="${facultySubjects}">
<tr>
<td><c:out value="${facultySubject.name}">${facultySubject.name}</c:out>
</td>
<td><input type="text" name="${facultySubject.id}_preliminary" value="" /></td>
</tr>
</c:forEach>
</table>
<h1>Your diploma marks</h1>
<table id="diploma">
<c:forEach var="subject" items="${allSubjects}">
<tr>
<td><c:out value="${subject.name}">${subject.name}</c:out>
</td>
<td><input type="text" name="${subject.id}_diploma" value="" /></td>
</tr>
</c:forEach>
</table>
<p>
<input type="submit" value="OK">
</p>
</form>
在我的 servlet 中,我的工作方式如下:
Map<String, String[]> parameterMap = request.getParameterMap();
for (String parameterName : parameterMap.keySet()) {
if (parameterName.endsWith("preliminary")
|| parameterName.endsWith("diploma")) {
String[] value = parameterMap.get(parameterName);
Byte markValue = Byte.valueOf(value[0]);
String[] subjectIdAndExamType = parameterName
.split("_");
Integer subjectId = Integer
.valueOf(subjectIdAndExamType[0]);
String examType = subjectIdAndExamType[1];
Mark mark = new Mark(subjectId, entrant.getId(),
markValue, examType);
...// another logic
总结一下——从下几行开始:
<input type="text" name="${facultySubject.id}_preliminary" value="" />
或
<input type="text" name="${subject.id}_diploma" value="" />
在一个 servlet 中我有:
- 主题编号
- 考试类型
- 标记值
因此,对于您的问题,您可以在 name
属性中使用任意参数组合,然后通过指定的正则表达式将它们提取到您的 servlet 中。
我有一个教师实体、主题和标记实体。每个学院都有一份预备科目清单。
当参赛者想申请一些教员时,他应该输入他在预备科目中的分数和他的学校文凭(大学,无论什么)的分数。
而且我希望能够像 subject-mark
一样将此值作为 key-value
对获取。
所以现在我将作为请求属性传递给 apply.jsp
第二页 List<Subject>
。一个 List
包含 all subjects
- 这是文凭,另一个 List
包含 faculty subjects
- 它们是初步的。
我的 apply.jsp
页面如下:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Apply for ${faculty.name}</title>
</head>
<body>
You are in client apply for faculty view!
<h1>${name}</h1>
<ul>
<li><label>Faculty name: </label> <c:out value="${name}"></c:out></li>
<li><label>Total seats: </label> <c:out value="${total_seats}"></c:out></li>
<li><label>Budget seats: </label> <c:out value="${budget_seats}"></c:out></li>
</ul>
<form action="controller" method="POST">
<input type="hidden" name="command" value="applyFaculty" /> <input
type="hidden" name="show" value="false" /> <input type="hidden"
name="facultySubjects" value="${facultySubjects}" /> <input
type="hidden" name="allSubjects" value="${allSubjects}" />
<h1>Your preliminary marks</h1>
<table id="preliminary">
<c:forEach var="facultySubject" items="${facultySubjects}">
<tr>
<td><c:out value="${facultySubject.name}">${facultySubject.name}</c:out>
</td>
<td><input type="text" name="preliminaryMark" value="" /></td>
</tr>
</c:forEach>
</table>
<h1>Your diploma marks</h1>
<table id="diploma">
<c:forEach var="subject" items="${allSubjects}">
<tr>
<td><c:out value="${subject.id}">${subject.name}</c:out></td>
<td><input type="text" name="diplomaMark" value="" /></td>
</tr>
</c:forEach>
</table>
<p>
<input type="submit" value="OK">
</p>
</form>
</body>
</html>
那么我应该如何改造它以实现所需的功能?
PS。如果它更简单 - 实际上我只需要知道 Subject
id
字段即可在数据库中生成所需的 insert
。
请尝试以下操作:
<c:forEach var="facultySubject" items="${facultySubjects}">
<tr>
<td><c:out value="${facultySubject.name}">${facultySubject.name}</c:out>
</td>
<td><input type="text" name="subject_${facultySubject.id}" value="" /></td>
</tr>
</c:forEach>
并在您的 servlet 中执行以下操作:
Map<String, String[]> parameterMap = request.getParameterMap();
for (String key: parameterMap.keySet()) {
if (key.startsWith("subject_")) {
// do what ever you want here
}
}
希望对您有所帮助。
Amrola 提出了自己的想法,我认为这非常好。
在这个答案中,我将添加我的代码示例,它更符合我的目的。
所以 apply.jsp
看起来像:
<form action="controller" method="POST">
<input type="hidden" name="command" value="applyFaculty" />
<input type="hidden" name="facultyId" value="${id}" /><input
type="hidden" name="show" value="false" />
<h1>Your preliminary marks</h1>
<table id="preliminary">
<c:forEach var="facultySubject" items="${facultySubjects}">
<tr>
<td><c:out value="${facultySubject.name}">${facultySubject.name}</c:out>
</td>
<td><input type="text" name="${facultySubject.id}_preliminary" value="" /></td>
</tr>
</c:forEach>
</table>
<h1>Your diploma marks</h1>
<table id="diploma">
<c:forEach var="subject" items="${allSubjects}">
<tr>
<td><c:out value="${subject.name}">${subject.name}</c:out>
</td>
<td><input type="text" name="${subject.id}_diploma" value="" /></td>
</tr>
</c:forEach>
</table>
<p>
<input type="submit" value="OK">
</p>
</form>
在我的 servlet 中,我的工作方式如下:
Map<String, String[]> parameterMap = request.getParameterMap();
for (String parameterName : parameterMap.keySet()) {
if (parameterName.endsWith("preliminary")
|| parameterName.endsWith("diploma")) {
String[] value = parameterMap.get(parameterName);
Byte markValue = Byte.valueOf(value[0]);
String[] subjectIdAndExamType = parameterName
.split("_");
Integer subjectId = Integer
.valueOf(subjectIdAndExamType[0]);
String examType = subjectIdAndExamType[1];
Mark mark = new Mark(subjectId, entrant.getId(),
markValue, examType);
...// another logic
总结一下——从下几行开始:
<input type="text" name="${facultySubject.id}_preliminary" value="" />
或
<input type="text" name="${subject.id}_diploma" value="" />
在一个 servlet 中我有:
- 主题编号
- 考试类型
- 标记值
因此,对于您的问题,您可以在 name
属性中使用任意参数组合,然后通过指定的正则表达式将它们提取到您的 servlet 中。