Struts2 系统学习笔记一

本章内容:
- 构建Web应用程序
- 使用Web框架
- 探索Struts2框架
- 介绍拦截器(interceptor)和ValueStack


1. Web应用程序,快速学习

1.1 构建Web应用程序

因为基于Web应用的迅速发展,web应用的迭代速度越来越快,所以需要面临
页面的程序可重用的问题。
Struts2是一个重用模型解决方式。他的目的是为了处理web应用程序的重用问题。

1.2 检查技术层

Struts2 使用了一个很简单的描述:
这里写图片描述
所有的Struts2应用基于HTTP协议,JAVA Servlet API则使用java语言来保持与HTTP的联系,而Struts2封装了servlet。

HTTP协议
HTTP协议是一个无国界的客户端与服务端之间的交换消息声明。一般来说,客户端为Web浏览器,而服务端是应用服务器或web服务器。
对于Web应用程序而言,需要跨越HTTP协议的两个障碍:无状态和基于文本。
无状态的协议不记录收到的多个请求之间的关系,每一个请求都会被当做服务器接收到的唯一的请求处理。HTTP的服务端并不保存这样的记录:记录和追踪所有连接着的来自客户端的请求。服务端拥有客户端的地址,但他只会返回当前的请求文本。如果一个客户端返回来请求一个其他的文本,服务端并不会意识到这个客户端是重复访问。
另一方面,HTTP是基于文本的,联合基于文本的技术和基于强类型的技术如JAVA,需要创建大量的数据绑定工作。当提交一个表单时,所有的数据都必须保存为文本,而这些编码后的文本必须保存为Java的数据类型。而这个转换的过程会在请求处理的两端都会发生。所以这给web应用带来相当繁重的工作。

JAVA SERVLET API
JAVA Servlet API能够帮助缓和以上的问题。 这意味着JAVA开发者能在服务端编写面向对象代码来开发HTTP的C/S联系。
Servlet API的核心部分是servlet、request和response对象。一个servlet是一个单个的JAVA对象来接受请求并返回经过任意后台处理的响应。request对象装入了大量请求细节,包括所有重要的请求参数(来自表单或者搜索字符串)。response对象主要包括了响应header和响应文本输出流。
简单来说,一个servlet接受request对象,对其进行处理,然后返回response对象给客户端。
在发布servlet前,我们需要先打包他们,最基本的servlet打包单元被称为web应用,而web应用通常包括一组servlet,HTML,classes以及其他的资源文件。打包后的文件为war文件。war是一个特殊的java打包文件,即web applcation archive。
打包好web应用后就需要发布了,我们把web应用发布在servlet容器中,一个servlet是一个特殊类型去管理应用的生命周期。这意味着我们不需要直接执行servlet,我们将它发布在容器中,而容器管理者他的执行通过实现大量的servlet生命周期方法。当一个servlet容器接受了一个请求,他就需要决定哪一个他管理的servlet来处理这个请求。当决定后,他启用这个servlet的service()方法,来处理他的request和response对象。
这里写图片描述
如上图,一个servlet容器中可以有多个web应用,而当容器所监听的端口得到相应的请求时,他会分析请求的命名空间去发现哪一个web应用是他的目标,最后分析URL来获取需要响应请求的servlet。
除了转换HTTP成JAVA语言,servlet还提供了一些其他更高级别的特性,如session机制,可以让我们关联相关的客户端组。在有这个功能之前,我们必须要处理cookies或者解析封装的查询字符串来处理这个问题。
除了session机制外,servlet API并没有提供很多高级别的特性,他概括了客户端服务端交互的细节在一个抽象的面向对象集合中。这意味着我们不需要解析HTTP请求而只是获得一个整齐的请求JAVA包装对象。基本上,Servlet API是一个基础级别的技术在现代的web应用领域中。
作为一个基础设置,servlet提供了坚实的基础使得web程序在他的基础上进行搭建。如果你考虑一些web应用日常需求,servlet API并不试图解决这些问题。

