大家好,今天小编来为大家解答深入解析:Struts2框架的核心原理与概念这个问题,很多人还不知道,现在让我们一起来看看吧!
本文将深入探讨Struts2的核心概念。首先会介绍Struts2的架构和几个重要的配置文件,并且会举例说明如何配置Struts2的核心对象。然后介绍Struts2最重要的三个组件:Action、Result、Interceptor的原理和使用方法。
1 术语概述
• Struts2 中的操作负责在Web 应用程序中实现特定逻辑。 Action 是一个Java 类,通常继承自com.opensymphony.xwork.ActionSupport 类。当Struts2的Dispatcher收到HTTP请求时会调用该类。
• 当一个动作执行时,会返回一个返回码,如“SUCCESS”、“INPUT”或其他“返回码”。这些“返回代码”通过查找struts.xml 中的定义来告诉Struts2 接下来要做什么,下一步称为结果。 Struts2 支持许多不同的结果类型,例如向用户返回结果页面。可选的显示模板技术包括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 文件是一个标准属性文件,包含一系列键值对象。每个键都是一个Struts2属性,该键对应的值是一个Struts2属性值。 struts.properties 文件通常放置在Web 应用程序的WEB-INF/classes 路径中。事实上,只要将该文件放在Web应用程序的CLASSPATH路径中,Struts2框架就可以加载该文件。以下是部分配置片段。
• struts.enable.DynamicMethodInitation=false"
struts.devMode=false
3.2 核心配置文件--struts.xml
• struts.xml 文件主要负责管理应用程序中的动作映射,以及动作中包含的结果定义。 struts.properties配置中有一项struts.configuration.files。这里可以看出,struts.xml的文件名不一定是固定的,可以配置为其他文件名。 struts.xml的内容主要包括:Action、Interceptor、Packages、Namespace等,后面的章节会详细介绍如何配置这些元素。
• 您可以使用struts.xml 中的标签将内容划分为多个文件。这和JSP中的action标签很相似,可以导入其他文件的内容。每个导入的配置文件必须与struts.xml 文件具有相同的格式。标签的格式如下。
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 放入类路径中,系统会自动加载它。还要配置struts-default.vm文件,
• 代码速度.属性
• # 速度资源定义。
• velocimacro.library=action-default.vm、tigris-macros.vm、myapp.vm
4 struts.xml配置
• Struts2的大部分配置都在struts.xml中完成。学习struts.xml文件是学习使用struts2的基础。本节将详细介绍如何在struts.xml中定义和配置各种元素。
4.1 动作配置
• Action 是Struts2 的基本“工作单元”。配置基本动作只需要两个信息:动作名称和对应的动作类。这两部分创建了最简单的操作配置。属性“method”用于告诉Struts2调用action的方法。 Action处理后,一般需要将处理结果显示给用户,因此需要将action和result映射在一起。如代码所示。
• 代码操作配置:struts.xml
•
•
•
•
•
4.3 拦截器配置
• 拦截器是可以在执行操作之前和之后执行的代码。在制作Web 应用程序时,它是一个非常有用的工具。 Interceptor实现的最常见的功能包括:安全检查(确保访问者是登录用户)、跟踪日志(记录每个动作)、效率瓶颈检查(记录每个动作的开始和结束时间检查程序中的瓶颈)。拦截器还可以连接在一起形成拦截器堆栈(interceptor-stack)。例如,要在操作执行之前同时执行登录检查、安全检查和日志记录,可以定义拦截器堆栈。拦截器必须提前定义,然后可以连接在一起形成堆栈。如代码5-7所示,定义了拦截器和拦截器栈。
4.4 包配置
• 所谓封装,就是将动作、结果、结果、类型、拦截器等元素封装成一个逻辑单元。从概念上讲,包更像是程序中的对象,可以由其他子包编写并且可以被拥有。它自己的独立部分。 Name属性是包的必需元素,作为关键字被后续包引用; extends 元素是可选的,它允许包扩展一个或多个先前定义的包。 Abstract 元素是可选的。像抽象类和抽象函数一样,它必须被继承。您可以声明一个不包含操作的包。
4.5 命名空间配置
• 命名空间属性允许将动作配置划分到不同的命名空间中,以便在具有不同功能的动作中可以使用相同的名称。默认命名空间由“”(空字符串)表示。如果系统在指定的命名空间中没有找到某个操作,则会在默认命名空间中搜索。可以在使用“extends”扩展的所有命名空间之外配置全局操作,而无需指定命名空间。
• Struts2中有一个名为“/”的根命名空间,这是当请求直接来自应用程序根路径时的命名空间。与其他命名空间一样,如果在根命名空间中找不到所需的操作别名,系统将回退到默认命名空间。如代码5-9所示,这里使用了默认命名空间“/”和声明的命名空间“barspace”
4.6 在struts.xml中定义Bean
• JavaBean 也可以在struts.xml 中定义,如下所示:
名称="我的工厂"
类="com.company.myapp.MyObjectFactory"/
4.7 在struts.xml中使用通配符
• 当配置文件中有大量操作映射时,使用通配符是将一些相似的映射联系在一起并用更通用的映射表示它们的好方法。使用*替换路径中变化的部分,动作处理类和JSP中的{1}只是替换该变量。
•
5 实施行动
• Action是Struts2编程的核心部分,反映了Web应用程序的功能需求。 Action在MVC模型中扮演着控制部分的角色,也是Struts2中用得最多的。每个请求的动作对应一个相应的动作,该动作还可以负责存储数据/状态(以getter和setter的形式)并执行逻辑处理。
• 在本章中,我们将重点关注如何实现操作以及它们如何提供Web 应用程序所需的通用功能。除了Action接口之外,Struts2动作还可以选择实现其他可选接口,使得动作可以提供国际化、验证、负责任的工作流程和错误消息处理等功能。 ActionSupport 基类实现Action 接口并提供大多数可选的默认实现。本章将深入描述该类。此外,我们还将探讨操作如何通过使用JavaBean 属性提供输入和输出,以及最后如何处理文件上传。
5.1 实现Aciton接口
• Struts2的Action接口来自WebWork,完整包名为com.opensymphony.xwork2.Action,如代码5-10所示。在Struts2中定义动作类时不再需要实现Aciton接口。 Struts2将以反射的方式调用动作类。
5.2 扩展ActionSupport类
• ActionSupport 是一个基类,允许操作类更快地开始工作。它包含操作可以提供的许多可选服务的默认实现,使开发人员可以更轻松地开始开发自己的操作类,而无需为这些可选服务提供特定的实现。同时,您可以重写可选接口的任何方法的实现,并保留其他方法的默认实现。由于ActionSupport 有许多开箱即用的预构建函数,因此建议读者在创建自己的操作时扩展ActionSupport 类。 ActionSupport 实现以下可选接口,
5.3 实施基本验证
• 在执行业务逻辑之前验证用户提供的数据通常很重要。这种字段验证包括“某个字段为必填”、“某个字段必须大于某个值且小于某个值”等。为了自动进行验证,Sturts 2提供了一种机制,可以调用在调用excuete() 方法之前处理操作的其他方法。该机制由com.opensymphony.xwork2.Validateable 接口提供,其中包含一个方法:
公共无效验证()
• Validateable接口为action添加标签,这样就可以通过上述方法自动验证action。
• ValidationAware 接口负责保存并显示验证错误信息。这两个接口一般是同时使用的。
5.4 使用本地资源文件
• 本节将介绍另外两个接口,TextProvider 和LocalProvider,这两个接口都是为了使用本地资源文件而设计的。
• 在Java 中,用户语言和区域信息封装在java.util.Local 类中,action 通过com.opensymphony.xwork.LocaleProvider 接口定义的方法确定使用哪个Locale 来获取要显示的信息文本。该接口中只定义了一个方法:
• 公共区域设置getLocale()
• 在ActionSupport 中,该方法的默认实现是:通过调用AcitonContext.getContext().getLocale() 方法,使用ActionContext 获取locale 值(ActionContext 的使用将在后面章节详细介绍)。 Struts2 通过查询HttpServletRequest 对象并调用其getLocale() 方法将Local 与操作调用关联起来。
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 使用模型驱动
• 在Struts2中,提供了两种Action驱动模式:Property-Driven(属性驱动)和Model-Driven(模型驱动)。
• 模型驱动的Action 与Struts1 中的FormBean 非常相似。在传递过程中,有一个单独的值对象作为参数的载体。然而在Struts2中,这个值对象不需要继承任何接口,只需要普通的JavaBean就可以作为模型部分。很多情况下,Bean的定义已经存在并且无法修改(比如从外部引入的类或者已经被大量代码引用的类)。如果必须实现一个接口来充当FromBean,则必须添加一个新类。Struts2的这个改进非常及时。
5.8 使用属性驱动
• 属性驱动是指Action 会直接使用自己的字段来充当FormBean 的功能。在《Struts2入门》一章中,HelloReader示例使用了此方法。 Action直接包含message属性及其set和get方法。一般在页面表单比较简单的时候使用,属性可以直接作为Action的字段,这样就不需要再写一个FormBean,减少重复代码。
• 如果上一节的例子中使用Property-Driven方法,则将User类和action类合并定义,将User中的属性值直接传递给action。无需在配置文件中添加modelDriven 过滤器。
6 结果类型介绍
• Result 类决定执行Action 并返回结果后会发生什么。开发人员可以根据应用程序和环境的需求自由创建自己的结果类型。例如,在Struts2 中,创建了Servlet 和Velocity 结果类型来显示Web 应用程序屏幕。本节将介绍Struts2内置的几种Result类型以及如何定制开发Result。
6.1 内置结果类型
• 所有结果类型均实现com.opensymphony.xwork.Result 接口。该接口是所有操作执行结果的公共接口,无论结果是用于显示网页、生成电子邮件、发送JMS消息还是其他。
• 系统提供的默认结果类型在struts-default.xml 中定义,并映射到可在操作配置中引用的名称。在action配置中,可以直接使用这些别名,无需使用长类名。
6.2 默认结果
• 调度程序结果是最常用的结果。也是Struts2的默认结果,也称为通用结果。 Action执行后,请求会被定向到对应的View,相当于标签实现的跳转功能。将同一个HTTP请求中的内容分发到某个页面(使用dispatcher类型result) 只要配置文件中包含struts-default.xml并且包继承了struts-default,使用dispatcher result不需要其他设置。例子:
foo.jsp
6.3 页面跳转结果
• Redirect Result 与Dispatcher Result 类似,也实现页面跳转。最后的响应会被重定向到指定的位置,可以理解为客户端跳转,用户再次请求新的URL。重定向就是重新生成一个新的请求,那么原来请求中保存的东西将不再有效。例如,无法通过request.getAtrribute()获取对象,也无法获取action、errors、field错误等的实例。
• Redirect Result 和Dispatcher Result 之间的差异源于JSP 中标签和response.redeiret() 之间的差异。
6.4 创建动作链
• Chain Result 是一种结果类型,它根据自己的拦截器堆栈和结果调用操作,允许操作将请求转发到具有原始状态的目标操作。
• Struts2 提供了按预定义的顺序或流程链接多个操作的能力。该功能是通过为指定的Action设置一个Chain Result,然后通过ChainingInterceptor拦截目标Action来实现的。
6.5 集成各种View技术
• Velocity、Freemarker、JasperReports 和xslt 这四种结果均旨在集成不同的视图技术。
• 1. Velocity Result:Velocity是一个基于java的模板引擎(template engine)。
• 2. Freemarker Result:Freemarker 也是一个模板引擎,它允许JavaServlet 通过将HTML 封装在模板中来将图形设计与应用程序逻辑分开。该模板根据servlet 提供的数据动态生成HTML。
• 3. JasperReports result:JasperReports 是一个基于Java 的开源报表工具,它可以像其他IDE 报表工具一样在Java 环境中生成报表。
• 4. XSLT 结果:XSLT 结果使用XSLT 将操作对象转换为XML。
6.6 自定义结果
• Struts2 还允许用户自定义自己的结果类型,只要他们实现com.opensymphony.xwork2.Result 接口即可。如代码5-29所示,模拟了一个结果函数,即根据处理结果向用户发送一封E-mail。这个结果需要4 个参数to、from、subject 和body
7 拦截器简介
Interceptor是Struts2的一个强大的工具,很多功能都是建立在它之上的,比如国际化、转换器、验证等。Interceptor是Struts2的一大特色。请求在执行动作之前和之后可以通过一个或多个拦截器传递。实现某种功能的多个连接器的组合称为拦截器链(Interceptor Chain,在Struts2中称为拦截器堆栈)。拦截器链就是将拦截器按照一定的顺序连接成一条链。当访问被拦截的方法或字段时,拦截器链中的拦截器将按照之前定义的顺序被调用。
7.1 拦截器原理
• Struts2 拦截器的实现相对简单。当请求到达Struts2的ServletDispatcher时,Struts2会查找配置文件,根据其配置实例化相对的拦截器对象,然后串成一个列表(list),最后一一调用列表中的拦截器。
7.2 内置拦截器介绍
• Struts2 包含许多内置拦截器,它们提供许多核心功能和可选的高级功能。拦截器定义在struts.default.xml文件中,还定义了一些默认的拦截器堆栈和拦截器名称。框架提供了很多实用的Interceptor,可以随时通过名字来调用。
7.3 使用内置i
nterceptor • 本节将介绍几种常用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 都被这个拦截器拦截。深入解析:Struts2框架的核心原理与概念的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于、深入解析:Struts2框架的核心原理与概念的信息别忘了在本站进行查找哦。
【深入解析:Struts2框架的核心原理与概念】相关文章:
2.米颠拜石
3.王羲之临池学书
8.郑板桥轶事十则
用户评论
真期待深入了解一下Struts2!
有18位网友表示赞同!
我一直好奇Struts2的工作原理,这次终于有机会好好学习了。
有19位网友表示赞同!
希望这篇文章能详细解释Struts2的框架结构。
有18位网友表示赞同!
想要知道Struts2和spring之间的关系。
有7位网友表示赞同!
有没有讲解如何配置 Struts2 的各种组件?
有14位网友表示赞同!
看看Struts2能解决哪些常见开发问题,想听听实际案例分享。
有8位网友表示赞同!
学习新的框架总感觉有点复杂,希望这篇文章能循序渐进的讲解。
有17位网友表示赞同!
看完文章以后可以上手练习吗?
有11位网友表示赞同!
最期待看看Struts2最新的版本更新和改进!
有19位网友表示赞同!
想知道Struts2在实际项目中应用得怎么样?有分享吗?
有13位网友表示赞同!
这个框架适合哪些类型的项目呢?
有16位网友表示赞同!
文章里会有代码示例吗?方便理解和实践。
有15位网友表示赞同!
Struts2有哪些优点和缺点呢?
有7位网友表示赞同!
想了解一下 Struts2 的安全性方面怎么样?
有18位网友表示赞同!
是否有关于 Struts2 的最佳实践分享?
有7位网友表示赞同!
希望这篇文章能解释清楚核心概念,方便我理解其优势。
有19位网友表示赞同!
我已经使用过一些web框架了,想知道Struts2和它们的区别在哪里。
有9位网友表示赞同!
如果需要迁移项目到 Struts2 有哪些需要注意的点?
有14位网友表示赞同!
看了这篇文章之后可以学习其他的成熟框架吗?
有19位网友表示赞同!
这篇博文能解决我目前在开发中的问题吗?
有10位网友表示赞同!