2013-03-11 62 views
2

我有2個類 - StudentCourse。它們都具有在其內部屬性上定義的所有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。 請告訴我我做錯了什麼。它是語法問題還是錯誤的方法?

回答

4

如果你想發送回Action對象的列表,你需要在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> 
+0

當表單被提交回時,Struts2框架何時或如何創建列表行動課?我被困在一個類似的問題上,理解這可能是關鍵(當我在提交表單時到達動作時,我的列表是'null',但我可以驗證發佈請求發送列表的值,如'myList [index]。屬性') – JorgeGRC 2015-09-09 10:20:51

+0

你可能沒有通過參數攔截器...檢查出來 – 2015-09-09 14:20:28

+0

我很尷尬,但問題是我沒有寫下列表的setter方法..現在我面對一個非常不同的問題,表單似乎不止一次(我認爲),因此框架試圖在我的列表對象的屬性上設置一個String [],因爲將有多於一個的參數具有相同的名稱。 。我會嘗試解決這個問題,但我可能會發佈一個新問題,而不是劫持這個問題:) – JorgeGRC 2015-09-09 15:28:01