2014-07-17 Java Web的学习(14)-----struts2(0)----简单入门

一、什么是strut2?
   主要的功能:传统Servlet中功能(控制转发),校验框架,封装数据.
   MVC框架如下图所示:
 
无标题
二、Filter VS Servlet(Struts2 入口程序之争)
三、struts2的解决问题
四、搭建strut2的开发环境(自带应用模仿)图示
   1.将所需架包放入构建路径中
   2.web.xml文件配置过滤器
   3.在应用的构建路径的顶端(WEB-INF/classes),建立配置文件struts.xml
   4.部署到Tomcat中.
   注意:Struts2框架默认处理的URL的扩展名:以.action结尾,或者什么都没有.hello.action或者hello
五、struts2简单工作原理(图示)
六、struts2的常用配置.
    各种的配置文件按顺序加载.
七、struts2中Action的配置
八、动作类的编写
    定义有三种方式:
    推荐:extends ActionSupport
九、动作类的生命周期
    动作类每次访问都会重新被实例化,是线程安全的。为什么线程安全.
十、动作方法的定义.
  
1.Struts2的核心入口程序
  如何进入Struts框架内部,从功能上讲必须能够处理客户端的Http请求.真实表示层框架的基本的要求.而SUN公司规定Servlet标准.有两种方式可以进行Http请求的处理.实现标准的Servlet接口和Filter接口.而Struts2为什么选择Filter??而Filter相对于Servlet接口的优势在哪?
  从Servlet API中可以发现Servlet和Filter的区别:
  a.实例何时被WEB服务器创建?
    默认情况下第一次访问Servlet时,容器创建实例,初始化该对象.应用启动时,Filter对象被容器创建,执行init方法.Struts2容器需要初始化相关Bean.
  b.Filter如果配置信息错误,服务器启动就会出错.抛出异常,可以较早发现程序错误.
  接下来程序分为两部分:
QQ拼音截图未命名
初始化的特点(init方法):
  QQ拼音截图未命名 [1]
初始化的主要内容(init方法):
QQ拼音截图未命名 [2]
 
处理Http请求的内容(doFilter方法):
QQ拼音截图未命名 [3]
QQ拼音截图未命名 [4]
StrutsPrepareAndExecuteFilter源码可知.所以从严格意义上的Struts2,实际上有两个不同的框架组成.传统Struts2的工作处理Http请求,然后委托XWork完成真正的逻辑处理.做到与Servlet API(即Web容器)分离.
 
2.Struts2的初始化.
  初始化什么?
  内置对象+事件响应模型
  怎么知道初始化哪些内置对象和事件响应模型?
  XML配置文件:default.properties......
3.Http请求预处理和XWork执行业务逻辑(重点).
QQ拼音截图未命名 [5]
4.Struts2如何初始化加载配置文件(default.properties,struts-default.xml,struts-plugin.xml,struts.xml)
  QQ拼音截图未命名1
无标题 [1]
5.通过配置文件中的<bean>节点,熟悉Struts2容器的静态注入.
     5.1 default-struts.xml.
        < bean type = "com.opensymphony.xwork2.ObjectFactory" name = "struts" class = "org.apache.struts2.impl.StrutsObjectFactory" />
        当Web容器启动时,就会加载配置文件,然后实例化该Bean.
   
     5.2 ObjectFactory API
      Image
     5.3 Struts2默认是由ObjectFactory管理所有相关的Bean,现在通过改变管理Bean的工厂,来改变Action的产生方式.根据配置文件加载顺序和复写规则,重新指定新的工厂.
 
          Image [1]
         PS:有关struts.objectFactory的介绍,### if specified, the default object factory can be overridden here
                                          ### Note: short-hand notation is supported in some cases, such as "spring"
                                          ###       Alternatively, you can provide a com.opensymphony.xwork2.ObjectFactory subclass name here
                                            # struts.objectFactory = spring
 
6.Struts2拦截器机制
  6.1 Struts2为什么采用拦截器?
      有人这样描述Interceptor和Action之间的关系:这时一个策应部队和主力部队之间的关系.这就如同作任何事 都要分清主次,当我们将事件处理的主要职责(进行核心业务逻辑处理)交给Action对象,而将一些次要的职责(如何设置Action的运行参数,校验表单数据)交付给Interceptor对象.这样的话,就将不同职责分而治之.并且分派到不同的对象上去执行。分而治之,各司其职。所以拦截器的作用:"干杂活"---(重复性和开发常用的功能).
