上一章 Struts2框架的基础使用
Struts2的核心使用
1.传参
1.1)基本数据的传参
1.2)数组传参
1.3)对象传参
1.4)多个对象传参
2.转向
在节点下生成节点进行转向
3.标签
ps: 在页面使用标签是,记得必须引入s标签库
<%@taglib prefix=“s” uri="/struts-tags"%>
3.1)iterator标签
即:页面迭代标签
s:iterator 可以遍历 数据栈里面的任何数组,集合等等
s:iterator 标签有3个属性:
value :被迭代的集合
id :指定集合里面的元素的id
status : 迭代元素的索引
3.2)if标签
即:判断标签
进行代码的判断,例如页面中table标签奇偶行的染色
3.3)url标签和action标签和a标签与href标签与param标签
即: 进行地址传值
代码页面解析为
相当于我们的超链接,从而进行地址传参,进行后台action节点的操作执行其editpage方法。
3.4)select标签
即: 选择标签
将value的选项值以list的方式存储,其s标签库中的select标签其本质就是我们所使用的的select标签嵌套 option标签。
修改页面同样如此,只不过多添加了一个value属性从而在修改页面展示后台存储的是哪个结果,既而展示出来。
4.值栈
4.1)什么是值栈
值栈是对应每一个请求对象的轻量级的内存数据中心。
Struts2中一个特性就是引入了值栈,在这里统一管理着数据,供Action、
Result、Interceptor等Struts2的其他部分使用,这样一来,数据被集中管
理起来而不会凌乱,大大方便了程序编写。
Struts2中关于值栈的另外一个特性就是:大多数情况下,你根本无需关心
值栈,你不用管它在哪里,不用管它里面有什么,你只需要去获取自己需要的数据
就可以了。也就是说,你可以隐式的使用值栈。当然,如果编写自定义的Result
或拦截器等较复杂功能的时候,还是需要显示访问值栈的。
4.2)值栈的作用
值栈能够线程安全的为每个请求提供公共的数据存取服务。当有请求到达的时候,Struts2会为每个请求创建一个新的值栈,也就是说,值栈和请求是一一对应的,不同的请求,值栈也不一样,而值栈封装了一次请求所有需要操作的相关的数据。正是因为值栈和请求的对应关系,因而值栈能保证线程安全的为每个请求提供公共的数据存取服务。
ps:值栈是线程安全的,且功能是提供数据的存取
4.3)狭义与广义值栈
狭义值栈
通常指的是实现com.opensymphony.xwork2.util.ValueStack接口的
对象,目前就是com.opensymphony.xwork2.ognl.OgnlValueStack对象。
狭义值栈主要用来存取动态EL(表达式语言)运算需要的值和结果,当然
OgnlValueStack对象主要是用来支持OGNL(对象图导航语言)运算的。狭义值
栈里面存放着一些OGNL可以存取访问的数据,
典型如:
Action的实例,这样就可以通过OGNL来访问Action实例中的属性的值了
OGNL表达式运算的值,可以设置到值栈中,可以主动访问值栈对象,强行设置
OGNL表达式产生的中间变量,比如在使用Struts2的标签的时候,
使用循环标签,自然会有循环的变量,这些都存放在值栈中
广义值栈
通常指的是ActionContext对象,ActionContext是Action运行的上
下文,每个ActionContext是一个基本的容器,包含着Action运行需要的数据,
比如请求参数、会话等。
ActionContext是线程安全的,每个线程有一个独立的ActionContext,
这样你就不用担心值栈中值的线程安全问题了。ActionContext里面存放有很多
的值,典型如:
Request的parameters:请求中的参数,要注意这里的数据是从请求
对象里面拷贝出来的,因此这里数据的变化是不会影响到请求对象里面的参数的值的
Request的Attribute:请求中的属性,这里其实就是个Map,存放着
请求对象的属性数据,这些数据和请求对象的Attribute是连动的
Session的Attribute:会话中的属性,这里其实就是个Map,存放着
会话对象的属性数据,这些数据和会话对象的Attribute是连动的
Application的Attribute:应用中的属性,这里其实就是个Map,
存放着应用对象的属性数据,这些数据和应用对象的Attribute是连动的
Value stack:也就是狭义值栈,ActionContext以value stack
作为被OGNL访问的根,简单点说,OGNL在没有特别指明的情况下,访问的就是
value stack里面的数据
attr:在所有的属性范围中获取值,依次搜索page、request、
session和application。
我们知道Xwork与Web是无关的,因此Action不用去依赖于任何Web容器,
不用和Servlet 的API去交互,但是Action需要能访问到Web应用的数据,不
仅仅是取得请求参数的值,往往也需要在Action里直接获取请求或会话的一些
数据,对于这些数据,现在都可以通过ActionContext来获取到
PS:Struts2的值栈就是用来存放数据对象的地方,或者简单的来说就是内存中的一部分内存
5.分离配置文件
1)我们可以复制一下struts.xml,且存放的路径与struts.xml的平级的,
且更改名字为:struts-xxx.xml
2)在struts.xml将struts-xxx.xml引入
3)保存清空项目正常启动好使
5.声明时异常处理
1.Struts2中对异常处理的方式常见有两种:
1.1指定属于某一个action的异常
1.2指定一个全部action的异常
2.步骤:
准备的阶段:新创建一个项目:Struts2Exception,且将用到的jar包
配置好,且将启动Struts2的filter在web.xml中配置好,且在src下的
struts.xml创建好
1)创建一个类:HelloAction,且实现Action接口
@Override
public String execute() throws Exception {
String str=null;
str=str.substring(0);//模拟一个空指针异常
return “success”;
}
2)在项目的根目录下创建一个hello的文件夹,然后在里面创建两个页面:list.jsp和error.jsp
list.jsp:在body里面简单的写上: 正常的页面
error.jsp:在body里面简单的写上: 页面不知道去哪了,可能是出去玩了.......
3)在struts.xml中配置:
<action name="hello" class="com.rj.bd.hello.HelloAction" >
<exception-mapping result="nullpoint"
exception="java.lang.NullPointerException">
</exception-mapping>
<result name="success" type="dispatcher">/hello/list.jsp</result>
<result name="nullpoint">/hello/error.jsp</result>
</action>
4)在index.jsp上进行访问:
<a href="<%=request.getContextPath()%>/hello.action">
Struts2声明式异常处理:只对单个Action起作用
</a>
5)针对所有的Action都起作用的全局声明式异常:只是配置的方式作出
了改动而已其他的都没太大变化,在struts.xml中
<global-exception-mappings>
<exception-mapping result="nullpoint"
exception="java.lang.NullPointerException">
</exception-mapping>
</global-exception-mappings>
<action name="hello" class="com.rj.bd.hello.HelloAction" >
<result name="success" type="dispatcher">/jsp/list.jsp</result>
<result name="nullpoint">/hello/error.jsp</result>
</action>
6)在index.jsp上进行访问:
<a href="<%=request.getContextPath()%>/hello.action">
Struts2声明式异常处理:全部Action都起作用
</a>