package com.ibatis.struts;

import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.lang.reflect.Method;

/**
* BeanAction is an extension to the typical Struts Action class that
* enables mappings to bean methods.  This allows for a more typical
* Object Oriented design where each object has behaviour as part of
* its definition.  Instead of writing separate Actions and Forms,
* BeanAction allows you to simply have a Bean, which models both
* the state and the methods that operate on that state.
*
* In addition to the simpler packaging, BeanAction also simplifies the
* Struts progamming paradigm and reduces dependency on Struts.  Using
* this pattern could allow easier migration to newer frameworks like JSF.
*
* The method signatures are greatly simplified to the following
*
* public String myActionMethod() {
*   //..work
*   return "success";
* }
*
* The return parameter becomes simply the name of the forward (as defined
* in the config file as usual).  Form parameters, request, response, session,
* attributes, and cookies are all accessed via the ActionContext class (see the
* ActionContext javadocs for more).
*
* The forms that you map to a BaseAction mapping must be a subclass of the
* BaseBean class.  BaseBean continues to simplify the validation and
* reset methods by removing the parameters from the signature as was done with
* the above action method example.
*
* There are 3 ways to map a BeanAction in the struts configuration file.
* They are as follows.
*
* URL Pattern
*
* This approach uses the end of the action definition to determine which
* method to call on the Bean.  For example if you request the URL:
*
* http://localhost/jpetstore4/shop/viewOrder.do
*
* Then the method called would be "viewOrder" (of the mapped bean as specified
* by the name="" parameter in the mapping below).  The mapping used for this
* approach is as follows.
*
*  <action path="/shop/viewOrder" type="com.ibatis.struts.BeanAction"
*    name="orderBean" scope="session"
*    validate="false">
*    <forward name="success" path="/order/ViewOrder.jsp"/>
*  </action>
*  위와 같은 xml문장은 orderBean클래스의 viewOrder메서드를 호출하게 된다.
*
* Method Parameter
*
* This approach uses the Struts action parameter within the mapping
* to determine the method to call on the Bean.  For example the
* following action mapping would cause the "viewOrder" method to
* be called on the bean ("orderBean").  The mapping used for this
* approach is as follows.
*
*  <action path="/shop/viewOrder" type="com.ibatis.struts.BeanAction"
*    name="orderBean" parameter="viewOrder" scope="session"
*    validate="false">
*    <forward name="success" path="/order/ViewOrder.jsp"/>
*  </action>
*
* No Method call
*
* BeanAction will ignore any Struts action mappings without beans associated
* to them (i.e. no name="" attribute in the mapping).  If you do want to associate
* a bean to the action mapping, but do not want a method to be called, simply
* set the parameter to an asterisk ("*").  The mapping used for this approach
* is as follows (no method will be called).
*
*  <action path="/shop/viewOrder" type="com.ibatis.struts.BeanAction"
*    name="orderBean" parameter="*" scope="session"
*    validate="false">
*    <forward name="success" path="/order/ViewOrder.jsp"/>
*  </action>
*
*
* A WORK IN PROGRESS;
*
* <i>The BeanAction Struts extension is a work in progress.  While it demonstrates
* good patterns for application development, the framework itself is very new and
* should not be considered stable.  Your comments and suggestions are welcome.
* Please visit http://www.ibatis.com for contact information.
*
* Date: Mar 11, 2004 10:03:56 PM
*
* @author Clinton Begin
* @see BaseBean
* @see ActionContext
*/
public class BeanAction extends Action {

  public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response)
      throws Exception {

    String forward = "success";

    try {

      ActionContext.initialize(request, response);

      if (form != null) {

        // Explicit Method Mapping
        Method method = null;
        String methodName = mapping.getParameter();
        if (methodName != null && !"*".equals(methodName)) {
          try {
            method = form.getClass().getMethod(methodName, null);
            forward = (String) method.invoke(form, null);
          } catch (Exception e) {
            throw new BeanActionException("Error dispatching bean action via method parameter ('" + methodName + "').  Cause: " + e, e);
          }
        }

        // Path Based Method Mapping
        if (method == null && !"*".equals(methodName)) {
          methodName = mapping.getPath();
          if (methodName.length() > 1) {
            int slash = methodName.lastIndexOf("/") + 1;
            methodName = methodName.substring(slash);
            if (methodName.length() > 0) {
              try {
                method = form.getClass().getMethod(methodName, null);
                forward = (String) method.invoke(form, null);
              } catch (Exception e) {
                throw new BeanActionException("Error dispatching bean action via URL pattern ('" + methodName + "').  Cause: " + e, e);
              }
            }
          }
        }
      }

    } catch (Exception e) {
      request.setAttribute("BeanActionException", e);
      throw e;
    }

    return mapping.findForward(forward);
  }

}
번호 제목 글쓴이 날짜 조회 수
31 샘플예제 file 황제낙엽 2009.03.02 445
30 A Walking Tour of the Struts 2 MailReader Application (2) 황제낙엽 2008.12.10 314
29 A Walking Tour of the Struts 2 MailReader Application (1) 황제낙엽 2008.12.10 458
28 스트러츠2 샘플 어플리케이션 (MailReader Demonstration Application) file 황제낙엽 2008.11.20 904
27 스트러츠2 실습 예제 모음 (Struts Showcase) 황제낙엽 2008.11.20 58252
26 Struts와 Struts2의 로그인 매커니즘 비교 황제낙엽 2008.10.23 319
25 Struts2 시작하기 황제낙엽 2008.09.22 54365
24 Struts2(스트럿츠2) Feature(특징) 황제낙엽 2008.07.12 351
23 책 Starting Struts 2 - Free Online Version (InfoQ.com) file 황제낙엽 2008.07.11 730
22 스트러츠2 활용 Upload 예제 file 황제낙엽 2007.08.14 344
21 Struts 프레임워크를 이용한 효율적인 개발 전략 황제낙엽 2007.01.30 324
20 MyEclipse를 사용한 Struts 빠른 시작 황제낙엽 2007.01.26 585
19 EJB+JSP를 활용한 J2EE기반의 샘플 프로젝트 (JPetStore-5.0) 황제낙엽 2007.01.18 397
18 EJB+JSP를 활용한 J2EE기반의 샘플 프로젝트 (JPetStore-4.0.5) file 황제낙엽 2005.10.28 491
17 Struts GUI XML 작성 Tool 들 황제낙엽 2006.02.24 486
16 스트러츠로 작성된 웹서점 샘플화일 (Struts+Hsql) 황제낙엽 2005.11.24 305
15 Validation과 Dispatcher액션 황제낙엽 2006.05.22 550
14 폼빈의 Reset 황제낙엽 2006.05.22 371
13 Struts-Config.xml 과 액션과 JSP의 관계 황제낙엽 2006.05.22 327
12 struts-config 설명 및 작성방법 황제낙엽 2006.02.27 331