1.strust2框架是什么?为解决什么问题出现?

Struts2是在WebWork+xwork基础发展而来的。

2. strust2的优缺点
优点:
支持Ajax
支持Ognl标签
提供了强大的拦截器
线程安全 因为每次请求都会产生一个实例
缺点:
耦合度低 比较复杂,源代码不好调试。

3.在公司里怎么用的?

国际化 :提供了全局范围、包范围和Action范围的国际化资源文件
action类简单名字.properties------package_zh.properties-----------ApplicationResources.properties
action范围-----包范围 我们的action必须继承ActionSuport

1 局部类型转换器 自己action使用 action同目录下建立Action简单类名-conversion.properties
action中的bean属性名=包名.转换器类名
2全局类型转换器 全部action使用 src建立xwork-conversion.properties

4写自定义验证?
验证:1.继承ActionSupport 重写validate方法或者编写validatetXxx 方法,重写vaildate方法会对Action中的所有struts2业务方法进行校验
2 校验框架<字段与非字段>
在action的同目录下编写Action简单类名-validation.xml文件,该文件中的验证会对Action中的所有struts2业务方法进行校验,如要校验某个方法
编写的文件名是Action简单类名-action name(struts,xml配置中的name)-validation.xml文件
3.模型驱动与属性驱动
action类实现 ModelDriven<javabean类名> 接口,采用泛型
在 action类中定义javabean属性,实现getModel方法,把getModel方法放在栈顶,栈是先进后出
4.自定义拦截器
(1)编写拦截器类,继承AbstractInterceptor类 重写intercept(ActionInvocation arg0)方法
调用用参数类ActionInvocation的invoke方法,即 String result= arg0.invoke(); 返回该result=invoke就是回调使用了该拦截器的action得相应方法,此时可在该方法执行前后加入我们想要的代码,达到我们拦截action的目的,利用 arg0.getAction()方法还可以得到拦截器拦截的action实例

配置:
在struts.xml配置拦截器<interceptors>中配置<interceptor name="拦截器名" class="包名.拦截器类">,再到action中指定拦截器。

(2)struts2有30多个拦截器,但我们最常用的有18个拦截器
拦截器的好处:可以进行面向切面编程

4.经验和教训:strust2双向类型转换(页面----action----页面回显)
1.关闭开发模式
3.不要使用不需要的拦截器 因为会把每个类都拦截一次,这样会导致性能比较慢
4.尽量使用页面缓存
5.web-inf下创建一个freemarker.properties文件,因为strust的标签都是freemarker做的
6.使Freemarker模版定制标签缓存
7.不要在session里面放东西。尽量放在request里面

5.整体结构和源码的实现
整体结构:
ActionSupport与Action
Action接口提供了5个常量
public static final String SUCCESS = "success";
public static final String ERROR = "error";
public static final String LOGIN = "login";
public static final String INPUT = "input";
public static final String NONE = "none";
ActionSupport
1实现了Action接口
2实现了国际化
3实现了校验7

继承ActionSupport的好处:
继承了Action,Action提供了5个常量:SUCCESS、ERROR、LOGIN、INPUT、NONE。
实现了国际化
实现了校验(struts2中Action要实现国际化和校验必须继承ActionSupport)

Struts2请求处理流程
1、客户端发送请求 (客户端初始化一个指向Servlet容器(如Tomcat)的请求)
2、请求经过一系列过滤器(如ActionContextCleanUp、SiteMesh等),ActionContextCleanUp-->FilterDispatcher
3、FilterDispatcher通过ActionMapper来决定这个Request需要调用哪个Action 如果不是调用action 则直接执行你的资源
4、如果ActionMapper决定调用某个Action,FilterDispatcher把请求的处理交给ActionProxy,
5、ActionProxy通过Configuration Manager询问Struts配置文件(Struts.xml),找到需要调用的Action类。
6、ActionProxy创建一个ActionInvocation的实例
7、ActionInvocation通过一系列的拦截器调用真正的Action,当然这涉及到相关拦截器的调用
8、Action执行完毕,ActionInvocation创建Result并返回,返回结果前要做些动作也是可以的

  Struts2源码
