Struts1的源码执行流程

Struts的核心类是org.apache.struts.action.ActionServlet ,javax.servlet.HttpServlet,当我们配置Struts时就要在web.xml 文件中配置这个Servlet类,ActionServlet初始化时,就调用init方法。


1.初始化:struts框架的总控制器ActionServlet是一个Servlet,它在web.xml中配置成自动启动的Servlet,在启动时总控制器会读取配置文件(struts-config.xml)的配置信息,为struts中不同的模块初始化相应的对象。(面向对象思想)
2.发送请求:用户提交表单或通过URL向WEB服务器提交请求,请求的数据用HTTP协议传给web服务器。
3.form填充:struts的总控制器ActionServlet在用户提交请求时将数据放到对应的form对象中的成员变量中。
4.派发请求:控制器根据配置信息对象ActionConfig将请求派发到具体的Action,对应的formBean一并传给这个Action中的excute()方法。
5.处理业务:Action一般只包含一个excute()方法,它负责执行相应的业务逻辑(调用其它的业务模块)完毕后返回一个ActionForward对象。服务器通过ActionForward对象进行转发工作。
6.返回响应:Action将业务处理的不同结果返回一个目标响应对象给总控制器。
7.查找响应:总控制器根据Action处理业务返回的目标响应对象,找到对应的资源对象,一般情况下为jsp页面。
8.响应用户:目标响应对象将结果传递给资源对象,将结果展现给用户。


Struts1的源码执行流程:
Struts1主要有三个核心的类,分别是ActionServlet,ModuleConfig,RequestProcessor。
ActionServlet就是控制器, ModuleConfig封装着Struts应用程序的配置信息, RequestProcessor负责处理每一个HTTP请求。

所有Servlet都面向Servlet接口 都继承HttpServlet 实现了Servlet接口
Servlet是顶级接口,doget和dopost是Http的请求

Servlet的生命周期是:
加载配置---初始化---执行---销毁 而struts1里的init方法初始化的

在tomcat启动的时候,
用户从页面发送url请求---->被ActionServlet类进行拦截 根据请求方式调doGet 或 doPost 方法

doGet 、 doPost的区别:
Get方式传递数据时,参数是在浏览器的地址看的见的,适合少量数据传送,会出现乱码。
Post方式传递数据量不限,并且浏览器地址看不到。

它就会去调用ActionServlet里面的init方法去初始化,

首先:initInternal方法就会初始化内部资源文件,比如国际化,国际化包括英文和日文。

然后:initOther方法就是初始化其它的配置,获取我们自己的struts-config配置文件的路径,而它的默认路径就是WEB-INF/struts-config.xml,还有兼容1.0版本

然后:
ininServlet方法初始化Servlet(ActionServlet)本身,通过digester框架解析web.xml,对servletMapping数据进行初始化,在给数据一起映射到javaBean对象里面去。

然后:
initModuleConfig方法给struts-config里面的属性初始化后放入moduleConfig对象里面去,放到moduleConfig对象里面去便于以后操作更快,因为moduleConfig是文件流,文件流是放在内存的,而读内存要快于硬盘.

然后:
初始化插件,(插件的优点就是扩展性强),在让freeze方法使其冻结

最后:
通过迭代给其他模块的配置文件并初始化,同样也让freeze方法冻结它.


action的单例模式是一个HashMap实现的,首先它会到HashMap中找Action的实例,如果为空就创建一个Action的实例,在放入HashMap中,HashMap就是一个缓冲区所有的用户都共用HashMap中的Action实例.
servlet中doget和dopost的区别
servlet中doget和dopost的区别是什么
我知道doget是传输比较小一点的数据而dopost是传输比较大一点的数据, 我在Eclipse里面新建servlet的时候会自动生成一个servlet 然后里面自动有doget和dopost的方法 可是我把doget方法删了后 运行servlet时 在网页中没有显示,然后我把dopost方法删了后 没有什么影响。

Servlet接口中定义了五个方法,
其中比较重要的三个方法涉及到Servlet的生命周期,分别是上文提到的init(),service(),destroy()方法。
GenericServlet是一个通用的,不特定于任何协议的Servlet,它实现了Servlet接口。 而HttpServlet继承于GenericServlet,因此HttpServlet也实现了Servlet接口。
所以我们定义Servlet的时候只需要继承HttpServlet即可。

如何填充from
根据ActionMapping里面的属性信息利用反射机制填充到ActionForm-->然后进行验证 如果不通过则把请求转发到struts-config文件里面

processPopulate()查找ActionMapping是否配置ActionForm 有则调用reset方法清空再装载表单数据,装载时调用了Request.populate() 将页面上input框的name和value存在HashMap里,通过BeanUtils.populate()快速复制到form。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值