




已阅读5页,还剩57页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1 struts1和struts2的区别Action类 Struts 1要求Action类要扩展自一个抽象基类。Struts 1的一个共有的问题是面向抽象类编程而不是面向接口编程。 Struts 2的Action类实现了一个Action接口,连同其他接口一起实现可选择和自定义的服务。Struts 2提供一个名叫ActionSupport的基类实现一般使用的接口。虽然,Action接口不是必须的。任何使用execute方法的POJO对象可以被当作Struts 2的Action对象使用。 程模型 Struts 1 Action类是单例类,因只有一个示例控制所有的请求。单例类策略造成了一定的限制且给开发带来了额外的烦恼。Action资源必须是程安全或者同步的。 Struts 2 Action对象每一个请求都实例化对象,所以没有程安全的问题。(实践中,servlet容器生许多丢的对象对于每一个请求,多于一个的对象并不影响垃圾收集) Servlet 依赖 Struts 1的Action类依赖于servlet API以HttpServletRequest和HttpServletResponse作参数传给execute方法当Action被调用时。 Struts 2的Action不和容器有关。Servlet上下文被表现简单的Maps,允许Action被独立的测试。Struts 2的Action可以访问最初的请求和相应,如果需要的话。然而,其他的架构元素少或者排除直接访问HttpServletRequest或者HttpServletResponse的需要。 易测性 测试Struts 1的主要障碍是execute方法暴露了Servlet API。第三方的扩展,Struts测试用例,提供Struts 1的集合对象。 Struts 2的Action可以通过实例化Action测试,设置属性,然后调用方法。依赖注入的支持也是测试变得更简单。 接受输入 Struts 1使用ActionForm对象捕获输入。象Action一样,所有的ActionForm必须扩展基类。因其他的JavaBean不能作ActionForm使用,开发者经常创建多余的类捕获输入。DynaBeans可以被用来作替代ActionForm的类创建。但是开发者可以重新描述已经存在的JavaBean。 Struts 2 Action属性作输入属性,排除第二个输入对象的需要。输入属性可能有丰富的对象类型这些类型有他们自己的属性。Action的属性可以通过标签库访问。Struts 2也支持ActionForm形式。丰富的对象类型,包含业务或者域对象,可以被当作输入或者输出对象使用。馍型驱动特性简化标签对POJO输入对象的引用。 表达式语言 Struts 1整和JSTL,所以它使用JSTL的表达式语言。表达式语言有基本的图形对象移动,但是相对很弱的集合和被索引的属性支持。 Struts 2使用JSTL,但是框架也支持更大和更灵活的表达式,叫做“对象图形符号语言”(OGNL)。 将值绑定要视图上 Struts 1使用标准JSP机制来绑定对象到页面上下文。 Struts 2使用“ValueStack”技术了标签库可以不用链接你的视图到对象的表现类型访问值。ValueStack策略允许重用视图。 类型转换 Struts 1的ActionForm属性经常都是String的。Struts 1使用Commons-Beanutils类型转换。转换每一个类,不是每一个实例配置。 Struts 2使用OGNL类型转换。框架包含转换器基本的和共同的对象类型和原始类型。 验证 Struts 1支持手动验证凭借ActionForm的validate方法,或者通过扩展的公用验证器。类可以有不同的验证上下文未相同的类,但是不能不能包括验证子对象。 Struts 2支持手动验证凭借validate方法和XWork验证框架。Xwork验证框架支持一连串的验证子属性使用的验证了属性类的类型和严正上下文而定义。 Action执行的控制 Struts 1支持独立的请求处理器对于每一个模型,但是所有在模型中的Action必须共享同一个生命周期。 Struts 2支持在每一个Action基础上凭借拦截栈创建不同的生命周期。自定义栈可以被创建且使用不同的所需 的Action。 网上有很多比较。2 准备工作及实例2.1 解压struts-2.1.8-all.zipapps目录:struts2自带的例子程序docs目录:官方文档。lib 目录:存放所有jar文件。Src 目录:源文件存放地2.2 六个基本包struts2-core-.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.1X的正式版。特别要注意导入commons-fileupload-1.2.1.jar包,在此jar包中包含了RequestContext类,如果不导入该jar包将会报异常。2.3 初识struts2配置文件(1)web.xml文件 主要完成对StrutsPrepareAndExecuteFilter的配置(在以前的版本中是对FilterDispatcher配置,新版本同样支持用FilterDispatcher配置),它的实质是一个过滤器,它负责初始化整个Struts框架并且处理所有的请求。这个过滤器可以包括一些初始化参数,有的参数指定了要加载哪些额外的xml配置文件,还有的会影响struts框架的行为。除了StrutsPrepareAndExecuteFilter外,Struts还提供了一个ActionContexCleanUp类,它的主要任务是当有其它一些过滤器要访问一个初始化好了的struts框架的时候,负责处理一些特殊的清除任务。(2)struts.xml文件 框架的核心配置文件就是这个默认的struts.xml文件,在这个默认的配置文件里面我们可以根据需要再包括其它一些配置文件。在通常的应用开发中,我们可能想为每个不同的模块单独配置一个struts.xml文件,这样也利于管理和维护。这也是我们要配置的主要文件。(3)perties(参perties) 在Struts框架使用了很多属性,我们可以通过改变这些属性来满足我们的需求。要改变这些属性,只需在perties文件中指定属性的key和value即可。属性文件可以放在任何一个包含在classpath中的路径上,但是通常我们都把它放在/WEB-INF/classes目录下面。我们可以在perties文件中找到一个属性的列表。(4)struts-default.xml 此文件是struts2框架默认加载的配置文件,它定义了struts2一些核心bean和拦截器,它会自动包含(included)到struts.xml文件中(实质是通过),并为我们提供了一些标准的配置。我们可以在struts2-core.jar中找到这个文件。(5)其它配置文件perties,struts-default.vm,struts-plugin.xml2.4 让MyEclipse提示xml信息当我们在编写struts.xml时,发现eclipse并不会给出帮助提示,那是因为MyEclipse默认并不支持struts2,所以我们需要手工导入dtd以支持提示。步骤: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值。2.5 如何使用alt+/提示在MyEclipse6.5中,默认的提示为Ctrl+Space,而它会与我们的输入法切换冲突,使提示失效。找到key,先取消Content Assist命令的绑定,再用“alt+/”来绑定。2.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 execute() throws Exception if (username.equals(struts2) return loginSuccess; else return loginFailure;说明:实现了Action接口,主要是为了保证execute的正确定义,其实我们也可以不实现此接口,只要能保证execute方法书写的正确书写(方法名,返回值)。步骤三,在struts.xml文件中注册LoginAction。此配置文件要放在src目录下,实质就是成为classpath环境变量下的文件。主要代码如下:/success.jsp/failure.jsp说明:package后面会有详细说明。action元素中的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。完成核心监听器注册。内容如下: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文件。步骤六、发布测试。简要分析执行流程:当输入./login.jsp访问jsp页面填写完相关信息并提交给login.action时,它会首先被在web.xml中配置的过滤器监听到,过滤器会去查找strust.xml文件,并结合namespace查找名为login的action,查找到此action便交给其处理,LoginAction内部会执行execute方法,并返回结果result(result也是参照的struts.xml中action下的result配置)。 关于表单传参,主要是参照的action中的方法名,而非属性名。2.7 开启struts2自带的开发模式常量在以前的开发中,当修改一些配置时总是不能及时地更新到服务器,我们总会重新部署或重启来更新改变的内容,在struts2中可以通过一个常量来达到此目的。即在struts.xml中的元素下增加如下内容: 这样配置后,当配置文件修改保存时就会及时更新到服务器中。其它一些常量:?devMode模式是开发模式,开启它则默认开启了i18n.reload、configuration.xml.reload注意:在struts2.1.6版本中存在一个bug:即配置了struts.i18n.encoding常量也不能解决中文乱码问题,原因是此版本在获取请求参数后才调用了setCharacterEncoding()方法进行编码设置。解决此bug的方法是配置一个filter,并在doFilter方法中增加如下代码:request.setCharacterEncoding(“UTF-8”); 在以后的2.1.8版本中解决了此问题及2.1.6中存在的其它bug,建议新项目使用2.1.8版本。2.8 传参模式2.8.1 Action属性传参模式2.8.2 vo传参模式在LoginAction中有两个字段:username,password。把此两个属性重构到com.asm.vo.User类中,然后在LoginAction中提供User对象及相应的get/set方法。现在需要注意的是在login.jsp中会有如下的修改:户名:密码:关键就是改掉name属性值。其它基本无变动。 后话:假如此此User对象并不能和Model层的相应对象完全对应,我们还应借助此User对象在Action中构建出Model层的相应对象,这样,在exectue方法中便能通过构建的Model对象作为参数与Model层交互。2.8.3 ModelDriven传参模式LoginAction,修改后的主要内容如下:package com.asm;import com.asm.vo.User;import com.opensymphony.xwork2.Action;import com.opensymphony.xwork2.ModelDriven;public class LoginAction 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属性值为User中两个字段,和第一个实例一样。说明:此方式一般不会使用,在此略作了解。2.9 为什么要使用struts2代替struts1.x(1)struts2的execute方法中的参数不会依赖于servletAPI,实现了也servlet解耦,是一种无侵入式的设计。(2)struts2提供了拦截器,利用拦截器可以进行AOP编程,实现权限拦截等功能。(3)struts2提供了类型转换器,我们可以很容易地对请求参数转换成需要的类型。(4)提供了同种表现层技术支持,如JSP、freeMarker、velocity等(5)可以对指定的方法进行校验,可以轻松地实现表单校验功能(6)提供了全局范围、包范围和action范围的国际化资源文件管理实现。3 struts.xml配置及例程3.1 配置文件的优先级在struts2中一些配置(比如常量)可以同时在struts-default.xml(只读性),strtus-plguin.xml(只读性),struts.xml,perties和web.xml文件中配置,它们的优先级逐步升高,即是说后面的配置会覆盖掉前面相同的配置。3.2 配置形式下面以对struts.i18n.encoding=UTF-8的配置为例进行说明:在struts.xml配置形式如下:在perties的配置形式如下:struts.i18n.encoding=UTF-8在web.xml中配置如下:struts2org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilterstruts.i18n.encodingUTF-8说明:官方声称配置了此常量可以解决中文乱码问题,但实事上并不能达到目的,在前面的三个项目中,如果我们在表单中输入中文,其结果是会出现乱码。解决此问题参看一.7的注意。这是struts2.1.6中的一bug,它的下一版2.1.8已解决此问题。3.3 package配置相关属性名是否必须说明Name是Package的唯一标识,不允许同名Extends 否指定要继承的包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默认返回的就是“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然后输入a href=/test3/test3.actiontest3链接地址就可以访问了强调: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的namespace时,相对路径又要变,所以链接不能写成相对路径。 以下介绍绝对路径的写法:通常用myeclipse开发时建立一个jsp文件,默认总会有如下内容:我们写绝对路径可以参此内容。还可以参下的base href= 来完成绝对路径的书写。3.4 Action创建方式n 实体类n implements Actionn extends ActionSuppor(推荐的首选方法)与struts1.x不同的是:在struts2中每一个Action被请求访问时都会new出这个Action对象,所以Action本身不存在线程安全的问题。3.5 分工合作include:指定多个配置文件比如让jack来单独开发一个action,在jack.xml中的配置文件为:/forward/test4.jsp然后在struts.xml文件中增加如下内容: 它实质就是把jack.xml中的及其内容写进struts.xml中的根元素下。链接:a href=/jack/test4.actiontest4 这样便可以访问到了forward目录下的test4.jsp了。3.6 tomcat认证访问接上例:namespce的作用除了在前面提到的避免协同开发名字冲突外,还为认证提供一个条件。比如jack开发的东西所关联到的页面需要权限才能被访问。由于多为tomcat中的内容,下面只列出步骤。步骤一,tomcat的conf目录下tomcat-users.xml内容如下: 步骤二,在web.xml中增加如下内容:jack/jack/*POSTGETadminadminBASICinput authentication message这样配置完成后,当我们访问./jack中的任何内容都会要求输入密码认证信息,认证时输入tomcat-users.xml配置的admin权限的用户名和密码即可访问(这里就只有jack用户名可以访问)。3.7 初识拦截器(不讲)拦截器能在action被调用之前和被调用之后执行一些“代码”。Struts2框架的大部分核心功能都是通过拦截器来实现的,如防止重复提交、类型转换、对象封装、校验、文件上传、页面预装载等等,都是在拦截器的帮助下实现的。每一个拦截器都是独立装载的(pluggable),我们可以根据实际的需要为每一个action配置它所需要的拦截器。 在myStruts2项目下,重新对配置文件作如下修改:/success.jsp/failure.jsp首先在package中定义了两个拦截器,然后在login action中引用了这两个拦截器,需要说明的是这里使用的拦截器都是系统自带的拦截器。其实在extends所继承的struts-default中就包含了很多拦截器,也包括我们这里所用的拦截器,但如果在此action中不使用params拦截器,将会报空指针错,因为params拦截器的作用是传递表单参数,如果不使用此拦截器就不能在action中得到表单参数,所以引用时会报空指针错。虽然extends继承的strust-default自带有params拦截器,但是当我们自己引用了拦截器时,继承struts-default将不会再为我们分配默认的拦截器(有点类似构造器),但是我们仍然可以通过来继续使用struts-defalut的拦截器。补充:由于上面的package继承于struts-default,而我们这里所用到的timer和params都是在struts-defalut中定义过,所以即使我们在中没有定义过这两个拦截器,也可以直接在action中引用。使用组合多个拦截器:比如我们想把上面的params和timer这两个拦截器组合:然后再在action引用”,效果和分别引用两个是一样的。其实我们使用strtus-default中的也是使用interceptor-stack方式。3.8 动态方法调用3.8.1 Action中的method属性在struts1.x中我们知道通过继承DispatchAction可以实现把多个Action进行统一操作,在struts2中实现action的统一操作也很简单。我们以crud操作为例,把crud集中到一个Action中。步骤一、建立CalAction,内容如下:package com.aptech.action;import com.opensymphony.xwork2.ActionSupport;public class CalAction extends ActionSupport public String add() throws Exception return SUCCESS;public String substract() throws Exception return SUCCESS;public String multiply() throws Exception return SUCCESS;public String divide() throws Exception return SUCCESS;步骤二、配置此Action,为了清晰明了,专为此Action,建立一个配置文件crud.xml,主要内容如下:/result.jsp/result.jsp/result.jsp/result.jsp分析:上面的method方法的值来源于CRUDAction中方法的名字,这样当我们访问上面的每一个Action时,它实质是和method指定的方法关联上。步骤三、编写相应的jsp页面,在此略去crud文件夹下的四个跳转jsp页面(addSuccess.jsp等),重点是crud.jsp页面。内容如下:a href=/cal/add.action添加数据a href=/cal/substract.action删除数据a href=/cal/multiply.action查询数据a href=/cal/divide.acti
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年五年级数学下册 二 分数2.1 分数的意义(二)说课稿 西师大版
- 第四节 热机教学设计-2025-2026学年初中物理九年级全册(2024)北师大版(2024·郭玉英)
- 2.3配位化合物和超分子说课稿-2025-2026学年高中化学沪科版2020选择性必修2 物质结构与性质-沪科版2020
- 2023二年级数学上册 4 表内乘法(一)2 2~6的乘法口诀第3课时 4的乘法口诀配套说课稿 新人教版
- 公司监理工作总结(15篇)
- 中医学员考试题及答案解析
- 2025秋季云南省教育厅招募基础教育银龄教师719人笔试备考题库及答案解析
- 汽车维修保养服务企业股权收购与品牌整合合同
- 矿产资源开发区国有土地租赁及环境治理合同
- 每日一读:新能源产业项目贷款合同设计与风险控制
- YY/T 1437-2023医疗器械GB/T 42062应用指南
- 梦想课程《去远方》(版)分享课程
- 年6万吨废植物油回收利用项目立项申请报告
- 富贵包形成原因及治疗方法
- 电动起子使用教程
- 10000中国普通人名大全
- 钢铁冶金学(炼钢学)课件
- 历史虚无主义课件
- 毕业论文范文3000字(精选十六篇)
- 南京力学小学苏教版六年级上册数学《分数乘分数》公开课课件
- 陶艺制作过程介绍教学课件(共48张)
评论
0/150
提交评论