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" %>

//使用  
<s:property value="ognl表达式">

值栈(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页面中使用<s:property value="表达式">
  2. 上下文对象是ActionContext
  3. 根对象是谁ValueStack

​ java中ArrayList模拟栈结构-->操作ValueStack,在值栈中有一个context的引用。

<iterator value="集合中的东西">
    <s:property value="">
</iterator>

拦截器(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)
}
声明
<interceptors>
    <interceptor name="类名" class=";类的路径"></interceptor>
</interceptors>
使用
<interceptor-ref name=""></interceptor-ref>

从值栈中取值练习!

存值:

​ root

​ push

​ set

​ ModelDriven

​ context

​ 存在web常用对象中

取值:

​ root

​ 取值不加#

​ context

​ 取值加#

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,718评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,683评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,207评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,755评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,862评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,050评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,136评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,882评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,330评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,651评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,789评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,477评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,135评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,864评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,099评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,598评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,697评论 2 351

推荐阅读更多精彩内容