Struts1框架二之项目执行流程(源代码分析1)

本文深入探讨Struts1框架的执行流程,从ActionServlet的config属性、doPost和doGet方法入手,详细分析RequestProcessor的process方法,包括解析请求路径、匹配struts-config.xml、封装ActionForm、创建Action实例、执行Action并获取ActionForward,以及最终的页面跳转。通过对源代码的剖析,阐述每个关键步骤的作用和实现方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

整理笔记二:上文我将了一个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
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值