📄 requestprocessor.java.svn-base
字号:
// paths not starting with / should be passed through without any // processing (ie. they're absolute) if (forwardPath.startsWith("/")) { // get module relative uri uri = RequestUtils.forwardURL(request, forward, null); } else { uri = forwardPath; } if (forward.getRedirect()) { // only prepend context path for relative uri if (uri.startsWith("/")) { uri = request.getContextPath() + uri; } response.sendRedirect(response.encodeRedirectURL(uri)); } else { doForward(uri, request, response); } } // :FIXME: if Action.execute throws Exception, and Action.process has been // removed, should the process* methods still throw IOException, // ServletException? /** * <P>Ask the specified <code>Action</code> instance to handle this * request. Return the <code>ActionForward</code> instance (if any) * returned by the called <code>Action</code> for further processing. * </P> * * @param request The servlet request we are processing * @param response The servlet response we are creating * @param action The Action instance to be used * @param form The ActionForm instance to pass to this Action * @param mapping The ActionMapping instance to pass to this Action * @return The <code>ActionForward</code> instance (if any) returned by * the called <code>Action</code>. * @throws IOException if an input/output error occurs * @throws ServletException if a servlet exception occurs */ protected ActionForward processActionPerform(HttpServletRequest request, HttpServletResponse response, Action action, ActionForm form, ActionMapping mapping) throws IOException, ServletException { try { return (action.execute(mapping, form, request, response)); } catch (Exception e) { return (processException(request, response, e, form, mapping)); } } /** * <p>Removes any <code>ActionMessages</code> object stored in the session * under <code>Globals.MESSAGE_KEY</code> and <code>Globals.ERROR_KEY</code> * if the messages' <code>isAccessed</code> method returns true. This * allows messages to be stored in the session, display one time, and be * released here.</p> * * @param request The servlet request we are processing. * @param response The servlet response we are creating. * @since Struts 1.2 */ protected void processCachedMessages(HttpServletRequest request, HttpServletResponse response) { HttpSession session = request.getSession(false); if (session == null) { return; } // Remove messages as needed ActionMessages messages = (ActionMessages) session.getAttribute(Globals.MESSAGE_KEY); if (messages != null) { if (messages.isAccessed()) { session.removeAttribute(Globals.MESSAGE_KEY); } } // Remove error messages as needed messages = (ActionMessages) session.getAttribute(Globals.ERROR_KEY); if (messages != null) { if (messages.isAccessed()) { session.removeAttribute(Globals.ERROR_KEY); } } } /** * <p>Set the default content type (with optional character encoding) for * all responses if requested. <strong>NOTE</strong> - This header will * be overridden automatically if a <code>RequestDispatcher.forward</code> * call is ultimately invoked.</p> * * @param request The servlet request we are processing * @param response The servlet response we are creating */ protected void processContent(HttpServletRequest request, HttpServletResponse response) { String contentType = moduleConfig.getControllerConfig().getContentType(); if (contentType != null) { response.setContentType(contentType); } } /** * <p>Ask our exception handler to handle the exception. Return the * <code>ActionForward</code> instance (if any) returned by the called * <code>ExceptionHandler</code>.</p> * * @param request The servlet request we are processing * @param response The servlet response we are processing * @param exception The exception being handled * @param form The ActionForm we are processing * @param mapping The ActionMapping we are using * @return The <code>ActionForward</code> instance (if any) returned by * the called <code>ExceptionHandler</code>. * @throws IOException if an input/output error occurs * @throws ServletException if a servlet exception occurs */ protected ActionForward processException(HttpServletRequest request, HttpServletResponse response, Exception exception, ActionForm form, ActionMapping mapping) throws IOException, ServletException { // Is there a defined handler for this exception? ExceptionConfig config = mapping.findException(exception.getClass()); if (config == null) { log.warn(getInternal().getMessage("unhandledException", exception.getClass())); if (exception instanceof IOException) { throw (IOException) exception; } else if (exception instanceof ServletException) { throw (ServletException) exception; } else { throw new ServletException(exception); } } // Use the configured exception handling try { ExceptionHandler handler = (ExceptionHandler) RequestUtils.applicationInstance(config .getHandler()); return (handler.execute(exception, config, mapping, form, request, response)); } catch (Exception e) { throw new ServletException(e); } } /** * <p>Process a forward requested by this mapping (if any). Return * <code>true</code> if standard processing should continue, or * <code>false</code> if we have already handled this request.</p> * * @param request The servlet request we are processing * @param response The servlet response we are creating * @param mapping The ActionMapping we are using * @return <code>true</code> to continue normal processing; * <code>false</code> if a response has been created. * @throws IOException if an input/output error occurs * @throws ServletException if a servlet exception occurs */ protected boolean processForward(HttpServletRequest request, HttpServletResponse response, ActionMapping mapping) throws IOException, ServletException { // Are we going to processing this request? String forward = mapping.getForward(); if (forward == null) { return (true); } // If the forward can be unaliased into an action, then use the path of the action String actionIdPath = RequestUtils.actionIdURL(forward, this.moduleConfig, this.servlet); if (actionIdPath != null) { forward = actionIdPath; } internalModuleRelativeForward(forward, request, response); return (false); } /** * <p>Process an include requested by this mapping (if any). Return * <code>true</code> if standard processing should continue, or * <code>false</code> if we have already handled this request.</p> * * @param request The servlet request we are processing * @param response The servlet response we are creating * @param mapping The ActionMapping we are using * @return <code>true</code> to continue normal processing; * <code>false</code> if a response has been created. * @throws IOException if an input/output error occurs * @throws ServletException if thrown by invoked methods */ protected boolean processInclude(HttpServletRequest request, HttpServletResponse response, ActionMapping mapping) throws IOException, ServletException { // Are we going to processing this request? String include = mapping.getInclude(); if (include == null) { return (true); } // If the forward can be unaliased into an action, then use the path of the action String actionIdPath = RequestUtils.actionIdURL(include, this.moduleConfig, this.servlet); if (actionIdPath != null) { include = actionIdPath; } internalModuleRelativeInclude(include, request, response); return (false); } /** * <p>Automatically select a <code>Locale</code> for the current user, if * requested. <strong>NOTE</strong> - configuring Locale selection will * trigger the creation of a new <code>HttpSession</code> if * necessary.</p> * * @param request The servlet request we are processing * @param response The servlet response we are creating */ protected void processLocale(HttpServletRequest request, HttpServletResponse response) { // Are we configured to select the Locale automatically? if (!moduleConfig.getControllerConfig().getLocale()) { return; } // Has a Locale already been selected? HttpSession session = request.getSession(); if (session.getAttribute(Globals.LOCALE_KEY) != null) { return; } // Use the Locale returned by the servlet container (if any) Locale locale = request.getLocale(); if (locale != null) { if (log.isDebugEnabled()) { log.debug(" Setting user locale '" + locale + "'"); } session.setAttribute(Globals.LOCALE_KEY, locale); } } /** * <p>Select the mapping used to process the selection path for this * request. If no mapping can be identified, create an error response and * return <code>null</code>.</p> * * @param request The servlet request we are processing * @param response The servlet response we are creating * @param path The portion of the request URI for selecting a mapping * @return The mapping used to process the selection path for this * request. * @throws IOException if an input/output error occurs */ protected ActionMapping processMapping(HttpServletRequest request, HttpServletResponse response, String path) throws IOException { // Is there a mapping for this path? ActionMapping mapping = (ActionMapping) moduleConfig.findActionConfig(path); // If a mapping is found, put it in the request and return it if (mapping != null) { request.setAttribute(Globals.MAPPING_KEY, mapping); return (mapping); } // Locate the mapping for unknown paths (if any) ActionConfig[] configs = moduleConfig.findActionConfigs(); for (int i = 0; i < configs.length; i++) { if (configs[i].getUnknown()) { mapping = (ActionMapping) configs[i]; request.setAttribute(Globals.MAPPING_KEY, mapping); return (mapping); } } // No mapping can be found to process this request String msg = getInternal().getMessage("processInvalid"); log.error(msg + " " + path); response.sendError(HttpServletResponse.SC_NOT_FOUND, msg); return null; } /** * <p>If this is a multipart request, wrap it with a special wrapper. * Otherwise, return the request unchanged.</p> * * @param request The HttpServletRequest we are processing * @return A wrapped request, if the request is multipart; otherwise the * original request. */ protected HttpServletRequest processMultipart(HttpServletRequest request) { if (!"POST".equalsIgnoreCase(request.getMethod())) { return (request); } String contentType = request.getContentType(); if ((contentType != null) && contentType.startsWith("multipart/form-data")) { return (new MultipartRequestWrapper(request)); } else { return (request); } } /** * <p>Set the no-cache headers for all responses, if requested. * <strong>NOTE</strong> - This header will be overridden automatically if * a <code>RequestDispatcher.forward</code> call is ultimately * invoked.</p> * * @param request The servlet request we are processing * @param response The servlet response we are creating */ protected void processNoCache(HttpServletRequest request, HttpServletResponse response) { if (moduleConfig.getControllerConfig().getNocache()) { response.setHeader("Pragma", "No-cache"); response.setHeader("Cache-Control", "no-cache,no-store,max-age=0"); response.setDateHeader("Expires", 1); } } /** * <p>Identify and return the path component (from the request URI) that * we will use to select an <code>ActionMapping</code> with which to * dispatch. If no such path can be identified, create an error response * and return <code>null</code>.</p> * * @param request The servlet request we are processing * @param response The servlet response we are creating * @return The path that will be used to select an action mapping. * @throws IOException if an input/output error occurs */ protected String processPath(HttpServletRequest request, HttpServletResponse response) throws IOException { String path; // For prefix matching, match on the path info (if any) path = (String) request.getAttribute(INCLUDE_PATH_INFO); if (path == null) { path = request.getPathInfo(); } if ((path != null) && (path.length() > 0)) { return (path); }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -