我有2個類 - Student
和Course
。它們都具有在其內部屬性上定義的所有getter和setter。使用這兩個類我試圖構建一個具有通用功能的Web應用程序,如在不同的jsp頁面中編輯和添加學生。我的學生可能已經註冊了多個課程,並且每個學生的每門課程都應該在應用內編輯。編輯帶有struts 2表格標籤的對象的ArrayList
現在我有從動作類加載數據的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表達式。它總是通過NPE,如果我嘗試獲取行動類中courseList的值。雖然它沒有正確發送rollNo。 請告訴我我做錯了什麼。它是語法問題還是錯誤的方法?
當表單被提交回時,Struts2框架何時或如何創建列表行動課?我被困在一個類似的問題上,理解這可能是關鍵(當我在提交表單時到達動作時,我的列表是'null',但我可以驗證發佈請求發送列表的值,如'myList [index]。屬性') – JorgeGRC 2015-09-09 10:20:51
你可能沒有通過參數攔截器...檢查出來 – 2015-09-09 14:20:28
我很尷尬,但問題是我沒有寫下列表的setter方法..現在我面對一個非常不同的問題,表單似乎不止一次(我認爲),因此框架試圖在我的列表對象的屬性上設置一個String [],因爲將有多於一個的參數具有相同的名稱。 。我會嘗試解決這個問題,但我可能會發佈一個新問題,而不是劫持這個問題:) – JorgeGRC 2015-09-09 15:28:01