husted 2002/10/11 22:05:26 Modified: doc/userGuide building_controller.xml Log: New 1.1 sections contributed by Eddie Bush. Revision Changes Path 1.31 +89 -4 jakarta-struts/doc/userGuide/building_controller.xml Index: building_controller.xml =================================================================== RCS file: /home/cvs/jakarta-struts/doc/userGuide/building_controller.xml,v retrieving revision 1.30 retrieving revision 1.31 diff -u -r1.30 -r1.31 --- building_controller.xml 11 Oct 2002 22:00:23 -0000 1.30 +++ building_controller.xml 12 Oct 2002 05:05:26 -0000 1.31 @@ -315,11 +315,90 @@ </section> <section name="4.4 The ActionServlet" href="action_servlet"> - <p>[:TODO:]</p> + <p> + For those of you familiar with MVC architecture, the ActionServlet + represents the C - the controller. The job of the controller is to + process user requests, determine what the user is trying to achieve + according to the request, pull data from the model (if necessary) to + be given to the appropriate view, and then select the proper view + to respond to the user. The Struts controller delegates most of this + grunt work to Action classes. + </p> + <p> + In addition to being the controller for your application, the + ActionServlet instance also is responsible for initialization and + clean-up of resources. When the controller initializes, it first + loads the application con fig corresponding to the "config" init-param. + It then goes through an enumeration of all <code>init-param</code> + elements, looking for those elements who's name starts with + <code>config/</code>. For each of these elements, Struts loads the + configuration file specified by the value of that + <code>init-param</code>, and assigns a "prefix" value + to that module's ApplicationConfig instance consisting of the piece of + the <code>init-param</code> name following "config/". For example, the + module prefix specified by the <code>init-param config/foo</code> would + be "foo". This is important to know, since this is how the + controller determines which module will be given control of processing + the request. To access the module foo, you would use a URL like: + </p> + <p> + <pre>http://localhost:8080/myApp/foo/someAction.do</pre> + </p> + <p> + For each request made of the controller, the method + <code>process(HttpServletRequest, HttpServletResponse)</code> will be + called. This method simply determines which module should service + the request and then invokes that module's RequestProcessor's + process method, passing the same request and response. + </p> </section> - - <section name="4.4.1 Request Processor" href="request_processor"> - <p>[:TODO:]</p> + <section name="4.4.1 Request Processor" href="request_processor"> + <p> + The RequestProcessor is where the majority of the core + processing occurs for each request. Let's take a look at the + helper functions the process method invokes in-turn: + </p> + ul> + <li><code>processPath</code> Determine the path that invoked us. This + will be used later to retrieve an ActionMapping.</li> + <li><code>processLocale</code> Select a locale for this request, if one + hasn't already been selected, and place it in the request.</li> + <li><code>processContent</code> [:TODO:]</li> + <li><code>processNoCache</code> If appropriate, set the following response + headers: "Pragma", "Cache-Control", and "Expires".</li> + <li><code>processPreprocess</code> This is one of the "hooks" the + RequestProcessor makes available for subclasses to override. The + default implementation simply returns true. If you subclass + RequestProcessor and override processPreprocess you should either + return true (indicating process should continue + processing the request) or false (indicating you have handled the + request and the process should return).</li> + <li><code>processMapping</code> Determine the ActionMapping associated with + this path.</li> + <li><code>processRoles</code> If the mapping has a role associated with it, + ensure the requesting user is has the specified role. If they do + not, raise an error and stop processing of the request.</li> + <li><code>processActionForm</code> Instantiate (if necessary) the + ActionForm associated with this mapping (if any) and place it + into the appropriate scope.</li> + <li><code>processPopulate</code> Populate the ActionForm associated with + this request, if any.</li> + <li><code>processValidate</code> Perform validation (if requested) on the + ActionForm associated with this request (if any).</li> + <li><code>processForward</code> If this mapping represents a forward, + forward to the path specified by the mapping.</li> + <li><code>processInclude</code> If this mapping represents an include, + include the result of invoking the path in this request.</li> + <li><code>processActionCreate</code> Instantiate an instance of the class + specified by the current ActionMapping (if necessary).</li> + <li><code>processActionPerform</code> This is the point at which your + action's perform or execute method will be called.</li> + <li><code>processActionForward</code> Finally, the process method of the + RequestProcessor takes the ActionForward returned by your + Action class, and uses to select the next resource (if any). + Most often the ActionForward leads to the presentation page that + renders the response. </li> + </ul> </section> <section name="4.4.2 Exception Handler" href="exception_handler"> @@ -335,6 +414,12 @@ use of a plugin is to configure or load application-specific data as the web application is starting up. </p> + <p> + At runtime, any resource setup by <code>init</code> would be accessed by Actions + or business tier classes. The PlugIn interface allows you to setup + resources, but does not provide any special way to access them. Most + often, the resource would be stored in application context, under + a known key, where other components can find it.</p> <p> PlugIns are configured using <plug-in> elements within the Struts configuration file. See <a href="#plugin_config">
-- To unsubscribe, e-mail: <mailto:[EMAIL PROTECTED]> For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>