View Javadoc

    1   /*
    2    * $Id: DefinitionDispatcherAction.java 471754 2006-11-06 14:55:09Z husted $
    3    *
    4    * Licensed to the Apache Software Foundation (ASF) under one
    5    * or more contributor license agreements.  See the NOTICE file
    6    * distributed with this work for additional information
    7    * regarding copyright ownership.  The ASF licenses this file
    8    * to you under the Apache License, Version 2.0 (the
    9    * "License"); you may not use this file except in compliance
    10   * with the License.  You may obtain a copy of the License at
    11   *
    12   *  http://www.apache.org/licenses/LICENSE-2.0
    13   *
    14   * Unless required by applicable law or agreed to in writing,
    15   * software distributed under the License is distributed on an
    16   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
    17   * KIND, either express or implied.  See the License for the
    18   * specific language governing permissions and limitations
    19   * under the License.
    20   */
    21
    22  package org.apache.struts.tiles.actions;
    23
    24  import java.io.IOException;
    25  import java.io.PrintWriter;
    26
    27  import javax.servlet.http.HttpServletRequest;
    28  import javax.servlet.http.HttpServletResponse;
    29
    30  import org.apache.commons.logging.Log;
    31  import org.apache.commons.logging.LogFactory;
    32  import org.apache.struts.action.Action;
    33  import org.apache.struts.action.ActionForm;
    34  import org.apache.struts.action.ActionForward;
    35  import org.apache.struts.action.ActionMapping;
    36  import org.apache.struts.tiles.ComponentDefinition;
    37  import org.apache.struts.tiles.DefinitionsFactoryException;
    38  import org.apache.struts.tiles.DefinitionsUtil;
    39  import org.apache.struts.tiles.FactoryNotFoundException;
    40  import org.apache.struts.tiles.NoSuchDefinitionException;
    41  import org.apache.struts.tiles.TilesUtil;
    42
    43  /**
    44   * <p>An <strong>Action</strong> that dispatches to a Tiles Definition
    45   * that is named by the request parameter whose name is specified
    46   * by the <code>parameter</code> property of the corresponding
    47   * ActionMapping.
    48   * This action is useful in following situations:
    49   * <li>
    50   * <ul>To associate an Url to a definition</ul>
    51   * <ul>To use Struts &lt;html:link&gt; tag on a definition</ul>
    52   * </li>
    53   * <p>To configure the use of this action in your
    54   * <code>struts-config.xml</code> file, create an entry like this:</p>
    55   *
    56   * <code>
    57   *   &lt;action path="/saveSubscription"
    58   *           type="org.apache.struts.tiles.actions.DefinitionDispatcherAction"
    59   *           parameter="def"/&gt;
    60   *     &lt;forward name="success"   path="anything" //&gt;
    61   *     &lt;forward name="error"     path="path.to.error.page" //&gt;
    62   * </code>
    63   *
    64   * <p>which will use the value of the request parameter named "def"
    65   * to pick the appropriate definition name.
    66   * <p>  The value for success doesn't matter. The forward will forward to
    67   * appropriate definition.
    68   * <p> The value for error should denote a valid jsp path or definition name.
    69   *
    70   * @version $Rev: 471754 $ $Date: 2006-11-06 08:55:09 -0600 (Mon, 06 Nov 2006) $
    71   */
    72  public class DefinitionDispatcherAction extends Action {
    73
    74      /**
    75       * Commons Logging instance.
    76       */
    77      protected static Log log = LogFactory.getLog(DefinitionDispatcherAction.class);
    78
    79      /**
    80       * Process the specified HTTP request, and create the corresponding HTTP
    81       * response (or forward to another web component that will create it),
    82       * with provision for handling exceptions thrown by the business logic.
    83       *
    84       * @param mapping The ActionMapping used to select this instance
    85       * @param form The optional ActionForm bean for this request (if any)
    86       * @param request The HTTP request we are processing
    87       * @param response The HTTP response we are creating
    88       *
    89       * @exception Exception if the application business logic throws
    90       *  an exception
    91       * @since Struts 1.1
    92       */
    93      public ActionForward execute(
    94          ActionMapping mapping,
    95          ActionForm form,
    96          HttpServletRequest request,
    97          HttpServletResponse response)
    98          throws Exception {
    99
    100         // Identify the request parameter containing the method name
    101         // If none defined, use "def"
    102         String parameter = mapping.getParameter();
    103         if (parameter == null) {
    104             parameter = "def";
    105         }
    106
    107         // Identify the method name to be dispatched to
    108         String name = request.getParameter(parameter);
    109         if (name == null) {
    110             log.error("Can't get parameter '" + parameter + "'.");
    111
    112             return mapping.findForward("error");
    113         }
    114
    115         // Try to dispatch to requested definition
    116         try {
    117             // Read definition from factory, but we can create it here.
    118             ComponentDefinition definition =
    119                 TilesUtil.getDefinition(
    120                     name,
    121                     request,
    122                     getServlet().getServletContext());
    123
    124             if (log.isDebugEnabled()) {
    125                 log.debug("Get Definition " + definition);
    126             }
    127
    128             DefinitionsUtil.setActionDefinition(request, definition);
    129
    130         } catch (FactoryNotFoundException e) {
    131             log.error("Can't get definition factory.", e);
    132             return mapping.findForward("error");
    133
    134         } catch (NoSuchDefinitionException e) {
    135             log.error("Can't get definition '" + name + "'.", e);
    136             return mapping.findForward("error");
    137
    138         } catch (DefinitionsFactoryException e) {
    139             log.error("General Factory error '" + e.getMessage() + "'.", e);
    140             return mapping.findForward("error");
    141
    142         } catch (Exception e) {
    143             log.error("General error '" + e.getMessage() + "'.", e);
    144             return mapping.findForward("error");
    145         }
    146
    147         return mapping.findForward("success");
    148
    149     }
    150
    151     /**
    152      * @deprecated This will be removed after Struts 1.2.
    153      */
    154     protected void printError(HttpServletResponse response, String msg)
    155         throws IOException {
    156         response.setContentType("text/plain");
    157         PrintWriter writer = response.getWriter();
    158         writer.println(msg);
    159         writer.flush();
    160         writer.close();
    161     }
    162 }