1

我正在运行一个基本的 Struts2 应用程序,其中我感到困惑。

我的动作类实现PreparableModelDriven接口并扩展类ActionSupport。模型 bean 有一个名为User.

我的主页(jsp) 有一个输入字段,对应于User模型bean 的唯一属性。

prepare()方法中,我正在初始化 bean 并将其属性设置为某个默认值,例如"Test",该getModel()方法正在返回此 bean 对象。

validate()中,我有一个验证,如果Userbean 的属性的值等于"Test"然后addFieldError()继续。

public Student getModel() {
    System.out.println("inside getModel.."+ st.getName());      
    return st;
}

public void validate(){
    System.out.println("inside validate"+st.getName());
    if(st.getName().equals("Test")){
       addFieldError("name","blank field");
    }       
}

public void prepare() throws Exception {
    st = new Student();
    st.setName("Test");
}

现在,我的问题是

当我直接访问操作时,错误来了,在控制台中我得到了以下日志:

inside getModel..Test
inside getModel..Test
inside validate...Test

但是如果我"Stack"在表单字段中输入任何值并提交表单,则验证方法会打印用户输入的值,而模型方法正在打印准备初始化的内容。

inside getModel..Test
inside getModel..Test
inside validate...Stack

为什么这样?为什么两种方法不同步?验证方法和模型方法是否从不同位置选择属性值?

4

1 回答 1

1

这些值是按拦截器调用的顺序获取/设置的。只要动作在 valuestack 上,在prepare()调用拦截paramsgetModel()获取应该设置其属性的对象之后。

modelDriven拦截器还从valueStack. 任何后续通过表达式搜索模型属性的结果都将getModel()在属性尚未设置时调用。拦截器最后params设置属性,然后调用validation拦截器,它也被检索getModel()以获取应该已经设置的属性值。

控制台将如上所示。在执行操作之前,这是拦截器的正常行为。

在第一种情况下,您没有随请求发送值,因此控制台会打印 after 的内容prepare()

在第二个值被发送并且属性已经改变,所以控制台反映了它。http请求附带值,因此它在请求范围内是相同的“位置”。

于 2013-08-04T15:57:28.100 回答