Struts2集成指南.docx

上传人:b****5 文档编号:6238358 上传时间:2023-01-04 格式:DOCX 页数:20 大小:498.54KB
下载 相关 举报
Struts2集成指南.docx_第1页
第1页 / 共20页
Struts2集成指南.docx_第2页
第2页 / 共20页
Struts2集成指南.docx_第3页
第3页 / 共20页
Struts2集成指南.docx_第4页
第4页 / 共20页
Struts2集成指南.docx_第5页
第5页 / 共20页
点击查看更多>>
下载资源
资源描述

Struts2集成指南.docx

《Struts2集成指南.docx》由会员分享,可在线阅读,更多相关《Struts2集成指南.docx(20页珍藏版)》请在冰豆网上搜索。

Struts2集成指南.docx

Struts2集成指南

Struts2集成指南

关于Struts2

Struts是Apache软件基金会(ASF)赞助的一个开源项目。

它最初是Jakarta项目中的一个子项目,并在2004年3月成为ASF的顶级项目。

它通过采用JavaServlet/JSP技术,实现了基于JavaEEWeb应用的Model-View-Controller〔MVC〕设计模式的应用框架〔WebFramework〕,是MVC经典设计模式中的一个经典产品。

Struts,ahistory

在JavaEE的Web应用发展的初期,除了使用Servlet技术以外,普遍是在JavaServerPages(JSP)的源代码中,采用HTML与Java代码混合的方式进行开发。

因为这两种方式不可避免的要把表现与业务逻辑代码混合在一起,都给前期开发与后期维护带来巨大的复杂度。

为了摆脱上述的约束与局限,把业务逻辑代码从表现层中清晰的分离出来,2000年,CraigMcClanahan采用了MVC的设计模式开发Struts。

后来该框架产品一度被认为是最广泛、最流行JAVA的WEB应用框架。

CraigMcClanahan

