【问题标题】:Editing ArrayList of objects with struts 2 form tag使用 struts 2 表单标签编辑对象的 ArrayList
【发布时间】:2013-03-11 12:12:49
【问题描述】:

我有 2 个课程 - StudentCourse。两者都在它们内部的属性上定义了所有 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。 请告诉我我做错了什么。是语法问题还是方法不对?

【问题讨论】:

    标签: java jakarta-ee struts2 ognl struts-tags


    【解决方案1】:

    如果您想将对象列表发送回 Action,您需要在 name 属性中指定 index

    而不是

    <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>
    

    【讨论】:

    • 当表单提交回操作类时,Struts2 框架何时或如何创建列表?我遇到了类似的问题,理解这可能是关键(当我在提交表单时到达操作时,我的列表是 null,但我可以验证发布请求发送列表的值,如 myList[index].attribute)跨度>
    • 你可能没有通过参数拦截器...检查一下
    • 我很尴尬,但问题是我没有写下List的setter方法..现在我面临一个非常不同的问题,表单似乎提交了不止一次(我认为)因此框架试图在我的列表对象的属性上设置一个String[](因为会有多个同名的参数)......我会尝试解决这个问题,但我可能会发布一个新问题而不是劫持这个问题:)
    • 没关系,我发现了这个问题......它与我的设计有关,与struts2无关。
    猜你喜欢
    • 2013-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多