6.2 Interceptor的基本概念
     拦截器是原本属于AOP中的概念,其本质是一个代码段,可以通过定义织入点.来指定Interceptor的代码逻辑在织入点元素的之前或者之后执行。从而起到拦截的作用.Xwork是用AOP来实现Ioc(通过拦截器封装Action对象中属性,实现注入).而Spring是用Ioc实现AOP(同注入属性赋值,然后类与类之间的关联关系依赖实例化).
     在Struts2中还存在拦截器链(Interceptor Chain,在struts2中称为拦截器栈Interceptor Stack).拦截器栈就是将拦截器按一定的顺序联结成一条链.在访问被拦截的Action时,拦截器链中的拦截器就会按其之前定义的顺序被调用.
      Image [2]
   6.3 Interceptor实现原理

    Struts 2的拦截器实现相对简单.当请求到达Struts 2的ServletDispatcher时,Struts2会查找配置文件,并根据其配置实例化相对的拦截器对象,然后串成一个列表(list),最后一个一个地调用列表中的拦截器.
  Image [3]
 
   6.4 struts2内置的拦截器和默认使用的拦截器栈( struts-default.xml ).
      <interceptors>
           < interceptor name = "alias" class = "com.opensymphony.xwork2.interceptor.AliasInterceptor" />
           < interceptor name = "autowiring" class = "com.opensymphony.xwork2.spring.interceptor.ActionAutowiringInterceptor" />
           < interceptor name = "chain" class = "com.opensymphony.xwork2.interceptor.ChainingInterceptor" />
           < interceptor name = "conversionError" class = "org.apache.struts2.interceptor.StrutsConversionErrorInterceptor" />
           < interceptor name = "cookie" class = "org.apache.struts2.interceptor.CookieInterceptor" />
           < interceptor name = "cookieProvider" class = "org.apache.struts2.interceptor.CookieProviderInterceptor" />
           < interceptor name = "clearSession" class = "org.apache.struts2.interceptor.ClearSessionInterceptor" />
           < interceptor name = "createSession" class = "org.apache.struts2.interceptor.CreateSessionInterceptor" />
           < interceptor name = "debugging" class = "org.apache.struts2.interceptor.debugging.DebuggingInterceptor" />
           < interceptor name = "execAndWait" class = "org.apache.struts2.interceptor.ExecuteAndWaitInterceptor" />
           < interceptor name = "exception" class = "com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor" />
           < interceptor name = "fileUpload" class = "org.apache.struts2.interceptor.FileUploadInterceptor" />
           < interceptor name = "i18n" class = "com.opensymphony.xwork2.interceptor.I18nInterceptor" />
           < interceptor name = "logger" class = "com.opensymphony.xwork2.interceptor.LoggingInterceptor" />
           < interceptor name = "modelDriven" class = "com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor" />
           < interceptor name = "scopedModelDriven" class = "com.opensymphony.xwork2.interceptor.ScopedModelDrivenInterceptor" />
           < interceptor name = "params" class = "com.opensymphony.xwork2.interceptor.ParametersInterceptor" />
           < interceptor name = "actionMappingParams" class = "org.apache.struts2.interceptor.ActionMappingParametersInteceptor" />
           < interceptor name = "prepare" class = "com.opensymphony.xwork2.interceptor.PrepareInterceptor" />
           < interceptor name = "staticParams" class = "com.opensymphony.xwork2.interceptor.StaticParametersInterceptor" />
           < interceptor name = "scope" class = "org.apache.struts2.interceptor.ScopeInterceptor" />
           < interceptor name = "servletConfig" class = "org.apache.struts2.interceptor.ServletConfigInterceptor" />
           < interceptor name = "timer" class = "com.opensymphony.xwork2.interceptor.TimerInterceptor" />
           < interceptor name = "token" class = "org.apache.struts2.interceptor.TokenInterceptor" />
           < interceptor name = "tokenSession" class = "org.apache.struts2.interceptor.TokenSessionStoreInterceptor" />
           < interceptor name = "validation" class = "org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor" />
           < interceptor name = "workflow" class = "com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor" />
           < interceptor name = "store" class = "org.apache.struts2.interceptor.MessageStoreInterceptor" />
           < interceptor name = "checkbox" class = "org.apache.struts2.interceptor.CheckboxInterceptor" />
           < interceptor name = "profiling" class = "org.apache.struts2.interceptor.ProfilingActivationInterceptor" />
           < interceptor name = "roles" class = "org.apache.struts2.interceptor.RolesInterceptor" />
           < interceptor name = "annotationWorkflow" class = "com.opensymphony.xwork2.interceptor.annotations.AnnotationWorkflowInterceptor" />
           < interceptor name = "multiselect" class = "org.apache.struts2.interceptor.MultiselectInterceptor" />
            < interceptor-stack name = "defaultStack" >
               < interceptor-ref name = "exception" />
               < interceptor-ref name = "alias" />
               < interceptor-ref name = "servletConfig" />
               < interceptor-ref name = "i18n" />
               < interceptor-ref name = "prepare" />
               < interceptor-ref name = "chain" />
               < interceptor-ref name = "scopedModelDriven" />
               < interceptor-ref name = "modelDriven" />
               < interceptor-ref name = "fileUpload" />
               < interceptor-ref name = "checkbox" />
               < interceptor-ref name = "multiselect" />
               < interceptor-ref name = "staticParams" />
               < interceptor-ref name = "actionMappingParams" />
               < interceptor-ref name = "params" >
                   < param name = "excludeParams" > dojo\..*,^struts\..*,^session\..*,^request\..*,^application\..*,^servlet(Request|Response)\..*,parameters\...* </ param >
               </ interceptor-ref >
               < interceptor-ref name = "conversionError" />
               < interceptor-ref name = "validation" >
                   < param name = "excludeMethods" > input,back,cancel,browse </ param >
               </ interceptor-ref >
               < interceptor-ref name = "workflow" >
                   < param name = "excludeMethods" > input,back,cancel,browse </ param >
               </ interceptor-ref >
               < interceptor-ref name = "debugging" />
           </ interceptor-stack >
       </ interceptors >
 
    6.5 自定义拦截器及其XML的配置
 
         Image [4]
          Image [5]
 
     6.6 通过源码熟悉模型驱动和属性驱动的拦截器(AOP编程实现Action属性的注入)
         struts-default.xml中defaultStack栈.
        Image [6]
        a.模型驱动拦截器源代码(ModelDrviernInterceptor拦截器负责生成对象,在后面扥拦截器是ParametersInterceptor拦截器赋值)
            Image [7]
        
           使用模型驱动的话,必须实现ModelDriven接口.
            Image [8]
        b.属性驱动的源代码
              Image [9]
               Image [10]//封装REQUEST请求参数到Map集合中
               Image [11]   //调用方法,注意参数
               Image [12]      //由于Action对象已经在对象栈中,然后将Action对象属性赋值(请求参数中的值).

 
    6.7 通过源码熟悉Struts2验证机制(主要是两个拦截器实现)
       
    
        a.准备一个Action类继承ActionSupport,重写validate方法.(采用手工验证方式)
          Image [13]
        b.查看AnnotationValidationInterceptor拦截器的源代码:
          Image [14]
          Image [15]
         
Image [16]   //调用父类的doIntercept方法
           Image [17] //父类
         Image [18]
         
Image [19]  
                由于自定义UserAction继承ActionSupport,从而间接实现Validateable接口
          Image [20]
         
Image [21]------>完成校验的前期工作.但是最后如何返回视图(Result)呢?接下来就是workflow拦截器的事.
      
        c.查看
DefaultWorkflowInterceptor拦截器的源代码
          Image [22]
          Image [23]
         
Image [24]//判断有没有错误信息、确定该返回什么视图.
                            Image [25]     //常量:"input"

7.struts2插件机制
  从源代码看来,struts2在服务器启动时,会加载四种配置文件 Image [26] 其中的struts-plugin.xml就是插件配置文件.struts2容器会去web工程的lib下查找所有的.jar文件,查看jar文件的根目录下面是否有struts.plugin.xml文件.该文件的内容信息同时也会加载struts容器中。有可能会覆盖配置信息.如struts2-spring-plugin-2.3.15.3.jar根目录下struts-plugin.xml配置:
Image [27]

你可能感兴趣的:(2014-07-17 Java Web的学习(14)-----struts2(0)----简单入门)