Struts 1 - ActionForm 사용하기

Published on: 2009. 6. 26. 16:31 by louis.dev


1.ActionForm Class를 상속받아 FormBean Class를 만든다.
ex)InfoFormBean.java
package com.myhome.info.beans;

import org.apache.struts.action.ActionForm;

@SuppressWarnings("serial")
public class InfoFormBean extends ActionForm{
 
 private int num;
 private String name;
 private String sex;
 private String tel;

 //사용자 jsp페이지에서 파라미터로 넘어오는 파라미터 네임과 같아야 한다.
 public int getNum() {
  return num;
 }
 public void setNum(int num) {
  this.num = num;
 }
 public String getName() {
  return name;
 }
 public void setName(String name) {
  this.name = name;
 }
 public String getSex() {
  return sex;
 }
 public void setSex(String sex) {
  this.sex = sex;
 }
 public String getTel() {
  return tel;
 }
 public void setTel(String tel) {
  this.tel = tel;
 }
 
}

2.struts-config.xml 에서 form-bean을 설정한다.

1) 기본적인 ActionForm을 사용할때
<form-beans> 

        <form-bean
            name="bean"  
            type="com.myhome.info.beans.InfoFormBean"/>
</form-beans>

- name : 다른 config파일에서 사용할 이름을 사용자 편의 대로 정의 한다.
- type: 처음의 ActionForm Class를 상속받은 클래스의 패키지명과 클래스 이름을 설정한다.(InfoFormBean은 사용자 임의의 Class)

2) DynaActionForm 을 사용할때

- 사용자로 부터 파라미터로 넘어오는 값이 bean Class안에 정의 되어 있지 않거나 사용자로부터 어떠한 값이 넘어 올지 알 수 없을때 사용한다.
- ActionForm 처럼 ActionForm Bean Class를 만들 필요는 없고 xml 상에 선언만 해주면 된다.

<form-beans> 
        <!--
         DynaActionForm은 예측할 수 없는 파라미터를 참조할때 사용한다.
        -->
        <form-bean
         name="dyna"
         type = "org.apache.struts.action.DynaActionForm">
         <!--
          form bean에 존재하지 않는 파라미터를 참조하기 위해 property를 설정한다.
          -->
          <form-property name="num" type="java.lang.Integer"/>
          <form-property name="name" type="java.lang.String"/>
          <form-property name="sex" type="java.lang.String"/>
          <form-property name="tel" type="java.lang.String"/>
          <form-property name="wdate" type="java.lang.String"/>
        </form-bean>
         
    </form-beans>

- name : ActionForm 와 같은 용도
- type : struts에서 제공되는 클래스를 사용하는 것이기 때문에 직접 DynaActionForm을 설정해 준다.
- <form-property> : 저장될 이름을 선언해 준다.



3.struts-config.xml 파일의 <action-mapping>에 <action>태그와 함께 설정한다.

1) ActionForm을 상속한 bean을 사용할때
예)
<action path = "/update"
          name = "bean"
          scope = "request"
          input = "/info/modify.jsp"
          type = "com.myhome.info.actions.InfoUpdateAction">
     <forward name="success" path="/list.do" redirect="true"/>
</action>

- path : 주소창에 들어오는 URL 패턴, 이때 web.xml에 선언한 .do는 제거 하고 선언한다.
- name : 상단의 <form-beans>태그에 선언된 form-bean중 사용할 form-bean name을 적어 준다.
- scope : "request|session|application" - 다음의 영역으로 들어오는 정보
- input : 입력받은 폼 페이지 명 명시 - 정의된 곳에서 들어오는 데이터를 사용하겠다.
- type: Bussiness Logic을 수행할 Action Class 선언
- <forward> : Action class에서 actionForward로 'success' 를 보내면 path로 선언된 곳으로 보내겠다.
                    redirect = forward 부분에서 path만 잡아 주면 주소창은 변하지 않고 페이지만 변경 시킨다. 그래서 redirect를 true를 설정하면 주소 까지 바뀌어 버린다.

2)DynaActionForm 을 사용할 때
예)
<action path="/delete"
          name = "dyna"
          scope = "request"
          input= "/info.modify.jsp"
          type = "com.myhome.info.actions.InfoDeleteAction">
   <forward name = "success" path = "list.do" redirect="true" />
</action>

※참고 : ActionForm 을 사용할때 꼭 필요한 attribute 들은 name, scope, input 이다.

 4. Action에서 사용 방법

public ActionForward execute(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("success");
 }


만약 ActionForm을 상속한 form객체를 사용하면 위와 같은 방식으로 하되 config.xml파일에서 bean을 DynaActionForm으로 구현 했다면 물론 위의
코드중
InfoFormBean bean = (InfoFormBean) form;
이코드는
DynaActionForm bean = (DynaActionForm)form;

으로 타입 케스팅을 해주어야 캐스팅 에러가 나지 않는다.