struts2 <s:push value =“student”> textfield的标签</s:push>

时间:2012-10-01 03:42:34

标签: java-ee struts2

开发演示应用程序。

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

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

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>

1 个答案:

答案 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)。