2006年,WebWork与Struts这两个优秀的JavaEE Web框架(Web Framework〕的团体,决定合作共同开发一个新的,整合了WebWork与Struts优点,并且更加优雅、扩展性更强的框架,命名为“Struts2”,原Struts的1.x版本产品称为“Struts1”。

至此,Struts项目并行提供与维护两个主要版本的框架产品——Struts1与Struts2。

Struts1vs.Struts2

侵入性

Struts1

在编程方面是面向抽象类编程,而不是面向接口编程。

Struts1要求自定义Action类继承一个特定的抽象基类Action。

另一方面,Struts1的Action依赖于ServletAPI,因为Struts1Action的execute方法中有HttpServletRequest和HttpServletResponse方法。

e.g.

publicclassLogonActionextendsAction{

publicActionForwardexecute(

ActionMappingmapping,

ActionFormform,

HttpServletRequestrequest,

HttpServletResponseresponse){

}

}

Struts2

Action类可以实现一个Action接口,也可以实现其他接口,甚至不实现任何接口。

这使得可选的和定制的服务成为可能。

e.g.

publicclassExampleAction{

publicStringdoSomething(){

return"success";

}

}

线程模式

Struts1

Action类是单例模式并且必须是线程安全的,因为在web容器中,仅有Action类的一个实例来处理所有的请求。

Struts2

Web容器为每一个请求产生一个Action类实例,因此没有线程安全问题。

可测试性

Struts1

由于对ServletAPI的依赖,使得针对于自定义Action类的测试变得复杂。

Struts2

由于自定义Action可以为POJO,所以可以向测试一个POJO一样来测试Action类。

请求参数封装

Struts1

使用ActionForm对象封装用户的请求参数,所有的ActionForm必须继承一个基类:

ActionForm。

普通的JavaBean不能用作ActionForm,并且需要在配置文件中定义ActionForm。

e.g.

publicclassLogonFormextendsActionForm{

privateStringuserpassword;

privateStringusername;

}

Struts2

直接使用Action属性来封装用户请求属性,避免了开发者需要大量开发ActionForm类的烦琐,实际上,这些属性还可以是包含子属性的Rich对象类型。

e.g.

publicclassExampleAction{

privateStringresponseMessage;

privateStringrequestMessage;

publicStringgetResponseMessage(){

returnresponseMessage;

}

publicvoidsetResponseMessage(StringresponseMessage){

this.responseMessage=responseMessage;

}

publicStringgetRequestMessage(){

returnrequestMessage;

}

publicvoidsetRequestMessage(StringrequestMessage){

this.requestMessage=requestMessage;

}

publicStringdoSomething(){

setMessage("Hi,"+getRequestMessage());

return"success";

}

}

EL

Struts1

整合了JSTL,因此可以使用JSTL表达式语言。

JSTL有基本对象图遍历,但在对集合和索引属性的支持上则功能不强。

在向视图绑定值时,Struts1使用标准JSP机制把对象绑定到视图页面。

Struts2

Struts2可以使用JSTL,但它整合了一种更强大和灵活的表达式语言:

OGNL(ObjectGraphNotationLanguage),因此,Struts2下的表达式语言功能更加强大。

在向视图绑定值时,Struts2使用“ValueStack”技术,使标签库能够访问值,而不需要把对象和视图页面绑定在一起。

校验框架

Struts1

Struts1支持在ActionForm重写validate方法中手动校验,或者通过整合Commons-validator框架来完成数据校验。

Struts2

Struts2支持通过重写validate方法进行校验,也支持整合XWork校验框架进行校验。

Struts2architacture

名词约定

凡是代码、配置文件、IDE中出现的名词,均采用英文原称。

Roadmap

本文档的目标是,帮助读者在Eclipse中将Struts2集成至一个崭新的DynamicWebProject。

集成步骤大致如下:

配置Struts2的代码环境->在web.xml中加入Struts2功能->测试Struts2。

文档目标达成的标志是:

页面请求能够通过Struts2的ActionMapping成功转发,并且基于Java的Struts2验证框架能够生效。

集成步骤

引入Struts2相关的jar文件

Struts2jars

∙commons-fileupload-1.2.2.jar

∙commons-io-2.1.jar

∙commons-lang-2.4.jar

∙commons-logging-1.1.1.jar

∙freemarker-2.3.16.jar

∙javassist.jar

∙jstl-1.2.jar

∙ognl-3.0.1.jar

∙struts2-core-2.2.3.jar

∙xwork-core-2.2.3.jar

加入buildpath

将以上10个jar文件,拷贝至WebContent/WEB-INF/lib下:

对于WebDynamicProject,一般情况下,当你向lib目录下copy了jar文件,eclipse会自动将jar文件加入buildpath下的名为WebAppLibraries的Library。

请确认在工程下出现了名为WebAppLibraries的Library。

如果有,说明这些jar文件已经被添加至buildpath了:

如果在工程目录下找不到名为WebAppLibraries的Library,说明jar文件没有被添加至buildpath,需要进行手动添加。

首先进入buildpath设置界面,选中Libraries页,并点击AddJARs:

在JARSelection窗口中,选中lib下所有的jar文件。

选中后点击OK:

你将看到被选中的jar文件已经被添加至buildpath:

在工程中会出现一个名为ReferencedLibraries的Libraries。

这说明jar文件已经被添加至buildpath:

以上两种方法都可以将jar文件添加至buildpath,它们的效果是一样的。

配置web.xml

添加filter

在web.xml中添加一个filter:

struts2

org.apache.struts2.dispatcher.FilterDispatcher

filter-name表示filter的名字,你可以任意决定这个名字。

filter-class表示使用哪个类作为filter,从这个类的全称来判断,可以发现FilterDispatcher是Struts2提供的一个类。

它是Struts2转发请求的起点。

在web.xml中添加一个filter-mapping:

struts2

/*

filter-mapping用来映射url和filter的映射关系。

filter-name表示filter的名字,这个名字必须和之前filter声明中的filter-name一致。

url-pattern表示哪些格式的url会被此filter滤中。

/*表示在此web应用域名下,所有的地址都会被filter滤中,换言之,所有的http请求都会通过Struts2进行转发。

filter的作用

通过以上的配置,FilterDispatcher和url与filter-name联系在了一起。

由于在web容器中注册了FilterDispatcher这个filter,Struts2可以收到所有http:

//localhost:

8080/tyland-b2b的http请求。

随后,FilterDispatcher会根据我们定义的action-mapping规则,将请求分发到指定的action类以及它的拦截器栈。

最后,Struts2按照action-mapping规则,将后台计算的结果返回给指定页面。

笼统地来说,Struts2就是这样工作的,所以说,FilterDispatcher是Struts2工作的入口。

编写代码,测试Struts2

Struts2的环境已经配置好了,基于action-mapping的转发机制已经可以运行了。

为了证明这一点,请编写一些测试jsp页面和java代码。

在编写代码的过程中,请确保代码文件的位置如下图所示:

代码清单如下:

Java代码

UserVO.java

packagecom.tyland.b2b.vo;

//一个ValueObject(DataModel),用来存放用户名、密码

publicclassUserVO{

privateStringusername;

privateStringpassword;

//成员变量password的getter方法。

//在Strtus2中,用来在页面和服务器间传值的ValueObject必须有getter方法

publicStringgetPassword(){

returnpassword;

}

//成员变量password的setter方法。

//在Strtus2中,用来在页面和服务器间传值的ValueObject必须有setter方法

publicvoidsetPassword(Stringpassword){

this.password=password;

}

//同password

publicStringgetUsername(){

returnusername;

}

//同password

publicvoidsetUsername(Stringusername){

this.username=username;

}

}

BaseAction.java

packagecom.tyland.b2b.web.base;

importcom.opensymphony.xwork2.ActionSupport;

//为了代码的灵活性和可扩展性,请声明一个BaseAction基类

//BaseAction继承Struts2的ActionSupport,因为我们想使用Struts2的一些额外帮助。

//对于ActionSupport的继承不是必须的

publicclassBaseActionextendsActionSupport{

privatestaticfinallongserialVersionUID=1492640280374952195L;

}

UserAction.java

packagecom.tyland.b2b.web;

importcom.tyland.b2b.vo.UserVO;

importcom.tyland.b2b.web.base.BaseAction;

//自定义的Action类,继承BaseAction

//由于继承了ActionSupport,我们可以使用Struts2默认的action方法execute()

//由于继承了ActionSupport,我们可以使用Struts2默认的校验方法validate()

publicclassUserActionextendsBaseAction{

privatestaticfinallongserialVersionUID=-7178605703943684190L;

//用来在页面和服务器之间传递用户名、密码的ValueObject。

变量名任意。

privateUserVOuserVO;

//用来在页面和服务器之间传递message变量。

名称任意。

privateStringmessage;

//用来在页面和服务器之间传递sayHiTo变量。

名称任意。

privateStringsayHiTo;

//用来传值的变量必须有getter方法

publicUserVOgetUserVO(){

returnuserVO;

}

//用来传值的变量必须有setter方法

publicvoidsetUserVO(UserVOuserVO){

this.userVO=userVO;

}

publicStringgetMessage(){

returnmessage;

}

publicvoidsetMessage(Stringmessage){

this.message=message;

}

publicStringgetSayHiTo(){

returnsayHiTo;

}

publicvoidsetSayHiTo(StringsayHiTo){

this.sayHiTo=sayHiTo;

}

//Override声明说明这个方法复写或实现了父类或接口方法。

//如action-mapping中不显示指定别的方法,struts2会将execute()作为默认的action方法执行。

//返回的SUCCESS常量,来自ActionSupport,值为"success"。

//action-mapping会根据不同的返回值采取不同的转发或页面跳转动作。

@Override

publicStringexecute()throwsException{

System.out.println("******execute******");

System.out.println(userVO.getUsername()+"logins");

returnSUCCESS;

}

//在Struts2执行execute()之前,会先执行validateExecute()进行用户输入验证

//这个方法名必须符合Struts2验证框架所规定的命名规范

publicvoidvalidateExecute(){

System.out.println("******validateExecute******"+userVO.getUsername());

if(null==userVO.getUsername()||userVO.getUsername().length()<5){

this.addFieldError("username","USERNAMEERROR");

}

if(null==userVO.getPassword()||userVO.getPassword().length()<5){

this.addFieldError("password","PASSWORDERROR");

}

}

//一个自定义方法。

通过在action-mapping中的设置,可以实现使用POJO的自定义服务配置

publicStringsayHi()throwsException{

System.out.println("sayhito"+getSayHiTo());

returnSUCCESS;

}

//符合验证框架命名规范的、真对于sayHi()的验证方法

publicvoidvalidateSayHi(){

System.out.println("******validateSayHi******"+getSayHiTo());

if(null==getSayHiTo()||getSayHiTo().length()<5){

this.addFieldError("sayHiTo","SAYHITOERROR");

}

}

}

ExampleAction.java

packagecom.tyland.b2b.web;

importcom.tyland.b2b.web.base.BaseAction;

publicclassExampleActionextendsBaseAction{

privatestaticfinallongserialVersionUID=-2973295900729517281L;

privateStringmessage;

privateStringsayHiTo;

publicStringgetMessage(){

returnmessage;

}

publicvoidsetMessage(Stringmessage){

this.message=message;

}

publicStringgetSayHiTo(){

returnsayHiTo;

}

publicvoidsetSayHiTo(StringsayHiTo){

this.sayHiTo=sayHiTo;

}

publicStringfinish(){

System.out.println("examplefinished");

setMessage(getSayHiTo());

returnSUCCESS;

}

}

JSP代码

index.jsp

<%@pagelanguage="java"contentType="text/html;charset=UTF-8"

pageEncoding="UTF-8"%>

<%@tagliburi="prefix="c"%>

DOCTYPEhtmlPUBLIC"-//W3C//DTDHTML4.01Transitional//EN""http:

//www.w3.org/TR/html4/loose.dtd">

HelloWorld

--一个标准的jstl标签。

是浏览器重定向至指定的url-->

redirecturl="/login.jsp"/>

login.jsp

<%@pagelanguage="java"contentType="text/html;charset=UTF-8"

pageEncoding="UTF-8"%>

<%@tagliburi="/struts-tags"prefix="s"%>

DOCTYPEhtmlPUBLIC"-//W3C//DTDHTML4.01Transitional//EN""http:

//www.w3.org/TR/html4/loose.dtd">

TylandLogin

--struts提供的form标签。

action-mapping中会依据action的值进行相应的转发设定-->

formaction="login"method="post">

--struts的文本框标签-->

--name对应action类中相应的变量名-->

--label表示文本框前的文字显示-->

<

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > PPT模板 > 自然景观

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1