struts2笔记初步修改版_第1页
struts2笔记初步修改版_第2页
struts2笔记初步修改版_第3页
struts2笔记初步修改版_第4页
struts2笔记初步修改版_第5页
已阅读5页,还剩51页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、一、准备工作及实例1.解压struts-2.1.6-all.zipapps目录: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-fi

2、leupload-1.2.1.jar:文件上传组件,2.1.6版本后必须加入此jar包特别需要说明的是目前strust2的最新版本是struts-2.1.6,它作为2.1X的正式版。特别要注意导入commons-fileupload-1.2.1.jar包,在此jar包中包含了RequestContext类,如果不导入该jar包将会报异常。3.初识struts2配置文件(1)web.xml文件 主要完成对StrutsPrepareAndExecuteFilter的配置(在以前的版本中是对FilterDispatcher配置,新版本同样支持用FilterDispatcher配置),它的实质是一个过

3、滤器,它负责初始化整个Struts框架并且处理所有的请求。这个过滤器可以包括一些初始化参数,有的参数指定了要加载哪些额外的xml配置文件,还有的会影响struts框架的行为。除了StrutsPrepareAndExecuteFilter外,Struts还提供了一个ActionContexCleanUp类,它的主要任务是当有其它一些过滤器要访问一个初始化好了的struts框架的时候,负责处理一些特殊的清除任务。(2)struts.xml文件 框架的核心配置文件就是这个默认的struts.xml文件,在这个默认的配置文件里面我们可以根据需要再包括其它一些配置文件。在通常的应用开发中,我们可能想为每

4、个不同的模块单独配置一个struts.xml文件,这样也利于管理和维护。这也是我们要配置的主要文件。(3)perties(参perties) 在Struts框架使用了很多属性,我们可以通过改变这些属性来满足我们的需求。要改变这些属性,只需在perties文件中指定属性的key和value即可。属性文件可以放在任何一个包含在classpath中的路径上,但是通常我们都把它放在/WEB-INF/classes目录下面。我们可以在perties文件中找到一个属性的列表。(4)struts-default

5、.xml 此文件是struts2框架默认加载的配置文件,它定义了struts2一些核心bean和拦截器,它会自动包含(included)到struts.xml文件中(实质是通过),并为我们提供了一些标准的配置。我们可以在struts2-core.jar中找到这个文件。(5)其它配置文件perties,struts-default.vm,struts-plugin.xml4.让MyEclipse提示xml信息当我们在编写struts.xml时,发现eclipse并不会给出帮助提示,那是因为MyEclipse默认并不支持struts2,所以我们需要手工导入dtd以支持提示。

6、步骤:windowpreferencesMyEclipseFiles and EditorsXMLxml Catelog然后在右边点add添加:location为dtd文件所在的位置(struts-2.0.dtd文件struts2-core-2.1.6.jar中可以得到),KeyType选择URI,Key为struts-2.0.dtd文件中文档声明的内容(/dtds/struts-2.0.dtd),在struts.xml文件中也有此key值。5.如何使用alt+/提示在MyEclipse6.5中,默认的提示为Ctrl+Space,而它会与我们的输入

7、法切换冲突,使提示失效。找到key,先取消Content Assist命令的绑定,再用“alt+/”来绑定。6.实例步骤一,新建myStruts2项目,并导入struts2的六个基本jar包。步骤二,建立LoginAction文件,主要代码如下:package com.asm;import com.opensymphony.xwork2.Action;public class LoginAction implements Action private String username;private String password;.省略get/set方法public String execut

