Struts 1 - 스트럿츠 1의 다양한 Action Class 들 part 1

Published on: 2009.06.26 17:16 by krespo

1. ForwardAction Class


만약 기본타입처럼 Request Process를 거치지 않고 바로 뷰 페이지를 요청 할때는 다음과 같이 선언 할 수 있다.

<action path = "/index"  forward = "/info/register.jsp"/>

하지만 이렇게 action을 설정 하게 되면 위의 그림에서 보듯이 ActionServlet 에서 들어와서 Request processor를 거쳐 바로 ViewPage로 이동 하게 된다. 하지만 ForwardAction 을 쓰게 되면 Request Processor에서 ActionForm으로 넘어가 모든 로딩을 거쳐 ViewPage를 요청하게 할 수 있다.

<action path="/index"
          type = "org.apache.struts.actions.ForwardAction"
          parameter = "/info/register.jsp"/>

- type : 여기서 struts에서 제공하는 ForwardAction Class를 설정한다.
- parameter : 보여줄 view page의 경로를 설정 한다.

2.IncludeAction Class


defalte를 사용하면 Action에서 로직을 실행한후 ActionMapping을 통해 ActionForward로 이동후 Request Processor로 이동한후 view Page로 이동하는데 IncludeAction Class를 사용하면 ActionForward 에서 RequestProcessor를 거쳐서 View Page로 이동하는 것이아니라 바로 View Page로 이동할 수 있다.

- 장점 : ViewPage로 빠른 이동이 가능하다(검색 등에 사용)
- 단점 : Request Prcessor를 거쳐 가지 않기 때문에 processe method에서 실행하는 page Encoding이라 던가 validator를 사용할 수 없다.

예)
<action path="/index"
          type = "org.apache.struts.actions.IncludeAction"
          parameter = "/info/register.jsp"/>

3. DispatchAction Class
일반적으로 Action class를 상속받아 사용하게 되면 하나의 로직당 하나의 Class만을 생성 해야 하기 때문에 Class Over Head가 발생하기 쉽다. 이럴때는 Action Class를 상속 받지 않고 DispatchAction Class를 상속받고 그안에 메소드 형식으로 구현 하기 때문에 클래스 한개에서 모두 처리 할 수 있다.
하나의 클래스에서 이름이 다른 여러개의 ActionForward를 사용 할 수 있다.


다음 그림과 같이 jsp 페이지 에서는 form 태그 안에 hidden 으로 사용할 method 이름을 value로 넘겨 준다. value가 DispatchAction 을 상속 받은 클래스의 method 와 이름이 같아야 클래스에서 method가 실행 된다.

다음으로는 struts-config.xml 파일의 <action mapping>안의 내용이다
여기서 눈여겨 볼 내용은 type 과 parameter 이다.

- type : DispatchAction을 상속 받은 클래스의 위치를 지정
- parameter : jsp page의 hidden 태그의 name과 parameter 의 값과 같아야 한다.

즉 jsp페이지에서 히든으로 넘겨주는 value가 각각의 메소드 이름일때 다음의 것들이 실행 된다는 것이다.

ex)struts-config.xml

<struts-config>
 <action-mappings>
  <action path = "/dispatchIndex"
    type = "org.apache.struts.actions.ForwardAction"
    parameter="/dispatch/register.jsp"/>
  
  <!--
   unknown은 input속성을 대체하기 위한 속성이다.
   입력폼이 여러개 발생할 때 사용된다.
   template.jsp는 list.do로 보내면 어디로 가야 할지 모르기때문에
  -->
  
  <action path = "/dispatch"
    name = "bean"
    scope = "request"
    unknown = "true"
    parameter = "method"
    type = "com.myhome.dispatch.InfoDispatchAction">
   
   <forward name="result" path = "/dispatch/result.jsp"/>
   <forward name="list" path = "/dispatch/list.jsp"/>
   <forward name="query" path = "/dispatch/modify.jsp"/>
   <forward name="update" path = "/dispatch/template.jsp"/>
   <forward name="delete" path = "/dispatch/template.jsp"/>

  
  </action>
  
 </action-mappings>

위와 같이 forward 이름이 각 method마다 달라야 한다.


구현은 jsp 페이지 에서

1) DispatchAction을 상속 받은 클래스 생성
EX)
package com.myhome.dispatch;

import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.beanutils.BeanUtils;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.DynaActionForm;
import org.apache.struts.actions.DispatchAction;

import com.myhome.info.beans.InfoFormBean;
import com.myhome.info.dao.InfoDAO;
import com.myhome.info.dto.InfoDTO;

 

public class InfoDispatchAction extends DispatchAction{
 
