第五章 Struts2基础入门 理论Word格式.docx
- 文档编号:21356764
- 上传时间:2023-01-29
- 格式:DOCX
- 页数:33
- 大小:493.53KB
第五章 Struts2基础入门 理论Word格式.docx
《第五章 Struts2基础入门 理论Word格式.docx》由会员分享,可在线阅读,更多相关《第五章 Struts2基础入门 理论Word格式.docx(33页珍藏版)》请在冰豆网上搜索。
(1)支持的表现层技术单一
Struts1只支持JSP作为表现层技术,不提供与其它表现层技术,例如Velocity、FreeMarker等技术的整合。
这一点严重制约了Struts1框架的使用,对于目前的很多JavaEE应用程序而言,并不一定使用JSP作为表现层技术。
(2)与ServletAPI严重耦合,难于测试
因为Struts1框架是在Model2的基本上发展起来的,因此它完全是基本ServletAPI的,所以在Struts1的业务逻辑控制器内,充满了大量的ServletAPI。
分析以下Struts1业务逻辑控制器代码:
publicclassLoginActionextendsAction
{
publicActionForwardexecute(ActionMappingmapping,
ActionFormform,
HttpServletRequestrequest,
HttpServletResponseresponse){
...
}
}
当我们需要测试上面Action类的execute()方法是,该方法有4个参数:
ActionMapping、ActionForm、HttpServletRequest和HttpServletResponse,初始化这4个参数比较困难。
尤其是HttpServletRequest和HttpServletResponse两个参数,通常由Web容器负责实例化。
因此一旦脱离了Web服务器,Action测试非常困难。
(3)代码严重依赖于Struts1API,属于侵入式设计
正如从上面代码片段中所看到的,Struts1的Action类必须继承Struts1的基类,实现处理方法时,又包含了大量Struts1的API:
如ActionMapping、ActionForm和ActionForward类。
这种侵入式设计的最大缺点在于,一旦系统需要重构时,这些Action类完全没有利用价值。
可见,Struts1的Action类这种侵入式设计导致了较低的代码利用。
5.1.2Struts2体系结构
Struts2的体系结构主要包括Struts2控制器组件、Struts2配置文件和Struts2标签库等3部分。
1Struts2的控制器组件
Struts2的控制器组件是Struts2框架的核心,事实上,所有MVC框架都是以控制器组件为核心的。
Struts2的控制器由两个部分组成:
核心控制器FilterDispathcer和业务控制器Action。
(1)核心控制器:
FilterDispathcher
FilterDispatcher是Struts2框架的核心控制器,该控制器作为一个Filter运行在Web应用程序中,它负责拦截所有的用户请求,当用户请求到达时,该Filter会过滤用户请求。
如果用户请求以action结尾,该请求将被转入Struts2框架处理。
Struts2框架获得了*.action请求后,将根据*.action请求的前面部分决定调用那个业务控制器,例如,对于login.action的请求,Strtus2调用名为login的Action来处理该请求。
(2)业务控制器
业务控制器Action需由用户自己实现,在配置文件中进行配置,以供核心控制器FilterDispatcher来使用。
实际上,Struts2应用程序起作用的业务控制器不是用户自定义的Action,而是系统生成的Action的代理,但该Action代理以用户定义的Action为目标。
以下是Struts2的Action代码示例:
publicclassLoginAction
{
//封装用户请求参数的uid属性
privateStringuid;
//封装用户请求参数的pwd属性
privateStringpwd;
//处理用户请求的execute方法
publicStringexecute()throwsException
{
//如果登录成功,则进入主页面
if("
scott"
.equals(this.uid)&
&
"
tiger"
.equals(this.pwd))
{
return"
success"
;
}
//否则进入登录失败错误提示页面
return"
fial"
//getter、setter方法
publicStringgetPwd(){
returnpwd;
publicvoidsetPwd(Stringpwd){
this.pwd=pwd;
publicStringgetUid(){
returnuid;
publicvoidsetUid(Stringuid){
this.uid=uid;
以上Action代码无需实现任何父接口,无需继承任何Struts2基类,该Action类完全是一个POJO(普通、传统的Java对象),因此具有很好的复用性。
归纳起来,Struts2的Action类有如下优势:
1.Action类完全是一个POJO类,因此具有很好的代码重用性。
2.Action类无需与任何ServletAPI耦合,因此进行单元测试非常简单。
3.Action类的execute方法仅返回一个字符串作为处理结果,该处理结果可映射到任何的视图,甚至是另一个Action。
2Struts2的配置文件
当Struts2创建系统的Action代理时,需要使用Struts2的配置文件。
Struts2的配置文件有两份:
(1)配置Action的struts.xml文件
(2)配置Struts2全局属性的struts.properties文件(可选)
struts.xml文件内定义了Struts2的系列Action,定义Action时,指定该Action的实现类,并定义该Action处理结果与视图资源之间的映射关系。
以下是struts.xml配置文件的示例:
<
struts>
<
!
--Struts2的Action都必须配置在package里面-->
packagename="
default"
extends="
struts-default"
>
--继承自默认包-->
--定义一个login的Action类,实现类为LoginAction-->
actionname="
login"
class="
com.soft.struts5l.web.struts.action.LoginAction"
--定义结果与视图资源的映射关系-->
resultname="
/index.jsp<
/result>
fail"
/fail.jsp<
/action>
/package>
/struts>
在上面的struts.xml文件中,定义了一个Action,定义Action时,不仅定义了Action实现类,而且通过”name”属性指定访问该Action的逻辑名,此处为“login”。
其中”result”元素用于指定execute方法返回值和视图资源之间的映射关系。
对于如下配置片段:
<
表示当execute方法返回”success”字符串时,流程将转发至index.jsp页面。
除此之外,Struts2还有一个配置Struts2全局属性的properties文件:
struts.properties。
该文件的示例如下:
#指定Struts2标签的主题为普通主题
struts.ui.theme=simple
struts.properties文件的形式是一系列的key、value对,它指定了Struts2应用程序的全局属性。
3Struts2标签库
Struts2的标签库提供了非常丰富的功能,这些标签库不仅提供了表现层数据处理,而且提供了基本的流程控制功能,还提供了国际化、Ajax支持等功能。
通过使用Struts2的标签,开发者可以最大限度的减少页面代码的书写量。
以下是使用Struts2标签实现的登录页面:
%@pagelanguage="
java"
import="
java.util.*"
pageEncoding="
UTF-8"
%>
<
—导入struts2标签库-->
%@tagliburi="
/struts-tags"
prefix="
s"
%>
html>
body>
<
s:
formaction="
login.action"
用户名:
textfieldname="
uid"
/>
br/>
密 码:
pwd"
submitvalue="
登录"
resetvalue="
重置"
/s:
form>
其中<
标签用于生成HTML提交表单,<
textfield>
标签用于生成HTML中的<
inputtype=”text”>
输入框。
5.1.3Struts2运行流程
Struts2使用拦截器作为处理,以用户的业务逻辑控制器为目标,创建一个控制代理。
控制器代理负责处理用户请求,处理用户请求时回调业务控制器的execute方法,该方法的返回值将决定了Struts2将怎样的视图资源呈现给用户。
图1.5.1显示了Struts2运行流程。
图1.5.1Struts2运行流程图
Struts2框架的处理流程如下:
(1)浏览器发送请求,例如请求/login.action
(2)核心控制器FilterDispatcher根据请求决定调用合适的Action
(3)WebWork的拦截器链自动对请求应用通用功能,例如workflow、validation或文件上传等功能
(4)回调Action的execute方法,该方法先获取用户请求参数并调用业务逻辑组件来处理用户请求
(5)Action的execute方法处理结果信息将被输出到浏览器中,可以是HTML页面、图像,也可以是PDF文档或其它文档。
此时支持的视图技术非常多,既支持JSP,也支持Velocity、FreeMarker等模板技术。
5.2Struts2与Struts1的对比
`Struts2在Struts1上做出了巨大的改进,以下是Struts1和Struts2在各方面的简要对比。
(1)Action实现类方面:
Struts1要求Action类需继承org.apache.struts.action.Action父类;
Struts2中的Action无需任何特定要求,只有一个包含execute方法的POJO类都可以用作Struts2的Action
(2)线程模式方面:
Struts1中的Action是单例模式并且必须是线程安全的,因为仅有Action的一个实例来处理所有请求,所以在Action中定义的资源必须是线程安全的或同步的;
Struts2中的Action对象会为每个请求产生一个实例,因此没有线程安全问题。
(3)封装请求参数方面:
Struts1使用ActionForm对象封装用户的请求参数,所有的ActionForm必须继承org.apache.struts.action.ActionForm类,开发者必须创建大量的ActionForm类来封装用户请求参数;
Struts2直接使用Action属性来封装用户请求参数,避免了开发者需要大量开发ActionForm类。
(4)表达式语言方面:
Struts1整合了JSTL,因此可使用JSTL表达式语言。
这种表达式语言有基本对象图遍历,但在对集合和索引属性的支持上则功能不强;
Struts2可以使用JSTL,但同时整合了一种更强大和灵活的表达式语言:
OGNL(ObjectGraphNotationLanguage对象图形导航语言),因此,Struts2下的表达式语言功能更加强大。
(5)绑定值到视图方面:
Struts1使用标签JSP机制把对象绑定到视图页面;
Struts2使用ValueStack(值栈)技术,使标签库能够访问值,而不需要将对象和视图页面绑定在一起。
5.3使用Struts2重构用户登录
在第一章中,我们使用Struts1框架开发过一个简单的用户登录示例,下面使用Struts2框架重构该示例。
重构该示例涉及到以下内容:
(1)导入Struts2框架jar包到Web工程
(2)创建模型
(3)创建控制器
(4)创建视图
(5)对Struts2框架进行配置
(6)发布、运行此示例
5.3.1导入Struts2框架jar包到Web工程
创建一个Web工程,命名为struts5l,从http:
//archive.apache.org/dist/struts/binaries/下载Struts2库文件(本示例使用2.1.6版本),下载后解压缩,在apps目录下找到struts2-blank-2.1.6.war文件。
如图1.5.2所示:
图1.5.2Struts2apps目录文件列表
将struts2-blank-2.1.6.war文件解压缩,把其中lib目录下面的9个jar包,复制到项目的”WEB-INF/lib”文件夹下,如图1.5.3所示:
图1.5.3开发Struts2应用程序的jar包
5.3.2创建模型
本示例汲及到两个JavaBean。
(1)UserInfo.java:
用于描述用户的实体类。
代码如下:
publicclassUserInfoimplementsjava.io.Serializable
//用户名
//密码
privateStringrealName;
//真实姓名
privateDatebirthday;
//出生日期
//无参构造函数
publicUserInfo()
{
}
//有参构造函数
publicUserInfo(Stringuid,Stringpwd,StringrealName,Datebirthday){
super();
this.realName=realName;
this.birthday=birthday;
//getter、setter方法省略…
(2)UserService.java:
用于处理业务逻辑的JavaBean。
为了简化操作,本JavaBean模拟数据库来判断登录是否成功。
publicclassUserService
//构造一个Map对象,用于存入UserInfo的集合
privateMapuserInfoMap=newHashMap();
//构造一个UserService静态对象,实现单例工厂模式
privatestaticUserServiceuserService=newUserService();
//构造函数私有,做成为单例模式,模拟数据库产生UserInfo的集合
privateUserService()
try
//实例化一个SimpleDateFormat对象,用于转换字符串为日期
SimpleDateFormatsdf=newSimpleDateFormat("
yyyy-MM-dd"
);
//实例化多个UserInfo类
UserInfou1=newUserInfo("
admin"
"
张三"
sdf.parse("
1978-3-4"
));
UserInfou2=newUserInfo("
ht"
李四"
1980-11-12"
UserInfou3=newUserInfo("
soft"
王五"
1979-12-4"
UserInfou4=newUserInfo("
com"
胡海军"
1987-7-4"
UserInfou5=newUserInfo("
kitt"
张小玲"
1985-6-4"
//加入Map集合
userInfoMap.put(u1.getUid(),u1);
//加入u1
userInfoMap.put(u2.getUid(),u2);
//加入u2
userInfoMap.put(u3.getUid(),u3);
//加入u3
userInfoMap.put(u4.getUid(),u4);
//加入u4
userInfoMap.put(u5.getUid(),u5);
//加入u5
}catch(Exceptione)
e.printStackTrace();
//定义静态方法,实例化自己
publicstaticUserServicenewInstance()
returnuserService;
publicUserInfologin(Stringuid,Stringpwd)
//判断用户输入的用户名是否在集合中
if(this.userInfoMap.containsKey(uid))
//存在,进一步比较密码是否正确
UserInfofindUserInfo=(UserInfo)this.userInfoMap.get(uid);
//通过uid键得到一个UserInfo
if(findUserInfo.getPwd().equals(pwd))//如果密码也相等,说明登录成功
{
returnfindUserInfo;
}
returnnull;
//否则用户名相等,但密码不相等,登录失败
returnnull;
//不存在,表明登录失败,返回null;
5.3.3创建控制器
Struts2下的控制器不再像Struts1下的控制器,需要继承一个Action父类,甚至可以无需实现任何接口,Struts2的控制器就是一个普通的POJO类。
事实上,Struts2的Action就是一个包含execute方法的普通Java类。
以下是用于处理用户请求的Action类的代码:
//调用模型进行业务逻辑错误
UserInfouserInfo=UserService.newInstance().login(this.uid,this.pwd);
if(userInfo!
=null)//如果登录成功
{
//转发到成功页面,该success与struts.xml配置文件中<
result>
相对应
return"
//转发到失败页面,该fail与struts.xml配置文件中<
result
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第五章 Struts2基础入门 理论 第五 Struts2 基础 入门