1

开发演示应用程序。

错误:无法解析推送标签下的属性。姓名和年龄

形式:

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

动作与型号:

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


}

已编辑

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 将解析该属性。

jsp

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

1 回答 1

4

在渲染期间访问变量时使用推送。在您的情况下,您将文本字段中的值设置为空,并且由于这就是您在推送中所做的一切,因此很明显推送标签没有做任何有用的事情。

我认为您可能打算在视图中“推动”学生,这相当于附加“学生”。到所有变量。这不是 push 标签的作用,尽管我必须承认这样的标签会很有用,并且可能会节省大量的打字时间。我们可以看到动作的目标实现了模型驱动(并且模型是学生),这有效地将学生推到了堆栈的顶部,所以只需删除推送标签就可以了。

以下是忠告:

您的操作有一个 get/set Student...如果它实现了 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)。

于 2012-10-01T04:08:08.893 回答