2013-08-04 46 views
1

我正在运行一个基本的Struts2应用程序,在这个应用程序中我遇到了一个困惑。 我的动作类实现了Preparable和ModelDriven接口,并扩展了ActionSupport类。模型bean有一个名为“User”的属性。Struts2中验证的属性值和模型方法的区别

我的主页(jsp)有一个对应于模型bean的唯一属性“User”的输入字段。在prepare()方法中,我初始化bean并将其属性设置为某个默认值,例如“Test”,并且model()方法返回此bean对象。在验证(),我有一个验证,如果“用户”属性的价值等于“测试”,然后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 

,但如果我输入任何价值说“堆栈”中表单字段和提交表单然后验证方法打印用户输入的值,而模型方法是打印准备初始化的值。

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

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

谢谢。

回答

1

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

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

控制台将如上所示。在执行动作之前,这是拦截器的正常行为。在第一种情况下,您没有发送请求的值,因此控制台会打印prepare之后的内容。在第二个值发送和财产已更改,所以控制台反映它。值来自http请求,所以它在请求范围内是相同的“位置”。

+0

我错过了拦截器运行的顺序。谢谢。 – Infotechie

+0

@Infotechie它与上下配置文件中的顺序相同。看看'interceptor-stack'标签。 –