Filter与servlet的区别:
Filter必须实现javax.Servlet.Filter接口,并且必须定义以下三个方法:init(),destory(),doFilter().
Servlet一般继承HttpServlet,当Url匹配这个Servlet时候运行处理请求;如果加上load-on-start为1时候,Web应用启动时候加载此Servlet;
过滤器:Web.xml:《filter-class》StrutsPrepareAndExecuteFilter《/filter-class》
<filter>的生命周期:init()初始化——》doFilter()当用户发送请求的时候struts2去拦截 ——》destroy()跟servlet生命周期很像
Init():initOperations初始化的一个操作,
  初始化默认的资源文件,初始化xml配置文件,初始化struts其他文件(用得是一个模板模式)
  Init_TraditionalXmlConfigurations():configPaths=DEFAULT_CONEIGURATION_PATHS;拿到默认值,每拿到一个值就做判断(xwork做判断)向前兼容,可以解析xwork
  如果不是的话,把每个类的配置文件都加入到
dispatcher进去createDispatcher
把每个配置文件分配一个解析配置文件的类

reloadContainer(getContainerProviders):加载容器
containerProvider:遍历循环这个解析类,先解析,然后再注入到容器里面去
解析过程:
Inject:依赖注入,当我这个初始化的时候,那么依赖我的这个对象就会给它初始化(先依赖谁就初始化谁)
返回了configmannage;
Prepare:令模式
doFilter:当用户发送请求的时候我们就用doFilter拦截;
  Prepare:准备,只要action是实现了一般有优先级;
  Struts2不用写过滤器也不会出现乱码,它里面有自带的过滤器
  Dispatcher.getContainer().getINstance():容器得到genBean的方法
  将我们request封装到一个Map里面去了,这样struts2就和servlet解耦了。
  ThreadLocal:解决线程安全的问题,依靠本地线程(当多个线程访问dispatcher,它就 会把我们的每个线程复制一个dispatcher分配给ThreadLocal)相对于struts1线程比较安全
  UtilTimeStack:把调试信息放在值栈里面(以压栈的形式调用拦截器)
  提供一个键值对:键就是:拦截器,值就是队
  默认的有34种拦截器(常用的18种)——struts-defalut。xml
  第一个拦截器的源代码:1、异常拦截器(里面所有的拦截器它都能捕捉到)——》
  servletConfig:首先拿到action判断有没有实现
  只要实现哪里接口,就把我们实现相关的放进去,

Debugging:如果我要变成debugging模式就调成开发模式
modeDrivenInterceptor:后台传个参数过来,提交在页面利用模型驱动,它是双向的;
模型驱动原理:
首先把我们默认的值栈找出来
OJNL:对象导航图形页面,它是以值栈的形式访问数据
当我们action执行完了以后,系统就会把我们的action放在值栈里面
Action没有再去别的地方找,我们页面上的属性值都是通过action去找得
最后把模型放在栈顶,因为优先级是从栈顶找的,所以action不需要加前缀;

6.同类框架的比较
struts2与struts1的比较
1 核心控制器改为了过滤器
2 struts1要求我们的业务控制器必须继承action或者dispatchaction struts2不强制你这么做
只需提供一个返回string类型的execute方法
3 绑定值到业务类 struts1 通过actionform struts2直接绑定到action属性
4 struts1严重依赖于servle方法的校验。struts2则不然
5 管理action struts1 单例因为仅有Action的一个实例来处理所有的请求。 struts2 每个请求都会产生一个实例 (原型)
6 从表达式的支持上,struts2不仅支持jstl,还支持功能更为强大的ognl表达式
7 strust1类型转换是单向的(页面到ActionForm),strust2双向类型转换(页面----action----页面回显)
8 校验 strust没有针对具体方法的校验 当然它有自己的针对path验证
9 struts2支持的视图技术除了jsp之外 还有freemaker velocity 源代码等 struts1只是单一的表现层技术jsp
截等功能。
10 Struts2提供了拦截器,利用拦截器可以进行AOP编程,实现如权限拦
11 提供了全局范围、包范围和Action范围的国际化资源文件管理实现

