当前位置: 首页 > 面试题库 >

使用struts 2表单标签编辑对象的ArrayList

黄跃
2023-03-14
问题内容

我有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
操作,该操作将使用所有记录填充该页面(此页面工作正常),并且在每个记录之后都有一个编辑按钮。单击edit后,将调用 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>

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 。请告诉我我在做什么错。是语法问题还是方法错误?


问题答案:

如果要将对象列表发回给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>


 类似资料:
  • 主要内容:简单UI标签:,组 UI 标签:,选择 UI 标签:form 标签的列表是Struts的UI标签的一个子集。这些标签可以帮助渲染中需要Struts Web应用程序和用户界面可以分为三类。本章将带你通过所有三种类型的UI标签: 简单UI标签: 我们已经使用这些标签已经在我们的例子中。让我们来看看一个简单的一些简单UI标签的视图页面email.jsp: 如果你是知道的HTML,那么所有使用的标签是很常见的HTML标签与一个额外前缀s:随着每个标签和不同

  • 问题内容: 可能是一个新手问题,请耐心等待。 我有一个Django表单,可以编辑模型的特定实例。为了知道正在编辑哪个对象,我有一个包含对象ID的隐藏字段以及包含ID的URL。 第一个问题:在隐藏字段中包含对象的ID是否正确? 我(可能是毫无根据的)担心仅将其作为URL的一部分,然后有人可以打开一个对象ID的页面,将表单提交给另一个对象,然后该对象将被覆盖。这就是为什么我要使用隐藏字段的原因。 将I

  • 主要内容:创建action类:,创建视图,配置文件我们经常遇到的一些情况,必须创建列表或数组上遍历列表。可以创建列表或数组使用scriptlet或者可以使用generator 标签。 tag. 创建action类: 创建视图 下列 helloWorld.jsp 展示使用generator 标记: 在这里,我们创建一个generator 标签,我们要求它解析的字符串,其中包含逗号分隔的列表,形成了彩虹的颜色。我们告诉发电机标签,分隔符是“,”我们希

  • 主要内容:创建动作类:,创建视图,配置文件说,如果有两个列表A和B的值A1,A2和B1,B2。合并列表,会给你的A1,A2,B1,B2,而append 名单,会有A1,A2,B1,B2。 创建动作类: 首先,让我们创建一个简单的类叫做Employee.java,它看起来像: Employee类有两个属性 - name 和 department,我们也有两个员工名单 - employees 和contractors。我们有一个方法叫做get

  • 主要内容:创建动作类:,创建视图,配置文件如果有两个列表A和B的值,A1,A2和B1,B2。合并列表,会给出A1,B1,A2,B2。 创建动作类: 首先,让我们创建一个简单的类叫做Employee.java,它看起来像: Employee类有两个属性 - name 和 department,我们也有两个员工名单 - employees 和contractors。我们有一个方法叫做getRecruitmentDecider,返回Decide

  • 主要内容:创建动作类:,创建视图,配置文件创建动作类: 首先,让我们创建一个简单的类叫做Employee.java,它看起来像: Employee类有两个属性 - name 和 department,我们也有两个员工名单 - employees 和contractors。我们有一个方法叫做getRecruitmentDecider,返回Decider 对象。Decider 实现返回true,如果雇员招聘部门工作,否则返回false。 接下