struts2教程完全版.docx

上传人:b****2 文档编号:2373775 上传时间:2023-05-03 格式:DOCX 页数:105 大小:384.11KB
下载 相关 举报
struts2教程完全版.docx_第1页
第1页 / 共105页
struts2教程完全版.docx_第2页
第2页 / 共105页
struts2教程完全版.docx_第3页
第3页 / 共105页
struts2教程完全版.docx_第4页
第4页 / 共105页
struts2教程完全版.docx_第5页
第5页 / 共105页
struts2教程完全版.docx_第6页
第6页 / 共105页
struts2教程完全版.docx_第7页
第7页 / 共105页
struts2教程完全版.docx_第8页
第8页 / 共105页
struts2教程完全版.docx_第9页
第9页 / 共105页
struts2教程完全版.docx_第10页
第10页 / 共105页
struts2教程完全版.docx_第11页
第11页 / 共105页
struts2教程完全版.docx_第12页
第12页 / 共105页
struts2教程完全版.docx_第13页
第13页 / 共105页
struts2教程完全版.docx_第14页
第14页 / 共105页
struts2教程完全版.docx_第15页
第15页 / 共105页
struts2教程完全版.docx_第16页
第16页 / 共105页
struts2教程完全版.docx_第17页
第17页 / 共105页
struts2教程完全版.docx_第18页
第18页 / 共105页
struts2教程完全版.docx_第19页
第19页 / 共105页
struts2教程完全版.docx_第20页
第20页 / 共105页
亲,该文档总共105页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

struts2教程完全版.docx

《struts2教程完全版.docx》由会员分享,可在线阅读,更多相关《struts2教程完全版.docx(105页珍藏版)》请在冰点文库上搜索。

struts2教程完全版.docx

struts2教程完全版

一、准备工作及实例

1.解压struts-2.1.6-all.zip

apps目录:

struts2自带的例子程序

docs目录:

官方文档。

lib目录:

存放所有jar文件。

Src目录:

源文件存放地

2.六个基本包

struts2-core-2.1.6.jar:

开发的核心类库

freemarker-2.3.13.jar:

struts2的UI标签的模板使用freemarker编写

commons-logging-1.0.4.jar:

日志包

ognl-2.6.11.jar:

对象图导航语言,通过它来读写对象属性

xwork-2.1.2.jar:

xwork类库,struts2在其上进行构建

commons-fileupload-1.2.1.jar:

文件上传组件,2.1.6版本后必须加入此jar包

特别需要说明的是目前strust2的最新版本是struts-2.1.6,它作为2.1.X的正式版。

特别要注意导入commons-fileupload-1.2.1.jar包,在此jar包中包含了RequestContext类,如果不导入该jar包将会报异常。

3.初识struts2配置文件

(1).web.xml文件

主要完成对StrutsPrepareAndExecuteFilter的配置(在以前的版本中是对FilterDispatcher配置,新版本同样支持用FilterDispatcher配置),它的实质是一个过滤器,它负责初始化整个Struts框架并且处理所有的请求。

这个过滤器可以包括一些初始化参数,有的参数指定了要加载哪些额外的xml配置文件,还有的会影响struts框架的行为。

除了StrutsPrepareAndExecuteFilter外,Struts还提供了一个ActionContexCleanUp类,它的主要任务是当有其它一些过滤器要访问一个初始化好了的struts框架的时候,负责处理一些特殊的清除任务。

(2).struts.xml文件

框架的核心配置文件就是这个默认的struts.xml文件,在这个默认的配置文件里面我们可以根据需要再包括其它一些配置文件。

在通常的应用开发中,我们可能想为每个不同的模块单独配置一个struts.xml文件,这样也利于管理和维护。

这也是我们要配置的主要文件。

(3).struts.properties(参default.properties)

在Struts框架使用了很多属性,我们可以通过改变这些属性来满足我们的需求。

