struts1源码心得

struts1 = jsp + tag + servlet。struts1最核心的是ActionServlet。
web.xml是struts1框架中最基本的入口。
定义了一个标准的servlet,名字叫action,继承ActionServlet。.do的请求都被action拦截。
servlet的生命周期:当web容器启动的时候,加载init方法,然后执行service方法。当web容器退出或关闭时,才把servlet销毁。

ActionServlet源码

ActionServlet继承HttpServlet -> 继承GenericServlet -> 继承Object
Servlet规范的顶级接口:Servlet。servlet里面只有一个方法就是service方法,tomcat标准的是调service的方法,它是对doget,dopost进行了封装。
request和response都是tomcat封装好的方法,然后再传进servlet里。

GenericServlet是个抽象类,它实现Servilet接口,主要是做个助手类或可以说是个适配器,起个承上启下的作用。里面是servlet的生命周期方法

HttpServlet是个抽象类,它继承GenericServlet抽象类。它只处理http协议。真正在service里面处理doget,dopost等区别servlet。
(总结当一个用户发送一个请求的时候,tomcat最后还是调用了service方法,Service方法里面调用
request.getMethod对doget,head,dopost等逻辑处理判断)
先拿到客户端请求的方法,然后判断用get方法提交还是用post方法提交或head方法。
不赞成覆盖service方法,这样会把doget方法和doPost方法等方法覆盖掉,这样就会打断servlet正常的执行流程。所以真正执行的方法还是doget方法和doPost方法。
http协议是个超文本传输协议。
ftp协议是个下载,上传文件的协议。
                                       
ActionServlet类
Struts的错误提示都在它的内置资源文件里。
init方法是一系列的东西进行初始化。
init方法执行过程
1,(initInternal)初始化内置文件 ->

2,(initOther)通过getServletConfig().getInitParameter()方法初始化Struts的核心web.xml中actionServlet的配置
   (可以把web.xml里的struts-config.xml删掉,前提是web.xml要在web-inf目录下,因为Struts默认了struts-config.xml的路径)->
  
3,(initServlet)把web中当前的servlet配置放入当前类里面的Struts。
digester是一个经常使用的工具,是将xml文件转换成java对象。把xml放入this里,将xml转换成java对象,对象是ActionServlet。
(拿到web/inf/下面的文件:getServletContext().getResourceAsStream("文件名")) ->

4,(initChain)初始化Struts1里面的Chain框架strut1
单一职责链.
chain。初始化chain是组织执行一些复杂的处理流程。如果某个环节失败了,那这条链就会中断。还有chain还可以在链中插入方块(节点)。小方块由command表示。ActionCommandBase是小方块的父类。
对外扩展是开放的,对内修改是封闭的,这就是所谓的开关原则。

Struts解析
struts-config.xml初始化

通过字符串加载,依赖性就少一点。
1,在initModuleConfig里开始解析struts-config.xml。把struts-config.xml通过digester转换成moduleconfig对象。
2,初始化struts的资源文件,解析后的资源文件放在getServletContext()里
3,初始化struts的插件。
4,初始化formBean,拿到配置的formbean,处理formbean扩展,判断是否设定formbean的类型。然后检查是不是动态formbean。
5,初始化forward,检查它的扩展,判断是否设定path。
6,初始化异常。
7,初始化action,拿到配置的action,处理action扩展。然后看action里的forward。
8, moduleConfig.freeze()初始化冻结,冻结当前的模块的配置。因为初始化只执行一次。
9,拿初始化参数,它会判断还有没有其他的struts-config.xml文件,如果有,就把当前struts-config.xml进行一次初始化操作。然 后销毁掉这个对象。并释放内存。



Struts处理请求
.do发生的请求被actionServlet拦截下来,如果是get请求,就调用doGet方法,如果是post请求,就调用doPost方法。doGet和doPost都会调用process方法,统一处理。则在struts1 1.3.8版本之前处理请求都是在RequestProcess内中.

struts是怎么处理.do请求

所有的.do请求有ActionServlet所拦截,
.do请求是通过职责链模式实现的
struts真正的处理请求不是ActionServlet,而是链。
通过传入用户请求,生成一个上下文的context。不过这只针对当前请求。

