ActionServlet 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).
Generally, a "Model 2" application is architected as follows:
- 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.
- 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.
- There can be one 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
RequestProcessor
object. This component
represents the "controller" component of an MVC architecture. - The
RequestProcessor
selects and invokes an Action
class to perform
the requested business logic, or delegates the response to another resource. - The
Action
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. - Instead of producing the next page of the user interface directly,
Action
classes generally return an ActionForward
to indicate
which resource should handle the response. If the Action
does not return null, the RequestProcessor
forwards or
redirects to the specified resource (by utilizing
RequestDispatcher.forward
or Response.sendRedirect
)
so as to produce the next page of the user interface.
The standard version of
RequestsProcessor
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.
- Identify, from the incoming request URI, the substring that will be
used to select an action procedure.
- Use this substring to map to the Java class name of the corresponding
action class (an implementation of the
Action
interface).
- If this is the first request for a particular
Action
class,
instantiate an instance of that class and cache it for future use. - Optionally populate the properties of an
ActionForm
bean
associated with this mapping. - Call the
execute
method of this Action
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).
The standard version of
ActionServlet
is configured based
on the following servlet initialization parameters, which you will specify
in the web application deployment descriptor (
/WEB-INF/web.xml
)
for your application. Subclasses that specialize this servlet are free to
define additional initialization parameters.
- config - 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].
- config/${module} - 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)
- configFactory - The Java class name of the
ModuleConfigFactory
used to create the implementation of the
ModuleConfig
interface.
[org.apache.struts.config.impl.DefaultModuleConfigFactory]
- convertNull - Force simulation of the Struts 1.0 behavior
when populating forms. If set to true, the numeric Java wrapper class types
(like
java.lang.Integer
) will default to null (rather than 0).
(Since Struts 1.1) [false] - rulesets - Comma-delimited list of fully qualified
classnames of additional
org.apache.commons.digester.RuleSet
instances that should be added to the Digester
that will
be processing struts-config.xml
files. By default, only
the RuleSet
for the standard configuration elements is
loaded. (Since Struts 1.1) - validating - Should we use a validating XML parser to
process the configuration file (strongly recommended)? [true]
config
protected String config
Comma-separated list of context-relative path(s) to our configuration
resource(s) for the default module.
configDigester
protected Digester configDigester
The Digester used to produce ModuleConfig objects from a
Struts configuration file.
convertNull
protected boolean convertNull
The flag to request backwards-compatible conversions for form bean
properties of the Java wrapper class types.
dataSources
protected FastHashMap dataSources
The JDBC data sources that has been configured for this module,
if any, keyed by the servlet context attribute under which they are
stored.
internal
protected MessageResources internal
The resources object for our internal resources.
internalName
protected String internalName
The Java base name of our internal resources.
log
protected static Log log
Commons Logging instance.
processor
protected RequestProcessor processor
The RequestProcessor
instance we will use to process
all incoming requests.
registrations
protected String[] registrations
The set of public identifiers, and corresponding resource names, for
the versions of the configuration file DTDs that we know about. There
MUST be an even number of Strings in this list!
servletMapping
protected String servletMapping
The URL pattern to which we are mapped in our web application
deployment descriptor.
servletName
protected String servletName
The servlet name under which we are registered in our web application
deployment descriptor.
addRuleSets
private void addRuleSets()
throws ServletException
Add any custom RuleSet instances to configDigester that have
been specified in the rulesets
init parameter.
addServletMapping
public void addServletMapping(String servletName,
String urlPattern)
Remember a servlet mapping from our web application deployment
descriptor, if it is for this servlet.
servletName
- The name of the servlet being mappedurlPattern
- The URL pattern to which this servlet is mapped
destroy
public void destroy()
Gracefully shut down this controller servlet, releasing any resources
that were allocated at initialization.
destroyConfigDigester
protected void destroyConfigDigester()
Gracefully release any configDigester instance that we have created.
destroyInternal
protected void destroyInternal()
Gracefully terminate use of the internal MessageResources.
destroyModules
protected void destroyModules()
Gracefully terminate use of any modules associated with this
application (if any).
doGet
public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws IOException,
ServletException
Process an HTTP "GET" request.
request
- The servlet request we are processingresponse
- The servlet response we are creating
doPost
public void doPost(HttpServletRequest request,
HttpServletResponse response)
throws IOException,
ServletException
Process an HTTP "POST" request.
request
- The servlet request we are processingresponse
- The servlet response we are creating
getInternal
public MessageResources getInternal()
Return the MessageResources
instance containing our
internal message strings.
getModuleConfig
protected ModuleConfig getModuleConfig(HttpServletRequest request)
Return the module configuration object for the currently selected
module.
request
- The servlet request we are processing
getProcessorForModule
private RequestProcessor getProcessorForModule(ModuleConfig config)
Returns the RequestProcessor for the given module or null if one does not
exist. This method will not create a RequestProcessor.
config
- The ModuleConfig.
getRequestProcessor
protected RequestProcessor getRequestProcessor(ModuleConfig config)
throws ServletException
Look up and return the
RequestProcessor
responsible for the
specified module, creating a new one if necessary.
config
- The module configuration for which to
acquire and return a RequestProcessor.
handleConfigException
private void handleConfigException(String path,
Exception e)
throws UnavailableException
Simplifies exception handling in the
parseModuleConfigFile
method.
init
public void init()
throws ServletException
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.
initConfigDigester
protected Digester initConfigDigester()
throws ServletException
Create (if needed) and return a new Digester
instance that has been initialized to process Struts module
configuration files and configure a corresponding ModuleConfig
object (which must be pushed on to the evaluation stack before parsing
begins).
initInternal
protected void initInternal()
throws ServletException
Initialize our internal MessageResources bundle.
initModuleConfig
protected ModuleConfig initModuleConfig(String prefix,
String paths)
throws ServletException
Initialize the module configuration information for the
specified module.
prefix
- Module prefix for this modulepaths
- Comma-separated list of context-relative resource path(s)
for this modules's configuration resource(s)
initModuleConfigFactory
protected void initModuleConfigFactory()
Initialize the factory used to create the module configuration.
initModuleDataSources
protected void initModuleDataSources(ModuleConfig config)
throws ServletException
Initialize the data sources for the specified module.
config
- ModuleConfig information for this module
initModuleMessageResources
protected void initModuleMessageResources(ModuleConfig config)
throws ServletException
Initialize the application MessageResources
for the specified
module.
config
- ModuleConfig information for this module
initModulePlugIns
protected void initModulePlugIns(ModuleConfig config)
throws ServletException
Initialize the plug ins for the specified module.
config
- ModuleConfig information for this module
initModulePrefixes
protected void initModulePrefixes(ServletContext context)
Saves a String[] of module prefixes in the ServletContext under
Globals.MODULE_PREFIXES_KEY. NOTE -
the "" prefix for the default module is not included in this list.
context
- The servlet context.
initOther
protected void initOther()
throws ServletException
Initialize other global characteristics of the controller servlet.
initServlet
protected void initServlet()
throws ServletException
Initialize the servlet mapping under which our controller servlet
is being accessed. This will be used in the &html:form>
tag to generate correct destination URLs for form submissions.
isValidating
private boolean isValidating()
Check the status of the validating
initialization parameter.
- true if the module Digester should validate.
parseModuleConfigFile
protected void parseModuleConfigFile(Digester digester,
String path)
throws UnavailableException
Parses one module config file.
digester
- Digester instance that does the parsingpath
- The path to the config file to parse.
process
protected void process(HttpServletRequest request,
HttpServletResponse response)
throws IOException,
ServletException
Perform the standard request processing for this request, and create
the corresponding response.
request
- The servlet request we are processingresponse
- The servlet response we are creating