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

详谈Struts2的核心概念(上)

阅读更多

本文将深入探讨Struts2的核心概念,首先介绍的是Struts2的体系结构和几个重要的配置文件,并会举例说明Struts2的核心对象如何配置。然后介绍Struts2最重要的3个组成部分Action、Result、Interceptor(拦截器)的原理和使用方法。

1  术语概述

•         Action在Struts2中是负责Web应用程序中具体逻辑实现的。Action是一个Java类,一般的继承于com.opensymphony.xwork.ActionSupport类,这个类在Struts2的Dispatcher接受到HTTP请求的时候被调用。

•         当一个action执行完毕之后,它将返回一个返回码,譬如“SUCCESS”“INPUT”或者其他“返回代码”。这些“返回代码”通过查找struts.xml中的定义告诉Struts2下一步该做什么而这个下一步就称为result。Struts2 支持许多种不同的result类型,比如返回结果页面给用户。可选择的显示模板技术有JSP、Velocity或者是FreeMarker。

2  Struts2的体系结构

•         Struts2的核心体系结构如图5.1所示。用户在Struts2框架下只需编写自己的Action类来处理逻辑、编写JSP页面(或者其他方式)来展示用户界面和在struts.xml配置映射关系就可以完成基本的业务流程。




 

3  Struts2的配置文件

•         Struts2框架主要有两个核心配置文件:struts.properties和struts.xml。struts.xml与Struts1版本中的struts-config.xml非常类似,主要负责管理应用中的Action映射,以及该Action包含的Result定义等,而struts.properties文件则定义了Struts2框架的全局属性。所有的配置文件说明见表所示,图展示了几个配置文件所在位置和相互关系。

 


3.1  全局配置文件--struts.properties

•         struts.properties文件是一个标准的Properties文件,该文件包含了系列的key-value对象,每个key就是一个Struts2属性,该key对应的value就是一个Struts2属性值。struts.properties文件通常放在Web应用的WEB-INF/classes路径下,实际上,只要将该文件放在Web应用的CLASSPATH路径下,Struts2框架就可以加载该文件。以下是一部分配置片段。

•         struts.enable.DynamicMethodInvocation=false"

•         struts.devMode=false

3.2  核心配置文件--struts.xml

•         struts.xml文件主要负责管理应用中的action映射,以及该action包含的result定义等。在struts.properties配置中的有一项struts.configuration.files,这里可以看出struts.xml这个文件名不一定是固定的,可以配置为其他文件名的。struts.xml内容主要包括:Action、Interceptor、Packages、Namespace等。后面的章节将详细介绍如何配置这些元素。

•         在struts.xml中可以使用<include>标签把内容分到几个文件中去。这里非常像JSP中的<jsp:include>动作标签,可以把其他文件的内容导入进来,被导入的每个配置文件必须和struts.xml文件有一样的格式。<include>标签的格式如下所示。

3.3  struts.xml的缺省实现

•         struts-default.xml这个文件被包含在struts2-core.jar中,文件名已经可以看出这个文件的作用是struts.xml的缺省配置,它将自动被加载然后导入到struts.xml中去。代码5-1是struts-default.xml的部分片段。

3.4  Velocity模板规则文件

•         如果在程序中使用了Velocity(一个基于java的模板引擎,可以替代JSP作为显示页面)可以把文件velocity.properties放到classpath中去,系统将自动加载。同时还要配置struts-default.vm文件,

•         代码  velocity.properties

•         # Velocity 资源定义.

•         velocimacro.library = action-default.vm, tigris-macros.vm, myapp.vm

4  struts.xml的配置

•         Struts2绝大多数的配置都是在struts.xml中完成的,学习struts.xml文件是学习使用struts2的基础。本节将详细讲述如何在struts.xml中定义和配置各种元素。

4.1  action配置

•         action是Struts2的基础“工作单元”。配置一个基本的action只需要两个信息:action名字和对应的action类,这两部分就建立了一个最简单的action配置。属性“method”用来告诉Struts2调用action的那个方法。在action处理之后一般的需要展示处理结果给用户,所以还需要把action和result映射在一起。如代码所示。

•         代码  Action配置:struts.xml

•         <!—Struts action配置-->

•         <action name="helloWorld" class="example.HelloWorld" method=”doWork”>

•           <result name="failure" path="Error.jsp"/>

•           <result name=”ok” path="HelloWorld.jsp"/>

•         </action>

4.2  result配置

•         Struts2定义了一些默认result:error,input,login,none和success。开发者当然也可以根据应用情况自由的定义结果。结果以“名字-值”的形式影射到结果类型。result标签告诉Strtus 2在action被调用以后下一步做什么。result在struts.xml文件中定义,嵌套在<action>标签里。如果location参数是唯一的参数,可以这样简单的定义:

•         <!—在result中添加参数-->

•         <action name="bar" class="myPackage.barAction">

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

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

•           </result>

•         </action>

4.3  拦截器(interceptor)配置

•         interceptor是能在一个action执行的前后执行的代码。它是做Web应用程序时很有用的工具。最常见的由Interceptor实现的功能如:安全检查(确保访问者是登陆用户)、跟踪日志(记录每个action)、效率瓶颈检查(记录每个action开始和结束的时间以检查程序中的瓶颈)。也可以把interceptor连在一起组成interceptor栈(interceptor-stack)。比如在action执行前同时做登陆检查,安全检查和记录日志,可以定义一个interceptor的栈。interceptor必须事先定义好,然后可以连在一起组成一个栈。如代码5-7所示,定义了一个interceptor和一个interceptor栈。

4.4  包(package)配置

