1.Params拦截器:
  • 作用:Parameters拦截器将把表单字段映射到ValueStack栈的栈顶对象的各个属性中,
  • 注意:如果某个字段在栈顶对象中没有对应的属性,则Params拦截器将尝试在ValueStack中的下一个对象
2.ModelDriven拦截器
  • 作用:
    • Struts2作为企业级的前端应用程序,将Action和Model隔离开是很有必要的
    • 有些Action类并不代表任何Model对象,它们的存在仅仅提供显示服务
  • 流程:
    • 先会执行ModelDrivenInterceptor的Intercept方法
  • 执行
  • ParametersInterceptor的intercept方法:把请求参数的值赋给栈顶对象对应的属性
  • 注意:getModel方法不提供以下实现,的确会返回一个Employee对象到值栈的栈顶,但是当前action的employee确是null
3.paramsPrepareParamsStack拦截器栈:
  • 问题:
    • Struts2表单回显时,从值栈栈顶开始查找匹配的属性,若找到就添加到value属性中
    • 若想将Employee对象压入到值栈栈顶,未使用
      而是直接使用
      此时的栈顶对象除了employeeId之外全部为null
    • 此时,不能够进行表单的回显,因为经过重写赋值的employee对象以及不是栈顶对象
    • 可以手动将Employee对象放入到值栈栈顶,但是值栈中会存在两个Employee对象,造成冗余
  • 解决方法:
    • 因为Action类实现了ModelDriven接口,所以我们可以在getModel方法中判断是Edit还是Create
    • 若为Edit则
    • 若为Create则
    • 此处我们可以根employeeId进行判断,若id为null,则是Create否则是Edit
    • 但是,使用employeeId来判断则需要在ModelDriven拦截器之前使用一个params拦截器
    • 而这个可以使用paramsPrepareParams拦截器栈来实现,因为默认的拦截器栈中ModelDriven之前没有params
  • 缺点:
    • 在执行删除操作的时候,getModel方法会从数据库中加载一个对象,浪费资源
    • 执行查询全部信息是也会new 一个新的对象出来,造成浪费
  • 流程:
    • params拦截器首先给action中的相关参数赋值
    • prapare拦截器首先调用prapare方法,给方法中会根据参数(如id)去调用业务逻辑,设置model对象
    • modelDriven拦截器将model对象压入到value stack,这里的model对象就是在prapare中创建的
    • params拦截器再将参数赋值给model对象
    • action业务逻辑执行
3.preparable拦截器:
  • 作用:
    • struts2中的modelDriven拦截器负责把Action类以外的一个对象压入到值栈栈顶
    • 而prepare拦截器负责准备为getModel()方法准备model
    • 一般prepare拦截器是和modelDriven拦截器一起使用的
  • PrepareInterceptor 运行流程(源码解析):
  • PrefixMethodInvocationUtil.invokePrefixMethod(invocation, prefixes)方法:
    •  
  • PrefixMethodInvocationUtil.getPrefixedMethod方法:
  • 总结:
    • 若Action实现了Prepareble接口,则struts将尝试执行prepare[ActionMethodName]方法,若prepare[ActionMethodName]不存在,则会尝试执行prepareDo[ActionMethodName]方法
    • 若PrepareInterceptor的alwaysInvokePrepare属性为false,则struts将不会调用实现了Prepareble接口的Action的prepare方法
    • 解决getModel方法造成的浪费:
      • 可以为每一个ActionMethod准备prepare[ActionMethodName]方法,而抛弃原先的prepare方法
      • 将PrepareInterceptor的alwaysInvokePrepare属性设置为false,以避免Struts框架再调用prepare方法
      • 如何在配置文件中为拦截器栈的属性赋值
    •   
 

