整理笔记二:上文我将了一个struts1项目的执行流程,但是具体里面的代码调用,我们并没有了解。今天我就从源代码分析下整个项目的执行流程,首先我们先来看看执行流程图
从上面我们我可以简单的了解到,一个Struts1的执行流程,但是大家会有一些问题
1、ActionServlet类里面有什么属性、都有什么方法
2、struts1框架是怎么通过请求得到一个具体的action请求的
3、struts1框架是怎么求请求参数进行封装的
4、struts1框架是怎么对返回的ActionFroward参数进行判断,然后返回给相应的jsp页面的
我也从这几个问题去深入了解Struts1源代码的实现
ActionServlet类里面有什么属性、都有什么方法
/**
*
*由于该类有许多方法和属性,我这里只列举出一些常见或者对我们理解项目流程有关的方法、属性
**/
public class ActionServlet extends HttpServlet {
//这里可以看出,如果我们再web.xml中没有配置config的init-param标签,系统默认查找ActionServlet的配置信息文件地址
protected String config = “/WEB-INF/struts-config.xml”;
//对象销毁的方法
public void destroy() {
}
public void init() throws ServletException {
}
//如果请求是一个get请求调用的方法
public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws IOException, ServletException {
process(request, response);
}
//如果请求是一个post请求调用的方法
public void doPost(HttpServletRequest request,
HttpServletResponse response)
throws IOException, ServletException {
process(request, response);
}
}
通过doPost、doGet方法我们可以了解到,具体的功能实现是一个process的方法,我们重点了解下这个方法具体做了什么
protected void process(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException {
/*去掉了一些无关的代码*/
getRequestProcessor(getModuleConfig(request)).process(request, response);
}
我们发现这里面相当于调用了RequestProcessor里面的public void process(HttpServletRequest request, HttpServletResponse response)方法,那我们来看看这个方法里面到底有哪些实现,这里就精彩了,我省略了部分源代码
总结
RequestProcessor的process方法具体的做的事情可以分为以下几点,下面是该方法的具体源代码
1、解析请求信息得到xxx.do,然后与struts-config.xml里面进行匹对,如果存在则往下执行,如果不存在则返回null
2、通过path与request和response域解析出里面的信息,得到ActionMapping的信息
3、通过path与request和response域解析出,得到ActionForm的信息
4、然后通过processPopulate方法将form表单数据封装到ActionFrom对象中
5、ActionMapping和response、response域得到Action实例对象(processActionCreate方法)
6、调用processActionPerform方法,通过Action实例对象、mapping、form等信息得到ActionForward对象
7、然后通过执行processFrowardConfig方法,就可以实现信息的返回给前台页面
public void process(HttpServletRequest request,
HttpServletResponse response)
throws IOException, ServletException {
request = processMultipart(request);
//这里是得到项目路径中请求后的信息,例如/login.do里面的login字符串,具体的实现可以看下面的processPath详解
String path = processPath(request, response);
if (path == null) {
return;
}
//通过上面的path可以找到ActionMapping里面的信息,具体里面封装了哪些信息,我在下面会进行详细讲解
ActionMapping mapping = processMapping(request, response, path);
if (mapping == null) {
return;
}
// Check for any role required to perform this action
if (!processRoles(request, response, mapping)) {
return;
}
//这里得到了ActionFrom的信息,到现在为止,我就得到了Action中execute方法的所有参数了
ActionForm form = processActionForm(request, response, mapping);
//封装表单信息到form-bean对象中
processPopulate(reques