Struts2 深入理解
概述
MVC思想由来已久,将视图、模型和控制分层维护的思想已经成为每个开发人员的共识,基于MVC思想而衍生出的MVC框架也挺多,其中以Struts2(Struts1.x已成为历史)、Spring MVC 最具代表性,本文将阐述MVC思想及Struts2的核心模块。
目录
1. 理解MVC思想&Struts2中拓展的MVC思想
2. 基于配置的思想&Struts2的环境配置、运行原理
3. 利刃之OGNL
4. 拦截器&&类型转换及数据校验的时机
正文
(一)理解MVC思想&Struts2中拓展的MVC思想
1. 传统的MVC思想:
a) 客户端向服务器发起请求(View)
b) 服务器端收到用户的请求||提交的数据(Controller)
c) 控制器调用处理业务的业务模型处理用户的请求并可选的以数据模型的方式为控制器返回数据(Model)
d) 控制器得到业务模型返回的数据判断结果给客户端返回不同的视图(Controller)
e) 客户端得到由服务端动态生成的视图页面
2. Struts2中拓展的MVC思想
a) 前端控制器(实际上为一个过滤器)拦截所有类型的请求;
b) Action(Struts2中一个或一组请求理解为一个Action)代理类负责加载Struts2的配置文件,由配置文件中的配置将请求经Action调度对象交给特定的Action去处理;
c) 一个请求在到达Action的过程中可能经过多个拦截器(Struts2的拦截器,有点类似于Filter的概念),该过程可完成日志、权限等操作;
d) Action 收到来自于用户的请求调用特定的方法处理用户的请求,通常情况下Action中的一个方法调用特定的业务模型处理一个请求并返回一个逻辑视图名称(实际上为一个字符串)该层扮演了Controller的角色;
e) Action调度对象获取到逻辑视图名称,并根据Action中配置的映射关系找到对应的真实视图
f) 渲染视图并给响应请求
(二)基于配置的思想&Struts2的环境配置、运行原理
a) XML是可选的,配置的思想确实必须的,如果一个项目后期的维护和升级需要修改源代码是一件非常糟糕的事情,配置的优势显而易见,数据源的变迁只需要修改几个简单的配置即可实现。
b) 现主流的框架都推荐使用配置的方式,Struts2也不例外,Struts2环境搭建大概需要以下几步:
i. Copy Jar包
ii. 在类路径下(src) Copy改struts.xml(Struts2的配置文件,主要配置了Action)
iii. 在web.xml中配置核心过滤器(以Filter作为Struts2框架的入口)
iv. 定义Action类通常建议继承(ActionSupport,该类默认实现了Struts中的某些功能),写业务方法,业务方法通常需要返回一个逻辑视图名称;
v. 在struts.xml中配置Action,该配置文件中以package元素定义不同的包一个包可以理解为一个业务模块,Action的配置通常需要指定一个特定的实体类及方法,同时需要配置若干个业务方法有可能返回的逻辑视图名称及对应的物理视图名称,当然通配符映射能极大的简化配置。
(三)利刃之OGNL
a) 如果说Struts2优于SpringMVC,那我们就谈谈OGNL。
b) OGNL全称对象关系导航语言,Struts2提供类专门的标签库结合OGNL用来在JSP页面中访问Action中的成员以及四大作用域中的数据
c) 每个Action对应一个ActionContext(有点类似于Application),ValueStack(值栈)存在于Action上下文中,ValueStack中存在一个CompoundRoot 的根元素(实际上为一个栈)和Map类型的context对象,默认情况下Action被置于栈顶,context存储了Session、Request等对象的引用
d) OGNL的主要作用即用来访问ValueStack中root栈和context集合中的对象或属性
e) OGNL访问root栈中的属性只需要使用属性名称即可;
f) OGNL访问context集合中对象的属性需要使用#key.属性 || #key.属性.属性的方式来访问
(四)拦截器&&类型转换及数据校验的时机
a) 拦截作用于在请求到达Action的过程中,可以对请求进行预处理。
b) Struts2内建的拦截器有exception、fileUpload、prepare、params等等。
c) Struts2允许开发者自由组合拦截器的顺序实现特定的需求,常见案例如下:
i. Prepare->modelDriven->params
1. prepare拦截器用于实现在特定的业务方法前执行若干操作,如常见的在更新操作中原始数据的查询操作。
2. modelDriven拦截器用于将数据模型置于值栈栈顶由后续的params拦截器为栈顶的数据模型属性赋值。
3. params拦截器负责为值栈栈顶的模型属性赋值,并完成默认的数据类型转换工作。
ii. Params->prepare->modelDriven->params
1. 常用于既需要为数据模型赋值又需要为Action中属性赋值的情况
2. Params首先为Action中的属性赋值(此时Action位于值栈的栈顶)
3. Prepare 用于完成业务方法的前处理操作
4. modelDriven 返回数据模型并置于值栈栈顶
5. Params 为值栈栈顶的数据模型再次赋值
iii. Params->conversionError->validation->workflow
1. 常用于操作类型转换||数据校验
2. Params 执行类型转换如有异常则存储到值栈中
3. conversionError 检查是否存在类型转换异常,有则添加异常信息
4. validation基于XMl配置的声明式表单验证,将不满足条件的字段异常信息存储至值栈中
5. workflow收尾工作,检查整个赋值操作中是否存在异常若存在异常则返回一个名称为”input”的逻辑视图名称;
By 奋斗的小青年
技术支持:1069161787