1.3 深入研究

由于Servlet API处理了低级别的客户/服务端的联系问题,我们则可以专注于应用层面的问题。而web应用需要处理相当多的日常请求问题,如:
- 绑定请求参数为Java types
- 验证数据
- 访问业务层逻辑
- 访问数据层逻辑
- 呈现响应页面(HTML或其他)
- 提供国际化与地方化

绑定请求参数以及数据验证
HTML是基于文本的协议,所以他的生成的请求参数是文本编码的。当这些参数到达我们的应用程序,他们必须被转换成恰当的数据类型。而Servlet API不处理这些问题,我们需要自行处理。转换这些数据虽然做起来简单,但是无比耗时并且容易出错。这些数据必须在进入系统前被检查。
有两种层级的类型验证,第一种情况是字符串必须是合法的表现形式,如邮编不能有任何字符。另一种情况是,在值被成功绑定成java type时,该值必须被更高等级的验证,比如之前提供的邮编,应用需要了解他是否在一个可接受的范围内。如果花费大量的时间来编写以上功能的代码会使得JAVA开发者枯燥无味。

调用服务层和持久层
在应用程序内部,大多数的请求调用业务逻辑或者数据持久层,当有大量的调用来自不同的程序,能总结出一系列的归纳。第一种,不管这些调用内部的细节,他们来自于工作流的一部分。在他们的核心,每一个来自工作队列的实例都需要被完成。这种就是面向行为的action框架。另一种,逻辑和功能表现在一个清晰的步骤表现自web的领域之外。

生成页面和国际化
曾经可以这样说,表现层只是一个HTML文本。然而随着前段技术的发展,越来越多越来越复杂的JS技术,CSS技术已经让这个说法不准确。对于国际化的需求也日益增长,国际化能让我们在只构建一个web应用的时候就能发现每一个用户的位置,并且给与定制的页面。


2 基于web应用的框架

2.1 什么是框架

框架时一块结构化的软件,之所以称它为结构化,是因为该结构是面向解决更大的目标问题,而不是一个特殊的功能需求。一个框架尝试去总结普遍的问题和工作流来自一个特定的领域。从根本上框架处理问题通过两个方面,一是该框架尝试去自动化解决所有该领域枯燥的任务。二是尝试去介绍一种优雅的模型解决方案,用来解决这个领域普遍工作流的问题。

定义 web应用框架时一组结构化的软件。他提供了普通任务的自动化解决方案以及建造了一种解决模型,能够轻松的让应用继承实现。

框架自动化常见任务
如转换数据,数据验证,分离服务层与持久层响应来自基于web的工作,国际化,表示层内容呈现。

框架提供模型解决方案
宏观的模型对于一个框架更为重要。struts2是基于action的框架。

2.2 为什么使用框架

除非web应用特别简单,否则还是需要使用框架来解决一个领域内的所有问题。
我们也可以构建自己的框架,但是面临两个问题,一是时间、人员、经济上的考虑,另一点是维护与扩展上的代价。
所以作为一个新时代的web应用,都应该使用框架。


3 Struts 2框架

Struts2是一个全新的web应用框架。他不只是struts 1 的新版本,他是一个彻底全新的框架,他基于OpenSymphony WebWork框架。

3.1 Struts 2 简史

Struts2相比Struts1 提供了更加整洁的MVC实现。同时它还引入了拦截器,注解,以及OGNL,支持可重用UI组件和基于微型MVC模式的标签API。

3.2 Struts 2 概览:MVC模式

Struts 2的顶层设计遵循公认的MVC设计模式。
MVC设计模式有3个关注点:model,view和controller。而Struts2实现他们通过action,result和FilterDispatcher。
这里写图片描述

