如何将键值对从jsp传递给servlet?

时间:2015-01-22 16:03:08

标签: java jsp servlets jstl key-value

我有一个教师实体,主题和标记实体。每个教师都有一份初步科目清单。

当参赛者想要申请一些教师时,他应该在初级科目中留下他的分数,并从他的学校文凭(大学,无论如何)中留下分数。

我希望能够将这些值设为key-valuesubject-mark

所以现在我作为请求属性传递给apply.jsp第2页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

2 个答案:

答案 0 :(得分:1)

请尝试以下内容:

<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 
    }
}

希望能帮助。

答案 1 :(得分:1)

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中我有:

  1. 主题ID
  2. 考试类型
  3. 标记值
  4. 因此,对于您的问题,您可以在name属性中使用任何参数组合,然后通过指定的正则表达式在servlet中提取它们。