我有2个课程-
Student
和Course
。两者都具有在其内部属性上定义的所有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。 接下