开发演示应用程序。
错误:无法解析推送标记下的属性。姓名和年龄
FORM:
<s:form action="addStudentAction" method="POST">
<s:push value="student">
<s:textfield name="name" label="Name : " value="" />
<s:textfield name="age" label="Age : " value=""/>
</s:push>
<s:submit/>
</s:form>
行动&amp;模型:
public class StudentAction extends ActionSupport implements ModelDriven {
Student student = new Student();
@Autowired
StudentService studentService;
public Object getModel() {
return student;
}
public String execute(){
return SUCCESS;
}
public String addStudent() throws Exception {
student.setCreatedDate(new Date());
studentService.add(student);
return SUCCESS;
}
public Student getStudent() {
return student;
}
public void setStudent(Student student) {
this.student = student;
}
}
package com.myapp.model;
import java.util.Date;
public class Student {
private Long id;
private String name;
private Integer age;
private Date createdDate;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public Date getCreatedDate() {
return createdDate;
}
public void setCreatedDate(Date createdDate) {
this.createdDate = createdDate;
}
}
EDITED
public class StudentAction extends ActionSupport implements ModelDriven<Student> {
Student student = new Student();
List<Student> studentList = new ArrayList<Student>();
@Autowired
StudentService studentService;
public Student getModel() {
return student;
}
public String execute(){
return SUCCESS;
}
public String addStudent() throws Exception {
student.setCreatedDate(new Date());
studentService.add(student);
return SUCCESS;
}
}
仍无法解析静态属性。查看选项。 model.name将解析该属性。
**struts.xml**
<struts>
<constant name="struts.devMode" value="true"/>
<package name="default" namespace="/" extends="struts-default">
<action name="addStudentAction" class="com.myapp.action.StudentAction" method="addStudent">
<result name="success" type="redirectAction">listStudentAction</result>
</action>
<action name="listStudentAction" class="com.myapp.action.StudentAction" method="listAllStudents">
<result name="success">/pages/student.jsp</result>
</action>
</package>
</struts>
答案 0 :(得分:4)
在渲染期间访问变量时使用Push。在您的情况下,您将文本字段中的值设置为空,并且因为这是您在推送内所做的全部操作,很明显推送标记没有做任何有用的事情。
我认为你可能想要的是“推动”学生的观点,这相当于追加“学生”。对所有变量。这不是push标签的功能,虽然我必须承认这样的标签很有用,并且可能节省大量的输入。我们可以看到动作的目标实现了模型驱动(并且模型是学生),这有效地将学生推到了堆栈顶部,所以只需删除推送标签就可以了。
以下是建议:
你的行动有一个get / set学生......如果它实现了ModelDriven则不应该。
你的班级StudentAction应该叫做AddStudentAction。
应删除addStudent方法,并将功能移至execute(),即:
public String execute() throws Exception {
student.setCreatedDate(new Date());
studentService.add(student);
return SUCCESS;
}
您应该实现验证方法public void validate()
(除非您在xml或注释中执行此操作)。
最后,这是个人偏好,但是当你实现ModelDriven时,它有助于提供类型,即:implements ModelDriven<Student>
(然后IDE希望知道创建正确的getter / setter)。