从复选框中获取空值

时间:2015-09-06 13:19:02

标签: spring-mvc arraylist data-binding jstl

我正在开发一个简单的Spring MVC项目。我无法从复选框中获取值。我的意思是当用户检查3个中的2个框时,所有3个被绑定到具有未检查值的列表为空。那是错的。我只想要检查的值。那些未经检查的人根本不应该列入名单。 这是我的代码片段: POJO:

public class Student{
private List<StudentCourses> sc;
//getters and setters
}

public class StudentCourses{
private int courseID;
private String courseName;
private Character grade;
private String semesterID;
//getters and setters
} 

这是我从控制器发送的内容:

@RequestMapping(value = "/selectclasses", method = RequestMethod.POST)
public String selectClasses(Model m) {
Student s = new Student();
List<StudentCourses> coursesList = new ArrayList<StudentCourses>();
coursesList.add(new StudentCourses("Eng 101", '-', "SP 16"));
coursesList.add(new StudentCourses("Math 140", '-', "SP 16"));
coursesList.add(new StudentCourses("CS 442", '-', "SP 16"));
m.addAttribute("coursesList", coursesList);
m.addAttribute("student", s);
return "selectclasses";
}

这就是我在selectclasses.jsp中的内容:

    <form:form modelAttribute="student" method="post" action="/success">
        <table>
            <c:forEach items="${coursesList}" var="r" begin="0" varStatus="status">
                <form:checkbox path="sc[${status.index }].courseName" value="${r.courseName}" label="${r.courseName}" />
            </c:forEach>
        </table>
        <input type="submit" id="submit" name="submit" value="Submit" />
    </form:form>

我不知道为什么在未检查时将null传递给“sc.courseName”。我究竟做错了什么?或者有解决方法吗?

请帮忙 谢谢。

2 个答案:

答案 0 :(得分:0)

简单的作家

<input type="checkbox" value="${r.courseName}" id="id"name="name"/>
控制器类中的

使用

获取值
String []values=request.getParameterValues(pass the id);

简单地获得所选值

答案 1 :(得分:0)

我找到了解决方案!

我找到了两种解决方法。这是使用Spring标签的解决方案:

<form:checkboxes path="sc" items="${coursesList}" itemValue="courseName" itemLabel="courseName" />

在上面的代码中,itemValue和itemLabel是主要的东西! itemValue和itemLabel只是引用items属性(items =“$ {coursesList}”)中对象的bean属性。简而言之,如果您需要使用自定义Bean列表作为items属性,则还需要使用itemValue和itemLabel属性。段落的这个粗体部分取自:https://stackoverflow.com/a/15529281/4828463 by @卡洛斯加维迪亚

现在使用JSTL核心代码的解决方案:

    <c:forEach items="${coursesList}" var="courses">
        <tr>
            <td><form:checkbox path="sc" value="${courses.courseName}" label="${courses.courseName}"/></td>
        </tr>
    </c:forEach>

就是这样。同样,value属性和label属性也很重要。

我必须说的一件事是,当我试图在线找到解决方案时,在几个地方我看到有些人建议使用@Override hashCode()和equals()方法(在我的案例中是StudentCourses类)。我用它测试了我的代码而没有它,但在这两种情况下我都没有看到任何区别。我的申请工作得很好。无论如何,如果有人需要看到它,我会发布我对这两种方法的实现。

@Override
public int hashCode() {
    int hash = 3;
    hash = 7 * hash + this.courseName.hashCode();
    hash = 7 * hash + this.grade.hashCode();
    hash = 7 * hash + this.semesterID.hashCode();
    return hash;
}

@Override
public boolean equals(Object object) {
    boolean result = false;
    if (object == null || object.getClass() != getClass()) {
        result = false;
    } else {
        StudentCourses sc = (StudentCourses) object;
        if (this.courseName == sc.getCourseName()
                && this.grade == sc.getGrade() && this.semesterID == sc.getSemesterID()) {
            result = true;
        }
    }
    return result;
}

再次感谢,我希望人们发现这个解决方案和解释很有用。