 public ActionForward register(ActionMapping mapping,
          ActionForm form,
          HttpServletRequest request,
          HttpServletResponse response)
          throws Exception{
  
  /*form parameter를 bean으로 받는다*/
  InfoFormBean bean = new InfoFormBean();
  bean.setName(request.getParameter("name"));
  bean.setSex(request.getParameter("sex"));
  bean.setTel(request.getParameter("tel"));
  
  /*bean property 를 dto로 복사한다.*/
  InfoDTO dto = new InfoDTO();
  BeanUtils.copyProperties(dto, bean);
  dto.setWdate(this.getWdate());
  
  /*info table에 연동한다.*/
  
  new InfoDAO().register(dto);
  
  /*result.jsp로 포워드하기 위해 리퀘스트 영역에 dto를 binding한다
   * */
  request.setAttribute("dto", dto);
  
  
  return mapping.findForward("result");
 }
 
 public ActionForward list(ActionMapping mapping,
         ActionForm form,
         HttpServletRequest request,
         HttpServletResponse response)
         throws Exception{
  
  List<InfoDTO> list = null;
  
  list = new InfoDAO().getAllQuery();
  
  request.setAttribute("list", list);

  return mapping.findForward("list");
 }
 
 public ActionForward query(ActionMapping mapping,
         ActionForm form,
         HttpServletRequest request,
         HttpServletResponse response)
         throws Exception{
  InfoFormBean bean = (InfoFormBean)form;
  InfoDTO dto = new InfoDTO();
  BeanUtils.copyProperties(dto, bean);
  
  //쿼리된 object를 리퀘스트 영역에 바인딩 한다.
  
  request.setAttribute("dto", new InfoDAO().getQuery(dto));

  return mapping.findForward("query");
 }
 
 public ActionForward update(ActionMapping mapping,
         ActionForm form,
         HttpServletRequest request,
         HttpServletResponse response)
         throws Exception{
  /*form parameter를 InfoFormBean으로 받는다*/
  
  /**
   *  ActionForm의 역할
   *   Form parameter의 정보를 참조하기 위해
   *   ActionForm의 객체를 초기화 한다 - reset()
   * 
   *   form parameter의 정보를 받아 유효성 검사를 실시한다 - validate()
   * 
   *   참조한 폼 정보를 form-bean에 설정도니 bean으로 전달한다.
   * */
  
  InfoFormBean bean = (InfoFormBean)form;
  
  /*bean의 객체를 Entity(DTO)로 property를 복사한다.*/
  InfoDTO dto = new InfoDTO();
  BeanUtils.copyProperties(dto, bean);
  
  new InfoDAO().update(dto);
  

  return mapping.findForward("update");
 }
 
 public ActionForward delete(ActionMapping mapping,
         ActionForm form,
         HttpServletRequest request,
         HttpServletResponse response)
         throws Exception{

  InfoFormBean bean = (InfoFormBean)form;
  
  /*bean의 객체를 Entity(DTO)로 property를 복사한다.*/
  InfoDTO dto = new InfoDTO();
  BeanUtils.copyProperties(dto, bean);
  new InfoDAO().delete(dto);
  return mapping.findForward("delete");
 }
 protected String getWdate(){
  return new java.text.SimpleDateFormat("yyyy-MM-dd").format(new java.util.Date());
 }
 
}


4.MappingDispatchAction Class

DispatchAction은 각 사용할 method를 hidden값으로 받아서 xml에서 세팅 해주어야 한다. 그리고 DispatchAction을 사용하면 input 테그에서 데이터를 받을때 다양한 값을 받을 수 없기 때문에 MappingDispatchAction을 사용한다.

1)MappingDispatchAction을 상속받아 클래스를 생성한다.
(DispatchAction Class와 다를 것이 없다)

2)xml을 설정한다.
<action-mappings>
  <action path="/mappingIndex"
    type = "org.apache.struts.actions.ForwardAction"
    parameter="/mapping/register.jsp" />
  
  <action path="/mappingRegister"
    parameter="register"
    type="com.myhome.dispatch.InfoMappingDispatchAction">
   <forward name="result" path="/mapping/result.jsp"/>
  </action>
  
  <action path="/mappingList"
    parameter="list"
    type="com.myhome.dispatch.InfoMappingDispatchAction">
   <forward name="list" path="/mapping/list.jsp"/>
  </action>
  
  <action path="/mappingQuery"
    parameter="query"
    type="com.myhome.dispatch.InfoMappingDispatchAction"
    name="bean"
    scope="request"
    input="/mapping/modify.jsp">
   <forward name="query" path="/mapping/modify.jsp"/>
  </action> 
  
  <action path="/mappingUpdate"
    parameter="update"
    type="com.myhome.dispatch.InfoMappingDispatchAction"
    name="bean"
    scope="request"
    input="/mapping/modify.jsp">
   <forward name="update" path="/mappingList.do" redirect="true"/>
  </action>
  
  <action path="/mappingDelete"
    parameter="delete"
    type="com.myhome.dispatch.InfoMappingDispatchAction"
    name="bean"
    scope="request"
    input="/mapping/modify.jsp">
   <forward name="delete" path="/mappingList.do" redirect="true"/>
  </action>

  
 </action-mappings>

-paramether : MappingDispatchAction Class의 method 이름이다.

이렇게 구현하면 jsp 페이지에서 hidden으로 넘겨줄 필요가 없다.

Name
Password
Homepage
Secret