struts2中

Struts2第二部分

今日目标

  • 了解在struts2的action中如何获取servlet的api
  • 了解ognl表达式:对象导航式语言
  • 务必掌握理解值栈
  • 了解两个标签
  • 了解拦截器(struts底层核心)

如何在action中获取servlet中的API

  1. struts2中提供ServletActionContext工具类,静态方法获取对象

  2. 实现ServletRequestAware接口可以获取request对象

//在action类中获得request、response、session等对象
ServletActionContext.getRequest()
ServletActionContext.getResponse()
ServletActionContext.getServletContext()
  
//实现XXX接口可以获取
ServletRequestAware--request
ServletResponseAware--response
ServletContextAware--ServletContext

OGNL(了解)

OGNL是对象导航图语言

  1. 表达式
  2. context上下文
  3. 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。

  1. 值栈在哪儿
    1. struts2框架中的action是多例的,也就是只要请求过来,就会创建.因此是线程安全的
    2. A--请求--LoginAvtion流程
      1. 给A用户创建一个request(requestA)对象
      2. 给A用户创建一个loginAction(loginActionA)对象
      3. 在loginActionA对象中会有ValueStack对象(值栈)
      4. 获取valueStack
        1. 通过action
        2. 通过request
  2. Struts2的值栈结构
  3. 获取到值栈
  4. 区分几个小概念
  5. 操作值栈[存:后台存取;取:前台jsp取值]
  6. 拦截器[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开发常识:

  1. HttpServletRequest 真身时有tomcat创建的
  2. 一次请求来了,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值栈的深入理解

  1. 表达式写在jsp页面中使用
  2. 上下文对象是ActionContext
  3. 根对象是谁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

​ 取值加#

你可能感兴趣的:(struts2中)