`
eggbucket
  • 浏览: 186595 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

详谈Struts2的核心概念(下)

阅读更多

详谈Struts2的核心概念(下)作者:匿名   来源:程序员之家   发布者:admin
时间:2010-01-27 11:28:15   点击:4659 5.4  使用本地的资源文件

•         本节中将介绍另外两个接口TextProvider和LocalProvider,它们都是为了使用本地的资源文

件而设计的。

•         在Java中用户语言和地区的信息被封装在java.util.Local类中,而action则通过一个定义与

com.opensymphony.xwork.LocaleProvider接口的方法判断使用哪个Locale获取用于显示的信息文本,这

个接口中只定义了一个方法:

•         Public Locale getLocale()

•         在ActionSupport中,这个方法的默认实现为:通过调用AcitonContext.getContext

().getLocale()方法,利用ActionContext获得locale的值(关于ActionContext的使用将在后面的章节

详细描述)。Struts2通过查询HttpServletRequest对象并调用它的getLocale () 方法将Local与action

调用联系起来。

5.5  用ActionContext与Web容器发生联系

•         在Action的接口定义中,excute()方法并没有HttpServletRequest和HttpServletResponse参

数也就是说Struts2的Action不用去依赖于任何Web容器(不像Struts 1必须在Web容器中才能运行),不

用与那些JavaServlet复杂的请求(Request)、响应(Response)关联在一起。但在Web应用程序开发中,

往往需要在Action里直接获取请求(Request)或会话(Session)的一些信息,甚至需要直接对

JavaServlet Http的请求、响应操作。Struts2 提供了一个工具,用ActionContext对象来与Web容器发

生联系。

•         ActionContext(com.opensymphony.xwork.ActionContext)是Action执行时的上下文,上下

文可以把它看作是一个Map,它存放是Action在执行时需要用到的对象,比如:上下文放有请求的参数(

Parameter)、会话(Session)、Servlet上下文(ServletContext)、本地化(Locale)信息等。在每

次执行Action之前都会创建新的ActionContext,ActionContext是线程安全的,也就是说在同一个线程

里ActionContext里的属性是唯一的,这样的Action就可以在多线程中使用。

5.6  高级输入

•         应用程序经常使用JavaBean表示一个域中的对象,包括User、Address、Block在内地的类就

是这种JavaBean很好的例子。而在Web程序中很大一部工作都是将信息填充到这些对象中去和从Bean中获

取数据信息在网页中表现。本节将以一个完整的实例来说明Sturts 2在这些方面提供了那些便利。

5.7  使用Model-Driven

•         Struts2中,提供了两种Action驱动模式:Property-Driven(属性驱动),Model-Driven(

模型驱动的)。

•         模型驱动的Action很像Struts1中的FormBean,在传递过程中有一个单独的值对象来作为参数

的载体,但在Struts2中这个值对象不必再继承任何接口,只要普通JavaBean就可以充当模型部分。很多

情况下Bean的定义已经存在了,而且是不能修改的(如从外部引入的类或者是已经被大量代码引用的类

),如果必须实现某个接口才能作为FromBean,不得不再新增一个类,Struts2的这个改进非常及时。

5.8  使用Property-Driven

•         Property-Driven 就是Action将直接用自己的字段来充当FormBean的功能,在Struts2入门一

章中,HelloReader这个例子就是采用的这种方法,在Action中直接包含了message属性和它set、get方

法。它一般用在页面表单比较简单的情况使用,而且可以直接把属性作为Action的字段,这样就不用在

另写FormBean,减少了重复代码。

•         上一节的例子如果使用Property-Driven方法,那就是将User与action类合并定义,把User中

的属性值直接转移到action中去,在配置文件中也不必再增加modelDriven这个过滤器。

6  Result类型介绍

•         Result是在Action执行完,一个结果返回后决定发生什么事的类。开发者可以自由的根据他

们的应用和环境的需要创建自己的Result类型。例如在Struts2中Servlet和Velocity结果类型已经被创

建用来显示web应用程序的画面。本节将介绍Struts2 内置的几种Result类型和如何自定义开发Result。

6.1  内置Result类型

•         所有的Result类型都实现了com.opensymphony.xwork.Result接口。这个接口是所有action执

行结果的通用接口,不管这个结果是用来显示一个网页还是产生一个E-mail,发送一个JMS消息还是别的

•         在struts-default.xml中定义了系统提供的缺省Result类型,把它们映射为action配置中可

以引用的名字,在action配置就就不用再使用长类名直接使用这些别名就可以了。

6.2  默认Result

•         Dispatcher Result是最常用的一种result,它也是Struts2默认的result,又称为通用resut

。action执行完后,请求会导向对应的View,相当于<jsp:forword>标签实现的跳转功能。将同一个HTTP

请求中的内容分发至某一个页面(dispatcher类型的result的使用)只要配置文件包含了struts-

default.xml,而且package继承了struts-default,那么使用dispatcher result并不需要其他设置。示

例:

•         <result name="success" type="dispatcher">

•           <param name="location">foo.jsp</param>

•         </result>

6.3  页面跳转 Result

•         Redirect Result与Dispatcher Result作用类似也是实现页面跳转。对上次的响应将重定向

到指定的位置,可以理解为在客户端跳转用户又重新请求了一个新的URL。redirect是重新产生一个新的

request,因此原来request保存的东西将不再有效,比如不能通过再requet.getAtrribute()取得对象,

也不能取得action的实例、errors、field errors等。

•         Redirect Result与Dispatcher Result的区别于源于JSP篇中<jsp:forward>标签与

response.redeiret()的区别。

6.4  创建action链

•         Chain Result是一种result 类型,它基于自己的拦截器stack(堆栈)和result调用一个

action,这样允许一个action附带着原来的状态将请求转到目标action

•         Struts2提供把多个Action按照预先定义好的顺序或者流程链接起来的能力。这个特性通过给

指定的Action设置一个Chain Result,然后通过一个ChainingInterceptor拦截目标Action来实现。

6.5  整合各种View技术

•         Velocity、Freemarker、JasperReports、xslt这4种result都是为了整合不同的视图技术而

设计的。

•         1.Velocity Result:Velocity是一个基于java的模板引擎(template engine)。

•         2.Freemarker Result:Freemarker也是一个模板引擎,允许JavaServlet保持图形设计同应

用程序逻辑的分离,这是通过在模板中密封HTML完成的。模板用servlet提供的数据动态地生成 HTML。

•         3.JasperReports result:JasperReports是一个基于Java的开源报表工具,它可以在Java环

境下像其他IDE报表工具一样来制作报表。

•         4.XSLT Result:XSLT Result用XSLT来转换action对象到XML。

6.6  自定义result

•         Struts2也允许用户自定义自己的result类型,只要实现com.opensymphony.xwork2.Result接

口就可以了。如代码5-29所示,模拟了一种result作用是根据处理结果将给指用户发送一份E-mail。这

个result需要4个参数to、from、subject和body

7  拦截器(Interceptors)介绍

•         拦截器(Interceptor)是Struts2的一个强有力的工具,有许多功能都是构建于它之上,如

国际化、转换器,校验等。Interceptor是Struts2的一大特色,在执行action之前和之后可以使请求通

过一个或多个Interceptor。多个连接器组合在一起实现某一个功能称为interceptor链(Interceptor

Chain,在Struts2中称为拦截器栈Interceptor Stack)。interceptor链就是将interceptor按一定的顺

序联结成一条链。在访问被拦截的方法或字段时,interceptor链中的interceptor就会按其之前定义的

顺序被调用。

7.1  Interceptor的原理

•         Struts2的interceptor实现相对简单。当请求到达Struts2的ServletDispatcher时,Struts2

会查找配置文件,并根据其配置实例化相对的interceptor对象,然后串成一个列表(list),最后一个

一个地调用列表中的拦截器,

 

 

 

 

 

 

 

 

 

 

 

7.2  内置拦截器介绍

•         Struts2包含了许多内置的interceptor,它们提供了很多核心功能和可选的高级特性。

interceptor在struts.default.xml文件中被定义,而一些默认的interceptor栈及interceptor的命名也

被定义其中。框架中提供了很多实用的Interceptor,可以随时使用它们的名字来调用这些interceptor

7.3  使用内置interceptor

•         本节将介绍几种常用interceptor的用法:

•         1.使用timer为action即时

•         2.使用logger 为aciton提供日志

•         3.使用校验

•         4.准备action

•         5.实现ModelDriven

•         6.token和token-session


 

 

 

 

 

 

 

 

 

7.4  内置拦截器栈介绍

•         除了内置的interceptor之外,struts.xml还包含了内置的interceptor组合,可以通过具体

的命名的interceptor栈来使用它们。


7.5  自定义拦截器

•         自定义一个拦截器需要3个步骤:

•         (1)自定义一个实现Interceptor接口的类。

•         (2)在strutx.xml中注册上一步中定义的拦截器。

•         (3)在需要使用的Action中引用上述定义的拦截器,为了方便也可将拦截器定义为默认的拦

截器,这样在不加特殊声明的情况下所有的Action都被这个拦截器拦截。

8  小结

•         本文讲述的是Struts2的核心构成元素及其使用方法,使读者对Sturts 2的体系结构有了一个

清晰的认识。Struts2是一个开放的系统,它的很多实现对用户来说都是透明的,它们在struts-

default.xml 中配置,开发人员配置自己的元素在struts.xml中,这个文件是可以拆分并按用户需要组

织的。Struts2的核心部分由action、interceptor、result3个主要部分构成,Interceptor是它最大特

色。

转载请注明出处:程序员之家http://www.sunxin.org

  • 大小: 13.2 KB
  • 大小: 14.6 KB
分享到:
评论

相关推荐

    详谈Servlet和Filter的区别以及两者在Struts2和Springmvc中的应用

    详谈Servlet和Filter的区别以及两者在Struts2和Springmvc中的应用 Servlet和Filter是Java Web开发中两个非常重要的概念,它们都是Java Servlet API的一部分,但它们之间有着很大的区别。 首先,Servlet是一个在WEB...

    详谈万兆光纤跳线的概念、类型材质和损耗.docx

    ### 详谈万兆光纤跳线的概念、类型材质和损耗 #### 一、万兆光纤跳线概述 万兆光纤跳线是一种高级别的光纤连接器,主要应用于高速数据传输环境中,尤其是在万兆以太网中扮演着至关重要的角色。它采用的是增强型50/...

    详谈NVMe和NVMe-oF基础架构和概念.docx

    2. Kernel-Bypass:应用直接操作设备接口,不再经过系统调用切换到内核态,没有内核切换开销。 3. None-CPU:数据传输无须CPU参与,完全由网卡搞定,无需再做发包收包中断处理,不耗费CPU资源。 NVMe-oF和NVMe之间...

    linux下nfs系统详谈

    Linux下的NFS(Network File System)系统是一种网络文件共享协议,允许不同的计算机通过网络共享文件系统。这篇详谈将深入探讨NFS的工作原理、安装配置、优化以及在Fedora 10系统中的内核设置。 一、NFS概述 NFS是...

    详谈Angular 2+ 的表单(一)之模板驱动型表单

    在Angular 2+中,表单处理是应用开发中的关键组成部分,特别是在企业级应用中,表单的使用频繁且复杂。Angular提供了两种处理表单的方式:模板驱动型表单(Template Driven Forms)和模型驱动型表单(Model Driven ...

    详谈SDN如何对接云平台.docx

    然而,由于现有网络环境的限制和新技术的成熟度问题,SDN的实施通常需要一个过渡过程,这就是广义SDN的概念,它允许部分控制上收,逐步引入SDN的优势。 在SDN与云平台对接的过程中,SDN控制器起着关键作用。控制器...

    机房维护与管理详谈

    机房 维护 与 管理 详谈

    家庭无线局域网组建方案详谈

    家庭无线局域网组建方案详谈 家庭无线局域网组建方案详谈

    hibernate配置要点详谈

    ### Hibernate配置要点详谈 #### 一、配置文件与配置方式 在Hibernate中,有两种主要的配置文件形式:`hibernate.cfg.xml` 和 `hibernate.properties`。 1. **`hibernate.cfg.xml`**: - 这种配置文件通常包含...

    详谈内核的Inline Hook实现.pdf

    ### 详谈内核的Inline Hook实现 #### 引言 在深入探讨内核级Inline Hook的实现之前,我们先简要回顾一下Inline Hook的基本概念。Inline Hook是一种用于修改或拦截函数执行流程的技术,尤其在内核编程和系统级安全...

    PT100AD采样电路和调试经验详谈

    PT100温度传感器是基于铂的电阻温度特性制造的,其测量精度高、适用温度范围广,并且在中温范围内具有良好的重复性和稳定性。PT100广泛用于需要高精度测量的应用中,尤其是工业测量,其温度范围可达-200℃到650℃。...

    一文详谈架构设计.docx

    在探讨架构设计这一主题时,首先要明确架构的基本概念。架构是一个复杂的主题,因为不同的人有不同的理解和定义。...理解并掌握这些核心概念是进行有效架构设计的基础,也是构建高质量、可持续发展的软件系统的前提。

    详谈Unity3D通过Webservice读取数据库

    从结构上看,Unity3D想要拿数据库的数据,问Web拿就可以了,而对数据库的操作已经外包给Web了,不用你操心。是的,理论上的东西看上去就是这么简单。...但是问题是我Unity3D如何向Web拿数据?我当时就卡在了这步,好,...

    HACCP基础知识详谈.pptx

    HACCP基础知识详谈.pptx

    详谈如何开展危机公关.pptx

    详谈如何开展危机公关.pptx

    详谈内核的Inline_Hook实现

    ### 详谈内核的Inline_Hook实现 #### 前言 Inline Hook技术是一种用于在软件层面修改或拦截函数执行流程的技术手段。它通过对目标函数的机器码进行修改,从而实现在函数调用过程中插入自定义逻辑的操作。本文旨在...

    PCB布局经验详谈

    《PCB布局经验详谈》 PCB(Printed Circuit Board)布局设计是电子工程中至关重要的一环,它直接影响到电路板的性能、可靠性和生产效率。本文将深入探讨PCB设计的基本流程、布局原则、布线技巧以及检查与制版的注意...

Global site tag (gtag.js) - Google Analytics