其执行流程如下:
(1) 调用processMultipart()方法,如果HTTP请求方式为POST,并且请求的coutentType属性以”Multipart/form-data”开头,标准的HttpServletRequest对象将被重新包装,以方便处理“Multipart”类型的HTTP请求,如果请求方式为GET,或者contentType属性不是“multipart”,就直接返回原始的HttpServletRequest对象。
(2) 调用processPath(),获得请求URI路径,这一信息可用于选择合适的Struts Action组件。
(3) 调用processLocale()方法,当ControllerConfig对象的locale属性为true,将读取用户请求中包含的Locale信息,然后把Locale实例保存在session范围内。
(4) 调用processContent(),读取ControllerConfig对象的contentType属性,然后调用response.setContentType(content Type)方法,设置响应结果的文档类型和字符编码。processContent()方法的代码如下:
protected void processContent(HttpServletRequest request,HttpServletResponse){
String contentType=moduleConfig.getControllerConfig().getContentType();
If(contentType!=null) {
Response.setContentType(contentType);
}
}
(5) 调用processNoCache(),读取ControllerConfig对象的nocache属性,如果nocache属性为true,在响应结果中将加入特定的头参数:Pragma,Cache-Control和Expires,防止页面被存储在客户浏览器的缓存中,processNoCache()方法的代码如下:
protected void processNoCache(HttpServletRequest request,HttpServletResponse response){
if(moduleConfig.getControllerConfig().getNoCache()) {
response.setHeader(“Pragma”,”NoCache”);
response.setHeader(“Cache-Control”,”no-cache”);
response.setHeader(“Expires”,1);
}
}
(6) 调用processPreprocess(),该方法不执行任何操作,直接返回true,子类可以覆盖这个方法,执行客户化的预处理请求操作。
(7) 调用processMapping(),寻找和用户请求的URI匹配的ActionMapping,如果不存在这样的ActionMapping,则向用户返回恰当的错误信息。
(8) 调用processRoles(),现判断是否为Action配置了安全角色,如果配置了安全角色,叫调用isUserInRole()方法判断当前用户是否具备必须的角色。如果不具备,就结束请求处理流程,向用户返回恰当的错误信息。
(9) 调用processActionForm(),现判断是否为ActionMapping配置了ActionForm,如果配置了ActionForm(),就先从ActionForm的存在范围内寻找该ActionForm的实例,如果不存在,就创建一个实例,接下来把它保存在合适的范围内,保存时使用的属性key为ActionForm的name属性。
(10) 调用processPopulate()方法,如果为ActionMapping配置了ActionForm,就先调用ActonForm的reset()方法,再把请求中的表单数据组装到ActionFrom中。
(11) 调用processValidate(),如果为ActionMapping 配置了ActionForm,并且ActionMapping 的validate属性为true,就调用ActionForm的validate()方法,如果validate()方法返回的ActionErrors对象中包含ActionMessage对象,说明表单验证失败,就把ActionErrors对象存储在request范围内,再把请求转发到ActionMapping的input属性指定的WEB组件,如果ActionForm的valildate()方法执行表单验证成功,就继续执行下一个请求处理流程。
(12) 调用processForward(),判断是否在ActionMapping中配置了forward属性,如果配置了这个属性,就调用RequestDispatcher的forward()方法,请求处理流程结束,否则进行下一步。
(13) 调用processInclude(),判断是否在ActionMapping中配置了include属性,如果配置了这个属性,就调用RequestDispatcher的include()方法,请求处理流程结束,否则进行下一步。
(14) 调用processActionCreate()方法,现判断是否在Action缓存中存在这个Action实例,如果不存在,就创建一个实例,把它保存在Action缓存中。
(15) 调用processActionPerform()方法,该方法再调用Action实例的execute()方法,execute()方法位于try/catch代码中,以便捕获异常。代码如下:
protected ActionForward processActionPerform(HttpServletRequest request,HttpServletResponse response,Action action, ActionMapping mapping)throws IOException,ServletException{
try{
return(action.execute(mapping,form,request,response));
}catch(Exception e){
return(processException(request,response,e,form,mapping));
}
}
(16) 调用processActionForward()方法,把Action 的execute()方法返回的ActionForward对象作为参数来传给它。processActionForward()根据ActionFroward对象包含的请求转发信息来执行请求转发或重定向。
注意:在struts中,ControllerConfig类与配置文件中的<controller>元素对应,ActionMapping类和<action>元素对应,ActionForward类和<forward>元素对应
扩展RequestProcessor类
下面我们来实现用户在同一个会话的任何时候都可以改变它的Locale设置,在RequestProcessor类中定义的processLocale()方法的默认行为是: 仅仅当session范围呢不存在Locale实例的时候,才会把Locale实例保存在session内,这通发生在处理同一个对话的第一个请求时。
那么我们怎样实现在同一个会话的任何时候都可以改变它的Locale设置呢?我们扩展RequestProcessor类,检查每次用户发出的HTTP请求中包含的Locale信息,每当Locale发生变化时,就会把新的Locale实例保存在session范围内。
代码如下:
package sample;
import javax.servlet.http*;
import java.util.Locale;
import org.apache.struts.action.Action;
import org.apache.struts.action.RequestProcessor;
import org.apache.struts.action.Globals;
public class ExtendedRequestProcessor extends RequestProcessor{
protected void processLocale(HttpServletRequest request,HttpServletResponse response){
if(!moduleConfig.getControllerConfig().getLocale()){
return
}//end if
//get the locale that stored in the user’s session if any
HttpSession session=request.getSession();
Locale sessionLocale=(Locale)session.getAttribute(Globals.LOCALE_KEY);
}
//get the user’s preferred Locale form the request
Locale requestLocale=request.getLocale();
//if was never a locale in the session or it has changed ,set it
if(sessionLocale==null||(sessionLocale!=requestLocale)){
if(log.isDebugEnabled()) {
相关推荐
在测试`RequestProcessor`时,我们需要关注它如何处理不同类型的请求,是否能正确地转发请求到DispatcherServlet,以及在异常情况下如何进行错误处理。此外,对于涉及安全性的操作,如验证请求头或Cookie,我们还...
在"struts1整合spring 通过代理RequestProcessor实现"这个主题中,核心思想是利用Spring的AOP(面向切面编程)能力,对Struts1的RequestProcessor进行代理,以此来增强或扩展RequestProcessor的功能。...
3. **RequestProcessor的参与**:在process()方法中,ActionServlet会实例化或获取RequestProcessor对象,RequestProcessor是处理请求的核心组件。它会解析struts-config.xml配置文件,寻找与请求URI匹配的`<action>...
接着,它会找到相应的RequestProcessor对象,RequestProcessor与模块的配置信息关联。 RequestProcessor是控制流程的关键步骤。在`process`方法中,首先调用`processPreprocess`方法,这个方法默认为空,但可以被子...
- **存储位置**:这个唯一的`RequestProcessor`实例会被存储在`ActionServlet`的一个属性中,其键名为`"org.apache.struts.action.REQUEST_PROCESSOR"`加上当前模块配置文件的前缀(如`config.getPrefix()`)。...
在开发Web应用程序时,中文乱码问题是一个常见的...对于大型项目来说,自定义`RequestProcessor`方法更加推荐,因为它能全局统一处理编码问题,避免在每个Action中重复进行编码转换,提高了代码的可读性和可维护性。
RequestProcessor对请求进行预处理,根据`struts-config.xml`配置文件找到合适的ActionForm和ActionMapping。 3. **Action**:Action类是具体业务逻辑的执行者。当RequestProcessor找到对应的Action实例后,会调用...
2. **创建自定义RequestProcessor**:继承`org.apache.struts.action.RequestProcessor`,但通常这个类不需要额外的处理逻辑,只是为了指定每个模块使用的RequestProcessor。 3. **配置struts-config-module1.xml**...
2. **RequestProcessor组件**: RequestProcessor是每个子应用模块的请求处理器,它才是真正执行处理工作的核心。在调用Action的execute方法之前,RequestProcessor会执行一些预处理任务。开发者可以通过扩展...
- **自定义 RequestProcessor 类:**继承 Struts 的 RequestProcessor 类,并重写 `processPreprocess` 方法,在此方法中设置请求的字符编码。 ```java package servlets; import java.io....
2. **RequestProcessor**:每个请求在到达ActionServlet之前,都会先经过RequestProcessor。RequestProcessor负责预处理请求,例如设置本地化信息、处理主题等。开发者可以自定义RequestProcessor以实现特定的请求...
- **RequestProcessor**: 处理每个模块的请求,它负责处理ActionServlet传递过来的请求,包括验证用户角色、处理表单Bean、选择ActionMapping和执行Action等步骤。 - **Action**: 这是业务逻辑的入口点,它实现了`...
我们可以通过继承Struts的`RequestProcessor`类并重写其方法,对请求和响应进行适当的处理,以确保数据在传输过程中保持正确的编码格式。 在Struts的配置文件`struts-config.xml`中,我们可以将这个自定义的过滤器...
此外,RequestProcessor也是控制器的一部分,它负责解析请求并准备调用Action。 Struts1的执行流程包括以下步骤: 1. 客户端发送一个以".do"结尾的HTTP请求,ActionServlet接收请求。 2. ActionServlet将请求交给...
Struts1.2的使用流程涉及到了Web应用程序的结构定义、ActionForm的创建、JSP页面的编写、Action处理逻辑的实现、RequestProcessor的定制以及控制器配置等多个方面。通过遵循这一流程,开发者可以构建出结构清晰、...
2. **自定义RequestProcessor**:创建一个继承自`org.apache.struts.action.RequestProcessor`的类,如`MyProcessor`。在该类的`processPreprocess`方法中,设置请求和响应的字符编码为`UTF-8`: ```java public ...
2. **RequestProcessor**:RequestProcessor类负责协调Struts框架中的其他组件,如ActionForm、Action等,完成整个请求的处理过程。其内部实现了一个处理链(Chain of Responsibility),通过一系列的方法调用来处理...
首先,创建一个新的类 `SelfRequestProcessor` 继承自 Struts 内置的 `RequestProcessor` 类: ```java public class SelfRequestProcessor extends RequestProcessor { public SelfRequestProcessor() {} @...
步骤类似,但需要在 `struts-config.xml` 中更改 `RequestProcessor` 类的配置,将默认的 `RequestProcessor` 替换为 `DelegatingRequestProcessor`。 3. 通过 Spring 的 `DelegatingActionProxy` 类 这种方式更为...
它可能会创建一个Socket监听特定端口,接受连接,然后实例化`RequestProcessor`来处理每个新连接。 3. `JHTTPServer.java` - 这个类可能是整个HTTP服务器的主入口点,它初始化服务器设置,比如端口号、请求处理器...