05_CRUD操作的更多相关文章

  1. 关于DOM的操作以及性能优化问题-重绘重排

     写在前面: 大家都知道DOM的操作很昂贵. 然后贵在什么地方呢? 一.访问DOM元素 二.修改DOM引起的重绘重排 一.访问DOM 像书上的比喻:把DOM和JavaScript(这里指ECMScri ...

  2. Sql Server系列:分区表操作

    1. 分区表简介 分区表在逻辑上是一个表,而物理上是多个表.从用户角度来看,分区表和普通表是一样的.使用分区表的主要目的是为改善大型表以及具有多个访问模式的表的可伸缩性和可管理性. 分区表是把数据按设 ...

  3. C# ini文件操作【源码下载】

    介绍C#如何对ini文件进行读写操作,C#可以通过调用[kernel32.dll]文件中的 WritePrivateProfileString()和GetPrivateProfileString()函 ...

  4. js学习笔记:操作iframe

    iframe可以说是比较老得话题了,而且网上也基本上在说少用iframe,其原因大致为:堵塞页面加载.安全问题.兼容性问题.搜索引擎抓取不到等等,不过相对于这些缺点,iframe的优点更牛,跨域请求. ...

  5. jquery和Js的区别和基础操作

    jqery的语法和js的语法一样,算是把js升级了一下,这两种语法可以一起使用,只不过是用jqery更加方便 一个页面想要使用jqery的话,先要引入一下jqery包,jqery包从网上下一个就可以, ...

  6. ASP.NET Aries 入门开发教程7:DataGrid的行操作(主键操作区)

    前言: 抓紧勤奋,再接再励,预计共10篇来结束这个系列. 上一篇介绍:ASP.NET Aries 入门开发教程6:列表数据表格的格式化处理及行内编辑 本篇介绍主键操作区相关内容. 1:什么时候有默认的 ...

  7. 如何在高并发环境下设计出无锁的数据库操作(Java版本)

    一个在线2k的游戏,每秒钟并发都吓死人.传统的hibernate直接插库基本上是不可行的.我就一步步推导出一个无锁的数据库操作. 1. 并发中如何无锁. 一个很简单的思路,把并发转化成为单线程.Jav ...

  8. 【翻译】MongoDB指南/CRUD操作(四)

    [原文地址]https://docs.mongodb.com/manual/ CRUD操作(四) 1 查询方案(Query Plans) MongoDB 查询优化程序处理查询并且针对给定可利用的索引选 ...

  9. 【翻译】MongoDB指南/CRUD操作(三)

    [原文地址]https://docs.mongodb.com/manual/ CRUD操作(三) 主要内容: 原子性和事务(Atomicity and Transactions),读隔离.一致性和新近 ...

随机推荐

  1. IIS进行URL重写

    一.Why? 1.先来讲一讲为什么我们要使用url重写这个东西 2.因为我学习的后端是nodejs,然后我发现nodejs一个非常让人难受的事,就是它监听端口不是80和443时,你访问网页需要输入端口 ...

  2. hdu3342-判断有向图中是否存在(至少)3元环或回路-拓扑排序

    一:题目大意:   给你一个关系图,判断是否合法,    每个人都有师父和徒弟,可以有很多个:  不合法:  1) . 互为师徒:(有回路)  2) .你的师父是你徒弟的徒弟,或者说你的徒弟是你师父的 ...

  3. jQuery获取浏览器参数

    当我们需要获取浏览器参数是,我们可以使用jQuery进行获取,具体方法如下: 例如获取参数的地址:http://www.test.com?a="111"&b="2 ...

  4. zookeeper初探

    安装三台linux虚拟机,安装好java环境,并配置好网络以及host文件,分别改好hostname为node0.node1.node2 上传下载好的zookeeper文件到node0的/usr/lo ...

  5. MySQL中的字符串函数

    使用字符串数据 当使用字符串数据时,可以使用下面的字符数据类型. CHAR 固定长度.不足部分使用空格填充的字符串. varchar 变长字符串. text(MySQL和SQL Server)或CLO ...

  6. 自行实现高性能MVC WebAPI

    wcf虽然功能多.扩展性强但是也面临配置忒多,而且restful的功能相当怪异,并且目前没法移植.asp.net core虽然支持webapi,但是功能也相对繁多.配置复杂.就没有一个能让码农们安安心 ...

  7. [LeetCode] License Key Formatting 注册码格式化

    Now you are given a string S, which represents a software license key which we would like to format. ...

  8. ios开发-日期处理(类似朋友圈,微博等的发送时间)

    ios开发中,我们经常要处理从服务器获取的时间.类似朋友圈,微博这些应用.我们经常可以看到“刚刚”,“31分钟前发表”,“昨天5点”,之类的字样. 当时我们从服务器端获取的都是那条朋友圈信息,或者微博 ...

  9. WebApi的安全性及其解决方案

    一.前言   WebApi的小白想要了解一些关于WebApi安全性相关的问题,本篇文章是整理一些关于WebApi安全.权限认证的文章. 二.内容正文  2.1 不进行验证  客户端调用:http:// ...

  10. [ZJOI2008]生日聚会

    题目描述 今天是hidadz小朋友的生日,她邀请了许多朋友来参加她的生日party. hidadz带着朋友们来到花园中,打算坐成一排玩游戏.为了游戏不至于无聊,就座的方案应满足如下条件: 对于任意连续 ...