⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 requestprocessor.java.svn-base

📁 MVC开源框架
💻 SVN-BASE
📖 第 1 页 / 共 3 页
字号:
/* * $Id$ * * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements.  See the NOTICE file * distributed with this work for additional information * regarding copyright ownership.  The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License.  You may obtain a copy of the License at * *  http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied.  See the License for the * specific language governing permissions and limitations * under the License. */package org.apache.struts.action;import org.apache.commons.logging.Log;import org.apache.commons.logging.LogFactory;import org.apache.struts.Globals;import org.apache.struts.config.ActionConfig;import org.apache.struts.config.ExceptionConfig;import org.apache.struts.config.ForwardConfig;import org.apache.struts.config.ModuleConfig;import org.apache.struts.upload.MultipartRequestWrapper;import org.apache.struts.util.MessageResources;import org.apache.struts.util.RequestUtils;import javax.servlet.RequestDispatcher;import javax.servlet.ServletContext;import javax.servlet.ServletException;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import javax.servlet.http.HttpSession;import java.io.IOException;import java.util.HashMap;import java.util.Iterator;import java.util.Locale;/** * <p><strong>RequestProcessor</strong> contains the processing logic that the * {@link ActionServlet} performs as it receives each servlet request from the * container. You can customize the request processing behavior by subclassing * this class and overriding the method(s) whose behavior you are interested * in changing.</p> * * @version $Rev$ $Date$ * @since Struts 1.1 */public class RequestProcessor {    // ----------------------------------------------------- Manifest Constants    /**     * <p>The request attribute under which the path information is stored for     * processing during a <code>RequestDispatcher.include</code> call.</p>     */    public static final String INCLUDE_PATH_INFO =        "javax.servlet.include.path_info";    /**     * <p>The request attribute under which the servlet path information is     * stored for processing during a <code>RequestDispatcher.include</code>     * call.</p>     */    public static final String INCLUDE_SERVLET_PATH =        "javax.servlet.include.servlet_path";    /**     * <p>Commons Logging instance.</p>     */    protected static Log log = LogFactory.getLog(RequestProcessor.class);    // ----------------------------------------------------- Instance Variables    /**     * <p>The set of <code>Action</code> instances that have been created and     * initialized, keyed by the fully qualified Java class name of the     * <code>Action</code> class.</p>     */    protected HashMap actions = new HashMap();    /**     * <p>The <code>ModuleConfiguration</code> with which we are     * associated.</p>     */    protected ModuleConfig moduleConfig = null;    /**     * <p>The servlet with which we are associated.</p>     */    protected ActionServlet servlet = null;    // --------------------------------------------------------- Public Methods    /**     * <p>Clean up in preparation for a shutdown of this application.</p>     */    public void destroy() {        synchronized (this.actions) {            Iterator actions = this.actions.values().iterator();            while (actions.hasNext()) {                Action action = (Action) actions.next();                action.setServlet(null);            }            this.actions.clear();        }        this.servlet = null;    }    /**     * <p>Initialize this request processor instance.</p>     *     * @param servlet      The ActionServlet we are associated with     * @param moduleConfig The ModuleConfig we are associated with.     * @throws ServletException If an error occor during initialization     */    public void init(ActionServlet servlet, ModuleConfig moduleConfig)        throws ServletException {        synchronized (actions) {            actions.clear();        }        this.servlet = servlet;        this.moduleConfig = moduleConfig;    }    /**     * <p>Process an <code>HttpServletRequest</code> and create the     * corresponding <code>HttpServletResponse</code> or dispatch to another     * resource.</p>     *     * @param request  The servlet request we are processing     * @param response The servlet response we are creating     * @throws IOException      if an input/output error occurs     * @throws ServletException if a processing exception occurs     */    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.isDebugEnabled()) {            log.debug("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;        }        this.processCachedMessages(request, response);        // 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);        // Validate any fields of the ActionForm bean, if applicable        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;        }        // 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        processForwardConfig(request, response, forward);    }    // ----------------------------------------------------- Processing Methods    /**     * <p>Return an <code>Action</code> instance that will be used to process     * the current request, creating a new one if necessary.</p>     *     * @param request  The servlet request we are processing     * @param response The servlet response we are creating     * @param mapping  The mapping we are using     * @return An <code>Action</code> instance that will be used to process     *         the current request.     * @throws IOException if an input/output error occurs     */    protected Action processActionCreate(HttpServletRequest request,        HttpServletResponse response, ActionMapping mapping)        throws IOException {        // Acquire the Action instance we will be using (if there is one)        String className = mapping.getType();        if (log.isDebugEnabled()) {            log.debug(" Looking for Action instance for class " + className);        }        // If there were a mapping property indicating whether        // an Action were a singleton or not ([true]),        // could we just instantiate and return a new instance here?        Action instance;        synchronized (actions) {            // Return any existing Action instance of this class            instance = (Action) actions.get(className);            if (instance != null) {                if (log.isTraceEnabled()) {                    log.trace("  Returning existing Action instance");                }                return (instance);            }            // Create and return a new Action instance            if (log.isTraceEnabled()) {                log.trace("  Creating new Action instance");            }            try {                instance = (Action) RequestUtils.applicationInstance(className);                // Maybe we should propagate this exception                // instead of returning null.            } catch (Exception e) {                log.error(getInternal().getMessage("actionCreate",                        mapping.getPath()), e);                response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR,                    getInternal().getMessage("actionCreate", mapping.getPath()));                return (null);            }            actions.put(className, instance);        }        if (instance.getServlet() == null) {            instance.setServlet(this.servlet);        }        return (instance);    }    /**     * <p>Retrieve and return the <code>ActionForm</code> associated with this     * mapping, creating and retaining one if necessary. If there is no     * <code>ActionForm</code> associated with this mapping, return     * <code>null</code>.</p>     *     * @param request  The servlet request we are processing     * @param response The servlet response we are creating     * @param mapping  The mapping we are using     * @return The <code>ActionForm</code> associated with this mapping.     */    protected ActionForm processActionForm(HttpServletRequest request,        HttpServletResponse response, ActionMapping mapping) {        // Create (if necessary) a form bean to use        ActionForm instance =            RequestUtils.createActionForm(request, mapping, moduleConfig,                servlet);        if (instance == null) {            return (null);        }        // Store the new instance in the appropriate scope        if (log.isDebugEnabled()) {            log.debug(" Storing ActionForm bean instance in scope '"                + mapping.getScope() + "' under attribute key '"                + mapping.getAttribute() + "'");        }        if ("request".equals(mapping.getScope())) {            request.setAttribute(mapping.getAttribute(), instance);        } else {            HttpSession session = request.getSession();            session.setAttribute(mapping.getAttribute(), instance);        }        return (instance);    }    /**     * <p>Forward or redirect to the specified destination, by the specified     * mechanism.  This method uses a <code>ForwardConfig</code> object     * instead an <code>ActionForward</code>.</p>     *     * @param request  The servlet request we are processing     * @param response The servlet response we are creating     * @param forward  The ForwardConfig controlling where we go next     * @throws IOException      if an input/output error occurs     * @throws ServletException if a servlet exception occurs     */    protected void processForwardConfig(HttpServletRequest request,        HttpServletResponse response, ForwardConfig forward)        throws IOException, ServletException {        if (forward == null) {            return;        }        if (log.isDebugEnabled()) {            log.debug("processForwardConfig(" + forward + ")");        }        String forwardPath = forward.getPath();        String uri;        // If the forward can be unaliased into an action, then use the path of the action        String actionIdPath = RequestUtils.actionIdURL(forward, request, servlet);        if (actionIdPath != null) {            forwardPath = actionIdPath;            ForwardConfig actionIdForward = new ForwardConfig(forward);            actionIdForward.setPath(actionIdPath);            forward = actionIdForward;        }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -