📄 actionservlet.java.svn-base
字号:
/* * $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.beanutils.BeanUtils;import org.apache.commons.beanutils.ConvertUtils;import org.apache.commons.beanutils.PropertyUtils;import org.apache.commons.beanutils.converters.BigDecimalConverter;import org.apache.commons.beanutils.converters.BigIntegerConverter;import org.apache.commons.beanutils.converters.BooleanConverter;import org.apache.commons.beanutils.converters.ByteConverter;import org.apache.commons.beanutils.converters.CharacterConverter;import org.apache.commons.beanutils.converters.DoubleConverter;import org.apache.commons.beanutils.converters.FloatConverter;import org.apache.commons.beanutils.converters.IntegerConverter;import org.apache.commons.beanutils.converters.LongConverter;import org.apache.commons.beanutils.converters.ShortConverter;import org.apache.commons.chain.CatalogFactory;import org.apache.commons.chain.config.ConfigParser;import org.apache.commons.digester.Digester;import org.apache.commons.digester.RuleSet;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.ConfigRuleSet;import org.apache.struts.config.ExceptionConfig;import org.apache.struts.config.FormBeanConfig;import org.apache.struts.config.FormPropertyConfig;import org.apache.struts.config.ForwardConfig;import org.apache.struts.config.MessageResourcesConfig;import org.apache.struts.config.ModuleConfig;import org.apache.struts.config.ModuleConfigFactory;import org.apache.struts.config.PlugInConfig;import org.apache.struts.util.MessageResources;import org.apache.struts.util.MessageResourcesFactory;import org.apache.struts.util.ModuleUtils;import org.apache.struts.util.RequestUtils;import org.xml.sax.InputSource;import org.xml.sax.SAXException;import javax.servlet.ServletContext;import javax.servlet.ServletException;import javax.servlet.UnavailableException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import java.io.IOException;import java.io.InputStream;import java.math.BigDecimal;import java.math.BigInteger;import java.net.MalformedURLException;import java.net.URL;import java.net.URLConnection;import java.util.ArrayList;import java.util.Enumeration;import java.util.Iterator;import java.util.List;import java.util.MissingResourceException;/** * <p><strong>ActionServlet</strong> provides the "controller" in the * Model-View-Controller (MVC) design pattern for web applications that is * commonly known as "Model 2". This nomenclature originated with a * description in the JavaServerPages Specification, version 0.92, and has * persisted ever since (in the absence of a better name).</p> * * <p>Generally, a "Model 2" application is architected as follows:</p> * * <ul> * * <li>The user interface will generally be created with server pages, which * will not themselves contain any business logic. These pages represent the * "view" component of an MVC architecture.</li> * * <li>Forms and hyperlinks in the user interface that require business logic * to be executed will be submitted to a request URI that is mapped to this * servlet.</li> * * <li>There can be <b>one</b> instance of this servlet class, which receives * and processes all requests that change the state of a user's interaction * with the application. The servlet delegates the handling of a request to a * {@link RequestProcessor} object. This component represents the "controller" * component of an MVC architecture. </li> * * <li>The <code>RequestProcessor</code> selects and invokes an {@link Action} * class to perform the requested business logic, or delegates the response to * another resource.</li> * * <li>The <code>Action</code> classes can manipulate the state of the * application's interaction with the user, typically by creating or modifying * JavaBeans that are stored as request or session attributes (depending on * how long they need to be available). Such JavaBeans represent the "model" * component of an MVC architecture.</li> * * <li>Instead of producing the next page of the user interface directly, * <code>Action</code> classes generally return an {@link ActionForward} to * indicate which resource should handle the response. If the * <code>Action</code> does not return null, the <code>RequestProcessor</code> * forwards or redirects to the specified resource (by utilizing * <code>RequestDispatcher.forward</code> or <code>Response.sendRedirect</code>) * so as to produce the next page of the user interface.</li> * * </ul> * * <p>The standard version of <code>RequestsProcessor</code> implements the * following logic for each incoming HTTP request. You can override some or * all of this functionality by subclassing this object and implementing your * own version of the processing.</p> * * <ul> * * <li>Identify, from the incoming request URI, the substring that will be * used to select an action procedure.</li> * * <li>Use this substring to map to the Java class name of the corresponding * action class (an implementation of the <code>Action</code> interface). * </li> * * <li>If this is the first request for a particular <code>Action</code> * class, instantiate an instance of that class and cache it for future * use.</li> * * <li>Optionally populate the properties of an <code>ActionForm</code> bean * associated with this mapping.</li> * * <li>Call the <code>execute</code> method of this <code>Action</code> class, * passing on a reference to the mapping that was used, the relevant form-bean * (if any), and the request and the response that were passed to the * controller by the servlet container (thereby providing access to any * specialized properties of the mapping itself as well as to the * ServletContext). </li> * * </ul> * * <p>The standard version of <code>ActionServlet</code> is configured based * on the following servlet initialization parameters, which you will specify * in the web application deployment descriptor (<code>/WEB-INF/web.xml</code>) * for your application. Subclasses that specialize this servlet are free to * define additional initialization parameters. </p> * * <ul> * * <li><strong>config</strong> - Comma-separated list of context-relative * path(s) to the XML resource(s) containing the configuration information for * the default module. (Multiple files support since Struts 1.1) * [/WEB-INF/struts-config.xml].</li> * * <li><strong>config/${module}</strong> - Comma-separated list of * Context-relative path(s) to the XML resource(s) containing the * configuration information for the module that will use the specified prefix * (/${module}). This can be repeated as many times as required for multiple * modules. (Since Struts 1.1)</li> * * <li><strong>configFactory</strong> - The Java class name of the * <code>ModuleConfigFactory</code> used to create the implementation of the * ModuleConfig interface. </li> * * <li><strong>convertNull</strong> - Force simulation of the Struts 1.0 * behavior when populating forms. If set to true, the numeric Java wrapper * class types (like <code>java.lang.Integer</code>) will default to null * (rather than 0). (Since Struts 1.1) [false] </li> * * <li><strong>rulesets </strong> - Comma-delimited list of fully qualified * classnames of additional <code>org.apache.commons.digester.RuleSet</code> * instances that should be added to the <code>Digester</code> that will be * processing <code>struts-config.xml</code> files. By default, only the * <code>RuleSet</code> for the standard configuration elements is loaded. * (Since Struts 1.1)</li> * * <li><strong>validating</strong> - Should we use a validating XML parser to * process the configuration file (strongly recommended)? [true]</li> * * <li><strong>chainConfig</strong> - Comma-separated list of either * context-relative or classloader path(s) to load commons-chain catalog * definitions from. If none specified, the default Struts catalog that is * provided with Struts will be used.</li> * * </ul> * * @version $Rev$ $Date: 2005-10-14 19:54:16 -0400 (Fri, 14 Oct 2005) * $ */public class ActionServlet extends HttpServlet { /** * <p>Commons Logging instance.</p> * * @since Struts 1.1 */ protected static Log log = LogFactory.getLog(ActionServlet.class); // ----------------------------------------------------- Instance Variables /** * <p>Comma-separated list of context-relative path(s) to our * configuration resource(s) for the default module.</p> */ protected String config = "/WEB-INF/struts-config.xml"; /** * <p>Comma-separated list of context or classloader-relative path(s) that * contain the configuration for the default commons-chain * catalog(s).</p> */ protected String chainConfig = "org/apache/struts/chain/chain-config.xml"; /** * <p>The Digester used to produce ModuleConfig objects from a Struts * configuration file.</p> * * @since Struts 1.1 */ protected Digester configDigester = null; /** * <p>The flag to request backwards-compatible conversions for form bean * properties of the Java wrapper class types.</p> * * @since Struts 1.1 */ protected boolean convertNull = false; /** * <p>The resources object for our internal resources.</p> */ protected MessageResources internal = null; /** * <p>The Java base name of our internal resources.</p> * * @since Struts 1.1 */ protected String internalName = "org.apache.struts.action.ActionResources"; /** * <p>The set of public identifiers, and corresponding resource names, for * the versions of the configuration file DTDs that we know about. There * <strong>MUST</strong> be an even number of Strings in this list!</p> */ protected String[] registrations = { "-//Apache Software Foundation//DTD Struts Configuration 1.0//EN", "/org/apache/struts/resources/struts-config_1_0.dtd", "-//Apache Software Foundation//DTD Struts Configuration 1.1//EN", "/org/apache/struts/resources/struts-config_1_1.dtd", "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN", "/org/apache/struts/resources/struts-config_1_2.dtd", "-//Apache Software Foundation//DTD Struts Configuration 1.3//EN", "/org/apache/struts/resources/struts-config_1_3.dtd", "-//Apache Software Foundation//DTD Struts Configuration 1.4//EN", "/org/apache/struts/resources/struts-config_1_4.dtd", "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN", "/org/apache/struts/resources/web-app_2_3.dtd" }; /** * <p>The URL pattern to which we are mapped in our web application * deployment descriptor.</p> */ protected String servletMapping = null; // :FIXME: - multiples? /** * <p>The servlet name under which we are registered in our web * application deployment descriptor.</p> */ protected String servletName = null; // ---------------------------------------------------- HttpServlet Methods /** * <p>Gracefully shut down this controller servlet, releasing any * resources that were allocated at initialization.</p> */ public void destroy() { if (log.isDebugEnabled()) { log.debug(internal.getMessage("finalizing")); } destroyModules(); destroyInternal(); getServletContext().removeAttribute(Globals.ACTION_SERVLET_KEY); // Release our LogFactory and Log instances (if any) ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); if (classLoader == null) { classLoader = ActionServlet.class.getClassLoader(); } try { LogFactory.release(classLoader); } catch (Throwable t) { ; // Servlet container doesn't have the latest version // of commons-logging-api.jar installed // :FIXME: Why is this dependent on the container's version of // commons-logging? Shouldn't this depend on the version packaged // with Struts? /* Reason: LogFactory.release(classLoader); was added as an attempt to investigate the OutOfMemory error reported on Bugzilla #14042. It was committed for version 1.136 by craigmcc */ } CatalogFactory.clear(); PropertyUtils.clearDescriptors(); } /** * <p>Initialize this servlet. Most of the processing has been factored * into support methods so that you can override particular functionality * at a fairly granular level.</p> * * @throws ServletException if we cannot configure ourselves correctly */ public void init() throws ServletException { final String configPrefix = "config/"; final int configPrefixLength = configPrefix.length() - 1; // Wraps the entire initialization in a try/catch to better handle // unexpected exceptions and errors to provide better feedback // to the developer
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -