struts 总结

来源:互联网 发布:mysql root用户无权限 编辑:程序博客网 时间:2024/05/16 17:16

https://my.oschina.net/suyewanwan/blog/264797  知识点总结


struts2中Action与Servlet容器的耦合。主要有三种方式:
        a.实现ServletRequestAware或ServletResponseAware接口。并提供对request或者response熟悉

       的设置方法。一定要重写setServletRequest方法。
        b.使用ActionContext(但不能获得response对象)。改方法方便单元测试
        c.使用ServletActionContext。ServletActionContext是ActionContext的子类。
          首选使用ActionContext,其次ServletActionContext。

整合多个struts配置文件,在struts2的配置文件中使用include元素包含其他的配置文件。用于多模块开发

Struts2的重点

Struts2的概念(描述清楚它在mvc模式中的角色)

      Struts2是一个基于mvc模式的web应用框架,它本质上相当于一个servlet.

      struts2相当于mvc中的视图(view)层,也就是action

      Struts2是线程安全的,struts2的action是多例的,每次请求都会新创建一个新的action对象,

      Struts2的action对象是反射生成的,所以需要有一个公共的无参的构造方法

      Struts2中的Action不再依赖于Servlet API,有利于测试

      简单又核心的描述:

   Struts2就是一个接受客户端发送过来的请求,并在后台作出一系列的数据操作,然后在响应给客户端

                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              

如何搭建一个struts2项目

1).创建一个动态的Web工程

2).配置web.xml(在web.xml里配置struts2的核心过滤器)

3).在src下面配置一个struts.xml(名字一定要叫struts.xml):

          如何编写Struts2的配置文件

   1.首先引入头文件struts.dtd配置文件

   2.然后 定义package节点,在此节点中有以下属性:

 name: package的名称(名字必须是唯一的,package提供了将多个Action组织为一个模块的方式)

 extends: 继承的父package名称;

 namespace: 定义package命名空间,该命名空间会影响到url的地址

    节点action配置:(一个action可以被多次映射,只要action配置中的name不同)

  name: action名称

  class: 对应的类的路径

  method: 调用action中的方法名

     节点result配置:

  name: result名称,和action中返回的值相同,不写默认为success

  type: result类型,不写则默认为struts-default.xml中的dispatcher

4).创建action类( 三种方法 )

            如何编写Struts2 的Action(普通类可以是一个action)

   第一种:(定义一个普通类) 可以不一定要有excute方法

   第二种:implements  Action一定要有excute方法

   第三种:extends  ActionSupport不要有excute方法

全局结果集如何配置,有什么用

     在配置文件中加入global-results标签

        需要配置在所有的aciton前面,也就是在<package>下面第一行

        1.访问同一个包内的全局结果集,直接在action中return这个结果集的name即可

        2.访问的全局结果集如果与action不在同一个包内,则action所在的包要继承全局结果集所在的包

      作用:

        在项目中很多地方都返回到同一个视图,这样就有必要配置一个全局的结果集来减少重复操作的代码

       

 

Struts2的工作流程(实现原理)

1、客户端初始化一个指向Servlet容器(例如Tomact)的请求

2、这个请求经过一系列的过滤器(Filter)(这些过滤器中有一个叫做 ActionContextClenUp的可选过滤器,这个过滤器对于Struts2和其他框架的集成很有帮助,例如:SiteMesh Plugin)

3、接着FilterDispatcher被调用,FilterDispatcher询问ActionMapper来决定这个请求是否需要调用某个Action。FilterDispatcher是控制器的核心,就是mvc中c控制层的核心。

   下面粗略的分析下我理解的FilterDispatcher工作流程和原理:FilterDispathcer进行初始化并启用核心doFilter

4、如果ActionMapper决定需要调用某个Action,FilterDispatcher则把请求的处理交给ActionProxy

6.ActionProxy通过ConfigurationManager询问框架的配置文件,找到需要调用的Action类 ,这里,我们一般是从struts.xml配置中读取。

ActionProxy创建一个ActionInvocation的实例同时ActionInvocation通过代理模式调用Action。但在调用之前,ActionInvocation会根据配置加载Action相关的所有Interceptor(拦截器)

7.action执行完毕后,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果result。

 

模型驱动与属性驱动的区别

  属性驱动:

对于属性驱动,我们需要在Action中定义与表单元素对应的所有的属性,因而在Action中会出现很多的getter和setter方法

             用对象的方式处理数据,提供get和set方法

             在页面要用对象去点相对应的属性去获取值

  模型驱动:1.在Action中必须实现ModelDriven接口,而且要提供相应的泛型

             这里就是看你具体使用的javaBean类

             2.必须重写getModel方法,里面返回泛型的一个对象

             3.在action中定义一个泛型的对象,并提供相应的get和set方法

             4.之后,Action就会自动调用set方法将表单中的属性的值赋给对象中的属性

 

值栈和ActionContext

   

          

          

   

Struts2与servlet的区别

1.可以说Struts2本质还是一个Servlet(在S1中用于整体控制的是一个Servlet;S2中是一个Filter,其实也可把它看作是Servlet),只是对Servlet进一步的封装罢了

2.struct2一般是新建一个Action来接受用户的请求。在这个Action中调用模型中的方法(查数据库), 得到结果后再跳转到JSP页面显示出来。而Servlet的话,是新建一个Servlet接受用户的请求

   3.Struts2 是基于MVC的一个框架,也是基于MVC模式对servlet的一种封装

   4.servlet是java基于j2ee的一种实现技术

 

