Редактирование ArrayList объектов с тегом формы struts 2

У меня есть 2 класса - Student и Course. Оба имеют все геттеры и сеттеры, определенные для атрибутов внутри них. Используя эти два класса, я пытаюсь создать веб-приложение с общими функциями, такими как редактирование и добавление студентов на разные страницы 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, который устанавливает один объект студента и получает список курсов для этого студента. Обратите внимание, что я не использую список курсов из хэш-карты. На этой странице отметки учащихся отображаются вместе с отметками внутри текстовых полей, чтобы их можно было редактировать. На этой странице отображается правильная информация об ученике.

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>

Курс.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 правильно. Пожалуйста, скажите мне, что я делаю неправильно. Проблема в синтаксисе или неправильный подход?


person ishan    schedule 11.03.2013    source источник


Ответы (1)


Если вы хотите отправить обратно в 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>
person Andrea Ligios    schedule 11.03.2013
comment
Когда или как платформа Struts2 создает список, когда форма отправляется обратно в класс действий? Я застрял в аналогичной проблеме и понимаю, что это может быть ключом (мой список null, когда я достигаю действия при отправке формы, но я могу проверить, что почтовый запрос отправляет значения списка, такие как myList[index].attribute) - person JorgeGRC; 09.09.2015
comment
Вы, вероятно, не проходите через перехватчик параметров... Проверьте это - person Andrea Ligios; 09.09.2015
comment
Я смущен, но проблема в том, что я не записал метод установки для списка. Теперь я столкнулся с совершенно другой проблемой, форма, кажется, отправляется более одного раза (я думаю) и, таким образом, структура пытается установить String[] в атрибутах объекта моего списка (поскольку будет более 1 параметра с тем же именем)... Я попытаюсь решить это, но я мог бы опубликовать новый вопрос вместо того, чтобы перехватывать этот :) - person JorgeGRC; 09.09.2015
comment
Неважно, я нашел проблему... она была связана с моим дизайном и не имела ничего общего с struts2 - person JorgeGRC; 09.09.2015