public void process(HttpServletRequest request,
HttpServletResponse response)
throws IOException, ServletException {
// 处理 contentType 为 multipart/form-data 的 POST 请求,如果是则将请求包装,否则,返回原有
//请求,一般来说,除非是要处理文件上传,否则不用关心
request = processMultipart(request);
//取得 URI 路径
String path = processPath(request, response);
if (path == null) {
return;
}
if (log.isDebugEnabled()) {
log.debug("Processing a '" + request.getMethod() +
"' for path '" + path + "'");
}
// 处理一些国际化的事务
processLocale(request, response);
// 决定请求的Content编码方式。指定响应结果内容类型和字符编码,默认是text/html
processContent(request, response);
//nochache如果是true在响应结果中加入特定的头参数
processNoCache(request, response);
// /前置处理,默认返回 true,子类可以重新定义它以決定要不要继续处理
if (!processPreprocess(request, response)) {
return;
}
this.processCachedMessages(request, response);
//根据客户请求信息的path来决定是否返回ActionMapping实例。
//如果不能找到path的映射则先看是否actionMapping中有unknown属性 有返回,没有这客户将会得到一个error响应
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;
}
// 处理ActionForm,如果沒有就新增一个,之后一直使用它
//首先先检查是否存在ActionMapping配置的ActionForm。如果存在,
//则在有效区域查找是否存在该ActionForm实例,存在则复用,不存在则创建一个实例
//然后将实例保存在配置文件中的有效域(request,session)内,
//并用mapping.getAttribute()作key值
ActionForm form = processActionForm(request, response, mapping);
// 如果存在ActionMapping配置的ActionForm,则封装请求对象的数据
//到ActionForm中,在封装之前,先调用ActionForm的reset()方法进行属性值的默认化
processPopulate(request, response, form, mapping);
// 如果ActionForm被配置好,并且action元素的属性Validate被设置为true,
//则进一步调用validate()方法进行规则校验。如果validate()方法校验失败,
//就会保存一个ActionErrors对象到请求域中,请求将自动重定向到action映射的
//input属性所指向的页面中。如果校验通过或action映射中没有配置ActionForm,
//则继续处理请求
try {
if (!processValidate(request, response, form, mapping)) {
return;
}
} catch (InvalidCancelException e) {
ActionForward forward = processException(request, response, e, form, mapping);
processForwardConfig(request, response, forward);
return;
} catch (IOException e) {
throw e;
} catch (ServletException e) {
throw e;
}
// 判断 <action> 标签的 forward 或 include 标签是不是被设定
// 这两个标签在设定一個路径,其与 type 属性是互斥的,当设定
// 其中一个属性时,调用 RequestDispatcher 的 forward() 或
// include() ,其作用与设定ForwardAction或IncludeAction相同
// 直接传送而不再使用Action物件进行接下来的处理
if (!processForward(request, response, mapping)) {
return;
}
if (!processInclude(request, response, mapping)) {
return;
}
//创建或获得action实例来处理此请求
// 处理action,如果沒有就生成一个,之后一直使用它
Action action = processActionCreate(request, response, mapping);
if (action == null) {
return;
}
// 调用Action的execute()方法,并反回ActionForward
ActionForward forward =
processActionPerform(request, response,
action, form, mapping);
//处理返回来的ActionForward
processForwardConfig(request, response, forward);
}
分享到:
相关推荐
at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1196) at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:432) at javax.servlet.http.HttpServlet.service...
- **RequestProcessor**: 处理每个模块的请求,它负责处理ActionServlet传递过来的请求,包括验证用户角色、处理表单Bean、选择ActionMapping和执行Action等步骤。 - **Action**: 这是业务逻辑的入口点,它实现了`...
- **请求处理阶段**:每次接收到客户端请求时,ActionServlet都会调用RequestProcessor的process方法来处理该请求。 2. **RequestProcessor**:RequestProcessor类负责协调Struts框架中的其他组件,如ActionForm、...
- 当ActionServlet接收到HTTP请求,它会在`doGet()`或`doPost()`方法中调用`process()`方法,接着由RequestProcessor处理实际的请求。 2. **ActionForm**: - ActionForm用于封装来自客户端表单的数据。当请求...
**原理介绍**:在Struts配置文件中设置ActionServlet的初始化参数`inputEncoding`。 **具体实现**: 1. **修改struts-config.xml**: ```xml <plug-in className="org.apache.struts.action.ActionServlet"> ...
当ActionServlet接收到请求后,会根据`struts-config.xml`中的配置找到对应的Action实例,调用其`execute()`方法来处理请求。 4. **ActionForm**:ActionForm 类用于封装用户的请求数据,它通常对应于HTML表单中的...
3. **RequestProcessor的参与**:在process()方法中,ActionServlet会实例化或获取RequestProcessor对象,RequestProcessor是处理请求的核心组件。它会解析struts-config.xml配置文件,寻找与请求URI匹配的`<action>...
首先,ActionServlet是Struts1.2中的核心组件,它扮演着前端控制器的角色。当应用程序启动时,由于在web.xml配置文件中设置了`<load-on-startup>0</load-on-startup>`,ActionServlet会立即被实例化并调用其`init`...
- **概述**:`RequestProcessor`类在Struts架构中扮演着核心角色之一,主要作为`ActionServlet`的助手类。`ActionServlet`的主要功能通过`RequestProcessor`类实现,尤其是在处理HTTP请求时。 - **职责**:处理...
ActionServlet会根据`struts-config.xml`中的配置来处理请求。首先,`process()`方法被调用,接着选择合适的RequestProcessor实例。RequestProcessor会检查Action缓存,如果Action实例不存在,就会创建一个新的实例...
Struts框架的核心组件之一是`ActionServlet`,它作为前端控制器处理所有的HTTP请求,并将请求分发到相应的业务逻辑层(Action)。下面我们将深入解析Struts的处理流程,以帮助开发者更好地理解和运用Struts框架。 #...
一旦捕获到请求,ActionServlet会查找与请求相关的Action,然后通过调用`ActionServlet`中的`process()`方法,进而调用`RequestProcessor`对象的`process()`方法来处理请求。最终,Action的执行结果会通过`Action...
总结,Struts1的控制器组件包括ActionServlet、RequestProcessor和Action,它们协同工作以处理用户请求并驱动业务逻辑。动态ActionForm提供了对表单数据处理的灵活性,适应了Web应用中多样化的用户输入需求。通过...
`process()`方法是ActionServlet的核心,它会根据请求的类型调用相应的处理方法。 2. **RequestProcessor**:这是一个中间层,负责处理ActionServlet接收到的请求。RequestProcessor对请求进行预处理,根据`struts-...
`RequestProcessor` 类扮演着核心角色,它处理所有客户端的请求,所有请求的处理都在 `RequestProcessor` 的 `process()` 方法中进行。`Action` 类是业务逻辑的主要载体,它的 `execute()` 方法用于根据传入的请求...
- `ActionServlet` 调用 `process()` 方法处理请求。 - `RequestProcessor` 进一步处理请求,实例化 `FormBean`。 - 填充 `FormBean` 的值,并进行验证。 - 实例化相应的 `Action` 类。 - 调用 `Action` 类中的...