•         所谓packages就是把actions、results、results、types、interceptors这些元素打包到一个逻辑单元中去,从概念上讲,packages就更像一个程序中的对象,可以被其他子包从写,而且可以拥有自己独立的部分。Name属性是packages的必填元素,它作为一个关键字被后边的包引用;extends元素是可选的,它允许包扩展一个和多个前边定义的包。Abstract元素是可选的,如抽象类和抽象函数一样它是必须被继承的,可以申明一个不包含actions的package。

4.5  命名空间(Namespace)配置

•         命名空间属性允许把action配置分成不同的命名空间,这样可以使功能不同action中使用相同的名字。默认命名空间用“”(空字符串)表示。如果系统在指定的命名空间中没有找到某个action,就会到默认命名空间中查找。可以在所有用"extends"扩展的命名空间外配置全局action不指定命名空间。

•         Struts2中有以“/”命名的根命名空间,它是请求直接来自应用程序根路径的时候的命名空间。和其他命名空间一样,如果在根命名空间中没有所需的action别名,系统会回到默认命名空间中查找。如代码5-9所示,这里使用了默认命名空间、“/”和声明了的命名空间“barspace”

4.6  在struts.xml中定义Bean

•         在struts.xml中还可以作JavaBean的定义如下: s

•         <!--在struts.xml中定义Bean --->

•         <struts>

•           <bean type="com.opensymphony.xwork2.ObjectFactory"

•              name="myfactory"

•              class="com.company.myapp.MyObjectFactory" />

•         </struts>

4.7  在struts.xml中使用通配符

•         当配置文件中action mapping的数量很多的时候,使用通配符是一个很好的办法,可以将一些相似的mapping绑在一起,用一个比较通用的mapping来表示。在路径中用*来代替变化的部分,而action的处理类和JSP中{1}刚好是代替这个变量。

•         <!--在struts.xml中使用通配符-->

•         <action name="/edit*” class="example.Edit{1}Action">

•           <result name="failure" path="/mainMenu.jsp"/>

•           <result name=”ok” path="/\{1\}.jsp"/>

•         </action>

5  实现Action

•         Action是Struts2编程的核心部分,反映了对Web应用程序的功能需求。Action在MVC模式中担任控制部分的角色,在Struts2中也使用的最多。每个请求的动作都对应于一个相应的action,action还可以负责存储数据/状态(以getter和setter的方式)并且执行逻辑处理。

•         在本章中将关注如何实现action,以及action如何提供Web应用程序中所需的通用功能。除了Action接口之外,Struts2的action也可以选择实现其他可选择的接口,从而使action能够提供诸如国际化、校验、负责工作流和错误信息处理等功能。ActionSupport基类实现了Action接口并提供了大部分可选择口默认实现,将在本章深入讲述这个类。除此之外,也将探讨action是如何通过使用JavaBean属性提供输入和输出的,最后将介绍如何处理文件上传。

5.1  实现Aciton接口

•         Struts2的Action接口来源于WebWork,全包名为com.opensymphony.xwork2.Action如代码5-10所示。在Struts2中定义action类时已经可以不实现Aciton接口,Struts2会以反射的方式来调用action类。

5.2  扩展ActionSupport类

•         ActionSupport是一个让action类能够更快开始工作的基类。它包含了action能够提供的许多可选服务的默认实现,让开发者更容易地开始开发自己的action类,不需要在为这些可选服务提供具体实现了。同时能够改写可选择接口的任意一个方法实现并保持其他方法的默认实现。由于ActionSupport预建了许多开箱即用的功能,建议读者创建自己的action时都扩展ActionSupport类。ActionSupport实现了以下可选择接口,

5.3  实现基本校验

•         通常在执行业务逻辑之前,校验用户提供的数据是十分表要的。这种字段校验包括“某个字段是必须的”、“某个字段必须大于某个值,小于某个值“等内容。为了自动执行校验,Sturts 2提供了一种能够在excuete()方法被调用之前调用其他方法对action进行处理的机制,这个机制由com.opensymphony.xwork2.Validateable接口提供,它包含了一个方法:

•         public void validate()

•         Validateable接口为action增加了一个标记,通过以上方法使得action能够自动被校验。

•         保存和显示校验的错误信息有接口ValidationAware来负责,这两个接口一般会同时使用。

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

 

  • 大小: 42.8 KB
  • 大小: 58.7 KB
分享到:
评论

相关推荐

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

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

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

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

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

    "NVMe和NVMe-oF基础架构和概念" NVMe(Non-Volatile Memory Express)是一种抽象协议层,旨在提供可靠...此外,在技术细节和工作机制上两者有很大不同,NVMe-oF是在NVMe(NVMe over PCIe)的基础上扩展和完善起来的。

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

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

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

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

    一文详谈架构设计.docx

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

    机房维护与管理详谈

    机房 维护 与 管理 详谈

    详谈Unity3D通过Webservice读取数据库

    从结构上看,Unity3D想要拿数据库的数据,问Web拿就可以了,而对数据库的操作已经外包给Web了,不用你操心。是的,理论上的东西看上去就是这么简单。Web对数据库的操作完全是没问题的,前提是大家如果会Asp.net,...

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

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

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

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

    hibernate配置要点详谈

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

    HACCP基础知识详谈.pptx

    HACCP基础知识详谈.pptx

    详谈内核的Inline Hook实现.pdf

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

    PCB布局经验详谈

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

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

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

    详谈一阶RC低通滤波器如何过滤高频噪声

     简单的做法,就是在输出上直接加上一个无源RC滤波器了,心电信号频率范围是:0.05-100Hz,为确保有用信号在通带不产生过于不平衡的衰减,我们设计一个截止频率为150Hz的低(因为在到达截止频率时,信号已经产生了...

Global site tag (gtag.js) - Google Analytics