与Struts 2的形式标记对象的编辑的ArrayList与Struts 2的形式标记对象的编辑的A

2019-05-12 11:51发布

我有2班- StudentCourse 。 都对里面的相关属性进行定义的所有getter和setter。 使用这两个类,我试图建立与像编辑一般功能和增加学生在不同的JSP页面的Web应用程序。 我学生可以在多种课程和标志已登记为每个学生的每一个过程中,应在应用程序中编辑。

现在我有一个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。 请告诉我,我到底做错了。 难道是语法问题,或者是这是错误的做法?

Answer 1:

如果你想发送回行动对象的列表,你需要指定的索引 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>


文章来源: Editing ArrayList of objects with struts 2 form tag