8、e() throws Exception if (username.equals(struts2) return loginSuccess; else return loginFailure;说明:实现了Action接口,主要是为了保证execute的正确定义,其实我们也可以不实现此接口,只要能保证execute方法书写的正确书写(方法名,返回值)。步骤三,在struts.xml文件中注册LoginAction。此配置文件要放在src目录下,实质就是成为classpath环境变量下的文件。主要代码如下:/success.jsp/failure.jsp说明:package后面会有详细说明。act

9、ion元素中的name属性值指定了此action所指定的请求路径为“login.action”。后面login.jsp中的属性值就会参照此name属性。步骤四、提供jsp页面login.jsp主要代码:form action=/login.action method=get户名:密码:failure.jsp主要代码登录失败,错误的用户名:a href=/login.jsp返回说明:使用了标签库,在struts2中使用标签库非常简单,只需要像上面那样导入标签库便可以使用所有的struts2的所有标签success.jsp主要代码登录成功!步骤五、配置web.xml。完成核心监听器注册。内容如下:

10、struts2!- org.apache.struts2.dispatcher.FilterDispatcher-org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilterstruts2/*说明:注释掉的部分为以前2.1.4版本中用的核心filter类。StrutsPrepareAndExecuteFilter类的init方法将会读取类路径下默认的配置文件struts.xml,并以javabean形式存放在内存中,以后struts2对用户的每次请求将使用内存中数据,而不是重读struts.xml文件。步骤六、发布测

11、试。简要分析执行流程:当输入./login.jsp访问jsp页面填写完相关信息并提交给login.action时,它会首先被在web.xml中配置的过滤器监听到,过滤器会去查找strust.xml文件,并结合namespace查找名为login的action,查找到此action便交给其处理,LoginAction内部会执行execute方法,并返回结果result(result也是参照的struts.xml中action下的result配置)。 关于表单传参,主要是参照的action中的方法名,而非属性名。7.开启struts2自带的开发模式常量在以前的开发中,当修改一些配置时总是不能及时地

12、更新到服务器,我们总会重新部署或重启来更新改变的内容,在struts2中可以通过一个常量来达到此目的。即在struts.xml中的元素下增加如下内容: 这样配置后,当配置文件修改保存时就会及时更新到服务器中。其它一些常量:注意:在struts2.1.6版本中存在一个bug:即配置了struts.i18n.encoding常量也不能解决中文乱码问题,原因是此版本在获取请求参数后才调用了setCharacterEncoding()方法进行编码设置。解决此bug的方法是配置一个filter,并在doFilter方法中增加如下代码:request.setCharacterEncoding(“UTF-8

13、”); 在以后的2.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层的相应对象完全对应,我们还应借助此

14、User对象在Action中构建出Model层的相应对象,这样,在exectue方法中便能通过构建的Model对象作为参数与Model层交互。9.ModerDriven传参模式Copy上面的myStruts2Vo项目,改名为myStruts2Model项目。重点是修改LoginAction,修改后的主要内容如下:package com.asm;import com.asm.vo.User;import com.opensymphony.xwork2.Action;import com.opensymphony.xwork2.ModelDriven;public class LoginActio

15、n implements Action, ModelDriven private User user = new User();public String execute() throws Exception if (user.getUsername().equals(struts2) return loginSuccess; else return loginFailure;public User getModel() return user;说明:它实现了ModelDriven接口,并使用了泛性机制(必须),因此要求jdk1.5以上。现在需要注意的是在login.jsp中name属性值为U

16、ser中两个字段,和第一个实例一样。说明:此方式一般不会使用,在此略作了解。10.为什么要使用struts2代替struts1.x(1)struts2的execute方法中的参数不会依赖于servletAPI,实现了也servlet解耦,是一种无侵入式的设计。(2)struts2提供了拦截器,利用拦截器可以进行AOP编程,实现权限拦截等功能。(3)struts2提供了类型转换器,我们可以很容易地对请求参数转换成需要的类型。(4)提供了同种表现层技术支持,如JSP、freeMarker、velocity等(5)可以对指定的方法进行校验,可以轻松地实现表单校验功能(6)提供了全局范围、包范围和ac

17、tion范围的国际化资源文件管理实现。二、struts.xml配置及例程1.配置文件的优先级在struts2中一些配置(比如常量)可以同时在struts-default.xml(只读性),strtus-plguin.xml(只读性),struts.xml,perties和web.xml文件中配置,它们的优先级逐步升高,即是说后面的配置会覆盖掉前面相同的配置。2.配置形式下面以对struts.i18n.encoding=UTF-8的配置为例进行说明:在struts.xml配置形式如下:在perties的配置形式如下:struts.i18n.encoding

18、=UTF-8在web.xml中配置如下:struts2org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilterstruts.i18n.encodingUTF-8说明:官方声称配置了此常量可以解决中文乱码问题,但实事上并不能达到目的,在前面的三个项目中,如果我们在表单中输入中文,其结果是会出现乱码。解决此问题参看一.7的注意。这是struts2.1.6中的一bug,它的下一版2.1.8已解决此问题。3.package配置相关属性名是否必须说明Name是Package的唯一标识,不允许同名Extends 否指定要继承

19、的包Namespace否指定名称空间Abstract否声明包为抽象否下面我们建立struts2package项目来进行package相关测试:/forward/test1.jsp/forward/test2.jspa href=/test2/test2.actiontest2struts.xml中的内容:链接地址a href=/test1/test1.actiontest1链接地址说明:在上面的配置文件中所用到的Test1Action和Test2Action这两个Action都只是继承了com.opensymphony.xwork2.ActionSupport类,而ActionSupport默

20、认返回的就是“success”,所以当点击上面的链接分别转到了forward目录下的test1.jsp和test2.jsp。下面重点来看这个package元素的namespace属性及action的name属性,它们共同定义了action所映射到的实质文件。上图展示了链接地址和action的对应关系,所以当我们要想访问一个action所关联到的jsp文件时,应该用namespace+action的name 关于它的内容测试可以参考struts2package项目。 补充:通常情况下,action元素的name是属性值是不能出现“/”的,所以希望通过action中name属性来实现多级映射,需要

21、在sturts.xml中增加如下属性: 这样配置后就可以再action的name元素中使用“/”了。比如:/forward/test3.jsp然后输入a href=/test3/test3.actiontest3链接地址就可以访问了强调:namespace默认值“”,即不配置namespace属性。它的意思是:如果action不能进行完整路径匹配,则会来此namespace下进行匹配,比如:./test/test/test.action,如果参照namespace及action的name不能找到也之完全对应的action,它会再到依次追溯到上级目录中查找,即是说它会以/test/test.ac

22、tion这样的路径来对应namespace和action的name进行查找。如果返回到最终的目录仍找不到,它就会到namespace=/对应的包下查找名为test的action,如果仍找不到,它就会去默认的namespace下查找名为test的action,如果找到则执行此action。另外,namespace也可以配置成namespace=/。它代表配置为项目的根。 总结action的名称探索顺序:完全对应、逐步追溯到上级目录查找、/下查找、默认namespace下查找。为什么要提出namespace,主要是避免多人共同开发项目出现名字冲突。如果不使用namespace,多个人所写的acti

23、on中可能出现重名的现象,这样当项目合并时就会出现冲突。而有了namespace可以在项目开发时由项目经理给每一个人分不同的namespace,这样每个开发人员只需要保证自己所写的action不同名即可。namespace引发的链接问题:当我们为action配置了namespace时,访问此action的形式总会是如下形式:./webappname/xxx/yyy/ActionName.action 而当此action成功执行跳转到某个jsp页面时,如想在此jsp页面写链接,一定要写绝对路径,因为相对路径是相对./webappname/xxx/yyy/,而如果以后我们修改了action的nam

24、espace时,相对路径又要变,所以链接不能写成相对路径。 以下介绍绝对路径的写法:通常用myeclipse开发时建立一个jsp文件,默认总会有如下内容:我们写绝对路径可以参此内容。还可以参下的base href= 来完成绝对路径的书写。4.分工合作include:指定多个配置文件比如让jack来单独开发一个action,在jack.xml中的配置文件为:/forward/test4.jsp然后在struts.xml文件中增加如下内容: 它实质就是把jack.xml中的及其内容写进struts.xml中的根元素下。链接:a href=/jack/test4.actiontest4 这样便可以访

25、问到了forward目录下的test4.jsp了。5.tomcat认证访问接上例:namespce的作用除了在前面提到的避免协同开发名字冲突外,还为认证提供一个条件。比如jack开发的东西所关联到的页面需要权限才能被访问。由于多为tomcat中的内容,下面只列出步骤。步骤一,tomcat的conf目录下tomcat-users.xml内容如下: 步骤二,在web.xml中增加如下内容:jack/jack/*POSTGETadminadminBASICinput authentication message这样配置完成后,当我们访问./jack中的任何内容都会要求输入密码认证信息,认证时输入to

26、mcat-users.xml配置的admin权限的用户名和密码即可访问(这里就只有jack用户名可以访问)6.初识拦截器拦截器能在action被调用之前和被调用之后执行一些“代码”。Struts2框架的大部分核心功能都是通过拦截器来实现的,如防止重复提交、类型转换、对象封装、校验、文件上传、页面预装载等等,都是在拦截器的帮助下实现的。每一个拦截器都是独立装载的(pluggable),我们可以根据实际的需要为每一个action配置它所需要的拦截器。 在myStruts2项目下,重新对配置文件作如下修改:/success.jsp/failure.jsp首先在package中定义了两个拦截器,然后在

27、login action中引用了这两个拦截器,需要说明的是这里使用的拦截器都是系统自带的拦截器。其实在extends所继承的struts-default中就包含了很多拦截器,也包括我们这里所用的拦截器,但如果在此action中不使用params拦截器,将会报空指针错,因为params拦截器的作用是传递表单参数,如果不使用此拦截器就不能在action中得到表单参数,所以引用时会报空指针错。虽然extends继承的strust-default自带有params拦截器,但是当我们自己引用了拦截器时,继承struts-default将不会再为我们分配默认的拦截器(有点类似构造器),但是我们仍然可以通过

28、来继续使用struts-defalut的拦截器。补充:由于上面的package继承于struts-default,而我们这里所用到的timer和params都是在struts-defalut中定义过,所以即使我们在中没有定义过这两个拦截器,也可以直接在action中引用。使用组合多个拦截器:比如我们想把上面的params和timer这两个拦截器组合:然后再在action引用”,效果和分别引用两个是一样的。其实我们使用strtus-default中的也是使用interceptor-stack方式。7.Action中的method属性在struts1.x中我们知道通过继承DispatchActio

29、n可以实现把多个Action进行统一操作,在struts2中实现action的统一操作也很简单。我们以crud操作为例,把crud集中到一个Action中。步骤一、建立CRUDAction,内容如下:package com.asm;import com.opensymphony.xwork2.ActionSupport;public class CRUDAction extends ActionSupport public String add() return success;public String del() return success;public String update()

30、return success;public String query() return success;步骤二、配置此Action,为了清晰明了,专为此Action,建立一个配置文件crud.xml,主要内容如下:/crud/addSuccess.jsp/crud/delSuccess.jsp/crud/updateSuccess.jsp/crud/querySuccess.jsp分析:上面的method方法的值来源于CRUDAction中方法的名字,这样当我们访问上面的每一个Action时,它实质是和method指定的方法关联上。步骤三、把crud.xml配置文件并入struts.xml中,

31、只需增加如下代码:步骤四、编写相应的jsp页面,在此略去crud文件夹下的四个跳转jsp页面(addSuccess.jsp等),重点是crud.jsp页面。内容如下:a href=/crud/add.action添加数据a href=/crud/del.action删除数据a href=/crud/query.action查询数据a href=/crud/update.action修改数据步骤五、发布测试。补充扩展,动态调用DMI:不使用method实现统一.我们在crud.xml中增加如下内容:/crud/op.jsp然后再在crud.jsp中定义如下链接:a href=/crud/op!a

32、dd.action添加数据a href=/crud/op!del.action删除数据a href=/crud/op!query.action查询数据a href=/crud/op!update.action修改数据注意查看上面的链接地址,它们都是针对op action,然后再加地上“!+CRUDAction中相应的方法名”,最后再写上.action即可以访问到统一页面op.jsp。这样做虽然能减少页面,但是由于它们实质用到的是同一个Action,所以这就意味着我们要使用的拦截器相同,相同的跳转result。实际中这种方式很少使用,在此略作了解。如果不想使用动态方法调用,我们可以通过常量来关闭

33、,即在struts.xml中增加如下配置:扩展2:在CRUDAction中使用do。举例:我们在CRUDAction中增加一个新的方法,内容如下:public String doMain()return success;然后再在在crud.xml中增加如下内容:/crud/main.jsp注意:配置中method属性值是doMain中去掉do后M小写。然后再在crud.jsp中增加如下链接:a href=/crud/main.actionmain页面随后便可以访问到./crud/main.jsp页面了。8.使用ForwardAction实现页面屏蔽。我们在jsp页面之间写链接总会是./xxx.

34、jsp,而如果我们想屏蔽掉具体的jsp,只需要所jsp页面配置成一个ForwardAction即可实现。示例如下:在根目录下有一个index.jsp主页,我们strtus.xml中作如下配置:/index.jsp说明:如果没有未action指定class,默认就是ActionSupport类,如果没有为action指定method属性,则默认执行execute方法,如果没有指定result的name属性,默认值为success。知道了这些再结合ActionSupport的源码就不难理解实现转发的原理了。随后再在前面第7点扩展中用到的op.jsp中增加如下代码:a href=/forward.a

35、ctionforward最后再测试访问op.jsp,在op.jsp中页面中直接点链接便可以跳到index.jsp,观察地址栏发现此时跳到index页面是进行的服务器跳转,如果我们在上面的配置中的result增加type属性变成/index.jsp,实现的跳转就是客户端跳转。 补充:像这种forward形式的action实质是执行的ActionSupport 这个Action。因此配置它的result可以参看此类的api文档,比如它常用的result name有:success、login、input等。8.使用default-Action配置统一访问default-action-ref,当访问没有找到对应的action时,默认就会调用default-action-ref指定的action.同样在上面的package中增加如下内容:/other/error.jsp上面一段内容就是说当我们访问的action不能被找到时便指向名为error的action中去,接着我们在下面配置了这个error Action。但是要注意,一个package

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论