service 启动时会初始化过滤器,其中最主要的过滤器是filterDispatcher这个过滤器,filterDispatcher的初始化代码如下
public void init(FilterConfig filterConfig) throws ServletException {
try {
this.filterConfig = filterConfig;
initLogging();
dispatcher = createDispatcher(filterConfig);
dispatcher.init();
dispatcher.getContainer().inject(this);
staticResourceLoader.setHostConfig(newFilterHostConfig(filterConfig));
} finally {
ActionContext.setContext(null);
}
}
由上面的代码可以看出,在filterDispatcher的初始化中,
会初始化log,创建一个dispatcher并对他进行初始化,并调用它的container的inject方法,在这个方法中会根据
[struts-default.xml, struts-plugin.xml, struts.xml]这些配置文件,获取里面action,inceputor的配置信息,
放在ActionMapper里面。
当一个http请求过来时,经过层层过滤器,最后调用filterDispatcher过滤器,执行他的doFilter,代码如下:
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
....
ActionMapping mapping;
try {
mapping = actionMapper.getMapping(request, dispatcher.getConfigurationManager());
} catch (Exception ex) {
log.error("error getting ActionMapping", ex);
dispatcher.sendError(request, response, servletContext, HttpServletResponse.SC_INTERNAL_SERVER_ERROR, ex);
return;
}
....
dispatcher.serviceAction(request, response, servletContext, mapping);
....
}
在这个方法里面会根据
传入的HTTP信息,到ActionMapper查找是否需要调用某个action类,如果需要,获取该action在配置文件中的mapping,并掉用如下dispatcher的serviceAction方法:
public void serviceAction(HttpServletRequest request, HttpServletResponse response, ServletContext context, ActionMapping mapping) throws ServletException {
....
try {
UtilTimerStack.push(timerKey);
String namespace = mapping.getNamespace();
String name = mapping.getName();
String method = mapping.getMethod();
Configuration config = configurationManager.getConfiguration();
ActionProxy proxy = config.getContainer().getInstance(ActionProxyFactory.class).createActionProxy(
namespace, name, method, extraContext, true, false);
request.setAttribute(ServletActionContext.STRUTS_VALUESTACK_KEY, proxy.getInvocation().getStack());
// if the ActionMapping says to go straight to a result, do it!
if (mapping.getResult() != null) {
Result result = mapping.getResult();
result.execute(proxy.getInvocation());
} else {
proxy.execute();
}
....
}
在serviceAction方法中会创建需要调用的action的代理类,actionProxy,调用代理类的excute()方法。代码为:
public String execute() throws Exception {
....
retCode = invocation.invoke();
....
}
如上在excute()方法中,会调用代理类的Invocation()方法,此刻,就会调用struts默认的一系列拦截器在struts-default.xml中定义。如ParametersInterceptor,ActionMappingParametersInteceptor拦截器和用户自己定义的拦截器,执行完后就会调用用户真正执行的action类的指定方法体
分享到:
相关推荐
### Struts框架响应客户请求的工作流程详解 #### Struts框架简介 Struts是一个开源的Java Web应用程序框架,属于MVC(Model-View-Controller)架构模式的一种实现。它通过简化Web应用开发,使得开发者能够更加关注...
在深入探讨Struts2的工作流程之前,我们先了解一下MVC模式的基本概念。MVC模式将应用逻辑分隔为三个部分:模型(Model)处理业务逻辑,视图(View)负责展示数据,控制器(Controller)协调用户输入和模型间的交互。...
在Struts 1.2.x中,请求处理流程是整个框架的核心部分,它涉及到了从用户发起请求到服务器响应的完整过程。下面将详细解释这个流程。 1. **请求开始**: 当用户通过浏览器向服务器发送HTTP请求时,请求通常会指向一...
Struts2的核心过滤器是`FilterDispatcher`,它负责整个请求/响应的处理流程。在`web.xml`中配置过滤器的顺序非常重要,因为它们会按照配置的顺序依次执行。例如,下面展示了如何配置字符编码过滤器和Struts2过滤器:...
在Struts2中,请求的处理流程涉及多个组件和步骤,确保了请求的正确路由、业务逻辑的执行以及响应的生成。以下是Struts2请求处理的详细分析: 1. **初始化请求**:客户端发起一个HTTP请求到Servlet容器,如Tomcat或...
3. **FilterDispatcher处理请求**:FilterDispatcher作为Struts2框架的核心控制器,负责处理整个请求流程。具体来说,FilterDispatcher的工作流程包括以下几个关键步骤: - **初始化与核心处理**:FilterDispatcher...
在本文中,我们将深入探讨Struts2的运行流程,了解它是如何处理用户的请求并协调各个组件来实现业务逻辑和视图展示的。 首先,让我们回顾一下在HelloWorld示例中所涉及的基本步骤: 1. 在`web.xml`配置文件中,...
- Struts2的Action与容器解耦,使用简单的Map来表示Servlet上下文,使得Action可以独立测试,同时提供了对原始请求和响应的访问。 4. **测试性**: - Struts1的测试较为困难,因为Action的`execute`方法直接暴露...
Struts 2的工作流程是其高效运行的关键,主要由核心控制器FilterDispatcher、业务控制器Action和用户实现的业务逻辑组件三大部分构成。 **核心控制器FilterDispatcher** FilterDispatcher是Struts 2框架的基础,它...
这个"留言板留言板struts2"项目,显然是一个基于Struts2实现的简单留言板系统,旨在展示Struts2的核心功能和开发流程。下面将详细介绍Struts2框架以及在该项目中可能涉及的关键知识点。 1. **Struts2框架概述**:...
2. **DispatcherServlet(ActionServlet)**: Struts的前端控制器接收请求,并进行初步处理。 3. **配置映射**: 请求URL被映射到相应的Action Mapping,这是在struts-config.xml配置文件中定义的。 4. **ActionForm*...
Struts将Web层进行分层处理,把业务逻辑从Web层中分离出来,通过Action处理用户的请求,再返回对应的响应。在了解Struts程序的执行流程之前,我们需要首先理解几个核心概念: 1. ActionServlet:是Struts框架中的...
1. **流程概述**:在Struts2中,请求首先由`StrutsPrepareAndExecuteFilter`处理。如果请求是Action,框架将创建`ActionInvocation`,并通过`ActionProxy`准备`Action`和拦截器链。执行拦截器后,执行`Action`的方法...
6. **拦截器(Interceptors)**:拦截器是Struts2中的一个强大特性,它可以拦截Action执行前后的流程,实现日志记录、权限验证、事务管理等功能。常见的拦截器有Params拦截器(处理请求参数),Validation拦截器...
在Web应用的配置中,Struts2通过`StrutsPrepareAndExecuteFilter`过滤器注册,因此容器会将请求交给这个过滤器进行处理。 2. **过滤器查询ActionMapper**:过滤器会查询ActionMapper来确定请求是否对应于一个可执行...
Struts2的架构设计采用了拦截器(Interceptor)机制,允许开发人员定义一系列的拦截器来处理HTTP请求和响应。其工作流程大致如下: 1. 用户的浏览器发起一个HTTP请求。 2. 该请求被Struts2框架捕获,请求会被封装...
这将指导Struts2如何处理用户请求并展示响应。 5. **打包项目**:将所有项目文件和目录打包成WAR文件。在命令行中,可以使用`jar`命令或者IDE的相应功能完成此步骤。 6. **部署WAR文件**:将WAR文件复制到Tomcat的...
当一个HTTP请求到达时,Struts2通过一系列精心设计的组件和流程,将请求转化为具体的业务逻辑执行,并最终返回响应结果给客户端。 ### 二、Struts2工作流程详解 #### 1. 请求初始化 一切始于客户端发起的HTTP请求...
本课程笔记主要涵盖了Struts2的基础概念、核心功能及其工作流程。 首先,Struts2的处理流程是通过一系列的组件协作完成的,包括Filter Dispatcher(过滤器调度器)、Action、Interceptor(拦截器)和Result。当用户...