struts2入门2

来源:互联网 发布:js鼠标悬停事件 编辑:程序博客网 时间:2024/06/05 02:04
1. struts2中获取servletapi, 获取servletactioncontext.getrequest();


2 .采用注入的方式:  java类实现servletrequestaware 接口, 可获取request对象.

    执行流程, 请求被拦截器拦截,有一个默认的servletcofig拦截器,这个拦截器中可以动态的判断action类
       哪个实现了servlet...aware接口, 然后注入给他的setservlet...(传一个对象的引用);



3.OGNL表达式: 三要素,表达式 ,上下文,根

    1.获取上下文对象 new OgnlContext,  2 . 获取根1.getroot(); 3  Ognl.getvalue("对象",1,2);

    4.静态成员访问: 1.getvalue("@java.lang.Math@静态方法或属性",1,2);


4.访问OGNL上下文:

  1 -- 向上下文中存数据 3.1.put("username","tom");
 
  2. Ognl.getvalue("#username",3.1,3.2);  这个地方如果不加#号,就是从根中获取, 你要把map或user对象   
         setroot(map)才能获取,否则就要加#号


  3.操作集合 Ognl.getvalue("{1,2,3,4}",1,2);相当于创建list集合  #{'username':'tom'}创建了map集合

 
   getvalue("username='sfds',age=34")注意这是root,要先setroot(),支持赋值和串联,


5.struts2用OGNL表达式获取valuestack中获取数据,从而达到在页面(jsp)上获取相关的数据.

  要想在jsp使用OGNL表达式, 导入标签库, uri="/struts-tags" prefix="s"

   然后<s:property value="字符串.length()">


6.栈: 先进后出  valueStack 值栈 ,是一个容器,将数据带到jsp页面上.  设计成一个接口了.

   实现类为Ognlvaluestack,

  1.struts2中的action是一个多例的,每一次请求都是一个新的action,所以不存在线程安全问题,

    每一个valuestack对应一个action, 贯穿整个action声明周期. 从request域中获取valuestack.


7.valuestack 内部结构: 有两部分

   1. root 是一个list集合  :  存储action相关数据,

   2. context 是一个map集合  :存储为web开发相关对象. parameters request, session ,aplication,
     里面是map集合等

   3.OGNL如果使用#就从Ognlcontext中获取,没有使用从root中获取.



8.获取valuestack的方式:   他存储在actioncontext中,actioncontext是通过getcontext在线程池里获取的.


   1.request.getattribute(servletactioncontext.str...);

   2.通过actioncontext来获取, actioncontext.getcontext().getvaluestack()

       actioncontext是绑定到线程中, 是每一次请求都会重新创建的

      valuestack中分两部分,他的context部分,每次都会  ctx = new ActionContext(stack.getContext());

       valuestack.getcontext(): 注意在context中持有root的引用.


9.一个request --- action - -- actioncontext---- valuestack(context(root(action)))  stack.push(action);


    ActionContext它是action上下文,strtus2框架它使用actionContext来保存Action在执行过程中所需要的一些对象
      例如 session, application…

      为什么会有这写对象呢?因为它里面有valustack,valuestack中context存储的是对象的map

   ActionContext的获取  是通过它的静态方法getContext()得到。

   Struts2会根据每一次的http请求来创建对应的ActionContext,它是与当前线程绑定的。getcontext方法是从线程池       里面来获取ActionContext对象的

  每一次请求,就是一个线程,对应着一个request,每一次请求,会创建一个Action,每一个action对应一个          ActionContext.每一次请求也对应着一个valueStack.

  request---ActionContext----Action-----ValueStaci它们都对应着一次请求(一个线程).
   valueStack与ActionContext本质上是可以获取



10.valuestack 存储数据

 1.手动存储.向root中存储
     stack.push("Object o"); 向root中存储

     stack.set("",""); 底层会创建一个hashmap,保存数据,把集合存储到root中.


 2.自动向root中存储. 每次请求,都会把action放入到stack.push中;

    a. 会将当前的action对象存储到valuestack中  stack.push(action);在defaultactioninvocation.init方法内
 
    b.如果action实现了modeldriven接口(模型驱动),他会把模型对象存进valuestack中


