struts2复习笔记

来源:互联网 发布:淘宝怎样关店 编辑:程序博客网 时间:2024/05/06 00:51

OGNL
概述:
el表达式用在jsp中,用于获取域对象的值
ognl也是一种表达式,比el更强大
支持对象方法调用
支持静态方法调用和值访问
主要用途 :
在struts2里面获取值栈数据

ognl本身不是struts2的一部分 , 是单独的一个项目 , 经常和struts2一起使用

使用ognl, 首先要导包 ,struts2包含了

ognl在struts2里面和struts2标签一起使用

使用 :
引入标签库 : <%taglib uri="/struts-tags" prefix="s"%>

<s:preperty value="'hello'.length()"> 结果就是5

值栈
概念: 类似于域对象 , 值栈应用在struts2的action里面,可以存值和取值

servlet默认在第一次访问的时候创建 ,只会创建一次 单实例对象
action在访问的时候创建 , 每次访问都会创建一个action 多实例对象

存储位置:值栈在每个action的对象里面存在一个值栈对象

值栈使用范围 : 使用在action范围的 , 输地址到页面显示

获取值栈对象 :
有多种方式
使用ActionContext类的方法得到值栈对象

获取ActionContext类
ActionContext context = ActionContext.getContext();
ValueStack stack = context.getValueStack();

每个Action对象里面只有一个值栈对象

值栈的内部结构
root 本身是一个list集合

context 是一个map集合 存的是对象的引用
key值 value值
request request对象引用
session HttpSession对象引用
application ServletContext引用
parameters 请求参数
attribter

一般数据都是放到root


struts2的执行流程

从客户端发送请求过来 , 会经过前段控制器(核心过滤器 StrutsPrepareAndExcuteFiflter)
过滤器中执行一组拦截器 , 拦截器执行完成以后 , 就会执行目标Action , 在Action中返回一个结果视

图 , 根据Result的配置进行页面的跳转

struts2常量的配置 :

1 : 在struts.xml文件中使用<constant>元素配置
2 : 在struts.properties文件中配置
3 : 在web.xml文件中通过<init-param>元素配置常量

A : 在struts.xml文件中通过<constant>配置,是最常用的方式 : 指定两个必填属性
<constant name="struts.il8n.encoding" value="UTF-8">—设置默认编码集
<constant name="struts.devMode" value="true">———-设置使用开发模式

B : 在struts.properties中配置 key-value形式

C : 在web.xml文件中通过初始化参数配置常量
在web.xml文件中配置核心过滤器 StrutsPrepareAndExcuteFilter 时 , 通过初始化参数来配置常量
通过<filter>元素的<init-param>子元素指定 , 每个<init-param>元素配置了一个Struts2 常量 ,
在web.xml文件中通过初始化参数配置常量方式 :
  
 

 <filter>   <filter-name>struts2</filter-name>   <filter-class>   ... ... StrutsPrepareAndExcuteFilter   </filter-class>    <init-param>          <param-name>struts.il8n.encoding</parm-name>          <parm-value>UTF-8</param-value>    </init-param>    </filter>

!——后加载的配置文件的常量会覆盖先加载的配置文件常量的值

分模块开发 <include> 元素
<include file="struts-shop.xml">—————–

Struts2 的 Action的访问

Action作为框架的核心类 , 实现对用户请求的处理 , Action类被称为业务逻辑控制器 , 一个Action

类代表一次请求或调用 , 每个请求的动作都对应一个相应的Action类 , 一个Action类是一个独立的工

作单元 , 用户的每次请求 , 都会转到一个相应的Action类里面 , 由这个Action类来进行处理 ,

实现Action控制类由3种方式 :
1 : Action 是一个pojo的类
可以不继承特殊的类或不实现特殊的接口 , 仅仅是一个POJO , 一般在这个POJO类中 , 要有一个公

共的无参构造方法和一个execute()方法 ;
execute()方法要求如下:
1-方法的权限修饰符为public
2-返回一个字符串
3-方法没有参数

2 : 实现一个Action的接口
这个接口里面只定义了一个execute()方法,还定义了5个字符串常量 , 他们的作用就是统一

execute()方法的返回值
SUCCESS
NONE
ERROR 跳转到错误页面
INPUT 数据校验的时候跳转的路劲
LOGIN 跳转到登录页面

3 : 继承AtionSupport类
ActionSupport类本身实现了Action接口 , 是struts2中默认的Action接口的实现类 ,
上面两种一般不用

配置method
<action>的name属性中使用*号代表任意字符 , method中的{1}代表name属性中出现第一个*所代替

的字符 ,

