struts1的原理

来源:互联网 发布:结婚相片制作软件 编辑:程序博客网 时间:2024/05/16 13:42

struts1似乎是一个离我们比较遥远的东西了,但是不排除现在有些企业还在用以struts1作为框架的项目,你去公司工作也许就那么倒霉地接到了一个struts1的项目,结果你发现,你会用struts2,却不会使用struts1,毕竟struts2和struts1相差有点大,但是,作为一个程序员,总能在某些场合一通百通,你会struts2,但不代表你要使用struts1就得重头学起,只要懂得了struts1的工作原理,聪明的你肯定就知道该如何使用struts1了,至少维护是没问题了吧。
关于struts1的原理和工作流程的介绍:
1、工作流程
(1)Struts框架总控制器(ActionServlet)是一个Servlet,在web.xml中配置成自动启动的Servlet。
读取配置文件(struts-config.xml)的配置信息,为不同的struts模块初始化相应的ModuleConfig对象:(理解为初始化)
(2)发送请求
ActionConfig
ControlConfig
FormBeanConfig
ForwardConfig
MessageResourcesConfig
(3)填充Form:ActionServlet在接收请求后往ActionForm中填充数据,所以请求的空间的name属性要与ActionForm中的成员变量一样
(4)派发请求:控制器根据配置信息ActionConfig将请求派发到具体的Action,相应的FormBean一并传给这个Action的execute()方法
(5)处理业务:Action一般只包含一个execute方法,它负责执行相应的业务逻辑(调用其他业务模块)。完毕后返回一个ActionForward对象,控制器通过该ActionForward对象来进行转发工作
(6)返回响应 不是真正响应目标,而是响应关键字
(7)查找响应(翻译响应):总控制器根据业务功能Action返回的目标响应对象,找到对应的资源对象,通常是一个具体的jsp页面
(8)响应用户
2、组件介绍
(1)ActionServlet将请求参数分装成FormBean的属性时进行转换,ActionServlet内部调用BeanUtil这个工具包来将字符串类型的请求参数转换成FormBean中对应的属性的类型,然后再将转换结构装配打牌FormBean中
(2)Action在发出该Action请求时才初始化,不是在读取配置文件时初始化
(可以利用构造器中的输出来判断该类在什么时候初始化以及初始化几次)
Action在内存中始终只有一个,这样是不安全的
Action是线程不安全的,因为所以得请求共享一个action实例

实现Action的安全性编程
①注意不要用实例变量或类变量共享只是针对某个请求的数据
②注意资源操作的同步性
对某个实例变量进行同步
private Integer count = 0;
public void method(){
synchronized(count){
count++;
}
}
(3)ActionMapping其实就是对struts-config中标签为action的所有属性的封装
(4)ActionForward(导航器)
ActionForward对象是配置对象。这些配置对象拥有独一无二的标识以允许它们按照name属性等来检索。ActionForward对象封装了向前进的URL路径且别请求处理器用于识别目标视图
name:逻辑名称
path:页面或者模块访问路径
ActionForward在配置文件中的一些该注意的地方
Redirect
false,no—RequestDispatcher.forward 路径相对当前应用
true,yes—HttpServletResponse.sendRedirect 写绝对路径
(5)ActionForm
工作原理
处理ActionForm的一般步骤
①检查Action的映射,确定Action中已经配置了对ActionForm的映射
②根据name属性,查找form bean的配置信息
③检查Action的form bean的使用范围,确定在此范围下(request,session),缺省值是session,是否已经有次form bean的实例
④假如当前范围下,已经存在了次form bean的实例,而且对当前请求来说是同一种类型的话,那么就重用
⑤否则,就重新构建一个form bean的实例(调用构造方法),并且保存在一定作用范围
⑥form bean的reset()方法被调用
⑦调用对应的setter方法,对状态属性赋值
⑧如果validate的属性设置为true,那么就调用form bean的validate()方法
⑨如果validate()方法没有返回任何错误,控制器将ActionForm作为参数,传给Action实例的execute()方法并执行。
注意:直接从ActionForm类继承的reset()和validate()方法,并不能实现什么处理功能,所以有必要直接重新覆盖
校验方法是在form的属性被赋值之后,exectue方法被调用之前进行的

struts1体系结构
struts1体系结构
struts1原理图
struts1原理图

1 0