protected void process(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { RequestUtils.selectApplication(request, getServletContext()); getApplicationConfig(request).getProcessor().process(request, response); }RequestUtils是个工具类,ActionServlet呼叫其selectApplication()方法,藉由 request.getServletPath()来取得请求路径以选择应用程序模块来处理请求,之后从ApplicationConfig对象取得 RequestProcessor对象,将使用者的请求委托它来进行处理。
public class CustomActionServlet extends ActionServlet { public void init() throws ServletException { super.init(); // 增加自己的初始化动作 .... } }预设的RequestProcessor物件是org.apache.struts.action.RequestProcessor,您可以藉由观看 process()方法的原始码来了解它作了哪些事情:
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; ..... // 确定客户端的位置 // 是否要将一个Locale对象储存在 session 中 // 配合 <controller> 的 locale 属性使用 processLocale(request, response); // 确定contentType,预设是 text/html processContent(request, response); // 判断<controller>属性nocache是否被设定 // 若是,在 response 中加入防止快取的header processNoCache(request, response); // 前置处理,预设返回 true //子类可以重新定义它以决定要不要继续处理 if(!processPreProcess(request, response)) { return; } // 从URI路径确定ActionMapping ActionMapping mapping = processMapping(request, response, path); if(mapping == null) { return; } .... // 处理ActionForm // 如果没有就新增一个,之后一直使用它 ActionForm form = processActionForm(request, response, mapping); // 将窗体的字段值填入ActionForm processPopulate(request, response, form, mapping); // 判断是否执行ActionForm的validate()方法 if(!processValidate(request, response, form, mapping)) { return; } // 判断 <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 = processActionCreate(request, response, mapping); if(action == null) { return; } // 呼叫Action的execute()或perform()方法 // 并返回ActionForward ActionForward forward =processActionPerform(request,response,action, for, mapping); // 处理ActionForward processActionForward(request, response, forward); }您可以继承RequestProcessor,并改写其中的processXXXXX()方法来自定义请求的处理方式,如果您要使用自己的 RequestProcessor,要在struts-config.xml中使用<controller>标签来定义,例如:
...在Struts 1.1后,新增了<controller>标签,它可以用于指定ActionServlet的一些参数,在Struts 1.1之前,这些参数是在<init-params>中加以指定,使用<controller>卷标,应用程序中不同的模块也可 以指定各自的参数给ActionServlet。
<controller
contentType="text/html;charset=Big5"
locale="true"
nocache="true"
processorClass="caterpillar.CustomRequestProcessor"/>
...