对struts2一些理解的更多相关文章

  1. struts2原理理解

    1.  由容器创建HttpServletRequest请求,这个请求经过一系列的过滤器,最终到struts2的核心过滤器(FilterDispatch), 2.  核心过滤器会根据url请求获得Act ...

  2. struts2学习之旅三 权限管理和导航设计

    1,权限管理的db设计和dao实现,尽量简单快速有效: db的设计如下:权限按照角色来赋给用户: 权限对应每一个具体的功能,有菜单级别的,有导航级别的,还有页面级别的功能: 涉及到权限的敏感操作一般都 ...

  3. struts2学习笔记之一:基本简介

    Struts2是一个基于MVC设计模式的Web应用框架,它本质上相当于一个Servlet,在MVC设计模式中,Struts2作为控制器来建立模型与视图的数据交互(所有的访问都会被控制器操作控制)   ...

  4. 小兵眼中的Java Struts2

        老魏终于可以回园子了,但是这次要慢慢的回来,不能一下子回来,这段时间除了要照顾刚出生的小女儿,还要做项目.说实在的老魏时间真是有限,不能照顾到园子的文章了,所以只能慢慢的回来写文章了.抱歉! ...

  5. 什么是struts2?

    一.我对struts2的理解. 1.struts2 是一个按MVC模式设计放入web层框架,其实它就是一个servlet.这个servlet命名为ActionServlet,或者是它的一个子类.它的工 ...

  6. Struts2的运行原理和运行与原理

    Struts2 struts2的流程图 运行机制 1.客户端发送请求.通过ActionContextLoader调用FilterDispatcher(struts) 2.FilterDispatche ...

  7. 框架学习Struts2之HelloWord

    一.概述 Struts2是基于MVC设计模式的web应用框架,它本质上相当于一个servlet,在MVC设计模式中,Struts作为控制器(Controller)来建立模型与视图之间的数据交互.Str ...

  8. [ SSH框架 ] Struts2框架学习之一

    一.Struts2框架的概述 Struts2是一种基于MVC模式的轻量级Web框架,它自问世以来,就受到了广大Web开发者的关注,并广泛应用于各种企业系统的开发中.目前掌握 Struts2框架几乎成为 ...

  9. java框架之Struts2(1)-简介及入门

    简介 Struts2 是一个基于 MVC 设计模式的 Web 应用框架,它本质上相当于一个 servlet,在 MVC 设计模式中,Struts2 作为控制器 (Controller) 来建立模型与视 ...

随机推荐

  1. 【EMV L2】终端风险管理(Terminal Risk Management)

    终端风险管理使大额交易联机授权,并确保芯片交易能够周期性地进行联机以防止在脱机环境中也许无法察觉的风险. 虽然发卡行被强制要求在应用交互特征(AIP)中将终端风险管理位设置成1以触发终端风险管理,但终 ...

  2. wireshark 无线抓包

    1)抓取无线网卡的数据包(类似有线,仅抓取本网卡的数据包,适用与windows,linux) 1.  打开菜单项“Capture”下的子菜单“Capture Options”选项: 2.  找到设置面 ...

  3. 看书记笔记 书名21天学C#

    ☆:为重点★:为科普△:注▲:术语 前言概述 ☆一门语言必须包括诸如异常处理,无用单元收集,可扩展数据类型以及代码安全性等特征☆C#特性:简单性,面向对象,模块性,灵活性,简明性 ☆C#面向对象的封装 ...

  4. CSS学习笔记_day1

    目录 一. 什么是HTML 二.编辑器 三.Html的基本骨架 四.html基本标签 h.p.img.a.audio.video.ul>li.ol>li.dl dd dt.span.div ...

  5. Mybatis根据List批量查询List结果

    https://blog.csdn.net/qq_36688928/article/details/82783392

  6. QT+VS2013 * 获取网络时间

    使用qt函数获取网络时间 现在Qt Project Setting中的Qt Modules勾选NetWork,再导入头文件我也忘了叫什么了 QStringList net_time; QTcpSock ...

  7. VMWare安装

    1. VMware 的下载和安装 VMware Workstation 15 Pro for Windows(64 位)的下载地址如下: 官方试用版地址:http://www.vmware.com/c ...

  8. 2050 Programming Competition

    http://2050.acmclub.cn/contests/contest_show.php?cid=3 开场白 Time Limit: 2000/1000 MS (Java/Others)    ...

  9. Python环境os模块功能

    功能 语句 得到当前工作目录,即当前Python脚本工作的目录路径: os.getcwd() 返回指定目录下的所有文件和目录名: os.listdir() 函数用来删除一个文件: os.remove( ...

  10. 一个简单的例子了解states

    在大规模的配置管理工作中,我们要编写大量的states.sls文件.top.sls是states系统的入口文件,它负责指定哪些设备调用哪些states.sls文件.statse的默认工作目录是在/sr ...