1.解决MVC开发过程中Controller的问题、
2.什么是MVC
MVC是一种编程思想,由设计者人为的将项目划分成三个层次:M(Module 模型层)V(View 视图层)C(Controller 控制层)
3.MVC编程思想的优点
① MVC处理后,便于多人协同开发,提高开发效率
② 解耦和:解除代码的强关联性 在修改一部分代码实现时不影响其他代码
4.Struts2业务处理流程
5.解决Servlet作为Controller的问题
① 收集数据的代码冗余(如:数据收集、处理中文字符集等)
struts2使用成员变量的形式进行参数的收集,并自动进行类型转换,时间类型支持 yyyy-MM-dd HH:mm:ss格式② 手动进行参数的类型转换
③ 跳转路径写死在Controller中不利于后续维护
二。开发步骤简介
1.框架环境搭建:(本次是基于struts2.x版本描述)
① 获得strts2框架(开源框架 open_source 免费 有源代码) 可以到www.apache.org网站下载
apps 存放的是例子
docs 存放docs文档
lib 相关jar包
src struts2源代码 xwork源代码
② 第三方依赖jar包
commons-fileupload-1.3.jar
commons-io-2.0.1.jar
commons-lang3-3.1.jar
commons-logging-1.1.3.jar
freemarker-2.3.19.jar
javassist-3.11.0.GA.jar
ognl-3.0.6.jar
struts2-core-2.3.15.1.jar
xwork-core-2.3.15.1.jar
2.初始化配置
将struts.xml放置在src根目录下
在web.xml中配置struts2的核心过滤器 目的:让struts2框架生效
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
在struts.xml中的基础搭建
注意:跨包之间的跳转只能用于Action
<!--
package标签属性
name :在整个struts.xml配置文件中要唯一
extends:值必须是struts-default
-->
<package name="package1" extends="struts-default">
<!--
action标签属性:
name:是未来用户请求的路径
http://localhost:8080/struts2/first
class:权限定名
-->
<action name="first" class="com.struts2.FirstAction">
<result name="sucess">/a/index.jsp</result>
</action>
</package>
全局跳转,解决jsp跳转路径冗余问题
<global-results>
<result name="success" type="">/result.jsp</result>
</global-results>
注意:
① 全局跳转一定是在开发后期,优化时使用的② 当全局跳转与局部跳转发生冲突时,局部优先
③ 全局跳转只在本包中有效(pachage标签内部使用)
三。原理解析
1.Action的创建
Servlet: 一个Servlet类只会创建一个实例对象,所以Servlet是单例的
Action: 一个Action类,每一次请求都会创建一个新的实例对象,所以Struts2是多例的
2.Struts2数据处理机制
Servlet数据存储在作用域中 用EL表达式来获取数据 在JSP文件中用JSTL标签+EL表达式用来显示
3.ValueStack
① ValueStack的作用:管理(存储) 一次请求中,所涉及的数据
Struts2通过ValueStack(值栈)将客户端数据传递到Action中,
数据都会经过parameters作用域封装成键值对后
根据属性名将参数类型转换并通过set方法进行值的注入
② 优点:与视图层解耦合,防止更换视图层显示技术时Action的代码无法执行
③ 值栈生命周期: 一次请求有效
④ ValueStack为什么叫做栈
[1]后入先出
客户端访问AAction forward跳转到BAction这是一次请求所以A会先存入root区B后存入root区
BAction的位置为第一位
root区底层是由栈来完成的 这个栈是用ArrayList实现的
[2]数据copy问题
同名属性从客户端接收数据时如果有同名属性那么,第一次客户端传来的一个值
会覆盖后面经过forward跳转的Action中的所有同名属性的值
① 作用:把多个Action中共有的代码,提取到拦截器中,减少代码冗余
② 拦截器体系:
【1】 自定义拦截器
【2】 系统拦截器:
[1]params 接收客户端提交的数据
[2]fileupload 文件上传拦截器
[3]exception 拦截器
[4]workflow 拦截器
③ 系统拦截器的放置位置
struts-default.xml中有一个默认系统包struts-default 是一个抽象的
这个包中含有大量的封装栈 所以在我们继承了struts-default 时会继承到系统封装的拦截器
注意:当自定义了拦截器栈,并设置成了默认栈后,系统默认拦截器栈将失效,所以一定要将系统默认栈引入自定义栈中
④ 方法拦截器
作用:在DMIAction开发过程中,通过方法拦截器可以拦截Action中的某些方法
5.工作原理
在struts2框架中处理大概分为以下几个步骤与
① 客户端初始化一个指向Servlet容器(如Tomcat)的请求
② 这个请求经过一系列的过滤器(Filter)这些过滤器中有一个叫做ActionContextCleanUp的可选过滤器
③ 接着FilterDispatcher被调用,FilterDispatcher询问ActionMapper来决定这个请求是否需要调用某个Action
④ 如果ActionMapper决定需要调用某个Action,FilterDispatcher把请求的处理嫁给ActionProxy
⑤ ActionProxy通过ConfigurationManager询问框架的配置文件,找到需要调用的Action类
⑥ ActionProxy创建一个Actionlnvocation的实例来
⑦ Actionlnvocation实例使用命名模式来调用,在调用Action的过程前后,涉及到相关拦截器的调用
⑧ 一旦Action执行完毕,Actionlnvocation负责根据struts.xml中的配置找到对应的返回结果。
返回结果通常是一个JSP 另一个Action调用链或者是FreeMarker的模板。
6.工作流程
① 客户端发出HTTP请求
② 根据web.xml配置,该请求被FilterDispatcher接收
③ 根据struts.xml配置,找到需要调用的Action类和方法,并通过IOC方式,将值注入给Action
④ Action调用业务逻辑组件处理业务逻辑,这一步包含表单验证
⑤ Action执行完毕,根据struts.xml中的配置找到哦对应的返回结果result,并跳转到响应页面
⑥ 返回HTTP响应到客户端浏览器