11. 在jsp页面获取数据

   1. 手动存的数据:

     <s:debug> 可以作为调试用. 取出set里面的数据,set的是map集合直接 <s:property value="map的key">

      而取出push()里面的数据,要清楚他是在栈空间内
      怎么存的,先存的在底部,最底部是一个action, 坐标是从上往下变大的. 要去 某个值 直接[坐标].top

    
  2.自动存的数据:

    他是调用get方法, 直接value="get后面的小写属性";也是存储在root中


  3.实现modeldriven接口的模型类;

    在execute()方法中重新new user();这里不会有模型驱动或者属性驱动,因为这两种驱动只是封装属性的,
    而现在在那个方法内直接用set属性的方式,所以他不会有驱动的事情,只会走个getModel方法.


    而第二个对象取值要jsp页面中value="model.成员属性" 这里model只是在action类中,有一个
    
    getmodel方法内是得到user对象的, 所以用model.成员属性;


  4.EL表达式可以从valuestack中获取数据
   
    struts2对request方法进行增强了.如果在request域中获取不到,就在valuestack中获取

     attribute = stack.findValue(key);


  5.debug中为什么自己设置的user对象是存储在actionstack中的,是因为通过model方法获取的,model方法是在
   action中的.



12. OGNL中 #是从不是root中获取数据 , % 和 $符号; 

  1. #parameters.username 获取地址栏请求参数

  2. %号用法: value=" %{会解析OGNL}"  value="  %{'不会解析'}"

 
  3.$ 号用法:  ${model.username} 可以在值栈中获取值. 注意是:在struts.xml中!!!!  有中文限制



13.在开发中一般继承actionsupprot类, 可以使用父类提供对于错误操作的处理方法,
  addactionError("密码错误"); addfielderror();进行错误信息的校验
  addactionmessage();同时配置了,只会取出最后一个;

  在jsp页面可以使用对应的标签 <s:actionerror/>

  

14.展示商品集合信息:

  1. 在动作类中,可以提供getproduct(),和setproduct()方法,会自动存储到valuestack中

  2. 在动作类中,手动存到值栈中


 在jsp页面中:
 
 1.  <s:iterator value="存的集合名" var="每一个数值">  每一个数值存在context里面,下面要用#    ?

 2.  <s:iterator value="存的集合名" >  直接写属性名;



15.自定义interceptor拦截器

   1. 实现interceptor接口

   2.在配置文件中配置自己的在package标签中<interceptors>
                                            <interceptor name class>
                                              <interceptor-stack name="mystack">
                                                <interceptor -ref name "自己定义的">
                                                <interceptor- ref name="defaultstack">

  3.在action配置中<action><interceptor- ref name="mystack">

  4.注意:当我们显示的引入了一个自定义的Interceptor,那么默认的defaultStack就不会在导入,需要手动         导入。
 

  5.如果登陆放行: return invocation.invoke()

   在拦截器中,获取action invocation.getaction();
   获取到实现actionsupport接口, 然后就可存储错误信息.


  6.使用通配符可以拦截多个方法,但如果只拦截一个方法,自定义需要继承methodfilterinterceptor;

   在配置时<interceptors>
                <interceptor name class> <Param name="includemethods" >放行的方法名
                      <Param name="excludemethods" >不放行的方法

 <default-interceptor-ref name="mystack">




16.存储数据在valuestack中就三个地方:  1.在root中存储  2.在context中存储  3.在action类中的get方法中

  相对应取值的三种方法 root直接取, context加#号取, 类中的加方法名.取值



17. 拦截器拦截请求后,会创建一个action的代理对象,代理会调用execute()方法,会调用invocation的invoke方法,

    在invoke方法内,会遍历所有的拦截器,然后去执行intercept方法,在方法内又会执行invocation.invoke.这样就会

    不断的递归调用拦截器,而请求拦截一遍,响应又拦截一遍.


    例如: params拦截器,当请求参数被拦截器拦截的时候,他就会获得所有的参数,然后,他是被action代理对象调用的

        然后就会知道action对象,然后就会封装了参数.

原创粉丝点击