我有两个课程 - Student
和Course
。两者都在其内部的属性上定义了所有getter和setter。使用这两个类,我正在尝试构建一个Web应用程序,其中包含编辑和在不同jsp页面中添加学生等常规功能。我的学生可以注册多个课程,每个学生的每门课程的分数都应该可以在应用内编辑。
现在我有一个studentMarks.jsp
来加载动作类中的数据 - StudentAction
public class StudentAction extends ActionSupport {
private static final long serialVersionUID = 1L;
private List<Student> studentList;
private List<Course> courseList;
private HashMap<Student,List<Course>> studentCourseList;
private int rollNo;
private String name;
private String DOB;
StudentService studentService;
CourseService courseService;
Student student;
Course course;
/**** Setters and getters for all the attributes here **/
public String studentCourseList() {
this.studentList = studentService.getStudentRecords();
studentCourseList = new HashMap<Student, List<Course>>();
for(Student s : studentList) {
this.studentCourseList.put(s,courseService.getStudentCourses(s.getRollNo()));
}
return "SUCCESS";
}
public String editCoursePage() {
this.student = studentService.getStudent(rollNo);
this.courseList = courseService.getStudentCourses(rollNo);
return "SUCCESS"; //loads the editCourse.jsp
}
public String editCourseAction() {
System.out.print("This line displays null pointer exception" + courseList.size());
//courseService.editCourse(rollNo,this.courseList);
return "SUCCESS";
}
}
首先加载一个执行 studentCourseList 操作的页面,该操作用所有记录填充页面(此页面工作正常),并且在每个记录之后都有一个编辑按钮。点击编辑后,将调用 editCoursePage ,设置一个学生对象并获取该学生的课程列表。请注意,我没有重用hashmap中的课程列表。在此页面中,学生标记显示文本框内的标记以允许编辑。此页面显示正确的学生信息。
editCourse.jsp
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Edit courses</title>
</head>
<body>
Student: <s:label value="%{student.name}" />
<s:form action="editCourseAction">
<s:hidden name="rollNo" value="%{student.rollNo}" />
Courses:
<s:iterator value="courseList" var="courses">
<s:label ><s:property value="name" /></s:label>
<s:textfield name="marks" theme="simple"/>
<br />
</s:iterator>
<s:submit action="editCourseAction" value="submit" />
</s:form>
</body>
</html>
Course.java
@Entity
@Table(name="courses")
public class Course {
@Id
@GeneratedValue
@Column(name="id")
int id;
@Column(name="marks")
int marks;
@Column(name="rollNo")
int rollNo;
@Column(name="course")
String course;
//all getters and setters
}
现在这个表单正在显示正确的数据,但问题是在提交时,它没有将课程的值传递回 editCourseAction 。我已经尝试了所有类型的OGNL表达式,它们可以通过表单填充列表,但无法完成。如果我试图在动作类中获取courseList的值,它总是通过NPE。虽然它没有正确发送 rollNo 。 请告诉我我做错了什么。这是语法问题还是错误的方法?
答案 0 :(得分:4)
如果要将对象列表发送回操作,则需要在name
属性中指定索引:
而不是
<s:iterator value="courseList">
<s:textfield name="marks" />
</s:iterator>
使用
<s:iterator value="courseList" status="ctr">
<s:textfield name="courseList[%{#ctr.index}].marks" />
</s:iterator>