Struts2是一个流行的Java web开发框架,其设计目标是简化MVC(模型-视图-控制器)架构的应用程序开发。它的工作流程清晰高效,能够帮助开发者更好地组织和管理应用程序的各个部分。以下是对Struts2工作流程的详细解释:
1. **客户端请求**:当用户在浏览器中输入URL,如`http://localhost:8080/bookcode/ch2/Reg.action`,这代表了一个(HttpServletRequest)请求被提交给服务器。
2. **过滤器链**:请求被一系列过滤器处理,这些过滤器主要分为三层。ActionContextCleanUp过滤器清理Action上下文,接着是其他过滤器,如SiteMesh等,最后是核心控制器FilterDispatcher。过滤器的执行顺序至关重要,遵循特定的配置。
3. **核心控制器FilterDispatcher**:作为MVC架构中的控制器,FilterDispatcher负责决定如何处理请求。它会询问ActionMapper,判断是否需要调用某个Action来处理请求。
4. **ActionProxy**:如果ActionMapper确定需要调用Action,FilterDispatcher会将请求传递给ActionProxy。ActionProxy通过Configuration Manager读取配置文件(struts.xml),找到需要执行的Action类。
5. **创建ActionInvocation**:ActionProxy创建一个ActionInvocation实例。在调用Action之前,ActionInvocation会根据配置加载与Action相关的所有Interceptor(拦截器)。
6. **拦截器链**:拦截器是Struts2的一个强大特性,它们在Action执行前后执行,可以进行权限检查、日志记录、数据校验等任务。在Action执行后,拦截器链会继续执行。
7. **Action执行**:ActionInvocation调用实际的Action,执行业务逻辑。Action通常是一个简单的Java类,与Servlet API解耦,但可以通过ActionContext访问HttpServletRequest中的参数。
8. **返回结果处理**:Action执行完成后,ActionInvocation会根据struts.xml中的配置找到对应的返回结果result。这个结果可以是一个JSP页面、一个转发或重定向,或者其他任何指定的响应。
9. **销毁与初始化**:FilterDispatcher有三个关键方法:`destroy()`、`doFilter()`和`init()`。`doFilter()`方法是处理请求的关键,它调用`dispatcher.serviceAction()`来处理用户请求并调用ActionProxy。
Struts2的工作流程强调了组件化和模块化的思想,使得开发者能够专注于业务逻辑的实现,而无需关心底层的请求处理和视图渲染。拦截器的引入使得代码更加灵活和可扩展,可以方便地添加额外的功能或校验。通过ActionProxy,Struts2实现了Action与Servlet API的解耦,使得Action可以专注于业务逻辑,而HTTP请求的处理则由框架自动完成。这样的设计大大提高了开发效率和代码的可维护性。