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

Published on: 2009.06.29 23:39 by krespo


1. LookupDispatchAction




getKeyMethodMap() 메서드를 구현하고 리소스 번들의 키와 메소드명을 매핑한다. 기본적으로 파라미터로 method 이름을 전달하여 그것을 통하여 method를 실행하것으로 DispatchAction과 유사한 방법으로 작동 된다.

작업순서

1)위의 클래스에서 getKeyMethodMap()에서 mapping을 해야 하기 때문에 .properties 로 확장자가 끝나는 메시지번들을 생성한다.

2)LookupDispatchAction Class를 상속받은 Class를 생성하고 LookupDispatchAction Class의 getKeyMethodMap()를 Override 하여 구현한다.

3)struts-config-lookup.xml 파일을 생성한다.

4)web.xml 에 struts-config-lookup.xml파일을 설정한다.

5)LookupDispatchAction 을 사용할 jsp 페이지 에서 DispatchAction에서 했던것과 동일 한방법으로 hidden으로 값을 숨기고 전달한다.


작업 방법
1)mapping을 위한 메시지 번들(.properties)를 생성한다.

-이클립스 자체에서 .properties파일을 생성하면 에러가 발생한다. 물론 플러그인을 추가하여 이클립스를 통해 properties파일을 생성 할 수 있지만 일단 메모장에서 작업하고 가져오는 방법을 취한다.

InfoMessageResource.properties(Original File)
------------------------------------------------------------------------------------------------
# struts1 lookup message bundle
# file name : InfoMessageResource.properties

lookup.register = 등록
lookup.list = 리스트
lookup.query = 쿼리
lookup.update = 갱신
lookup.delete = 삭제

# 국제회(Locale) 표준코드 (Unicode)로 변환
# native2ascii [-encoding 코드값] 원시파일 대상파일
# 코드값 : euc-kr, ksc5601, ms949, utf-16

# natice2ascii -encoding euc-kr InfoMessageResource.properties InfoMessageResource_ko.properties
------------------------------------------------------------------------------------------------
다음의 내용을 메모장을 통해 작성후 eclipse의 패키지에 끌어다 놓는다.
#은 주석이다.

가장 핵심 적인 부분은

lookup.register = 등록
lookup.list = 리스트
lookup.query = 쿼리
lookup.update = 갱신
lookup.delete = 삭제

이부분 인데 나중에 LookupDispatchAction Class를 상속한 파일에서 getKeyMethodMap() 메소드를 오버라이딩 하고 거기서 mapping시킬때 사용한다. 위와 같이 한글로 만들 수 있으며 한글로 저장하고 바로 properties파일을 이클립스에 끌어다 놓으면 한글이 깨진다..

------------------------------------------------------------------------------------------------
# struts1 lookup message bundle
# file name : InfoMessageResource.properties

lookup.register = µî·Ï
lookup.list = ¸®½ºÆ®
lookup.query = Äõ¸®
lookup.update = °»½Å
lookup.delete = »èÁ¦

# ±¹Á¦È¸(Locale) Ç¥ÁØÄÚµå (Unicode)·Î º¯È¯
# native2ascii [-encoding Äڵ尪] ¿ø½ÃÆÄÀÏ ´ë»óÆÄÀÏ
# Äڵ尪 : euc-kr, ksc5601, ms949, utf-16

# native2ascii -encoding euc-kr InfoMessageResource.properties InfoMessageResource_ko.properties
------------------------------------------------------------------------------------------------
그러므로 맨아래 부분에 처리된 주석과 같이 인코딩 타입을 euc-kr로 변환하는 작업을 해 주어야 하며 jdk/bin폴더 안에 있는 native2ascii 를 통해 변환 할 수 있다.

          [native2ascii를 통해 변환 하는 방법]
          1.콘솔창을 실행하고 맨처음 properties파일을 생성한 위치로 이동을 한다.
 

          2. 이동한 곳에서 native2ascii 사용하여 encoding타입을 euc-kr타입으로 변경한다.
          native2ascii [-encoding] [코드값] [원시파일] [목적파일]
          형식으로 작업하면 된다.
         
          예) native2ascii -encoding euc-kr InfoMessageResource.properties InfoMessageResource_ko.properties

          를 콘솔창에 쓴다.


          그러면 위와 같이 InfoMessageResource_ko.properties파일이 생성 된 것을 볼 수 있고 인코딩 되어 있는 것을 확인 할 수 있다.
          InfoMessageResource_ko.properties
          ----------------------------------------------------------------------------------------
          # struts1 lookup message bundle
          # file name : InfoMessageResource.properties

          lookup.register = \ub4f1\ub85d
          lookup.list = \ub9ac\uc2a4\ud2b8
          lookup.query = \ucffc\ub9ac
          lookup.update = \uac31\uc2e0
          lookup.delete = \uc0ad\uc81c

          # \uad6d\uc81c\ud68c(Locale) \ud45c\uc900\ucf54\ub4dc (Unicode)\ub85c \ubcc0\ud658
          # native2ascii [-encoding \ucf54\ub4dc\uac12] \uc6d0\uc2dc\ud30c\uc77c \ub300\uc0c1\ud30c\uc77c
          # \ucf54\ub4dc\uac12 : euc-kr, ksc5601, ms949, utf-16

          # native2ascii -encoding euc-kr InfoMessageResource.properties InfoMessageResource_ko.properties
          ----------------------------------------------------------------------------------------
          
         ※만약 natice2ascii에 대해서 찾을 수 없다는 에러가 나오면 환경변수중에 path를 설정하지 않은 것이다. path를 설정해 주면 바로 사용해 줄 수        있다.

          3) 만들어진 두개의 파일을 elipse의 원하는 곳으로 복사를 해서 가지고 온다.

          4) config.xml 파일에 .properties파일 경로를 설정해 준다.
          <message-resources parameter="com.myhome.lookup.InfoMessageResource" />

