Struts2第二部分
今日目标
- 了解在struts2的action中如何获取servlet的api
- 了解ognl表达式:对象导航式语言
- 务必掌握理解值栈
- 了解两个标签
- 了解拦截器(struts底层核心)
如何在action中获取servlet中的API
struts2中提供ServletActionContext工具类,静态方法获取对象
实现ServletRequestAware接口可以获取request对象
//在action类中获得request、response、session等对象
ServletActionContext.getRequest()
ServletActionContext.getResponse()
ServletActionContext.getServletContext()
//实现XXX接口可以获取
ServletRequestAware--request
ServletResponseAware--response
ServletContextAware--ServletContext
OGNL(了解)
OGNL是对象导航图语言
- 表达式
- context上下文
- root根
public void test(){
//获取上下文对象
OgnlContext context = new OgnlContext();
//操作
Object root = context.getRoot();
Ognl.getValue("'hello'.length()",context,root);
//输出
system.out.println(value)
}
//ognl支持静态成员访问
public void test2(){
//获取上下文对象
OgnlContext context = new OgnlContext();
//操作
Object root = context.getRoot();
Object value1 = Ognl.getValue("@java.lang.Math@random()",context,root);
Object value2 = Ognl.getValue("@java.lang.Math@PI",context,root);
//输出
value1
value2
}
public void test3(){
//获取上下文对象
OgnlContext context = new OgnlContext();
//在上下文存储数据
context.put("name","jj")
//操作
Object value = Ognl.getValue("#name",context,context.getRoot())
//输出
system.out.println(value)
}
- 如果从根中获取数据,不需要添加#号,如果不是中根中获取,则需要加#号
- OGNL表达式中三个部分其中context和root这两部分可以存储数据,表达式就是从这两部分中取数据。
//ognl创建集合
Object value = Ognl.getValue("#{1,2,3,4,5}",context,context.getRoot())
//ognl创建Map
Object value = Ognl.getValue("#{'name':'jj','age':'20'}",context,context.getRoot())
Struts2框架中如何使用ognl表达式
在struts框架中我们使用ognl表达式的作用是从valueStack中获取数据.
我们在struts2框架中可以使用ognl+valueStack达到在页面(jsp)上获取相关数据
//要引入标签库
<%@taglib prifix="s" uri="/struts-tags" %>
//使用
值栈(ValueStack【接口】--OGNLValueStack)--Struts2核心
我们使用 valueStack 的主要目的是为我将我们 action 中产生的数据携带到页面上,也就是说valueStack 它就是一个容器。
在 Struts2 框架中将 valueStack 设计成一个接口。
com.opensymphony.xwork2.util.ValueStack
我们主要使用的是它的实现类
com.opensymphony.xwork2.ognl.OgnlValueStack。
- 值栈在哪儿
- struts2框架中的action是多例的,也就是只要请求过来,就会创建.因此是线程安全的
- A--请求--LoginAvtion流程
- 给A用户创建一个request(requestA)对象
- 给A用户创建一个loginAction(loginActionA)对象
- 在loginActionA对象中会有ValueStack对象(值栈)
- 获取valueStack
- 通过action
- 通过request
- Struts2的值栈结构
- 获取到值栈
- 区分几个小概念
- 操作值栈[存:后台存取;取:前台jsp取值]
- 拦截器[Struts2底层---AOP思想]
值栈的内部结构
值栈就是一个容器:ValueStack(接口)
实现类:OgnlValueStack(类)
类的属性:root | context
root:ArrayList context:Map
实际上操作值栈就只是操作root和context属性.
root属性其实就是一个ArrayList集合
context属性其实就是一个Map集合
我们都使用root来存储action相关的数据,用context来存储web开发中常用的一些对象:Parameters 请求参数,request请求中的属性,session会话中的所有属性,applicationapplication中的所有发展,并且全部都是Map
在使用Struts2框架时,通过ognl表达式来获取valueStack中数据,使用#就会从context中获取,没有使用#号就会从compoundRoot中获取
获取值栈
- 通过request对象
- ServletActionContext.getRequest()
- 通过action的上下文对象
- context = ActionContext.getContext();
- context.getValueStack();
部分理解概念
ActionContext
Web开发常识:
- HttpServletRequest 真身时有tomcat创建的
- 一次请求来了,tomcat会开辟一条线程处理这一次的请求
一次request 对应一个Action对象,对应一个ActionContext 对应一个线程
即
request--------Action---------ActionContext
ActionContext 它是 action 上下文,strtus2 框架它使用 actionContext 来保存 Action 在执行过程中所需要的一些对象,例如 session, application,ActionContext 的获取 是通过它的静态方法 getContext()得到。Struts2 会根据每一次的 http 请求来创建对应的 ActionContext,它是与当前线程绑定的。每一次请求,就是一个线程,对应着一个 request,每一次请求,会创建一个 Action,每一个action 对应一个 ActionContext.每一次请求也对应着一个valueStack.request---ActionContext----Action-----ValueStaci 它们都对应着一次请求(一个线程).valueStack 与 ActionContext 本质上是可以获取
操作值栈
存储数据
使用valueStack存储数据主要时向root中存储
框架底层往值栈(root)Avtion对象,实现ModelDriven接口,模型存到root
手动向valueStack存储数据
push方法push(Object)
set方法set(key,value)
Struts2框架自动向valueStack中存储数据
获取数据
Ognl特殊符号
"#" :从非root中获取数据
"%":%{}里边的内容会被解析成Ognl表达式-----%{''}里边的内容不会被解析成Ognl表达式
"$":可以让重定向也拿到数据(根本不用!)
Struts2值栈的深入理解
- 表达式写在jsp页面中使用
- 上下文对象是ActionContext
- 根对象是谁ValueStack
java中ArrayList模拟栈结构-->操作ValueStack,在值栈中有一个context的引用。
拦截器(interceptor)
基于spring AOP思想,实质上是通过动态代理实现。
interceptor可以了解action的访问。
struts2框架默认加载的是defaultstack拦截器栈,他在Struts2-default.xml中配置,而我们自己的struts.xml文件一般会继承struts-default.xml
拦截器开发
拦截器的位置
拦截器的开发:
- 实现interceptor接口
- 在struts.xml配置拦截器【注册拦截器】
- 在action中引用拦截器。
拦截器的练习:
需求:如果用户没有登陆就不能查看商品信息
public class MyInterceptor implements Interceptor{
public String interceptor(Avtion)
}
声明
使用
从值栈中取值练习!
存值:
root
push
set
ModelDriven
context
存在web常用对象中
取值:
root
取值不加#
context
取值加#