- 浏览: 58481 次
- 性别:
- 来自: 济南
文章分类
最新评论
-
jichao113:
感谢楼主 谢谢
Struts2+Spring2+Hibernate3开发环境搭建及项目实例,泣血推荐,一步一步跟我做 -
ray_guanliang:
谢谢楼主分享
Struts2+Spring2+Hibernate3开发环境搭建及项目实例,泣血推荐,一步一步跟我做 -
wjb_forward:
写得很清晰,谢谢
Struts2+Spring2+Hibernate3开发环境搭建及项目实例,泣血推荐,一步一步跟我做 -
hlw579:
谢谢楼主啦
顶起来
Struts2+Spring2+Hibernate3开发环境搭建及项目实例,泣血推荐,一步一步跟我做 -
xyaoyuan:
谢谢楼主的东西,归我很有帮助。
Struts2+Spring2+Hibernate3开发环境搭建及项目实例,泣血推荐,一步一步跟我做
Struts2.0学习笔记第一天2009.3.9
主要内容:Struts2.0开发环境搭建
说明:本文内容有引入李刚老师的《Struts2 权威指南》书中的部分
相对于Struts1.0来说Struts2.0是一个全新的框架,但又不是一个新发布的框架,它是基于webwork基础之上建立起来的。
MVC思想(MVC模式的主要策略):
MVC思想将一个应用分成三个基本部分:Model(模型)、View(视图)和Controller(控制器),这三个部分以最少的耦合协同工作,从而提高应用的可扩展性及可维护性。
MVC有如下特点(MVC主要优势)。
— 多个视图可以对应一个模型。按MVC设计模式,一个模型对应多个视图,可以减少代码的复制及代码的维护量,一旦模型发生改变,也易于维护。
— 模型返回的数据与显示逻辑分离。模型数据可以应用任何的显示技术,例如,使用JSP页面、Velocity模板或者直接产生Excel文档等。
— 应用被分隔为三层,降低了各层之间的耦合,提供了应用的可扩展性。
— 控制层的概念也很有效,由于它把不同的模型和不同的视图组合在一起,完成不同的请求。因此,控制层可以说是包含了用户请求权限的概念。
— MVC更符合软件工程化管理的精神。不同的层各司其职,每一层的组件具有相同的特征,有利于通过工程化和工具化产生管理程序代码。
经典的MVC思想与Web应用的MVC思想也存在一定的差别,引起差别的主要原因是因为Web应用是一种请求/响应模式下应用,对于请求/响应应用,如果用户不对应用发出请求,视图无法主动更新自己。
常用的MVC框架:
1.JSF
基本知识及相关特征:
JSF是一个标准,而不是一个产品。JSF中没有控制器对象,控制器行为通过模型对象实现。JSF也允许生成独立的控制器对象。JSF依然是基于JSP/Servlet的,仍然是JSP/Servlet架构,因而学习曲线相对简单。
JSF也会存在一些不足:
— 作为新兴的MVC框架,用户相对较少,相关资源也不是非常丰富。
— JSF并不是一个完全组件化的框架,它依然是基于JSP/Servlet架构的。
— JSF的成熟度还有待进一步提高。
2.Tapestry
基本知识及相关特征:
包含了前端的MVC框架,还包含了一种视图层的模板技术,使用Tapestry完全可以与Servlet/JSP API分离,是一种非常优秀的设计。开发者完全不需要使用JSP技术,用户只需要使用Tapestry提供的模板技术即可,Tapestry实现了视图逻辑和业务逻辑的彻底分离。
Tapsetry是完全组件化的框架。Tapestr只有组件或页面两个概念,因此,链接跳转目标要么是组件,要么是页面,没有多余的path概念。组件名,也就是对象名称,组件名称和path名称合二为一。
不足:
— Tapestry的学习曲线相对陡峭,国内开发群体不是非常活跃,文档不是十分丰富。官方的文档太过学院派,缺乏实际的示例程序。
— Tapestry的组件逻辑比较复杂,再加上OGNL表达式和属性指定机制,因而难以添加注释。
3.Spring MVC
基本知识及相关特征:
Spring提供了一个细致完整的MVC框架。该框架为模型、视图、控制器之间提供了一个非常清晰的划分,各部分耦合极低。完全基于接口编程,真正实现了视图无关。
Spring MVC框架以DispatcherServlet为核心控制器,该控制器负责拦截用户的所有请求,将请求分发到对应的业务控制器。所有控制器都必须实现Controller接口,该接口仅定义ModelAndView handleRequest(request,response)方法。通过实现该接口来实现用户的业务逻辑控制器。
Spring MVC视图解析策略:它的控制器返回一个ModelAndView对象,该对象包含视图名字和Model,Model提供了Bean的名字及其对象的对应关系。视图名解析的配置非常灵活,抽象的Model完全独立于表现层技术,不会与任何表现层耦合:JSP、Velocity或者其他的技术——都可以和Spring整合。
Tapestry框架而言,Spring MVC依然是基于JSP/Servlet API的。
Spring MVC框架的一些缺点:
— Spring的MVC与Servlet API耦合,难以脱离Servlet容器独立运行,降低了Spring MVC框架的可扩展性。
— 太过细化的角色划分,太过烦琐,降低了应用的开发效率。
— 过分追求架构的完美,有过度设计的危险。
Struts 2的起源和背景
★★★Struts 1:
Struts 1框架以ActionServlet作为核心控制器,整个应用由客户端请求驱动。当客户端向Web应用发送请求时,请求将被Struts 1的核心控制器ActionServlet拦截,ActionServlet根据请求决定是否需要调用业务逻辑控制器处理用户请求(实际上,业务逻辑控制器还是控制器,它只是负责调用模型来处理用户请求),当用户请求处理完成后,其处理结果通过JSP呈现给用户。
Struts 1中的MVC:
(1)Model部分
Struts 1的Model部分主要由底层的业务逻辑组件充当,这些业务逻辑组件封装了底层数据库访问、业务逻辑方法实现。Model部分封装了整个应用的所有业务逻辑
(2)View部分
Struts 1的View部分采用JSP实现。
(3)Controller部分
Struts 1的Controller由两个部分组成:
— 系统核心控制器:由Struts 1框架提供,就是系统中的ActionServlet。
— 业务逻辑控制器:由Struts 1框架提供,就是用户自己实现的Action实例。
业务逻辑控制器负责处理用户请求,但业务逻辑控制器本身并不具有处理能力,而是调用Model来完成处理。
Struts 1提供了系统所需要的核心控制器,也为实现业务逻辑控制器提供了许多支持。因此,控制器部分就是Struts 1框架的核心。
Struts 1 MVC框架的一些缺点:
Struts 1与JSP/Servlet耦合非常紧密
(1)支持的表现层技术单一:只支持JSP作为表现层技术
(2)与Servlet API严重耦合,难于测试
HttpServletRequest和HttpServletResponse两个参数,通常由Web容器负责实例化。严重依赖于Web服务器。因此,一旦脱离了Web服务器,Action的测试非常困难。
★★★WebWork:
1.采用了一种更加松耦合的设计,让系统的Action不再与Servlet API耦合。使单元测试更加方便,允许系统从B/S结构向C/S结构转换。
2.支持更多的表现层技术,如Velocity、FreeMarker和XSLT等。
3.脱离Web应用使用,WebWork有自己的控制反转(Inversion of Control)容器,通过控制反转,可以让测试变得更简单,测试中设置实现服务接口的Mock对象完成测试,而不需要设置服务注册。
4.使用OGNL这个强大的表达式语言,可以访问值栈。OGNL对集合和索引属性的支持非常强大。
5.建立在XWork之上,使用ServletDispatcher作为该框架的核心控制器,处理HTTP的响应和请求。
6.控制器都由两个部分组成:
— 核心控制器ServletDispatcher,该控制器框架提供。
— 业务逻辑控制器Action,该控制器由程序员提供。
WebWork的Action可以与Servlet API分离,得益于它灵巧的设计,它使用一个拦截器链,负责将用户请求数据转发到Action,并负责将Action的处理结果转换成对用户的响应。
当用户向Web应用发送请求时,该请求经过ActionContextCleanUp、SiteMesh等过滤器过滤,由WebWork的核心控制器拦截,如果用户请求需要WebWork的业务逻辑控制器处理,该控制器则调用Action映射器,该映射器将用户请求转发到对应的业务逻辑控制器。值得注意的是,此时的业务逻辑控制器并不是开发者实现的控制器,而是WebWork创建的控制器代理。
创建控制器代理时,WebWork需要得到开发者定义的xwork.xml配置文件,控制器代理以用户实现的控制器作为目标,以拦截器链中的拦截器作为处理(Advice)。
WebWork中创建控制器代理的方式,就是一种AOP(面向切面编程)编程方式,
WebWork存在如下优点:
(1)Action无需与Servlet API耦合,更容易测试
(2)Action无需与WebWork耦合,代码重用率高
WebWork中的Action其实就是一个POJO,该Action仅仅实现了WebWork的Action接口,包含了一个execute方法。WebWork中的Action无需与任何Servlet API、WebWork API耦合,从而具有更好的代码重用率。
(3)支持更多的表现层技术,有更好的适应性
Struts 2起源:
第一个框架就是传统Struts 1和WebWork结合后的Struts 2框架:是以WebWork为核心,Struts 2为传统Struts 1注入了WebWork的设计理念,统一了Struts 1和WebWork两个框架
另外一个框架是Shale:
— Struts与JSF集成,而Shale则是建立在JSF之上。
— Struts实质上是一个巨大的、复杂的请求处理器;而Shale则是一组能以任何方式进行组合的服务,简单地说,Shale是一种SOA(面向服务架构)架构。
Struts 2体系介绍:
Struts 2使用了WebWork的设计核心,而不是使用Struts 1的设计核心。Struts 2大量使用拦截器来处理用户请求,从而允许用户的业务逻辑控制器与Servlet API分离。
Struts 2使用拦截器作为处理(Advice),以用户的业务逻辑控制器为目标,创建一个控制器代理。控制器代理负责处理用户请求,处理用户请求时回调业务控制器的execute方法,该方法的返回值将决定了Struts 2将怎样的视图资源呈现给用户。
Struts 2框架的大致处理流程如下:
1.浏览器发送请求,例如请求/mypage.action、/reports/myreport.pdf等。
2.核心控制器FilterDispatcher根据请求决定调用合适的Action。
3. WebWork的拦截器链自动对请求应用通用功能,例如workflow、validation或文件上传等功能。
4. 回调Action的execute方法,该execute方法先获取用户请求参数,然后执行某种数据库操作,既可以是将数据保存到数据库,也可以从数据库中检索信息。实际上,因为Action只是一个控制器,它会调用业务逻辑组件来处理用户的请求。
5. Action的execute方法处理结果信息将被输出到浏览器中,可以是HTML页面、图像,也可以是PDF文档或者其他文档。此时支持的视图技术非常多,既支持JSP,也支持Velocity、FreeMarker等模板技术。
Struts 2的配置文件:
Struts 2创建系统的Action代理时,需要使用Struts 2的配置文件。
Struts 2的配置文件有两份:
— 配置Action的struts.xml文件。struts.xml文件内定义了Struts 2的系列Action,定义Action时,指定该Action的实现类,并定义该Action处理结果与视图资源之间的映射关系。
— 配置Struts 2全局属性的struts.properties文件。struts.properties文件的形式是系列的key、value对,它指定了Struts 2应用的全局属性。
struts.xml配置文件的示例:
<struts>
<!-- Struts 2的Action都必须配置在package里 -->
<package name="default" extends="struts-default">
<!-- 定义一个Logon的Action,实现类为lee.Logon -->
<action name="Logon" class="lee.Logon">
<!-- 配置Action返回input时转入/pages/Logon.jsp页面 -->
<result name="input">/pages/Logon.jsp</result>
<!-- 配置Action返回cancel时重定向到Welcome的Action-->
<result name="cancel" type="redirect-action">Welcome</result>
<!-- 配置Action返回success时重定向到MainMenu的Action -->
<result type="redirect-action">MainMenu</result>
<!-- 配置Action返回expired时进入ChangePassword的Action链 -->
<result name="expired" type="chain">ChangePassword</result>
</action>
<!-- 定义Logoff的Action,实现类为lee.Logoff -->
<action name="Logoff" class=" lee.Logoff">
<!-- 配置Action返回success时重定向到MainMenu的Action -->
<result type="redirect-action">Welcome</result>
</action>
</package>
</struts>
上述定义Action时,不仅定义了Action的实现类,而且的定义Action的处理结果时,指定了多个result,result元素指定execute方法返回值和视图资源之间的映射关系
定义result元素时,可以指定两个属性:type和name。其中name指定了execute方法返回的字符串,而type指定转向的资源类型,此处转向的资源可以是JSP,也可以是FreeMarker等,甚至是另一个Action——这也是Struts 2可以支持多种视图技术的原因。
Strut 2的标签库:
实现表现层数据处理,而且提供了基本的流程控制功能,还提供了国际化、Ajax支持等功能。
Struts 2的标签库的功能非常复杂,该标签库几乎可以完全替代JSTL的标签库。而且Struts 2的标签支持表达式语言,这种表达式语言支持一个强大和灵活的表达式语言:OGNL(Object Graph Notation Language),因此功能非常强大。
Struts 2的控制器组件:
MVC框架都是以控制器组件为核心的,Struts 2的控制器由两个部分组成:FilterDispatcher和业务控制器Action。
Struts 2应用中起作用的业务控制器不是用户定义的Action,而是系统生成的Action代理,但该Action代理以用户定义的Action为目标。
该Action类完全是一个POJO(普通、传统的Java对象),因此具有很好的复用性。
Action类有如下优势:
— Action类完全是一个POJO,因此具有很好的代码复用性。
— Action类无需与Servlet API耦合,因此进行单元测试非常简单。
— Action类的execute方法仅返回一个字符串作为处理结果,该处理结果可映射到任何的视图,甚至是另一个Action。
Struts 2与Struts 1的对比:
— Action实现类方面的对比:Struts 1要求Action类继承一个抽象基类;Struts 1的一个具体问题是使用抽象类编程而不是接口。Struts 2 Action类可以实现一个Action接口,也可以实现其他接口,使可选和定制的服务成为可能。Struts 2提供一个ActionSupport基类去实现常用的接口。即使Action接口不是必须实现的,只有一个包含execute方法的POJO类都可以用作Struts 2的Action。
— 线程模式方面的对比:Struts 1 Action是单例模式并且必须是线程安全的,因为仅有Action的一个实例来处理所有的请求。单例策略限制了Struts 1 Action能做的事,并且要在开发时特别小心。Action资源必须是线程安全的或同步的;Struts 2 Action对象为每一个请求产生一个实例,因此没有线程安全问题。
— Servlet依赖方面的对比:Struts 1 Action依赖于Servlet API,因为Struts 1 Action的execute方法中有HttpServletRequest和HttpServletResponse方法。Struts 2 Action不再依赖于Servlet API,从而允许Action脱离Web容器运行,从而降低了测试Action的难度。 当然,如果Action需要直接访问HttpServletRequest和HttpServletResponse参数,Struts 2 Action仍然可以访问它们。但是,大部分时候,Action都无需直接访问HttpServetRequest和HttpServletResponse,从而给开发者更多灵活的选择。
— 可测性方面的对比:测试Struts 1 Action的一个主要问题是execute方法依赖于Servlet API,这使得Action的测试要依赖于Web容器。为了脱离Web容器测试Struts 1的Action,必须借助于第三方扩展:Struts TestCase,该扩展下包含了系列的Mock对象(模拟了HttpServetRequest和HttpServletResponse对象),从而可以脱离Web容器测试Struts 1的Action类。Struts 2 Action可以通过初始化、设置属性、调用方法来测试。
— 封装请求参数的对比:Struts 1使用ActionForm对象封装用户的请求参数,所有的ActionForm必须继承一个基类:ActionForm。普通的JavaBean不能用作ActionForm,因此,开发者必须创建大量的ActionForm类封装用户请求参数。虽然Struts 1提供了动态ActionForm来简化ActionForm的开发,但依然需要在配置文件中定义ActionForm;Struts 2直接使用Action属性来封装用户请求属性,避免了开发者需要大量开发ActionForm类的烦琐,实际上,这些属性还可以是包含子属性的Rich对象类型。如果开发者依然怀念Struts 1 ActionForm的模式,Struts 2提供了ModelDriven模式,可以让开发者使用单独的Model对象来封装用户请求参数,但该Model对象无需继承任何Struts 2基类,是一个POJO,从而降低了代码污染。
— 表达式语言方面的对比:Struts 1整合了JSTL,因此可以使用JSTL表达式语言。这种表达式语言有基本对象图遍历,但在对集合和索引属性的支持上则功能不强;Struts 2可以使用JSTL,但它整合了一种更强大和灵活的表达式语言:OGNL(Object Graph Notation Language),因此,Struts 2下的表达式语言功能更加强大。
— 绑定值到视图的对比:Struts 1使用标准JSP机制把对象绑定到视图页面;Struts 2使用“ValueStack”技术,使标签库能够访问值,而不需要把对象和视图页面绑定在一起。
— 类型转换的对比:Struts 1 ActionForm 属性通常都是String类型。Struts 1使用Commons-Beanutils进行类型转换,每个类一个转换器,转换器是不可配置的;Struts 2使用OGNL进行类型转换,支持基本数据类型和常用对象之间的转换。
— 数据校验的对比:Struts 1支持在ActionForm重写validate方法中手动校验,或者通过整合Commons alidator框架来完成数据校验。Struts 2支持通过重写validate方法进行校验,也支持整合XWork校验框架进行校验。
— Action执行控制的对比:Struts 1支持每一个模块对应一个请求处理(即生命周期的概念),但是模块中的所有Action必须共享相同的生命周期。Struts 2支持通过拦截器堆栈(Interceptor Stacks)为每一个Action创建不同的生命周期。开发者可以根据需要创建相应堆栈,从而和不同的Action一起使用。
WebWork和Struts 2对比:
Struts 2仅仅是改变了WebWork下的名称
Struts 2也删除了WebWork中少量特性:
— AroundInterceptor:Struts 2不再支持WebWork中的AroundInterceptor。如果应用程序中需要使用AroundInterceptor,则应该自己手动导入WebWork中的AroundInterceptor类。
— 富文本编辑器标签:Struts 2不再支持WebWork的富文本编辑器,如果应用中需要使用富文本编辑器,则应该使用Dojo的富文本编辑器。
— IoC容器支持:Struts 2不再支持内建的IoC容器,而改为全面支持Spring的IoC容器,以Spring的IoC容器作为默认的Object工厂。
◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇↓↓↓↓↓↓↓◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇
Struts2.0实践开发之环境配置:
Struts2.0架包文件结构:
apps 打包好的项目,包含struts2.0的示例项目
doc 文档,包含struts2.0快速入门、struts文档及API文档
lib 存放struts2.0核心类库,以及第三方插件类库
src 包含struts2.0全部源代码
1.控制器
Struts 2.0中的控制器分为核心控制器和业务控制器(用户控制器),其中业务控制器是用户创建的Action类。下面介绍这两种控制器。
?
核心控制器:FilterDispatcher。
FilterDispatcher类存在于org.apache.struts2.dispatcher包下,它继承了javax.servlet.Filter接口。在应用的web.xml文件中需要配置该控制器,用来接收用户所有请求,FilterDispatcher会判断请求是否为*.action模式,如果匹配,则FilterDispatcher将请求转发给Struts 2.0框架进行处理。在web.xml文件中对FilterDispatcher的配置可查看1.14.1节中的介绍。
?
业务控制器。
由用户创建的Action类实例,充当着Struts 2.0中的业务控制器,也可称为用户控制器。创建Action类时,通常使其继承Struts 2.0包中的com.opensymphony.xwork2.ActionSupport类。在Action类中可实现execute()方法,当有请求访问该Action类时,execute()方法会被调用来处理请求。
Struts 2.0也需要在配置文件中对Action进行配置。该配置主要就是将用户请求与业务控制器进行关联,然后指定请求处理结束后返回的视图资源。
<action name="userLogin" class="com.yxq.action.LoginAction"> <!-- 若请求路径中包含“userLogin.action”,则转发给LoginAction业务控制器 -->
<result>/welcome.jsp</result> <!-- 登录成功后,转发到welcome.jsp页面 -->
<result name="loginError">/login.jsp</result> <!-- 登录失败后,转发到login.jsp页面 -->
</action>
Struts 2.0中可使用拦截器处理请求。在一些拦截器中通过com.opensymphony.xwork2.Action- Context类将请求、会话与Map对象进行了映射。在开发程序时,若仅仅是对请求或会话进行存取数据的操作,则可使创建的Action控制器继承相应的接口,在拦截器中来判断该Action控制器是哪个接口的实例,根据判断,生成一个与请求进行映射的Map对象或与会话进行映射的Map对象。在用户Action控制器中,对这些Map对象进行数据存取操作,即可实现对请求或会话的数据存取操作。
Struts 2.0中实现该功能的拦截器为ServletConfigInterceptor,它存放在struts2-core-2.0.11.jar中的org.apache.struts2.interceptor包下。
2.模型组件:
实际上模型组件概念的范围是很广的,对于实现了MVC体系结构的Struts 2.0框架来说,在模型的设计方面并没有提供太多的帮助。在Java Web应用中,模型通常由JavaBean组成,一种JavaBean被指定用来封装表单数据,实现了视图与控制器之间的数据传递;另一种则实现了具体的业务,称为系统的业务逻辑组件。
在MVC体系结构中,位于控制层的业务控制器负责接收请求,然后调用业务逻辑组件处理请求,最后转发请求到指定视图。所以,真正用来处理请求的是系统中的模型组件。
3.视图组件:
Struts 2.0完成了请求的处理后,将根据在配置文件中的配置,决定返回怎样的视图,这主要是通过<result>元素的type属性来决定。若返回FreeMarker模板,则设置type属性的值为freemarker;若返回Velocity模板,则设置为velocity;若返回另外一个Action动作,则设置为redirectAction;在没有设置type属性的情况下,默认返回的视图为JSP页面。
<action name="returnType" class="com.yxq.action.ReturnAction">
<result>/welcome.jsp</result> <!-- 返回JSP页面 -->
<result name="vm" type=" velocity ">/welcome.vm </result> <!-- 返回Velocity模板 -->
<result name="action " type=" redirectAction ">myReturn.action</result> <!-- 返回Action动作 -->
</action>
4.配置文件
Struts 2.0默认会加载Web应用WEB-INF/classes目录下的struts.xml配置文件,通过该文件的配置为用户请求指定处理类,并设置该请求处理结束后返回的视图资源。在开发大型项目时,这往往struts.xml文件会导致过于庞大,降低了可读性。此时可以自己创建配置文件,然后在struts.xml文件中通过<include>元素包含这些文件。
例如在struts.xml文件中包含名为myxml.xml的文件:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN""http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<include file="myxml.xml"/> <!-- 包含myxml.xml文件 -->
</struts>
在myxml.xml文件中配置用户请求与处理类的关系。例如下面的配置:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN""http://struts.apache.org/dtds/struts-2.0.dtd">?
<struts> ?
<package name=" example" extends="struts-default">?
<action name="my" class="com.yxq.action. MyAction">?
<result>/welcome.jsp
</result>
</action>
……//其他<action>元素的配置
</package>
</struts>Struts2.0配置文件的根元素。
?
包元素。name属性指定了包名称;extends属性指定了继承的另一个包元素;struts-default是在struts-default.xml文件中定义的包的名称。struts-default.xml位于struts2-core-2.0.11.jar文件下,在该文件的struts-default包元素中,定义了<result>元素的type属性所能指定的视图类型、Struts 2.0中提供的拦截器以及对继承了struts-default包的XML配置文件中配置的所有Action类默认执行的拦截器。
<action>元素,用来配置业务控制器与请求的关系。
<result>元素,指定请求处理结束后返回的视图资源。
5.消息资源文件
Struts 2.0中用来存储提示信息的properties资源文件有以下3种:应用范围内的资源文件、包(package)范围内的资源文件和Action类范围内的资源文件。
★应用范围内的资源文件。
该资源文件在整个应用内都可以被访问,通常称为全局资源文件,它需要在struts.properties配置文件中指定。例如,在WEB-INF/classes目录下创建了一个名为allMessage.properties的全局资源文件,在struts.properties文件中需进行如下配置:
struts.custom.i18n.resources=allMessage
若将文件保存在了WEB-INF/classes/messages目录下,需进行如下配置:
struts.custom.i18n.resources= messages.allMessage
struts.properties文件通常应被存放到Web应用的WEB-INF/classes目录下,Struts 2.0会自动加载该文件,该文件以key=value的形式存储了一些在Struts 2.0启动时对Web应用进行的配置,key用来表示配置选项名称,value表示配置选项的值,如解决Struts 2.0中文乱码的问题。
★包(package)范围内的资源文件。
包范围内的资源文件必须命名为package_xx_XX.properties,其中xx表示语言代码,XX表示地区代码,例如package_zh_CN.properties表示中文(中国)。通过这样命名,可以实现应用程序国际化。也可忽略语言代码与地区代码,命名为package.properties,表示任意语言(地区)。包范围内的资源文件只可被当前包中的类文件访问。
★Action类范围内的资源文件。
该资源文件只可被某一个Action类访问,它必须与访问它的Action类存放在同一个目录下,并且文件的命名与该Action类的名称相同。
创建一个web工程,搭建struts2.0开发环境
第一步:导入Struts 2.0类包文件
将以下包拷入web-inf---lib目录
commons-logging-1.0.4.jar
commons-fileupload-1.2.1.jar
freemarker-2.3.13.jar
ognl-2.6.11.jar
struts2-core-2.1.6.jar
xwork-2.1.2.jar
(struts2.1.6对文件上传功能的改进)
第二步:编辑Web应用的web.xml配置文件,配置Struts 2的核心Filter
在web.xml中添加核心控制器,相当于mvc中的过滤器
代码如下:
<?xml version="1.0" encoding="GBK"?>
<!-- web-app是Web应用配置文件的根元素,指定Web应用的Schema信息 -->
<web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.
com/xml/ns/j2ee/web-app_2_4.xsd">
☆<!-- 定义Struts 2的FilterDispatcher的Filter -->
<filter>
<filter-name>struts2</filter-name> <!-- 定义核心Filter的名字 -->
<filter-class>org.apache.Struts2.dispatcher.FilterDispatcher</ filter-class><!-- 定义核心Filter的实现类 -->
</filter>
☆<!-- FilterDispatcher用来初始化Struts 2并且处理所有的Web请求 -->
<filter-mapping>
<filter-name>Struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
需要配置的部分如下:
<!-- 定义Struts2的FilterDispathcer的Filter -->
<filter>
<filter-name>struts2</filter-name><!-- 命名Struts 2.0核心类 -->
<filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class><!-- 指定Struts 2.0核心类 -->
</filter>
<-- 配置核心类处理的请求 -->
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern><!-- 指定处理用户所有请求 --><!-- FilterDispatcher用来初始化struts2并且处理所有的WEB请求。 -->
</filter-mapping>
第三步:创建struts.xml文件
新建xml文件即struts2.0配置文件命名为struts.xml,此文件必须放在src根目录下
(☆☆☆注:一定要放在这个src包的根目录下☆☆☆)
代码如下:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.1//EN"
"http://struts.apache.org/dtds/struts-2.1.dtd">
<struts>
<package name="struts2pak" extends="struts-default">
</package>
</struts>
代码详解:
根标签:<struts>
定义包<package name="" extends=""必须继承struts-default包></package>
</struts>
struts核心包 :xml-defaulst.xml xml的处理指令版本和编码格式
第四步:创建Action类,添加方法
方法代码如下:
public String execute()throws Exception
{
return "abc";
}
第五步:在struts.xml文件中配置action
(相当于mvc中的servlet)
代码如下:
<action name="test" class="com.haitian.test.action.testAction">
<result name="abc">/MyJsp.jsp</result>
</action>
代码详解:
<action name=""为struts取名 class=""类路径>
<result name=""(是action中的action返回值)></result>是从action方法中取得返回值
</action>
</package>
</struts>
第六步: 测试:试着从浏览器访问action,如果说找不到项目就把tomcat中的common下的endorsed下的xml-apis.jar文件移除,重启tomcat即可。
主要内容:Struts2.0开发环境搭建
说明:本文内容有引入李刚老师的《Struts2 权威指南》书中的部分
相对于Struts1.0来说Struts2.0是一个全新的框架,但又不是一个新发布的框架,它是基于webwork基础之上建立起来的。
MVC思想(MVC模式的主要策略):
MVC思想将一个应用分成三个基本部分:Model(模型)、View(视图)和Controller(控制器),这三个部分以最少的耦合协同工作,从而提高应用的可扩展性及可维护性。
MVC有如下特点(MVC主要优势)。
— 多个视图可以对应一个模型。按MVC设计模式,一个模型对应多个视图,可以减少代码的复制及代码的维护量,一旦模型发生改变,也易于维护。
— 模型返回的数据与显示逻辑分离。模型数据可以应用任何的显示技术,例如,使用JSP页面、Velocity模板或者直接产生Excel文档等。
— 应用被分隔为三层,降低了各层之间的耦合,提供了应用的可扩展性。
— 控制层的概念也很有效,由于它把不同的模型和不同的视图组合在一起,完成不同的请求。因此,控制层可以说是包含了用户请求权限的概念。
— MVC更符合软件工程化管理的精神。不同的层各司其职,每一层的组件具有相同的特征,有利于通过工程化和工具化产生管理程序代码。
经典的MVC思想与Web应用的MVC思想也存在一定的差别,引起差别的主要原因是因为Web应用是一种请求/响应模式下应用,对于请求/响应应用,如果用户不对应用发出请求,视图无法主动更新自己。
常用的MVC框架:
1.JSF
基本知识及相关特征:
JSF是一个标准,而不是一个产品。JSF中没有控制器对象,控制器行为通过模型对象实现。JSF也允许生成独立的控制器对象。JSF依然是基于JSP/Servlet的,仍然是JSP/Servlet架构,因而学习曲线相对简单。
JSF也会存在一些不足:
— 作为新兴的MVC框架,用户相对较少,相关资源也不是非常丰富。
— JSF并不是一个完全组件化的框架,它依然是基于JSP/Servlet架构的。
— JSF的成熟度还有待进一步提高。
2.Tapestry
基本知识及相关特征:
包含了前端的MVC框架,还包含了一种视图层的模板技术,使用Tapestry完全可以与Servlet/JSP API分离,是一种非常优秀的设计。开发者完全不需要使用JSP技术,用户只需要使用Tapestry提供的模板技术即可,Tapestry实现了视图逻辑和业务逻辑的彻底分离。
Tapsetry是完全组件化的框架。Tapestr只有组件或页面两个概念,因此,链接跳转目标要么是组件,要么是页面,没有多余的path概念。组件名,也就是对象名称,组件名称和path名称合二为一。
不足:
— Tapestry的学习曲线相对陡峭,国内开发群体不是非常活跃,文档不是十分丰富。官方的文档太过学院派,缺乏实际的示例程序。
— Tapestry的组件逻辑比较复杂,再加上OGNL表达式和属性指定机制,因而难以添加注释。
3.Spring MVC
基本知识及相关特征:
Spring提供了一个细致完整的MVC框架。该框架为模型、视图、控制器之间提供了一个非常清晰的划分,各部分耦合极低。完全基于接口编程,真正实现了视图无关。
Spring MVC框架以DispatcherServlet为核心控制器,该控制器负责拦截用户的所有请求,将请求分发到对应的业务控制器。所有控制器都必须实现Controller接口,该接口仅定义ModelAndView handleRequest(request,response)方法。通过实现该接口来实现用户的业务逻辑控制器。
Spring MVC视图解析策略:它的控制器返回一个ModelAndView对象,该对象包含视图名字和Model,Model提供了Bean的名字及其对象的对应关系。视图名解析的配置非常灵活,抽象的Model完全独立于表现层技术,不会与任何表现层耦合:JSP、Velocity或者其他的技术——都可以和Spring整合。
Tapestry框架而言,Spring MVC依然是基于JSP/Servlet API的。
Spring MVC框架的一些缺点:
— Spring的MVC与Servlet API耦合,难以脱离Servlet容器独立运行,降低了Spring MVC框架的可扩展性。
— 太过细化的角色划分,太过烦琐,降低了应用的开发效率。
— 过分追求架构的完美,有过度设计的危险。
Struts 2的起源和背景
★★★Struts 1:
Struts 1框架以ActionServlet作为核心控制器,整个应用由客户端请求驱动。当客户端向Web应用发送请求时,请求将被Struts 1的核心控制器ActionServlet拦截,ActionServlet根据请求决定是否需要调用业务逻辑控制器处理用户请求(实际上,业务逻辑控制器还是控制器,它只是负责调用模型来处理用户请求),当用户请求处理完成后,其处理结果通过JSP呈现给用户。
Struts 1中的MVC:
(1)Model部分
Struts 1的Model部分主要由底层的业务逻辑组件充当,这些业务逻辑组件封装了底层数据库访问、业务逻辑方法实现。Model部分封装了整个应用的所有业务逻辑
(2)View部分
Struts 1的View部分采用JSP实现。
(3)Controller部分
Struts 1的Controller由两个部分组成:
— 系统核心控制器:由Struts 1框架提供,就是系统中的ActionServlet。
— 业务逻辑控制器:由Struts 1框架提供,就是用户自己实现的Action实例。
业务逻辑控制器负责处理用户请求,但业务逻辑控制器本身并不具有处理能力,而是调用Model来完成处理。
Struts 1提供了系统所需要的核心控制器,也为实现业务逻辑控制器提供了许多支持。因此,控制器部分就是Struts 1框架的核心。
Struts 1 MVC框架的一些缺点:
Struts 1与JSP/Servlet耦合非常紧密
(1)支持的表现层技术单一:只支持JSP作为表现层技术
(2)与Servlet API严重耦合,难于测试
HttpServletRequest和HttpServletResponse两个参数,通常由Web容器负责实例化。严重依赖于Web服务器。因此,一旦脱离了Web服务器,Action的测试非常困难。
★★★WebWork:
1.采用了一种更加松耦合的设计,让系统的Action不再与Servlet API耦合。使单元测试更加方便,允许系统从B/S结构向C/S结构转换。
2.支持更多的表现层技术,如Velocity、FreeMarker和XSLT等。
3.脱离Web应用使用,WebWork有自己的控制反转(Inversion of Control)容器,通过控制反转,可以让测试变得更简单,测试中设置实现服务接口的Mock对象完成测试,而不需要设置服务注册。
4.使用OGNL这个强大的表达式语言,可以访问值栈。OGNL对集合和索引属性的支持非常强大。
5.建立在XWork之上,使用ServletDispatcher作为该框架的核心控制器,处理HTTP的响应和请求。
6.控制器都由两个部分组成:
— 核心控制器ServletDispatcher,该控制器框架提供。
— 业务逻辑控制器Action,该控制器由程序员提供。
WebWork的Action可以与Servlet API分离,得益于它灵巧的设计,它使用一个拦截器链,负责将用户请求数据转发到Action,并负责将Action的处理结果转换成对用户的响应。
当用户向Web应用发送请求时,该请求经过ActionContextCleanUp、SiteMesh等过滤器过滤,由WebWork的核心控制器拦截,如果用户请求需要WebWork的业务逻辑控制器处理,该控制器则调用Action映射器,该映射器将用户请求转发到对应的业务逻辑控制器。值得注意的是,此时的业务逻辑控制器并不是开发者实现的控制器,而是WebWork创建的控制器代理。
创建控制器代理时,WebWork需要得到开发者定义的xwork.xml配置文件,控制器代理以用户实现的控制器作为目标,以拦截器链中的拦截器作为处理(Advice)。
WebWork中创建控制器代理的方式,就是一种AOP(面向切面编程)编程方式,
WebWork存在如下优点:
(1)Action无需与Servlet API耦合,更容易测试
(2)Action无需与WebWork耦合,代码重用率高
WebWork中的Action其实就是一个POJO,该Action仅仅实现了WebWork的Action接口,包含了一个execute方法。WebWork中的Action无需与任何Servlet API、WebWork API耦合,从而具有更好的代码重用率。
(3)支持更多的表现层技术,有更好的适应性
Struts 2起源:
第一个框架就是传统Struts 1和WebWork结合后的Struts 2框架:是以WebWork为核心,Struts 2为传统Struts 1注入了WebWork的设计理念,统一了Struts 1和WebWork两个框架
另外一个框架是Shale:
— Struts与JSF集成,而Shale则是建立在JSF之上。
— Struts实质上是一个巨大的、复杂的请求处理器;而Shale则是一组能以任何方式进行组合的服务,简单地说,Shale是一种SOA(面向服务架构)架构。
Struts 2体系介绍:
Struts 2使用了WebWork的设计核心,而不是使用Struts 1的设计核心。Struts 2大量使用拦截器来处理用户请求,从而允许用户的业务逻辑控制器与Servlet API分离。
Struts 2使用拦截器作为处理(Advice),以用户的业务逻辑控制器为目标,创建一个控制器代理。控制器代理负责处理用户请求,处理用户请求时回调业务控制器的execute方法,该方法的返回值将决定了Struts 2将怎样的视图资源呈现给用户。
Struts 2框架的大致处理流程如下:
1.浏览器发送请求,例如请求/mypage.action、/reports/myreport.pdf等。
2.核心控制器FilterDispatcher根据请求决定调用合适的Action。
3. WebWork的拦截器链自动对请求应用通用功能,例如workflow、validation或文件上传等功能。
4. 回调Action的execute方法,该execute方法先获取用户请求参数,然后执行某种数据库操作,既可以是将数据保存到数据库,也可以从数据库中检索信息。实际上,因为Action只是一个控制器,它会调用业务逻辑组件来处理用户的请求。
5. Action的execute方法处理结果信息将被输出到浏览器中,可以是HTML页面、图像,也可以是PDF文档或者其他文档。此时支持的视图技术非常多,既支持JSP,也支持Velocity、FreeMarker等模板技术。
Struts 2的配置文件:
Struts 2创建系统的Action代理时,需要使用Struts 2的配置文件。
Struts 2的配置文件有两份:
— 配置Action的struts.xml文件。struts.xml文件内定义了Struts 2的系列Action,定义Action时,指定该Action的实现类,并定义该Action处理结果与视图资源之间的映射关系。
— 配置Struts 2全局属性的struts.properties文件。struts.properties文件的形式是系列的key、value对,它指定了Struts 2应用的全局属性。
struts.xml配置文件的示例:
<struts>
<!-- Struts 2的Action都必须配置在package里 -->
<package name="default" extends="struts-default">
<!-- 定义一个Logon的Action,实现类为lee.Logon -->
<action name="Logon" class="lee.Logon">
<!-- 配置Action返回input时转入/pages/Logon.jsp页面 -->
<result name="input">/pages/Logon.jsp</result>
<!-- 配置Action返回cancel时重定向到Welcome的Action-->
<result name="cancel" type="redirect-action">Welcome</result>
<!-- 配置Action返回success时重定向到MainMenu的Action -->
<result type="redirect-action">MainMenu</result>
<!-- 配置Action返回expired时进入ChangePassword的Action链 -->
<result name="expired" type="chain">ChangePassword</result>
</action>
<!-- 定义Logoff的Action,实现类为lee.Logoff -->
<action name="Logoff" class=" lee.Logoff">
<!-- 配置Action返回success时重定向到MainMenu的Action -->
<result type="redirect-action">Welcome</result>
</action>
</package>
</struts>
上述定义Action时,不仅定义了Action的实现类,而且的定义Action的处理结果时,指定了多个result,result元素指定execute方法返回值和视图资源之间的映射关系
定义result元素时,可以指定两个属性:type和name。其中name指定了execute方法返回的字符串,而type指定转向的资源类型,此处转向的资源可以是JSP,也可以是FreeMarker等,甚至是另一个Action——这也是Struts 2可以支持多种视图技术的原因。
Strut 2的标签库:
实现表现层数据处理,而且提供了基本的流程控制功能,还提供了国际化、Ajax支持等功能。
Struts 2的标签库的功能非常复杂,该标签库几乎可以完全替代JSTL的标签库。而且Struts 2的标签支持表达式语言,这种表达式语言支持一个强大和灵活的表达式语言:OGNL(Object Graph Notation Language),因此功能非常强大。
Struts 2的控制器组件:
MVC框架都是以控制器组件为核心的,Struts 2的控制器由两个部分组成:FilterDispatcher和业务控制器Action。
Struts 2应用中起作用的业务控制器不是用户定义的Action,而是系统生成的Action代理,但该Action代理以用户定义的Action为目标。
该Action类完全是一个POJO(普通、传统的Java对象),因此具有很好的复用性。
Action类有如下优势:
— Action类完全是一个POJO,因此具有很好的代码复用性。
— Action类无需与Servlet API耦合,因此进行单元测试非常简单。
— Action类的execute方法仅返回一个字符串作为处理结果,该处理结果可映射到任何的视图,甚至是另一个Action。
Struts 2与Struts 1的对比:
— Action实现类方面的对比:Struts 1要求Action类继承一个抽象基类;Struts 1的一个具体问题是使用抽象类编程而不是接口。Struts 2 Action类可以实现一个Action接口,也可以实现其他接口,使可选和定制的服务成为可能。Struts 2提供一个ActionSupport基类去实现常用的接口。即使Action接口不是必须实现的,只有一个包含execute方法的POJO类都可以用作Struts 2的Action。
— 线程模式方面的对比:Struts 1 Action是单例模式并且必须是线程安全的,因为仅有Action的一个实例来处理所有的请求。单例策略限制了Struts 1 Action能做的事,并且要在开发时特别小心。Action资源必须是线程安全的或同步的;Struts 2 Action对象为每一个请求产生一个实例,因此没有线程安全问题。
— Servlet依赖方面的对比:Struts 1 Action依赖于Servlet API,因为Struts 1 Action的execute方法中有HttpServletRequest和HttpServletResponse方法。Struts 2 Action不再依赖于Servlet API,从而允许Action脱离Web容器运行,从而降低了测试Action的难度。 当然,如果Action需要直接访问HttpServletRequest和HttpServletResponse参数,Struts 2 Action仍然可以访问它们。但是,大部分时候,Action都无需直接访问HttpServetRequest和HttpServletResponse,从而给开发者更多灵活的选择。
— 可测性方面的对比:测试Struts 1 Action的一个主要问题是execute方法依赖于Servlet API,这使得Action的测试要依赖于Web容器。为了脱离Web容器测试Struts 1的Action,必须借助于第三方扩展:Struts TestCase,该扩展下包含了系列的Mock对象(模拟了HttpServetRequest和HttpServletResponse对象),从而可以脱离Web容器测试Struts 1的Action类。Struts 2 Action可以通过初始化、设置属性、调用方法来测试。
— 封装请求参数的对比:Struts 1使用ActionForm对象封装用户的请求参数,所有的ActionForm必须继承一个基类:ActionForm。普通的JavaBean不能用作ActionForm,因此,开发者必须创建大量的ActionForm类封装用户请求参数。虽然Struts 1提供了动态ActionForm来简化ActionForm的开发,但依然需要在配置文件中定义ActionForm;Struts 2直接使用Action属性来封装用户请求属性,避免了开发者需要大量开发ActionForm类的烦琐,实际上,这些属性还可以是包含子属性的Rich对象类型。如果开发者依然怀念Struts 1 ActionForm的模式,Struts 2提供了ModelDriven模式,可以让开发者使用单独的Model对象来封装用户请求参数,但该Model对象无需继承任何Struts 2基类,是一个POJO,从而降低了代码污染。
— 表达式语言方面的对比:Struts 1整合了JSTL,因此可以使用JSTL表达式语言。这种表达式语言有基本对象图遍历,但在对集合和索引属性的支持上则功能不强;Struts 2可以使用JSTL,但它整合了一种更强大和灵活的表达式语言:OGNL(Object Graph Notation Language),因此,Struts 2下的表达式语言功能更加强大。
— 绑定值到视图的对比:Struts 1使用标准JSP机制把对象绑定到视图页面;Struts 2使用“ValueStack”技术,使标签库能够访问值,而不需要把对象和视图页面绑定在一起。
— 类型转换的对比:Struts 1 ActionForm 属性通常都是String类型。Struts 1使用Commons-Beanutils进行类型转换,每个类一个转换器,转换器是不可配置的;Struts 2使用OGNL进行类型转换,支持基本数据类型和常用对象之间的转换。
— 数据校验的对比:Struts 1支持在ActionForm重写validate方法中手动校验,或者通过整合Commons alidator框架来完成数据校验。Struts 2支持通过重写validate方法进行校验,也支持整合XWork校验框架进行校验。
— Action执行控制的对比:Struts 1支持每一个模块对应一个请求处理(即生命周期的概念),但是模块中的所有Action必须共享相同的生命周期。Struts 2支持通过拦截器堆栈(Interceptor Stacks)为每一个Action创建不同的生命周期。开发者可以根据需要创建相应堆栈,从而和不同的Action一起使用。
WebWork和Struts 2对比:
Struts 2仅仅是改变了WebWork下的名称
Struts 2也删除了WebWork中少量特性:
— AroundInterceptor:Struts 2不再支持WebWork中的AroundInterceptor。如果应用程序中需要使用AroundInterceptor,则应该自己手动导入WebWork中的AroundInterceptor类。
— 富文本编辑器标签:Struts 2不再支持WebWork的富文本编辑器,如果应用中需要使用富文本编辑器,则应该使用Dojo的富文本编辑器。
— IoC容器支持:Struts 2不再支持内建的IoC容器,而改为全面支持Spring的IoC容器,以Spring的IoC容器作为默认的Object工厂。
◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇↓↓↓↓↓↓↓◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇
Struts2.0实践开发之环境配置:
Struts2.0架包文件结构:
apps 打包好的项目,包含struts2.0的示例项目
doc 文档,包含struts2.0快速入门、struts文档及API文档
lib 存放struts2.0核心类库,以及第三方插件类库
src 包含struts2.0全部源代码
1.控制器
Struts 2.0中的控制器分为核心控制器和业务控制器(用户控制器),其中业务控制器是用户创建的Action类。下面介绍这两种控制器。
?
核心控制器:FilterDispatcher。
FilterDispatcher类存在于org.apache.struts2.dispatcher包下,它继承了javax.servlet.Filter接口。在应用的web.xml文件中需要配置该控制器,用来接收用户所有请求,FilterDispatcher会判断请求是否为*.action模式,如果匹配,则FilterDispatcher将请求转发给Struts 2.0框架进行处理。在web.xml文件中对FilterDispatcher的配置可查看1.14.1节中的介绍。
?
业务控制器。
由用户创建的Action类实例,充当着Struts 2.0中的业务控制器,也可称为用户控制器。创建Action类时,通常使其继承Struts 2.0包中的com.opensymphony.xwork2.ActionSupport类。在Action类中可实现execute()方法,当有请求访问该Action类时,execute()方法会被调用来处理请求。
Struts 2.0也需要在配置文件中对Action进行配置。该配置主要就是将用户请求与业务控制器进行关联,然后指定请求处理结束后返回的视图资源。
<action name="userLogin" class="com.yxq.action.LoginAction"> <!-- 若请求路径中包含“userLogin.action”,则转发给LoginAction业务控制器 -->
<result>/welcome.jsp</result> <!-- 登录成功后,转发到welcome.jsp页面 -->
<result name="loginError">/login.jsp</result> <!-- 登录失败后,转发到login.jsp页面 -->
</action>
Struts 2.0中可使用拦截器处理请求。在一些拦截器中通过com.opensymphony.xwork2.Action- Context类将请求、会话与Map对象进行了映射。在开发程序时,若仅仅是对请求或会话进行存取数据的操作,则可使创建的Action控制器继承相应的接口,在拦截器中来判断该Action控制器是哪个接口的实例,根据判断,生成一个与请求进行映射的Map对象或与会话进行映射的Map对象。在用户Action控制器中,对这些Map对象进行数据存取操作,即可实现对请求或会话的数据存取操作。
Struts 2.0中实现该功能的拦截器为ServletConfigInterceptor,它存放在struts2-core-2.0.11.jar中的org.apache.struts2.interceptor包下。
2.模型组件:
实际上模型组件概念的范围是很广的,对于实现了MVC体系结构的Struts 2.0框架来说,在模型的设计方面并没有提供太多的帮助。在Java Web应用中,模型通常由JavaBean组成,一种JavaBean被指定用来封装表单数据,实现了视图与控制器之间的数据传递;另一种则实现了具体的业务,称为系统的业务逻辑组件。
在MVC体系结构中,位于控制层的业务控制器负责接收请求,然后调用业务逻辑组件处理请求,最后转发请求到指定视图。所以,真正用来处理请求的是系统中的模型组件。
3.视图组件:
Struts 2.0完成了请求的处理后,将根据在配置文件中的配置,决定返回怎样的视图,这主要是通过<result>元素的type属性来决定。若返回FreeMarker模板,则设置type属性的值为freemarker;若返回Velocity模板,则设置为velocity;若返回另外一个Action动作,则设置为redirectAction;在没有设置type属性的情况下,默认返回的视图为JSP页面。
<action name="returnType" class="com.yxq.action.ReturnAction">
<result>/welcome.jsp</result> <!-- 返回JSP页面 -->
<result name="vm" type=" velocity ">/welcome.vm </result> <!-- 返回Velocity模板 -->
<result name="action " type=" redirectAction ">myReturn.action</result> <!-- 返回Action动作 -->
</action>
4.配置文件
Struts 2.0默认会加载Web应用WEB-INF/classes目录下的struts.xml配置文件,通过该文件的配置为用户请求指定处理类,并设置该请求处理结束后返回的视图资源。在开发大型项目时,这往往struts.xml文件会导致过于庞大,降低了可读性。此时可以自己创建配置文件,然后在struts.xml文件中通过<include>元素包含这些文件。
例如在struts.xml文件中包含名为myxml.xml的文件:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN""http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<include file="myxml.xml"/> <!-- 包含myxml.xml文件 -->
</struts>
在myxml.xml文件中配置用户请求与处理类的关系。例如下面的配置:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN""http://struts.apache.org/dtds/struts-2.0.dtd">?
<struts> ?
<package name=" example" extends="struts-default">?
<action name="my" class="com.yxq.action. MyAction">?
<result>/welcome.jsp
</result>
</action>
……//其他<action>元素的配置
</package>
</struts>Struts2.0配置文件的根元素。
?
包元素。name属性指定了包名称;extends属性指定了继承的另一个包元素;struts-default是在struts-default.xml文件中定义的包的名称。struts-default.xml位于struts2-core-2.0.11.jar文件下,在该文件的struts-default包元素中,定义了<result>元素的type属性所能指定的视图类型、Struts 2.0中提供的拦截器以及对继承了struts-default包的XML配置文件中配置的所有Action类默认执行的拦截器。
<action>元素,用来配置业务控制器与请求的关系。
<result>元素,指定请求处理结束后返回的视图资源。
5.消息资源文件
Struts 2.0中用来存储提示信息的properties资源文件有以下3种:应用范围内的资源文件、包(package)范围内的资源文件和Action类范围内的资源文件。
★应用范围内的资源文件。
该资源文件在整个应用内都可以被访问,通常称为全局资源文件,它需要在struts.properties配置文件中指定。例如,在WEB-INF/classes目录下创建了一个名为allMessage.properties的全局资源文件,在struts.properties文件中需进行如下配置:
struts.custom.i18n.resources=allMessage
若将文件保存在了WEB-INF/classes/messages目录下,需进行如下配置:
struts.custom.i18n.resources= messages.allMessage
struts.properties文件通常应被存放到Web应用的WEB-INF/classes目录下,Struts 2.0会自动加载该文件,该文件以key=value的形式存储了一些在Struts 2.0启动时对Web应用进行的配置,key用来表示配置选项名称,value表示配置选项的值,如解决Struts 2.0中文乱码的问题。
★包(package)范围内的资源文件。
包范围内的资源文件必须命名为package_xx_XX.properties,其中xx表示语言代码,XX表示地区代码,例如package_zh_CN.properties表示中文(中国)。通过这样命名,可以实现应用程序国际化。也可忽略语言代码与地区代码,命名为package.properties,表示任意语言(地区)。包范围内的资源文件只可被当前包中的类文件访问。
★Action类范围内的资源文件。
该资源文件只可被某一个Action类访问,它必须与访问它的Action类存放在同一个目录下,并且文件的命名与该Action类的名称相同。
创建一个web工程,搭建struts2.0开发环境
第一步:导入Struts 2.0类包文件
将以下包拷入web-inf---lib目录
commons-logging-1.0.4.jar
commons-fileupload-1.2.1.jar
freemarker-2.3.13.jar
ognl-2.6.11.jar
struts2-core-2.1.6.jar
xwork-2.1.2.jar
(struts2.1.6对文件上传功能的改进)
第二步:编辑Web应用的web.xml配置文件,配置Struts 2的核心Filter
在web.xml中添加核心控制器,相当于mvc中的过滤器
代码如下:
<?xml version="1.0" encoding="GBK"?>
<!-- web-app是Web应用配置文件的根元素,指定Web应用的Schema信息 -->
<web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.
com/xml/ns/j2ee/web-app_2_4.xsd">
☆<!-- 定义Struts 2的FilterDispatcher的Filter -->
<filter>
<filter-name>struts2</filter-name> <!-- 定义核心Filter的名字 -->
<filter-class>org.apache.Struts2.dispatcher.FilterDispatcher</ filter-class><!-- 定义核心Filter的实现类 -->
</filter>
☆<!-- FilterDispatcher用来初始化Struts 2并且处理所有的Web请求 -->
<filter-mapping>
<filter-name>Struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
需要配置的部分如下:
<!-- 定义Struts2的FilterDispathcer的Filter -->
<filter>
<filter-name>struts2</filter-name><!-- 命名Struts 2.0核心类 -->
<filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class><!-- 指定Struts 2.0核心类 -->
</filter>
<-- 配置核心类处理的请求 -->
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern><!-- 指定处理用户所有请求 --><!-- FilterDispatcher用来初始化struts2并且处理所有的WEB请求。 -->
</filter-mapping>
第三步:创建struts.xml文件
新建xml文件即struts2.0配置文件命名为struts.xml,此文件必须放在src根目录下
(☆☆☆注:一定要放在这个src包的根目录下☆☆☆)
代码如下:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.1//EN"
"http://struts.apache.org/dtds/struts-2.1.dtd">
<struts>
<package name="struts2pak" extends="struts-default">
</package>
</struts>
代码详解:
根标签:<struts>
定义包<package name="" extends=""必须继承struts-default包></package>
</struts>
struts核心包 :xml-defaulst.xml xml的处理指令版本和编码格式
第四步:创建Action类,添加方法
方法代码如下:
public String execute()throws Exception
{
return "abc";
}
第五步:在struts.xml文件中配置action
(相当于mvc中的servlet)
代码如下:
<action name="test" class="com.haitian.test.action.testAction">
<result name="abc">/MyJsp.jsp</result>
</action>
代码详解:
<action name=""为struts取名 class=""类路径>
<result name=""(是action中的action返回值)></result>是从action方法中取得返回值
</action>
</package>
</struts>
第六步: 测试:试着从浏览器访问action,如果说找不到项目就把tomcat中的common下的endorsed下的xml-apis.jar文件移除,重启tomcat即可。
发表评论
-
Struts2 开发总结13—19
2009-07-12 17:39 1799public void setCtype(Ctype ctyp ... -
Struts2 开发总结7—13
2009-07-12 17:21 1399Struts2开发总结 (注:Struts2版本:Strut ... -
Struts2开发总结
2009-07-12 10:55 1302Struts2开发总结 (注:S ... -
个人总结:Struts2 上传文件的六种方法
2009-06-09 22:34 1950Struts2 上传实例六种方法(去除了jar包,配置时必须导 ... -
Struts2.0学习笔记之二
2009-03-22 11:07 1179Struts2.0学习笔记第二天2 ...
相关推荐
struts2.0学习笔记1 自己动手做的还算可以的 ]struts2.0学习笔记1 自己动手做的还算可以的struts2.0学习笔记1 自己动手做的还算可以的struts2.0学习笔记1 自己动手做的还算可以的
本学习笔记主要涵盖了Struts2.0的基础概念、核心组件、配置方法以及实际代码示例,旨在帮助开发者更好地理解和运用这个框架。 一、Struts2.0基础 Struts2.0是Apache软件基金会的开源项目,它是Struts1.x的升级版本...
本篇学习笔记将深入探讨Struts2.0的核心概念和配置,帮助你理解和掌握这个框架。 **一、Struts2的作用** Struts2的主要目标是提供一种结构化的开发方式,它整合了请求处理、视图展示和业务逻辑的交互。通过使用...
Struts2.0是一个流行的Java Web开发框架,它极大地简化了MVC(模型-视图-控制器)架构的实现。在Struts2中,类型转换是自动进行的,旨在帮助开发者处理请求参数与Action类属性之间的类型匹配问题。文档中的内容主要...
本培训笔记将深入探讨Struts2.0的核心概念、特性以及如何在实际项目中有效应用。 一、Struts2.0框架基础 Struts2.0是Apache软件基金会的项目,它是Struts1.x的升级版,提供了更强大的功能和更好的性能。该框架通过...
Struts2.0是Java Web开发中非常重要的一个框架,它是Apache软件基金会的开源项目,主要用于构建MVC(Model-View-Controller)架构的应用程序。本笔记将带你深入理解Struts2.0的核心概念和使用方法。 Struts2.0是在...
struts2.0实例源码(struts2是我写的struts2Deom是我下的资源项目一起给大家) 包括strust2.0的所有知识面,每个点我都写了详细注释 网上是很难找到这样的资料的,这是我个人学习笔记拿出来希望跟大家一起学习...
通过阅读Struts2.0中文手册和学习笔记,以及动手实践教程中的示例,可以全面掌握Struts2.0的用法和精髓。在实际项目中,熟练运用Struts2.0能提高开发效率,降低维护成本。同时,了解并熟悉相关的社区资源和最佳实践...
这个压缩包包含的资源是作者学习Struts2.0过程中的笔记和示例,分为两个文档:struts2.0文档1-2.doc和struts2.0文档3-4-5.doc,涵盖了从基础到进阶的内容。 在"struts2.0文档1-2.doc"中,可能包括了以下知识点: 1...
### Struts2.0 学习笔记 #### 引言 Struts2 是一款非常流行的 Java Web 开发框架,它基于 Struts1 进行了重大的改进与优化,不仅继承了 Struts1 的优秀特性,还在此基础上进行了扩展,支持更加丰富的功能,如拦截...
### Struts2学习笔记知识点概览 #### 一、环境搭建 **1.1 Struts2简介** - **Struts2概述**:Struts2是一个开源的MVC框架,它结合了Struts 1.x、WebWork和其他一些框架的优点。Struts2的主要目标是简化Web应用程序...
### Struts2学习笔记知识点详解 #### 一、Struts2框架的基本引入步骤 ##### 1. 导入Struts2相关Jar包 在引入Struts2框架时,首先需要将Struts2的相关Jar包导入到项目的类路径中。这些Jar包通常包括核心库以及其他...
【Spring2.0学习笔记】 在深入探讨Spring2.0的知识点之前,首先理解几个核心概念至关重要。Spring框架的核心设计理念是控制反转(Inversion of Control, IoC)和依赖注入(Dependency Injection, DI)。IoC意味着...
<display-name>Struts2.0HelloWorld <filter-name>struts2 <filter-class>org.apache.struts2.dispatcher.FilterDispatcher <filter-name>struts2 <url-pattern>/* <!-- 其他配置 --> ``` 这段代码...