2)LookupDispatchAction Class를 상속한 InfoLookupDispatchAction Class(임의)를 생성한다.

----------------------------------------------------------------------------------------
package com.myhome.lookup;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

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.actions.LookupDispatchAction;


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

public class InfoLookupDispatchAction  extends LookupDispatchAction {
 
 @Override
 protected Map<String,String> getKeyMethodMap() {
  
  Map<String,String> map = new HashMap<String, String>();
  map.put("lookup.register", "register");  //메시지번들에 있는 키와 같아야 한다. 뒤에는 메소드 명이다.
  map.put("lookup.list", "list");
  map.put("lookup.query", "query");
  map.put("lookup.update", "update");
  map.put("lookup.delete", "delete");
  return map;
 }

 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());
 }

}
----------------------------------------------------------------------------------------

이 클래스 에서 가장 중요한 부분은 getKeyMethodMap() 부분이다.
Map을 한개 선언한 뒤에 위의 properties에서 선언한 대로 map에 집어 넣으면 된다.

  map.put("lookup.register", "register");  
  map.put("lookup.list", "list");
  map.put("lookup.query", "query");
  map.put("lookup.update", "update");
  map.put("lookup.delete", "delete");

앞의 lookup.~~ 는 properties파일에 정의된 부분과 같아야 되며 뒤에는 실행될 메소드 이름이다.


3)struts-config-lookup.xml 을 생성한다.

-----------------------------------------------------------------------------------------
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts-config PUBLIC
          "-//Apache Software Foundation//DTD Struts Configuration 1.3//EN"
          "http://struts.apache.org/dtds/struts-config_1_3.dtd">

<struts-config>
 <action-mappings>
  <action path = "/lookupIndex"
    type = "org.apache.struts.actions.ForwardAction"
    parameter="/lookup/register.jsp"/>
  
  <!--
   unknown은 input속성을 대체하기 위한 속성이다.
   입력폼이 여러개 발생할 때 사용된다.
   template.jsp는 list.do로 보내면 어디로 가야 할지 모르기때문에
  -->
  
  <action path = "/lookup"
    name = "bean"
    scope = "request"
    unknown = "true"
    parameter = "method"
    type = "com.myhome.lookup.InfoLookupDispatchAction">
   
   <forward name="result" path = "/lookup/result.jsp"/>
   <forward name="list" path = "/lookup/list.jsp"/>
   <forward name="query" path = "/lookup/modify.jsp"/>
   <forward name="update" path = "/lookup/template.jsp"/>
   <forward name="delete" path = "/lookup/template.jsp"/>
  
  </action>
 </action-mappings>
 
 <!-- Message Resources Definitions -->
 <!-- .property 파일을 설정 -->
 <message-resources parameter="com.myhome.lookup.InfoMessageResource" />
 
</struts-config>
-----------------------------------------------------------------------------------------
가장 핵심적인 부분은 굵은 선의 <action></action>이 핵심이다. DispatchAction 과 같은 형태로 선언 되어 있으며 jsp 페이지 에서 hidden name이 method인 것을 value를 받아 type로 선언된 class로 이동하여 getKeyMethodMap() 를 실행하고 mapping을통해 메소드가 실행된다.

4. web.xml에 config파일을 등록한다

-----------------------------------------------------------------------------------------
<param-value>
   /WEB-INF/struts-config.xml,
   /WEB-INF/struts-config-dispatch.xml,
   /WEB-INF/struts-config-mapping.xml,
   /WEB-INF/struts-config-lookup.xml  
  </param-value>
-----------------------------------------------------------------------------------------

5. jsp페이지에서 hidden값으로 넘겨준다.

<input type="hidden" name="method" value="등록">

이렇게 선언을 하고 submit이 되면
properties파일을 거쳐 lookup.register = 등록 과 같은 맵핑을 수행하게 된다. 이렇게 맵핑된 것은 LookupDispatchAction class의 getKeyMethodMap() 부분에서 map.put("lookup.register", "register"); 를 통해 register method가 실행 되게 된다.

           

Name
Password
Homepage
Secret