zoukankan      html  css  js  c++  java
  • 对struts2一些理解

    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范围的国际化资源文件管理实现

  • 相关阅读:
    常见寻找OEP脱壳的方法
    Windows内核原理系列01
    HDU 1025 Constructing Roads In JGShining's Kingdom
    HDU 1024 Max Sum Plus Plus
    HDU 1003 Max Sum
    HDU 1019 Least Common Multiple
    HDU 1018 Big Number
    HDU 1014 Uniform Generator
    HDU 1012 u Calculate e
    HDU 1005 Number Sequence
  • 原文地址:https://www.cnblogs.com/future-zmy/p/6435338.html
Copyright © 2011-2022 走看看