过滤器(filter)与拦截器(interceptor)的区别

1、拦截器是基于java反射机制的,而过滤器是基于函数回调的。 
2、拦截器不依赖servlet容器,而过滤器依赖servlet容器
3、拦截器只能对Action请求起作用,而过滤器则可以对几乎所有请求起作用。 
4、拦截器可以访问Action上下文、值栈里的对象,而过滤器不能。 
5、在Action的生命周期中,拦截器可以多次调用,而过滤器只能在容器初始化时被调用一次。

6.拦截器是struts2框架中定义的,而过滤器是web里面的对象,是j2EE里面定义的

7.拦截器定义在struts.xml中,而过滤器定义在web.xml中

8.拦截器对象的创建、调用、销毁是struts2框架负责的,过滤器对象的创建、调用、销毁服务器负责的.

 

Action的三种实现方式

 1.普通类 不必要写excute方法

 2.实现action,必须要写excute方法

 3.继承AcitonSupport ,不必要写excute方法

 

struts2的自定义类型转换器

  1.定义一个Action类

  2.定义转换器类继承StrutsTypeConverter,重写convertFromString和convertToString方法

  3..提供一个配置文件,名字叫xwork-conversion.properties(名字必须叫这个)

在这个配置文件中的格式是  需要转化类型的类路径=转换器的类路径

 

手动验证

  1.继承Actionsupport类,重写validate()方法,在Aciton中先验证validateXX()方法,

   在执行validate()方法,然后在执行指定的方法

  2.如果验证中出现错误将会返回input,所以在result的name中配置一个input

 

  验证框架

  1.Action类一定要继承ActionSupport

  2.给相应的Action中添加一个Aciton类名-validation.xml文件,并与Aciton类放在同一个目录下

  3.field:需要校验的字段,name属性值需要和action中的字段一致;

   field-validator:校验器,type属性值为struts2框架提供的校验器。

   param是为type指定的校验器提供参数值,因为一个校验器对应一个java类,可以通过param标签为该类中的字段指定值

          这里<param name="trim">true</param>意思是设置requiredstring校验器所引用的类  

          com.opensymphony.xwork2.validator.validators.RequiredStringValidator中的字段trim的值为true,意思是对name属性值作去前后空格处理。

  <message>用于发送错误信息

<!DOCTYPE validators PUBLIC "-//Apache Struts//XWork Validator 1.0.3//EN"

        "http://struts.apache.org/dtds/xwork-validator-1.0.3.dtd">

<validators>

    <field name="name">  

        <field-validator type="requiredstring">  

             <message>请输入姓名</message>  

        </field-validator>  

    </field>   

    <field name="age">  

        <field-validator type="int">  

           <param name="min">18</param>  

           <message>年龄必须在18岁以上</message>  

        </field-validator>  

    </field>  

     <field name="password">

      <field-validator type="passwordintegrity">  

          <param name="specialCharacters">$!@#?</param>  

          <message>您的密码必须包括至少一个数字,字符,并包括如下的特殊的字符: "${specialCharacters}"</message>  

     </field-validator>  

   </field>

</validators>

 

自定义验证器

必须实现Validator接口,而ValidatorSupport和FeildValidatorSupport类都实现了Validator接口

     1.所以可继承ValidatorSupport和FieldValidatorSupport,重写validate()方法,

       验证规则写在validate()方法里,若只是普通的验证器,则选择ValidateSupport类, 若是实现字段效验,选择FieldValidatorSuppott类

    2.若是为输入参数提供效验,则在验证器类中需要提供一个属性,并提供get和set方法

 3.在src下面配置一个validators.xml文件,在此文件中将验证器全部引入,最后再将自己定义的验证器添加在后面(注册验证程序)

 4.在Action同目录下面配置一个名叫  Action类名-validation.xml文件(配置文件名字一定要是这个格式)

 5.在此配置文件中对我们需要使用自定义验证器的字段使用自定义验证器

 

编写拦截器

1.编写拦截器类可以继承AbstractInterceptor和实现Interceptor接口

2.继承AbstractInterceptor必须重写interceptor方法,在此方法中做相应的判断

3.struts.xml中的配置

  package节点下面配置interceptors节点

  在此节点下可以有多个Interceptor节点  在此节点里面有 name(拦截器的名称)  class(拦截器的类路径)

  result下面配置一个interceptor-ref节点在此节点里面有 name(上面那个拦截器的名称)

  并加上下面这个默认拦截器(必须加)    <interceptor-ref name="defaultStack"></interceptor-ref>

 

如果拦截器多可以考虑配置一个拦截器栈

  package节点下面配置interceptors节点,在此节点下有多个拦截器Interceptor

  这时用拦截器栈<interceptor-stack ></interceptor-stack >

  拦截器栈与interceptor等级,并且有name(拦截器栈的名字),在拦截器栈可以配置多个拦截器,包括默认的拦截器, 最后与interctptors同级使用拦截器栈,

  <default-interceptor-ref name="栈名"></default-interceptor-ref>

 

方法拦截器

  1.继承MethodFilterInterceptor  重写doIntercept方法 

  2.在struts.xml中的配置

     package下面配置interceptors节点,在此节点下可以有多个interceptor 此节点有name  class属性

 3.如果是方法拦截器

<interceptor-ref name="methodInterceptor">

   <param name="excludeMethods">list</param>  黑名单,表示不需要拦截的方法

   <param name="includeMethods">method</param> 白名单,表示需要拦截的方法

</interceptor-ref>


原创粉丝点击