第10章 Structs2框架技术.docx
《第10章 Structs2框架技术.docx》由会员分享,可在线阅读,更多相关《第10章 Structs2框架技术.docx(30页珍藏版)》请在冰豆网上搜索。
第10章Structs2框架技术
第10章Struts2框架技术
主要内容
◆Struts2快速入门
◆Struts2核心概念
◆OGNL与值栈
◆Struts2标签
◆拦截器
◆Struts2国际化
◆Struts2输入校验
◆Struts2类型转换
◆Struts2其它常见功能实现
Struts是整合了当前动态网站技术中Srvlet、JSP、JavaBean、JDBC、XML等相关开发技术基础之上的一种主流Web开发框架,是一种基于J2EE平台的经典MVC的框架。
采用Struts可以简化MVC设计模式的Web应用开发工作,很好地实现代码重用,使开发人员从繁琐的工作中解脱出来,来开发具有强扩展性的Web应用。
Struts2是JavaWeb项目开发中最经典的Web框架技术,受到许多软件开发人员喜爱与追捧,是软件企业招聘Java软件人才时要求必备的技能之一。
Struts是Apache软件基金会下Jakarta项目的一部分。
2007年发布Struts2.0,Struts2是Struts的下一代产品,是在Struts1和WebWork的技术基础上进行了合并,全新的Struts2框架。
其全新的Struts2的体系结构与Struts1的体系结构的差别巨大。
Struts2以WebWork为核心,采用拦截器的机制来处理用户的请求,这样的设计也使得业务逻辑控制器能够与ServletAPI完全脱离开,所以Struts2可以理解为WebWork的更新产品。
10.1Struts2快速入门
Struts是一个优秀的开源MVC框架,可以到http:
//struts.apache.org/下载最新版的Struts以及文档和示例等。
本章以下载struts2.2.1.1的FullDistribution版本为例进行介绍。
将下载后的压缩文件解压之后,包含以下目录结构。
●apps:
该目录下存放了一些基于Struts2的简单示例,大学如struts2-blank.war是一个配置了Struts2的空白出
●Web应用项目。
这些示例对于初学者而言非常有用,社版便于迅速地理解Struts2。
●docs:
该目录下包含了Struts2的一些相关文档,如教程、Struts2API文档等,读者在开发Struts2项目时可参考这些文档。
●lib:
该目录下包括了Struts2的核心类库以及第三方插件类,开发Struts2应用项目的需要的JAR文件均存放在此目录下。
●src:
该目录下包含了实现Struts2的全部源代码。
注意:
lib目录下有很多JAR文件,对于基本的Struts2Web项目至少要:
struts2-core-2.2.2.1.jar;
xwork-2.2.1.1.jar;
ognl-3.0.jar;
freemarker-2.3.16.jar;
commons-fileupload-1.2.1.jar;
commons-io-1.3.2.jar
且勿把Struts2软件包中所有的JAR文件都添加到项目中,因为其中的某些JAR文件依赖于其他的JAR文件(而这些JAR文件不在Struts2软件包中),添加到项目中会造成项目不能运行。
Struts2的安装步骤
o复制上述JAR文件至WEB-INF/lib目录下web.xml中配置struts拦截器
ostruts拦截器内容
--定义Struts2的核心Filter名称为struts2-->
struts2
--指定核心Filter的实现类-->
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
--设置应用struts2核心Filter的URL映射-->
struts2
/*
o在src目录下创建struts.xml。
该文件是Struts2的核心配置文件。
xmlversion="1.0"encoding="UTF-8"?
>
DOCTYPEstrutsPUBLIC
"-//ApacheSoftwareFoundation//DTDStrutsConfiguration2.0//EN"
"http:
//struts.apache.org/dtds/struts-2.0.dtd">
……
经过以上三步,就可以在Javaweb中添加了Structs2框架的支持。
10.2Structs2简单示例
内容:
一个支持Struts2框架的JavaWeb应用项目。
在index.jsp页面输入姓名,在hello.jsp页面输出用户姓名。
•在Eclipse新建一个支持Struts2框架的JavaWeb应用项目;
•配置web.xml;
•创建struts.xml;
•创建Action及JSP页面。
第一步:
创建dynamicwebproject项目,把Structs2的包放入WEB-INF中的lib中,
创建index.jsp
<%@pagelanguage="java"contentType="text/html;charset=UTF-8"
pageEncoding="UTF-8"%>
DOCTYPEhtmlPUBLIC"-//W3C//DTDHTML4.01Transitional//EN""http:
//www.w3.org/TR/html4/loose.dtd">
第一个Struts简单示例
请输入你的大名:
第二步创建HelloAction类。
packagecom.jlp.action;
//导入ActionSupport类,用户自定义的StrutsAction需要继承此类
importcom.opensymphony.xwork2.ActionSupport;
/**
*HelloAction类,处理Struts2的业务逻辑
*/
publicclassHelloActionextendsActionSupport{
//定义一个私有成员变量name,用于获取表单中对应名称输入域的信息。
privateStringusername;
//setter和getter
publicStringgetUsername(){
returnusername;
}
publicvoidsetUsername(Stringusername){
this.username=username;
}
//覆盖ActionSupport类的execute()方法,用于处理业务逻辑,并返回相应结果视图
publicStringexecute()
{
//返回SUCCESS代表的视图
returnSUCCESS;
}
}
第三步定义处理结果视图hello.jsp.
<%@pagelanguage="java"contentType="text/html;charset=UTF-8"
pageEncoding="UTF-8"%>
DOCTYPEhtmlPUBLIC"-//W3C//DTDHTML4.01Transitional//EN""http:
//www.w3.org/TR/html4/loose.dtd">
结果hello,${username}
第四步在Struts.xml中配置Action
在src中建立struts.xml文件并写入以下内容
xmlversion="1.0"encoding="UTF-8"?
>
DOCTYPEstrutsPUBLIC
"-//ApacheSoftwareFoundation//DTDStrutsConfiguration2.0//EN"
"http:
//struts.apache.org/dtds/struts-2.0.dtd">
/WEB-INF/pages/hello.jsp
整个文件如下:
运行结果:
10.1.3STRUTS2工作流程
Struts应用开发流程是按:
“请求-响应”式开发的。
开发流程:
第一步:
客户端向Web容器(如Tomcat)发送请求(如请求访问index.jsp)。
第二步:
请求经过一系列的过滤器的过滤之后,把该请求传递给Struts2的核心过滤器StrutsPrepareAndExecuteFilter。
第三步:
核心过滤器接收到请求信息之后,会根据请求的URL(如/login/HelloAction)搜索Action的映射信息。
第四步:
如找到对应的映射信息,则在struts.xml文件中对应定义的Action(如HelloAction)被实例化,并且执行该Action实例的execute()方法,处理用户请求信息。
此外,如果在struts.xml文件中还定义了被请求Action的一些拦截器,那么该Action实例被调用前后,这些拦截器也会被先后执行。
第五步:
Action对请求处理完毕以后将返回一个逻辑视图,该逻辑视图将在struts.xml文件的相应元素中寻找对应的物理视图(如在HelloAction中SUCCESS对应于/WEB-INF/page/hello.jsp),并返回给客户端。
10.2.Struts2核心概念
Struts2框架默认的配置文件为struts.xml,在eclipse开发工具中,直接放在src中。
xmlversion="1.0"encoding="UTF-8"?
>
DOCTYPEstrutsPUBLIC
"-//ApacheSoftwareFoundation//DTDStrutsConfiguration2.0//EN"
"http:
//struts.apache.org/dtds/struts-2.0.dtd">
/WEB-INF/pages/hello.jsp
配置元素名称
功能描述
include
包含其他的XML配置文件
constant
配置常量信息
package
包含一系列Action及拦截器配置信息,便于对Action进行统一管理
default-action-ref
配置默认Action
default-interceptor-ref
配置默认拦截器,对package范围内所有的Action有效
global-results
配置全局结果集,对package范围内所有的Action有效
interceptors
包含一系列拦截器配置信息
interceptor
配置一个拦截器,一般嵌套在元素内
interceptor-stack
配置拦截器堆栈信息,一般嵌套在元素内
interceptor-ref
配置Action应用的拦截器,嵌套在,等元素内
action
包含与Action操作相关的一系列配置信息
result
配置Action的结果映射,嵌套在元素之内
param
配置参数信息,一般嵌套在,,等元素内
◆struts.xml--元素
作用:
原则上讲,一个Web项目的所有配置都可以放在struts.xml文件中,但随着应用规模的扩大,将直接导致struts.xml文件越来越臃肿,难以维护。
解决的方法就是把不同模块的配置信息放在不同的XML文件中,然后在struts.xml文件使用元素把这些XML文件包含在struts.xml中。
◆struts.xml--元素
作用:
使用元素可以定义一些Web应用中使用的常量
◆struts.xml--元素
作用:
Struts2框架的核心组件是Action和拦截器等,Struts2框架使用包(package)来管理Action和拦截器等。
包是多个Action、多个拦截器和多个拦截器引用的集合。
使用元素配置包的信息,每个元素定义一个包的配置。
●name属性:
必选属性,指定该包的名字,是引用该包的唯一标识。
●namespace属性:
可选属性,定义该包的命名空间。
namespace属性值和Action名称组合在一起,在项目中决定了该Action的URL。
●extends属性:
可选属性,在Struts2中,包也是可以继承的,extends属性的作用是指定该包是否继承其他的包。
包可以继承一个或多个父包的中Action定义、拦截器定义、拦截器栈等配置。
●abstract属性:
可选属性,若该属性值为“true”表示该包为抽象包,在抽象包中不能有任何Action定义。
注意:
Struts2的配置文件总是从上到下处理的,所以在struts.xml文件中父包的定义应该在子包的前面。
另外,关于namespace属性的使用需要注意以下几点:
元素若没有指定namespace属性,则该包使用默认的命名空间,默认的命名空间总是"";若设置namespace属性值为“/”时,即指定了包的命名空间为根命名空间,此时所有根路径下的Action请求都会去这个包中查找对应的资源信息。
若一个元素指定namespace="/ch10",必须注意的是“ch10”前的斜线“/”不能省略,并且该包下所有的Action处理的URL应该是“/ch10/Action名”,其完整的URL为http:
//主机地址:
端口/上下文路径/ch10/XXXAction.action。
Struts2查找Action的次序为:
先在指定的路径下查找Action;如果找不到则会去默认的路径找Action;如果仍找到,则抛出异常。
另外,当默认命名空间中存在与根命名空间同名的Action时,根命名空间的配置信息优先级高于默认命名空间中的配置信息。
命名空间只有一个级别,例如一个Action的URL为“/a/b/get.action”,则系统将先在“/a/b”的命名空间下查找,如果找不到,就直接到默认命名空间查找get.action,而不是在“/a”的命名空间下查找。
Struts2以命名空间的方式来管理Action,同一个命名空间不能有同名的Action。
不同的命名空间可以有同名的Action。
在struts.xml配置文件中,可以配置多个元素,但每元素中的namespace的属性值必须是唯一的。
◆struts.xml--元素
/WEB-INF/pages/hello.jsp
作用:
元素用来配置Action,该元素需嵌套在元素内,它包含如下属性:
name属性:
必选属性,用来设定Action的名称。
class属性:
可选属性,指定Action处理类对应的具体路径,若省略该属性,表示使用的是默认Action即ActionSupport类。
method属性:
可选属性,指定Action中的方法名。
converter属性:
可选属性,指定Action使用的类型转换器,其值可为true或false,默认为true,即使用类型转换器。
例子
/web-inf/page/{1}.jsp
在里面的意义:
注意:
若未配置method属性,则请求会被转发到Action中的execute()方法进行处理。
但很多情况下Action可能需要处理多个业务逻辑,那么就需要在Action中定义多个方法以处理不同的业务逻辑,那么在元素中配置method属性,就可以在请求Action时把不同的请求转发给相应的方法进行处理。
◆struts.xml--元素
作用:
当一个Action在指定命名空间和默认命名空间都找不到该Action时,就会抛出一个“HTTP404”错误信息,此时可使用元素指定一个默认的Action,当配置文件中没有与请求Action匹配的信息时,Struts2框架就会自动调用这个默认的Action去处理。
/error/actionError.jsp
◆struts.xml--元素
作用:
用于配置Action的结果映射,既可以配置常规的结果映射,也可以实现动态结果映射,即根据请求动态决定返回哪个视图。
常见的映射类型有dispatcher、redirectAction、redirect、plainText等。
元素下的主要属性包括:
type属性:
可选属性,type属性用于指定跳转至结果视图的方式,如省略该属性表示默认的类型为dispatcher。
name属性:
可选属性,表示逻辑视图的名称,默认为SUCCESS。
10.2.2Action详解
在struts2框架中,Action负责处理业务逻辑,是整个struts2应用的核心。
1.Action类的基本格式
Action类的基本格式:
publicclassXXXActionextendsActionSupport{
//定义一个私有成员变量name,用于封装HTTP请求参数的属性。
privateStringname;
……
//setter和getter
publicStringgetName(){
returnname;
}
publicvoidsetName(Stringname){
this.name=name;
}
……
//覆盖ActionSupport类的execute()方法,用于处理业务逻辑并返回相应的结果视图
publicStringexecute()
{//省略具体的业务逻辑
……
//返回SUCCESS代表的视图
returnSUCCESS;
}
//其它方法
……
}
2.Action接口和ActionSupport类
Action接口和ActionSupport类在com.opensymphony.xwork包中。
其中,Action接口定义了5个字符串常量
SUCCESS
NONE
ERROR
INPUT
LOGIN,
另外还定义了一个返回字符串类型的execute()方法。
ActionSuport类是一个默认的Action实现类,如果一个Action在struts.xml配置文件的元素中没有指定class属性,那么默认该Action为ActionSupport类。
在ActionSupport类中除了实现Action接口之外,该类还增加了获取国际化信息的方法getText()、数据校验的方法validate()、默认的处理用户请求的方法execute()等。
3.调用含有多个方法的action
在一个Action中集成了多个业务逻辑的方法。
先看一个含多个方法的Act