黑马程序员技术交流社区

标题: 【石家庄校区】struts2—简化总结 [打印本页]

作者: 花祭-    时间: 2017-11-28 19:01
标题: 【石家庄校区】struts2—简化总结
本帖最后由 小石姐姐 于 2017-11-29 16:38 编辑

Struts2 获取servletAPI两种方式
1、通过servletActionContext的静态方法获取
2、注入方式在action类实现接口即可
   ServletRequestAware, 实现这个接口可以获取HttpServletRequest
   ServletResponseAware ,实现这个接口可以获取HttpServletResponse
   ServletContextAware 实现这个接口可以获取ServletContext
OGNL
ONGL 是一种功能强大的表达式语言,通过它简单一致的表达式语法,可以存取对象的任意属性,调用方法,遍历整个对象,实现字段类型转换等功能
Ognl本身就一个项目,可以单独使用,Struts2内置及默认表达式
作用:
1、支持对象操作,调用对象的方法
2、支持静态成员的访问
3、支持赋值操作与表达式串联
4、访问OGNL上下文,访问ActionContext操作集合对象
OGNL三要素 表达式、OGNL上下文,root根
OgnlContext context=new OgnlContext(); // 它就是一个java.util.Map
Object root = context.getRoot();
//获取对象
Object value = Ognl.getValue("'abc'.length()", context, root);
//静态成员访问
Object value = Ognl.getValue("@java.lang.Math@random()", context, context.getRoot());
Object value1 = Ognl.getValue("@java.lang.Math@PI", context, context.getRoot());
//访问Ognl上下文
//存放数据
context.put("user", "aaa");
//取值
Object value = Ognl.getValue("#user", context, context.getRoot());
//存放数据 根基点
map.put("user", "aaa");
//取值
context.setRoot(map);
Object value = Ognl.getValue("user", context, context.getRoot());
//封装一个map集合
//支持表达式赋值及串联
Object value = Ognl.getValue("#{'username':'tom','age':20}", context,context.getRoot()); //相当于创建了一个Map集合

//封装list传到页面
将List<Product> ps声明成action的属性,并提供了get/set方法
页面遍历取值时,如不加var变量声明可以取出值
如果加variterator加上var等价于重新声明了ps对象是p ,是从上下文中取值,所以,取值的时候要加#号。
JSP页面上获取值栈中的数据
1、访问root中数据不需要#
2、访问其它对象数据加#
通过下标获取root对象
<s:property value="[0].top"/> //取值栈顶对象
直接在root中查找对象属性 (自上而下自动查找)
valueStack:<s:property value="username"/>
在OgnlContext中获取数据 需要加#号
    request:<s:property value="#request.username"/>
    session:<s:property value="#session.username"/>
    application:<s:property value="#application.username"/>
    attr:<s:property value="#attr.username"/>
    parameters:<s:property value="#parameters.cid[0]"/>
向valuestack存放数据
1、自动存放
    Struts2框架会自动向valuestack中存放数据
    每次请求,访问action,这个对象会存储到valueStack中
    通过DefaultActionInvocation的init方法内的stack.push(action)
2、手动存放,用于存储基本信息
     主要向root中存放数据
     valuestack.push("aaa")
     valuestack.set("username","aaa"), 封装成一个hashmap集合存放到root中
3、获取valuestack
     1、直接通过request对象获取
             ServletActionContext.getRequest().getAttribute(ServletActionContext.STRUTS_VALUESTACK_KEY);
     2、使用ActionContext对象获取
             ActionContext.getContext().getValueStack();
               
               
拦截器
      Struts2拦截器是在访问某个Action或Action的某个方法,字段之前或之后实施拦截,
      并且Struts2拦截器是可插拔的,拦截器是AOP的一种实现。
      拦截器栈(Interceptor Stack),Struts2拦截器栈就是将拦截器按一定的顺序联结成一条链。
      在访问被拦截的方法或字段时,Struts2拦截器链中的拦截器就会按其之前定义的顺序被调用。
PS:拦截器是AOP的一种实现,Struts2的拦截是链式调用,使用自定义拦截器必须调用默认拦截器,不然默认拦截器会失效
自定义拦截器
      1、自定义一个类实现Interceptor或继承MethodFilterInterceptor        
      2、在strutx.xml中注册上一步中定义的拦截器。               
      3、在需要使用的Action中引用上述定义的拦截器,为了方便也可将拦截器定义为默认的拦截器,这样在不加特殊声明的情况下所有的Action都被这个拦截器拦截。        
      4、配置文件
      实现接口的配置
      <interceptor name="myInterceptor" class="com.struts2.interceptor.MyInterceptor">
                        <interceptor-ref name="myInterceptor">
                        <interceptor-ref name="defaultStack"/>  --必须引入,要不默认拦截器不起作用
                </interceptor-ref>        
        ---------------
                继承的配置
             <interceptors>
               <interceptor name="myInterceptor" class="com.itheima.utils.MyInterceptor">
                       <param name="includeMethods">execute</param>
                        <param name="excludeMethods">addProduct</param>
               </interceptor>
               <interceptor-stack name="myStack">
                       <interceptor-ref name="myInterceptor"/>
                       <interceptor-ref name="defaultStack"/> --必须引入,要不默认拦截器不起作用
               </interceptor-stack>
       </interceptors>                                
        <interceptor-ref name="myInterceptor"/>  --在要拦截的action中引用
        
        
        




作者: 小石姐姐    时间: 2017-11-29 16:38
棒棒的




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2