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的连接 , 点击该连接 , 网页中将输出各种服务器对象的信息
…
- Struts2复习笔记
- struts2复习笔记
- struts2复习笔记
- 黑马程序员--Struts2复习笔记
- Struts2的笔记整理与复习
- 超全面 struts2 复习总结笔记
- struts2复习
- struts2复习首次记录
- struts2配置复习
- Struts2复习点
- struts2 复习小知识点
- Struts2复习专题
- Struts2大复习
- struts2基础复习
- struts2复习1
- struts2复习2 helloworld
- Struts2 回顾与复习
- struts2复习汇总
- Add Again UVA
- jQuery2
- linux源配置-yellowcong
- 002
- ios 数组排序
- struts2复习笔记
- myBatis之java.util.Date类型如何映射到mysql的datetime类型
- win7在虚拟机上用Djangodebug模式部署服务器的简要步骤
- Android开发的那些小秘密分享
- 《快学Scala》16章习题参考解答(XML)
- ElasticSearch入门常用查询语句
- 内存
- JAVA8 实现递归函数
- C#学习笔记