struts1 = jsp + tag + servlet。struts1最核心的是ActionServlet。
web.xml是struts1框架中最基本的入口。
定义了一个标准的servlet,名字叫action,继承ActionServlet。.do的请求都被action拦截。
servlet的生命周期:当web容器启动的时候,加载init方法,然后执行service方法。当web容器退出或关闭时,才把servlet销毁。

ActionServlet源码

ActionServlet继承HttpServlet -> 继承GenericServlet -> 继承Object
Servlet规范的顶级接口:Servlet。servlet里面只有一个方法就是service方法,tomcat标准的是调service的方法,它是对doget,dopost进行了封装。
request和response都是tomcat封装好的方法,然后再传进servlet里。

GenericServlet是个抽象类,它实现Servilet接口,主要是做个助手类或可以说是个适配器,起个承上启下的作用。里面是servlet的生命周期方法

HttpServlet是个抽象类,它继承GenericServlet抽象类。它只处理http协议。真正在service里面处理doget,dopost等区别servlet。
(总结当一个用户发送一个请求的时候,tomcat最后还是调用了service方法,Service方法里面调用
request.getMethod对doget,head,dopost等逻辑处理判断)
先拿到客户端请求的方法,然后判断用get方法提交还是用post方法提交或head方法。
不赞成覆盖service方法,这样会把doget方法和doPost方法等方法覆盖掉,这样就会打断servlet正常的执行流程。所以真正执行的方法还是doget方法和doPost方法。
http协议是个超文本传输协议。
ftp协议是个下载,上传文件的协议。
                                       
ActionServlet类
Struts的错误提示都在它的内置资源文件里。
init方法是一系列的东西进行初始化。
init方法执行过程
1,(initInternal)初始化内置文件 ->

2,(initOther)通过getServletConfig().getInitParameter()方法初始化Struts的核心web.xml中actionServlet的配置
   (可以把web.xml里的struts-config.xml删掉,前提是web.xml要在web-inf目录下,因为Struts默认了struts-config.xml的路径)->
  
3,(initServlet)把web中当前的servlet配置放入当前类里面的Struts。
digester是一个经常使用的工具,是将xml文件转换成java对象。把xml放入this里,将xml转换成java对象,对象是ActionServlet。
(拿到web/inf/下面的文件:getServletContext().getResourceAsStream("文件名")) ->

4,(initChain)初始化Struts1里面的Chain框架strut1
单一职责链.
chain。初始化chain是组织执行一些复杂的处理流程。如果某个环节失败了,那这条链就会中断。还有chain还可以在链中插入方块(节点)。小方块由command表示。ActionCommandBase是小方块的父类。
对外扩展是开放的,对内修改是封闭的,这就是所谓的开关原则。

Struts解析
struts-config.xml初始化

通过字符串加载,依赖性就少一点。
1,在initModuleConfig里开始解析struts-config.xml。把struts-config.xml通过digester转换成moduleconfig对象。
2,初始化struts的资源文件,解析后的资源文件放在getServletContext()里
3,初始化struts的插件。
4,初始化formBean,拿到配置的formbean,处理formbean扩展,判断是否设定formbean的类型。然后检查是不是动态formbean。
5,初始化forward,检查它的扩展,判断是否设定path。
6,初始化异常。
7,初始化action,拿到配置的action,处理action扩展。然后看action里的forward。
8, moduleConfig.freeze()初始化冻结,冻结当前的模块的配置。因为初始化只执行一次。
9,拿初始化参数,它会判断还有没有其他的struts-config.xml文件,如果有,就把当前struts-config.xml进行一次初始化操作。然 后销毁掉这个对象。并释放内存。



Struts处理请求
.do发生的请求被actionServlet拦截下来,如果是get请求,就调用doGet方法,如果是post请求,就调用doPost方法。doGet和doPost都会调用process方法,统一处理。则在struts1 1.3.8版本之前处理请求都是在RequestProcess内中.

struts是怎么处理.do请求

所有的.do请求有ActionServlet所拦截,
.do请求是通过职责链模式实现的
struts真正的处理请求不是ActionServlet,而是链。
通过传入用户请求,生成一个上下文的context。不过这只针对当前请求。

猜你喜欢

转载自terry0501.iteye.com/blog/1579454