RequestProcessor类
前面提到过,当ActionServlet接收到客户请求后,会进行一连串的初始化操作,然后,就会将客户请求转交给合适的处理器进行处理,这个合适的处理器就是org.apache.struts.action.RequestProcessor或其子类的一个实例(根据Struts配置文件中的配置)。提供了默认实现,如果需要自定义这些行为,可以重载这个类定义自己的处理行为,当你想要自定义操作时,Struts推荐你重载这个类而不是ActionServlet。
下面的代码片断提供了RequestProcessor的默认行为实现代码:
public void process(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
// Wrap multipart requests with a special wrapper request = processMultipart(request);
// Identify the path component we will use to select a mapping String path = processPath(request, response); if (path == null) { return; } if (log.isInfoEnabled( )) { log.info("Processing a '" + request.getMethod( ) + "' for path '" + path + "'"); }
// Select a Locale for the current user if requested processLocale(request, response);
// Set the content type and no-caching headers if requested processContent(request, response); processNoCache(request, response);
// General-purpose preprocessing hook if (!processPreprocess(request, response)) { return; }
// Identify the mapping for this request 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; }
// Process any ActionForm bean related to this request ActionForm form = processActionForm(request, response, mapping); processPopulate(request, response, form, mapping); if (!processValidate(request, response, form, mapping)) { return; }
// Process a forward or include specified by this mapping if (!processForward(request, response, mapping)) { return; } if (!processInclude(request, response, mapping)) { return; }
// Create or acquire the Action instance to process this request Action action = processActionCreate(request, response, mapping); if (action == null) { return; }
// Call the Action instance itself ActionForward forward = processActionPerform(request, response, action, form, mapping);
// Process the returned ActionForward instance processActionForward(request, response, forward); } |