要改变这些属性,只需在struts.properties文件中指定属性的key和value即可。

属性文件可以放在任何一个包含在classpath中的路径上,但是通常我们都把它放在/WEB-INF/classes目录下面。

我们可以在struts-default.properties文件中找到一个属性的列表。

(4)struts-default.xml

此文件是struts2框架默认加载的配置文件,它定义了struts2一些核心bean和拦截器,它会自动包含(included)到struts.xml文件中(实质是通过),并为我们提供了一些标准的配置。

我们可以在struts2-core.jar中找到这个文件。

(5)其它配置文件

velocity.properties,struts-default.vm,struts-plugin.xml

4.让MyEclipse提示xml信息

当我们在编写struts.xml时,发现eclipse并不会给出帮助提示,那是因为MyEclipse默认并不支持struts2,所以我们需要手工导入dtd以支持提示。

步骤:

[window][preferences][MyEclipse][FilesandEditors][XML][xmlCatelog]然后在右边点add添加:

location为dtd文件所在的位置(struts-2.0.dtd文件struts2-core-2.1.6.jar中可以得到),KeyType选择URI,Key为struts-2.0.dtd文件中文档声明的内容(http:

//struts.apache.org/dtds/struts-2.0.dtd),在struts.xml文件中也有此key值。

5.如何使用alt+/提示

在MyEclipse6.5中,默认的提示为Ctrl+Space,而它会与我们的输入法切换冲突,使提示失效。

找到key,先取消ContentAssist命令的绑定,再用“alt+/”来绑定。

6.实例

步骤一,新建myStruts2项目,并导入struts2的六个基本jar包。

步骤二,建立LoginAction文件,主要代码如下:

packagecom.asm;

importcom.opensymphony.xwork2.Action;

publicclassLoginActionimplementsAction{

privateStringusername;

privateStringpassword;

...省略get/set方法

publicStringexecute()throwsException{

if(username.equals("struts2")){

return"loginSuccess";

}else{

return"loginFailure";

}

}

}

说明:

实现了Action接口,主要是为了保证execute的正确定义,其实我们也可以不实现此接口,只要能保证execute方法书写的正确书写(方法名,返回值)。

步骤三,在struts.xml文件中注册LoginAction。

此配置文件要放在src目录下,实质就是成为classpath环境变量下的文件。

主要代码如下:

xmlversion="1.0"encoding="UTF-8"?

>

DOCTYPEstrutsPUBLIC

"-//ApacheSoftwareFoundation//DTDStrutsConfiguration2.0//EN"

"http:

//struts.apache.org/dtds/struts-2.0.dtd">

/success.jsp

/failure.jsp

说明:

package后面会有详细说明。

action元素中的name属性值指定了此action所指定的请求路径为“login.action”。

后面login.jsp中的属性值就会参照此name属性。

步骤四、提供jsp页面

login.jsp主要代码:

/login.action"method="get">

户名:


密码:


failure.jsp主要代码

<%@pagelanguage="java"import="java.util.*"pageEncoding="UTF-8"%>

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

登录失败,错误的用户名:

propertyvalue="username"/>

/login.jsp">返回

说明:

使用了标签库,在struts2中使用标签库非常简单,只需要像上面那样导入标签库便可以使用所有的struts2的所有标签

success.jsp主要代码

登录成功!

步骤五、配置web.xml。

完成核心监听器注册。

内容如下:

xmlversion="1.0"encoding="UTF-8"?

>

xmlns="

xmlns:

xsi="http:

//www.w3.org/2001/XMLSchema-instance"

xsi:

schemaLocation="

struts2

--org.apache.struts2.dispatcher.FilterDispatcher

-->

org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter

struts2

/*

说明:

注释掉的部分为以前2.1.4版本中用的核心filter类。

StrutsPrepareAndExecuteFilter类的init方法将会读取类路径下默认的配置文件struts.xml,并以javabean形式存放在内存中,以后struts2对用户的每次请求将使用内存中数据,而不是重读struts.xml文件。

步骤六、发布测试。

简要分析执行流程:

当输入login.jsp访问jsp页面填写完相关信息并提交给login.action时,它会首先被在web.xml中配置的过滤器监听到,过滤器会去查找strust.xml文件,并结合namespace查找名为login的action,查找到此action便交给其处理,LoginAction内部会执行execute方法,并返回结果result(result也是参照的struts.xml中action下的result配置)。

关于表单传参,主要是参照的action中的方法名,而非属性名。

7.开启struts2自带的开发模式常量

在以前的开发中,当修改一些配置时总是不能及时地更新到服务器,我们总会重新部署或重启来更新改变的内容,在struts2中可以通过一个常量来达到此目的。

即在struts.xml中的元素下增加如下内容:

这样配置后,当配置文件修改保存时就会及时更新到服务器中。

其它一些常量:

--指定WEB应用的编码集,相当于调用HttpServletRequest.setCharacterEncodint方法,如果使用了velocity或freemarker,它也用于指定输出的编码格式-->

--指定请求后缀为.action,指定多个请求后缀用逗号分隔-->

--设置浏览器是否缓存静态内容,建议:

开发阶段关闭,运行时开启-->

--当struts.xml配置文件修改后,系统是否重新加载该文件,开发阶段打开此功能-->

--开发提示:

出错时打印更详细的信息-->

--指定请求的后缀可以是.do或.action-->

注意:

在struts2.1.6版本中存在一个bug:

即配置了struts.i18n.encoding常量也不能解决中文乱码问题,原因是此版本在获取请求参数后才调用了setCharacterEncoding()方法进行编码设置。

解决此bug的方法是配置一个filter,并在doFilter方法中增加如下代码:

request.setCharacterEncoa2.1.8版本中解决了此问题及2.1.6中存在的其它bug,建议新项目使用2.1.8版本。

8.vo传参模式

Copy上面的myStruts2项目,改名为myStruts2Vo项目。

作如下修改:

在LoginAction中有两个字段:

username,password。

把此两个属性重构到com.asm.vo.User类中,然后在LoginAction中提供User对象及相应的get/set方法。

现在需要注意的是在login.jsp中会有如下的修改:

户名:


密码:


关键就是改掉name属性值。

其它基本无变动。

后话:

假如此此User对象并不能和Model层的相应对象完全对应,我们还应借助此User对象在Action中构建出Model层的相应对象,这样,在exectue方法中便能通过构建的Model对象作为参数与Model层交互。

9.ModerDriven传参模式(不建议采用)

Copy上面的myStruts2Vo项目,改名为myStruts2Model项目。

重点是修改LoginAction,修改后的主要内容如下:

packagecom.asm;

importcom.asm.vo.User;

importcom.opensymphony.xwork2.Action;

importcom.opensymphony.xwork2.ModelDriven;

publicclassLoginActionimplementsAction,ModelDriven{

privateUseruser=newUser();

publicStringexecute()throwsException{

if(user.getUsername().equals("struts2")){

return"loginSuccess";

}else{

return"loginFailure";

}

}

publicUsergetModel(){

returnuser;

}

}

说明:

它实现了ModelDriven接口,并使用了泛性机制(必须),因此要求jdk1.5以上。

现在需要注意的是在login.jsp中name属性值为User中两个字段,和第一个实例一样。

说明:

此方式一般不会使用,在此略作了解。

10.为什么要使用struts2代替struts1.x

(1)struts2的execute方法中的参数不会依赖于servletAPI,实现了也servlet解耦,是一种无侵入式的设计。

(2)struts2提供了拦截器,利用拦截器可以进行AOP编程,实现权限拦截等功能。

(3)struts2提供了类型转换器,我们可以很容易地对请求参数转换成需要的类型。

(4)提供了同种表现层技术支持,如JSP、freeMarker、velocity等

(5)可以对指定的方法进行校验,可以轻松地实现表单校验功能

(6)提供了全局范围、包范围和action范围的国际化资源文件管理实现。

二、struts.xml配置及例程

1.配置文件的优先级

在struts2中一些配置(比如常量)可以同时在struts-default.xml(只读性),strtus-plguin.xml(只读性),struts.xml,struts.properties和web.xml文件中配置,它们的优先级逐步升高,即是说后面的配置会覆盖掉前面相同的配置。

2.配置形式

下面以对struts.i18n.encoding=UTF-8的配置为例进行说明:

在struts.xml配置形式如下:

在struts.properties的配置形式如下:

struts.i18n.encoding=UTF-8

在web.xml中配置如下:

struts2

org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter

struts.i18n.encoding

UTF-8

说明:

官方声称配置了此常量可以解决中文乱码问题,但实事上并不能达到目的,在前面的三个项目中,如果我们在表单中输入中文,其结果是会出现乱码。

解决此问题参看[一.7的注意]。

这是struts2.1.6中的一bug,它的下一版2.1.8已解决此问题。

3.package配置相关

属性名

是否必须

说明

Name

Package的唯一标识,不允许同名

Extends

指定要继承的包

Namespace

指定名称空间

Abstract

声明包为抽象否

下面我们建立struts2package项目来进行package相关测试:

说明:

在上面的配置文件中所用到的Test1Action和Test2Action这两个Action都只是继承了com.opensymphony.xwork2.ActionSupport类,而ActionSupport默认返回的就是“success”,所以当点击上面的链接分别转到了forward目录下的test1.jsp和test2.jsp。

下面重点来看这个package元素的namespace属性及action的name属性,它们共同定义了action所映射到的实质文件。

上图展示了链接地址和action的对应关系,所以当我们要想访问一个action所关联到的jsp文件时,应该用namespace+action的name关于它的内容测试可以参考struts2package项目。

补充:

通常情况下,action元素的name是属性值是不能出现“/”的,所以希望通过action中name属性来实现多级映射,需要在sturts.xml中增加如下属性:

这样配置后就可以再action的name元素中使用“/”了。

比如:

/forward/test3.jsp

然后输入/test3/test3.action">test3
链接地址就可以访问了

强调:

namespace默认值“”,即不配置namespace属性。

它的意思是:

如果action不能进行完整路径匹配,则会来此namespace下进行匹配,比如:

.../test/test/test.action,如果参照namespace及action的name不能找到也之完全对应的action,它会再到依次追溯到上级目录中查找,即是说它会以…/test/test.action这样的路径来对应namespace和action的name进行查找。

如果返回到最终的目录仍找不到,它就会到namespace="/"对应的包下查找名为test的action,如果仍找不到,它就会去默认的namespace下查找名为test的action,如果找到则执行此action。

另外,namespace也可以配置成namespace="/"。

它代表配置为项目的根。

总结action的名称探索顺序:

完全对应、逐步追溯到上级目录查找、"/"下查找、默认namespace下查找。

为什么要提出namespace,主要是避免多人共同开发项目出现名字冲突。

如果不使用namespace,多个人所写的action中可能出现重名的现象,这样当项目合并时就会出现冲突。

而有了namespace可以在项目开发时由项目经理给每一个人分不同的namespace,这样每个开发人员只需要保证自己所写的action不同名即可。

namespace引发的链接问题:

当我们为action配置了namespace时,访问此action的形式总会是如下形式:

.../webappname/xxx/yyy/ActionName.action而当此action成功执行跳转到某个jsp页面时,如想在此jsp页面写链接,一定要写绝对路径,因为相对路径是相对.../webappname/xxx/yyy/,而如果以后我们修改了action的namespac

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

当前位置:首页 > 解决方案 > 学习计划

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2