模型驱动:

*要从页面中获取表单元素的值,需要在动作类中声明与页面元素同名的属性。导致动作类中既有javabean又有业务方法。

*将javabean和业务方法进行分离:

*将重新创建一个javabean,将javabean的内容放置其中。

*动作类action中只留业务方法

*在动作类中声明的javabean无法从页面中获取同名的属性

*需要使用struts2框架提供的"modelDriven(模型驱动)"

*实现ModelDriven这个接口

*重写getModel()方法,返回该javabean的实例

*代码如下:

public class UserAction extends ActionSupport implements ModelDriven<User>{

private User user = new User();

@Override

public User getModel() {

// TODO Auto-generated method stub

return user;

}

public String add(){

System.out.println("UserAction******add()");

return "add";

}

public String save(){

System.out.println("UserAction******save()");

System.out.println("username="+user.getUsername());

System.out.println("tel="+user.getTel());

System.out.println("des="+user.getDes());

return "success";

}

}

*模型驱动的原理:

*在不适用模型驱动的时候,之所以在动作类中获取不到对应的属性的原因:

*在ValueStack中没有对应javabean的所有属性

*模型驱动的作用,就是讲javabean的实例压入对象栈的栈顶,从而可以获取到对应的属性的值

页面回显技术:

*通过模型驱动,在动作类action中,可以获取到页面中元素的值

//方法一

*通过javabean实例的set()方法,将新的内容set到javabean中,从而放置在页面对应元素中

User newUser = new User();

newUser.setUsername("zhang");

newUser.setTel("123987654");

newUser.setDes("xxx");

//页面回显技术

//方法一

user.setUsername(newUser.getUsername());

user.setTel(newUser.getTel());

user.setDes(newUser.getDes());

//方法二

*首先将值栈中,旧的javabean的内容,删除掉

*然后将新的内容压入到值栈中的栈顶

User newUser = new User();

newUser.setUsername("zhang");

newUser.setTel("123987654");

newUser.setDes("xxx");

ValueStack valueStack = ServletActionContext.getContext().getValueStack();

valueStack.pop();

valueStack.push(newUser);

处理表单重复提交:

*在页面中增加一个隐藏域:<s:token></token>

*在struts_model.xml里添加配置信息,具体配置如下:

<interceptors>

<interceptor-stack name="tokenStack">

<interceptor-ref name="defaultStack" />

<interceptor-ref name="token">

<!-- 配置令牌拦截器,拦截的方法名,如果配置多个方法时,用逗号隔开 -->

<param name="includeMethods">save,update</param>

</interceptor-ref>

</interceptor-stack>

</interceptors>

<default-interceptor-ref name="tokenStack"></default-interceptor-ref>

*在struts_model.xml中增加一个result结果类型:

<!-- 配置表单重复提交后,要转向到的页面 -->

<result name="invalid.token">/model/error.jsp</result>

*在表单提交后,要转向的页面中,通过<s:actionerror>获取struts2框架底层提供错误提示信息

*将struts2框架底层提供错误提示信息改成中文

*在与动作类action同级目录下,创建名为token.properties 的资源文件,文件内容如下

struts.message.invalid.token=表单重复提交,请刷新后重试