控制器 - FilterDispatcher
Struts使用的MVC变体经常被称为是front controller MVC。这意味着控制器在最前端,是请求处理过程第一个被触发的组件。
控制器的角色由FilterDispatcher来担任,他是一个servlet过滤器,检查每一个传入请求然后决定由哪个Struts 2的action来处理。

模型 - action
model这个概念是MVC中最模糊的,model像一个包含应用程序内容的黑盒子。其他的一切仅仅是用户界面或者它们之间的连接。模型是事务本身。
用更专业的词汇解释,模型是应用程序的内部状态。这个状态由数据模型和业务逻辑共同组成。
Struts 2的动作组件有两个作用,首先,一个动作将业务逻辑调用封装到一个单独的工作单元中。其次,动作是一个数据传输的场所。

视图 - 结果
视图是MVC模式的呈现组件。结果向Web浏览器返回了页面。这个页面是用户界面,向用户呈现应用程序的状态。

3.3 Struts 2的工作原理

!这里写图片描述
如图,它引入了几个新的Struts 2组件:ActionContext、拦截器、ValueStack和OGNL。
拦截器
如图,拦截器在action执行前,result返回后都会被调用。它提供了一种在其中定义不同的工作流和横切任务的架构组件,以便能简单地重用这些组件,并且能够与其他架构关注点分离。
ValueStack和OGNL
ValueStack是保管与请求处理相关数据的一个存储区域。
OGNL是一个获取中央仓库(即ValueStack)数据的一个工具。
要注意的是,他们都不属于框架内任何一个组件,如上图,在拦截器阶段和result阶段都可以使用OGNL来获取ValueStack中的数据,因为他存储在名为ActionContext的ThreadLocal中。


初始Struts 2

内容:
- 声明应用程序架构
- 部署Hello World应用程序
- 构建基于XML的应用程序
- 使用Struts注解

1 声明性架构

声明性架构是一种特殊的配置方式,它允许开发人员以描述而不是硬编码干预的方式创建应用程序的架构。开发人员使用高级工件来描述架构组件,例如XML文件或JAVA注解,系统会利用这些高级工件来创建应用程序运行时的实例。

1.1 声明架构的两种方式

这里写图片描述
如图所示,无论使用XML配置或者注解的方式,框架都会转化为相同的运行时组件。不管使用哪种方式,框架都会产生相同的运行时应用程序。

XML声明性架构元素示例

<action name="Login" class="manning.Login">
    <result>/AccountPage.jsp</result>
    <result name="input">/Login.jsp</result>
</action>
<action name="Registration" >
    <result>/Registration.jsp</result>
</action>
<action name="Register" class="manning.Register">
    <result>/RegistrationSuccess.jsp</result>
    <result name="input">/Registration.jsp</result>
</action>

框架使用了struts.xml文件作为入口点文件。

基于java注解的声明性架构

@Results({
    @Result(name="input", value="/RegistrationSuccess.jsp" )
    @Result(value="/RegistrationSuccess.jsp" )
})
public class Login implements Action {
    public String execute() {
        //Business logic for login
    }
}

应该使用哪种方式
XML更适合初学者,并且更能集中应用程序组件符号,易理解。而注解更优雅,代码量更少,是未来的方向。最终由开发者决定。

1.2 智能默认值

许多常用的Struts2组件,或者组件的属性不需要开发人员声明。不管使用哪种配置风格,这些组件或者属性设置已经被框架声明了。
在struts-default.xml中声明了很多这样的组件,而这个文件在struts2-core.jar中。

2 搭建Helloworld

github项目 : https://github.com/xu509/Alan

使用XML需要注意的配置点
- web.xml的配置,过滤器相关
- struts.xml配置,根文件的配置
- jsp文件中相应的配置

使用注解需要注意的配置点
- web.xml配置,添加扫描注解的包
- 使用命名约定(示例中使用)使所有的动作类命名以Action结尾。
- 或者实现Action接口。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值