另外一种办法也可以解决这种问题 : 动态方法访问
动态方法访问在Struts2中默认是不开启的 , 如果要使用先要配置一个常量

  <constant name="struts.enable.DynamicMethodInvocation" value="true" / >

动态方法访问主要的控制是在前段页面 , 所以编写Action和配置Action都很简单 , 关键是访问路径

的编写
配置Action

<action name="userAction" class="....">

页面路劲写法

 <a href="${pageContext...}userAction!save.action">

Struts2访问Servlet的API

1 : 通过ActionCtext类访问
Struts2框架提供了ActionContext类来访问Servlet , ActionContext是Action执行的上下文对象 ,

在ActionContext中保存了Action执行所需要的所有对象 , 包括parameters , request , session ,

application 等
常用方法 :
put(String key , Object value) –将key-value键值对放进ActionContext中 , 模拟

setAttribute()方法
get(String key) –通过key查找ActionContext中的值
getApplication –返回一个Application级的Map对象
getContext() –返回当前线程的ActionContext对象
getParameters() –返回一个包含所有HttpServletRequest参数信息的Map对象
getSession() –返回一个Map类型的HttpSession对象
setApplication(Map

<global-results>    <result name="success">/success.jsp</result>  </global-results>

Struts的数据封装
1 : 属性驱动
2 : 模型驱动

属性驱动可以细分成两种 , 一种只需要提供属性的set方法即可 , 另一种可以直接通过表达式方式封装

到对象中.

在Struts2中 , 可以直接在Action中定义各种java基本数据的字段 , 使这些字段与表单数据相对应

, 并利用这些字段进行数据传递
1 : 提供属性的set方法
2 : 页面提供表达式方式

模型驱动
通过实现ModelDriven接口来接受请求参数 , Action类必须实现ModelDriven接口 , 并且要重写

getModel方法 , 这个方法返回的就是Action所使用的数据模型对象
JavaBean所封装的属性与表单的属性一一对应 , JavaBean将成为数据传递的载体

Struts2中封装集合类型的数据

封装进list
list[0].name
list[0].age

list[1].name
list[1].age

Map集合
map[‘one’].name
map[‘one’].age
map[‘two’].name
map[‘two’].age

值栈 :

ValueStack是Struts的一个接口 , 字面意义是值栈 , OgnlValueStack是ValueStack的实现类 ,
客户端发起一个请求 Struts2 架构会创建一个action实例同时创建一个OgnlValueStack值栈实例 ,
OgnlValueStack贯穿整个Action的生命周期 , struts中使用ognl将请求的Action参数封装成对象存储到值栈中 , 并通过OGNL表达式读取值栈中的对象属性值

值栈的内部结构:

在OgnlValueStack中包括两部分 , 值栈和map(即Ognl上下文)

1—-Context :
即Ognl上下文 , 他是一个map 结构 , 上下文中存储了一些引用 , 包括 (parameters,request,session,application等)
parameters : 包含当前请求的请求参数
request : 包含当前request对象中所有属性
session : 包含当前session对象中所有属性
application: 包含当前application对象中的所有属性
attr : 该map按如下顺序来检索某个属性:request,session,application
2—-CompoundRoot
存储了action实例 , 他作为OgnlContext的 Root 对象
CompoundRoot 继承 ArrayList实现压栈和出栈功能 , 拥有栈的特点 , 先进后出 ,所以称为对象栈

Struts2 对原OGNL作出的改进就是Root使用CompoundRoot(自定义栈) , \
使用OgnlValueStack的findValue方法可以在CompoundRoot中从栈顶向栈底查找对象的属性值

ActionContext和ValueStack的关系
在创建ActionContext的时候创建ValueStack的对象 , 将ValueStack对象给ActionContext,
ActionContetx中有一个ValueStack的引用 , ValueStack中也有一个ActionContext的引用

获取值栈对象
1 : 通过ActionContext对象获取
ValueStack stack = ActionContxet.getContext().getValueStack();

2 : 通过request域获取值栈
ValueStack stack = (ValueStack)ServletActionContext.getRequest().getAttribute(ServletActionContext.STURTS_VALUESTACK_KEY);

操作值栈
1 :  对象Action中的属性提供get方法的方法
    因为Action本身在值栈中 . Action的属性默认也就在值栈中了 , 所以可以通过对Action的属性提供get方法来操作值栈
2 : 手动调用值栈的push和set方法对值栈进行操作

EL可以访问值栈
原因是底层对request对象的getAttribute方法进行了增强

EL特殊字符的使用

# 号 :
获取context的数据 : <s:property value="#request.name">
用于构建一个Map集合 , 使用Struts的UI标签的时候
  <s:iteratior value="#{'aaa':'111','bbb':'222'}" var="entry">   
<s:property value="key"/>---<s:property value="value"/>
<s:property value="#entry.key"/>---<s:property value=”#entry.value”/>
号 :%强制解析Ognl表达式 : <s:textfield name="name" value"%{#request.name}"/>:property value="%{‘#requst.name’}”> 号 :
在配置文件中使用OGNL表达式

Struts2的拦截器

拦截器的概述: 在AOP中用于在某个方法或者字段访问之前 , 进行拦截然后在之前或者之后加入某些操作 , 拦截是AOP的一种实现策略

拦截器的实现原理 :
当请求到达struts2的ServletDispatcher时 , struts2会查找配置文件 , 并且根据其配置实例化相对的拦截器对象 , 然后串成一个列表 , 最后一个一个的调用列表中的拦截器
Struts2的拦截器是可以插拔的 , 拦截器是AOP的一种实现 , Struts2拦截器就是将拦截器按一定的顺序联结成一条链, 在访问被拦截的方法时或字段时 , Struts2拦截器链中的拦截器就

会按之前定义的顺序被调用 .

自定义拦截器:
开发过程中 , 如果需要开发自己的拦截器类 , 就需要直接或者间接的实现Intercepter接口

该接口提供了三个方法:
init() : 该方法在拦截器被创建后会立即调用 , 他在拦截器的生命周期内只被调用一次 ,
destory() ; 销毁释放资源
String intercept(ActionInvocation invocation)throws Exception; 拦截器的核心方法 , 用来添加真正执行拦截工作的代码 , 实现具体的拦截操作 , 他返回一个字符串作为逻辑视图

, 没拦截一个动作请求 , 该方法就会被调用一次 , 该方法的ActionInvocation参数包含了被拦截的Action的引用 , 可以通过该参数的invoke()方法 , 将控制权传给下一个拦截器或者

Action的execute()方法 .

如果需要自定义拦截器 , 只需要实现Interceptor接口的三个方法即可 ,

然而在实际开发过程中 , 除了实现Interceptor接口可以自定义拦截器 , 更常用的方法是继承抽象 拦 截器类AbstractIntercepter , 该类实现类Interceptor接口 , 并且提供了

init方法和distory的空实现 ,

拦截器的配置
在struts.xml文件中 ,

<intercetor name="interceptorName" class="inrterceptorClass">  <param name="paramName">paramValue</param>   </interceptor>

上面的语法格式中 , name属性用来指定拦截器的名称 , class属性用于指定拦截的实现类 , 有时 , 在定义拦截器时需要传入参数 , 这时需要使用<param>标签 , 其中name属性用来指定

参数的名称 , paramValue代表传入的值 ,

拦截器栈
在实际开发中 , 经常需要在Action执行前同时执行多个拦截动作 , 例如用户登录检查,登录日志记录以及权限检查等 , 这时 , 可以把多个拦截器组成一个拦截器栈 , 在使用时 , 可以将栈

内的多个拦截器当成一个整体来引用 , 当拦截器栈被附件到一个Action上时 , 在执行Action之前必须先执行拦截器栈中的每一个拦截器

定义拦截器栈使用<interceptors>元素和<interceptor-stack>子元素 , 当配置多个拦截器时 , 需要使用<interceptor-ref>元素来指定多个拦截器 ,

<interceptors>  <interceptor-stack name="自定义拦截器栈名字">    <interceptor-ref name = "拦截器的名字" />    ...   </interceptor-stack> </intercetors>

一个拦截器栈中还可以包含另一个拦截器栈

<package name="default" namespace="/" extends="struts-default">   <!-- 声明拦截器 -->   <interceptors>      <interceptor name="interceptor1" class="interceptorClass">      <interceptor name="interceptor2" class="interceptorClass">   <!-- 定义一个拦截器栈mystack 该拦截器栈中包含两个拦截器和一个拦截器栈 -->   <interceptor-stack name="myStack">   <interceptor-ref name="defaultStack">   <interceptor-ref name="interceptor1">   <interceptor-ref name="interceptor2">    </interceptor-stack>  </interceptors></package>

定义的拦截器栈是myStack , 在myStack中,除了引用两个自定义拦截器,还引用了内置拦截器栈
这个defaultStack是必须要引入的

Struts2的标签库
在JavaWeb中 , Struts2标签库是一个比较完善 , 而且功能强大的标签库 , 他将所有标签都统一到一个标签库中 , 从而简化了标签的使用 , 他还提供了主题和模板的支持 , 极大的简化视

图页面代码的编写 , 同时他还提供了Ajax的支持 , 大大丰富了视图的表现效果 , 与JSTL相比 , Struts2标签库更加易用和强大

Struts2标签库的分类

普通标签
Control标签
Data标签
UI标签
From标签
Non-From标签
Ajax标签

主要分为两类 , 普通标签主要是在页面生成时 , 控制执行的标签 , UI标签则是以丰富而可复用的HTML文件来显示数据

普通标签又分为控制标签(Control Tags)和数据标签(Data Tags) . 控制标签用来完成条件逻辑,循环逻辑的控制 , 也可以用来做集合的操作 , 数据标签用来输出后台的数据和完成其他数据

的访问功能 .

UI标签又分为表单标签(Form Tags)/非表单标签(Non-Form Tags)和Ajax标签 , 表单标签主要用来生成HTML页面中的表单元素 , 非表单标签主要用来生成HTML的<div>标签以及输出Action中

封装的信息 , Ajax标签主要用来提供Ajax技术支持

Struts2标签的使用

Struts2标签库被定义在struts-tags.tld文件中 , 在struts-core-2.3.24.jar中的META-INF目录下 ,
要是用struts2的标签库 , 一般只需要在jsp文件中使用taglib指令导入Struts2标签库 , 如下:
<%@ taglib prefix=”s” uri=”/struts-tags”%>
taglib指令的uri属性用于指定引入标签库描述符文件的URL , prefix属性用于指定引入标签库描述文件的前缀 ,
需要注意的是 , 在jsp文件中 , 所有的Struts2标签库的使用”s”前缀

Struts2的控制标签

常用的逻辑控制标签主要包括

<s:if><s:elseif><s:eles><s:iterator>

只有<s:if>标签可以单独使用 , 而<s:elseif><s:else>都必须和<s:if>标签结合使用

<s:if test="表达式1">   标签体</s:if><s:elseif test="表达式2">   标签体 </s:elseif><s:else>标签体</s:eles>

<s:if><s:elseif>标签都必须指定test属性 , 该属性用于设置标签的判断条件 , 其值为boolean型的条件表达式

<s:iterator>标签
主要用于对集合中的数据进行迭代 , 他可以根据条件遍历集合中的数据 ,
<s:iterator>标签的属性:
begin 迭代数组或者集合的起始位置
end
status 迭代过程中的状态
step 每一次迭代后索引增加的值
value 迭代的数组或集合对象
var 将生成的iterator设置为page范围属性
id 指定集合元素的id 现已用var代替

如果再<s:iterator>标签中指定了status属性 , 那么通过该属性可以获取迭代过程中的状态信息 , 如元素数 , 当前索引值
st.count 返回当前已经遍历的集合元素的个数
st.first 返回当前遍历元素是否为集合的第一个元素
st.last 返回当前遍历元素是否为集合的最后一个元素
st.index 返回当前遍历元素的当前索引值
st.even 返回当前遍历的元素索引是否为偶数
st.odd 返回当前遍历的元素索引是否为奇数

<s:iterator var="name" value="{'java','javaweb','oracle','mysql'}" status="st">    <s:if test="#st.odd">      <tr>         <td><s:property value="name"></td>      </tr>    </s:if>    <s:else>       <tr>          <td><s:property value="name"></td>       </tr>    </s:else></s:iterator>

Struts2的数据标签
在Struts2标签库中 , 数据标签主要用于各种数据访问相关的功能以及Action的调用 . 常用的数据标签有 :

 <s:property> <s:a> <s:debug> <s:include> <s:param>

<s:property>标签:
用于输出指定的值 , 通常输出的是value属性指定的值 , 属性如下 :
id 可选属性 指定该元素的标识
default 可选属性 如果要输出的值为null , 则显示default属性指定的值
escape 可选属性 指定是否忽略HTML代码
value 可选属性 指定需要输出的属性值 , 如果没有指定则默认数值

`VauleStack<s:property value="字符串"/>tml代码<s:property value="'<h3>文本内容</h3>'" escape="true">不忽略html<s:property value="'<h3>文本内容</h3>'" escape="false">输出默认值<s:property value="" default="默认值"><s:a>`标签 : 用于构造HTML超链接 , 其使用方式与HTML中的`<a>`标签类似 , action     可选属性     指定超链接Action的地址href       可选属性     超链接地址namespace  可选属性     指定Action地址id         可选属性     指定其idmethod     可选属性     指定Action调用方法
<s:a href="超链接地址"/><s:a namespace="" action="">mmm.cn</s:a>

<s:debug>标签
用于调试程序时输出更多的信息 , 主要输出ValueStack和StackContext中的信息 , 该标签只有一个id属性 , 而且一般不用
在使用<s:debug>标签后 , 网页中会生成一个Debug的连接 , 点击该连接 , 网页中将输出各种服务器对象的信息

原创粉丝点击