模型驱动:

*要从页面中获取表单元素的值,需要在动作类中声明与页面元素同名的属性。导致动作类中既有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=表单重复提交,请刷新后重试

struts2模型驱动和令牌拦截器相关推荐

  1. struts2 拦截器_Struts2令牌拦截器示例

    struts2 拦截器 Struts 2 token interceptor can be used to handle multiple form submission problem. While ...

  2. 【struts2】预定义拦截器

    1)预定义拦截器 Struts2有默认的拦截器配置,也就是说,虽然我们没有主动去配置任何关于拦截器的东西,但是Struts2会使用默认引用的拦截器.由于Struts2的默认拦截器声明和引用都在这个St ...

  3. 使用struts2中默认的拦截器以及自定义拦截器

    转自:http://blog.sina.com.cn/s/blog_82f01d350101echs.html 如何使用struts2拦截器,或者自定义拦截器.特别注意,在使用拦截器的时候,在Acti ...

  4. Struts2——(7)拦截器组件

    AOP:面向切面编程(通过配置文件来指定作用到目标对象) OOP:面向对象编程 AOP具有很好的可插拔特性,很灵活. 可用于封装共通的业务处理,之后可以通过配置作用到Action组件上. 共通的业务处 ...

  5. struts2(三) 输入校验和拦截器

    前面知道了struts2的架构图和struts2的自动封装表单参数和数据类型自动转换,今天来学struts2的第三第四个东西,输入校验和拦截器, --WH 一.输入校验 在以前我们写一个登录页面时,并 ...

  6. Struts2 源码分析——拦截器的机制

    本章简言 上一章讲到关于action代理类的工作.即是如何去找对应的action配置信息,并执行action类的实例.而这一章笔者将讲到在执行action需要用到的拦截器.为什么要讲拦截器呢?可以这样 ...

  7. Struts2入门(二)——配置拦截器

    一.前言 之前便了解过,Struts 2的核心控制器是一个Filter过滤器,负责拦截所有的用户请求,当用户请求发送过来时,会去检测struts.xml是否存在这个action,如果存在,服务器便会自 ...

  8. 在struts2中配置自定义拦截器放行多个方法

    源码: 自定义的拦截器类: //自定义拦截器类:LoginInterceptor ; package com.java.action.interceptor; import javax.servlet ...

  9. struts2 ModelDriven 和 Preparable 拦截器

    Struts2 运行流程图-1 ActionProxy 是 Action 的一个代理类,也就是说Action的调用是通过 ActionProxy 实现的,其实就是调用了ActionProxy.exec ...

最新文章

  1. AI时代的幕后英雄:谁在生产高质量的AI训练数据?
  2. 磁盘分区形式mbr和gpt哪个好_济南历下区中考美术集训应该选哪个
  3. 用python pandas按块读取超大csv/txt
  4. 微信浏览器 返回按钮二次返回
  5. mysql join 循环_关于mysql联表的内嵌循环操作nested loop join中on和where执行顺序问题...
  6. using(){},Close(),Dispose()的区别
  7. 360私有云平台-HULK 5岁啦~
  8. RQNOJ 140 分配时间:dp
  9. python产品缺陷检测_3 Kaggle钢材表面缺陷检测竞赛的探索与实践-阿里云开发者社区...
  10. 工业设计与钣金工艺是怎么相互相成的
  11. java邮箱格式校验
  12. html span 字体位置,span内文字居中css布局方法_让span内容居中
  13. 最新章节 第238章 超级计算机的安排,第238章 黄花大闺女
  14. 一文读懂元数据的概念、分类及作用
  15. Pycharm2017补丁破解
  16. Unsafe code may only appear if compiling with /unsafe
  17. linux下传输文件命令
  18. 基于libyuv库的NV12格式图片的缩放
  19. T51 运行文本指令
  20. windows命令获取帮助_如何在Windows 10中获得帮助

热门文章

  1. 浅谈Java中equals()和==的区别
  2. IntelliJ IDEA 15快捷键大全
  3. chrome应用程序无法启动因为并行配置不正确的处理办法(亲测版本不一样也是类似的操作)
  4. WSGI接口(廖雪峰重点)
  5. js如何循环拼接字符串
  6. PHP CURL 多线程 GET/POST 类
  7. python整数格式显示_[python之路]格式化显示
  8. PHP中empty,is_null,isset的区别
  9. jquery中获取元素的几种方式小结
  10. java 文件删除异常 ut_【JAVA-UT】12、抛出了指定的异常吗?