Struts是Java Web开发中的一个经典MVC框架,它为构建基于J2EE的Web应用程序提供了一种结构化的解决方案。这里我们将深入探讨Struts1和Struts2的工作原理。
我们来看Struts1的工作流程:
1. **ActionServlet**:作为Struts1的核心组件,它是Servlet的一个子类,负责接收来自客户端的HTTP请求。
2. **ActionMapping**:ActionServlet会根据请求URL查找匹配的ActionMapping,ActionMapping定义了请求与Action之间的映射关系。
3. **ActionForm**:如果请求携带了表单数据,ActionServlet会创建或复用ActionForm对象,并将请求参数填充到ActionForm中。
4. **表单验证**:在调用Action之前,如果配置了表单验证,ActionServlet会调用ActionForm的validate()方法进行数据校验。
5. **Action执行**:验证通过后,ActionServlet根据ActionMapping创建或获取Action实例,然后调用其execute()方法处理业务逻辑。
6. **结果转发**:execute()方法返回一个ActionForward对象,指示ActionServlet将请求转发给哪个JSP页面,最终生成动态响应并返回给客户端。
接下来,我们转向Struts2的工作原理:
1. **客户端请求**:客户端发送HTTP请求到服务器,目标通常是一个Servlet。
2. **过滤器链**:请求经过一系列过滤器(Filter),这是Struts2的核心特性之一,它增强了框架的可扩展性和灵活性。
3. **FilterDispatcher**:过滤器链中的FilterDispatcher是入口点,它解析请求并决定是否需要调用Action。
4. **ActionMapper**:FilterDispatcher询问ActionMapper来确定请求是否对应一个特定的Action,以及如何映射。
5. **ActionProxy**:如果需要调用Action,FilterDispatcher会通过ActionProxy来处理。ActionProxy是框架的代理模式实现,负责实际的Action调用。
6. **Configuration Manager**:ActionProxy根据配置管理器(Configuration Manager)读取struts.xml配置文件,找到要执行的Action类。
7. **ActionInvocation**:ActionProxy创建一个ActionInvocation实例,它负责调用Action并管理拦截器(Interceptor)的执行顺序。
8. **拦截器**:在Action执行前后,ActionInvocation会按照配置顺序调用拦截器,这些拦截器可以进行日志记录、权限检查等预处理或后处理操作。
9. **Action执行**:ActionInvocation执行Action的execute()方法,处理业务逻辑。
10. **结果处理**:Action执行完成后,ActionInvocation根据struts.xml中的配置找到对应的返回结果,可能是JSP、FreeMarker模板或其他视图技术,然后将控制权交还给框架,生成最终的响应。
Struts1和Struts2在处理请求和执行业务逻辑方面有相似之处,但Struts2引入了更灵活的拦截器机制,使得业务逻辑和视图渲染更加分离,提高了代码的可维护性和可扩展性。同时,Struts2的配置管理也更为精细,能够更好地适应复杂的项目需求。