黑马程序员技术交流社区
标题:
【石家庄校区】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