struts1을 그대로 사용하는 것이 아니라 개발하기 좀 더 편한 방법으로 커스터마이징 해서 사용해본다.

1. lib 셋팅
생성한 프로젝트의 WEB-INF의 lib 폴더에 설정할 라이브러리 파일을 갖다 넣는다 : struts, log4j, struts-test, junit

- apache, sourceforge 사이트에서 각각 다운로드를 받는다.
Junit은 C:\eclipse\plugins\org.junit_3.8.2.v20090203-1005 에서 junit.jar  파일을 사용한다.

- struts의 lib 폴더안에 있는 라이브러리 파일을 사용한다.

- log4j는 라이브러리와 함께, log4j.properties나, log4j.xml 설정 파일을 src 폴더 아래에 넣는다.

- strutstest는 struts를 WAS를 띄우지 않고 테스트 하기 위해 필요하다. strutstest.jar 파일과 common-collection.jar 파일이 필요하다.



2. 서블릿 설정
web.xml 안에 서블릿을 설정한다.
- 다운 받아 압출을 해제한 struts 폴더 안에 struts-blank 안에 있는 web.xml 에서 복사하거나, Servlet을 하나 만들어서 web.xml 안에 생성하게 하고, 만든 Servlet은 삭제 한다.


/action -> *.do 바꾼다.



<servlet>
    <servlet-name>action</servlet-name>
    <servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
 </servlet>
  <servlet-mapping>
    <servlet-name>action</servlet-name>
    <url-pattern>*.do</url-pattern>
  </servlet-mapping>


3. struts-config.xml 생성
struts-config.xml을 WEB-INF 아래 만들고 struts-blank 안에 있는 struts-config.xml 파일에서 dtd 설정을 복사해서 넣는다.

<!DOCTYPE struts-config PUBLIC
          "-//Apache Software Foundation//DTD Struts Configuration 1.3//EN"
          "
http://struts.apache.org/dtds/struts-config_1_3.dtd">

나머지 설정(역시 struts-blank 참조)

<struts-config>
 <!-- 액션 폼 설정 파일 -->
 <form-beans>
 </form-beans>
 
 <!-- 공통 예외처리 -->
 <global-exceptions>
 </global-exceptions>
 
 <!-- 공통 링크 이동 처리 -->
 <global-forwards>
 </global-forwards>
 
 <!-- 액션 설정 -->
 <action-mappings>
 </action-mappings>
 
 <!-- 커스터마이징된 RequestProcessor -->
 <controller>
 </controller>
 
 <!-- 다국어 처리, 에러메시지 -->
 <!--  <message-resources parameter=""></message-resources>-->
 
 <!-- 외부 프레임웍, 라이브러리 연동 -->
 <!--  <plug-in className=""></plug-in> -->
 
</struts-config>



여기까지 작업을 하고, WAS를 띄워서 http://127.0.0.1:8081/struts1/*.do 해서 * 아무이름이나 넣고 접속이 되는지 확인한다. 500에러가 발생할 것이다. 그러면 성공.
그리고 struts-config.xml 에서 아래와 같이 설정하고

<action-mappings>
  <action path="/hello" forward="/hello.jsp"></action>
</action-mappings>


설정을 해주고 http://127.0.0.1:8081/struts1/hello.do 했을 때 hello.jsp 라고 뜨는지 확인한다.

log4j 설정을 해놨다면 콘솔창에 로그가 뜬다.

4. util 패키지 않에 기본적으로 구현할 Action을 추상 클래스로 만들어서 오버라이드 시킨다.
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.log4j.Logger;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;

public abstract class BasicAction extends Action {
 
protected static Logger logger = Logger.getLogger(BasicAction.class); //log4j 설정
 
 public ActionForward execute(ActionMapping mapping,
            ActionForm form,
            HttpServletRequest request,
            HttpServletResponse response)throws Exception{
  
  logger.info("action path" + request.getRequestURI()); //log4j 설정
  
  return executeAction(mapping, form, request,response);
  
 }
 protected abstract ActionForward executeAction(ActionMapping mapping,
            ActionForm form,
            HttpServletRequest request,
            HttpServletResponse response)throws Exception;
}

5. struts에서 기본적으로 CRUD가 나오면 DispatchAction을 사용한다.
action을 만들고 테스트 한다.

public class BbsAction extends DispatchAction {
 private static Logger logger = Logger.getLogger(BbsAction.class);
 
 public ActionForward add(ActionMapping mapping,
            ActionForm form,
            HttpServletRequest request,
            HttpServletResponse response)throws Exception{
  
   return null;
 }
 
}

- test 패키지에서 BbsTest.java를 만들어서 테스트 한다. strutstest는 가짜로 request, response를 만들어서 테스트 할 수 있게 해준다. 아래와 같이 작성 하고, Junit으로 테스트 한다.

import java.io.File;
import servletunit.struts.MockStrutsTestCase;
public class BbsTest extends MockStrutsTestCase {
  public void setUp() throws Exception{
   super.setUp();
   this.setContextDirectory(new File("WebContent")); //반드시 WebContent가 들어가야 한다. WebContent아래 설정 파일들을 불러 오기 위해
  }
 
  public void testAdd() throws Exception{
   this.setRequestPathInfo("/bbs");
    this.actionPerform();
  }
  
  }

6. ActionForm을 안잡고 하는 방법.
ActionForm을 사용 할 경우 상당한 노가다를 해야한다. 그래서 LazyValidatorForm을 사용한다.
이것의 단점은 파라미터 검증을 할 수 없다는 것이다.(그래서 commons의 validation을 적용해서 사용한다.)
ActionForm은 타입이 똑같아야 들어가지만, BeanUtils는 타입이 달라도 들어간다.

- BbsVO 작성

- struts-config.xml 에서 추가.
 <form-beans>
  <form-bean name="lazyForm" type="org.apache.struts.validator.LazyValidatorForm"></form-bean>
 </form-beans>


<action path="/bbs"
 type="org.bnk.bbs.BbsAction"
 parameter="method"
 name="lazyForm"
 validate="false"></action> <!-- 검증을 할 수 없으므로 false -->

- BbsAction 추가

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.beanutils.BeanUtils;
import org.apache.log4j.Logger;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.actions.DispatchAction;
import org.apache.struts.validator.LazyValidatorForm;
import org.bnk.bbs.vo.BbsCriteria;
import org.bnk.bbs.vo.BbsVO;
import org.bnk.util.VODisplayer;

public class BbsAction extends DispatchAction {
 private static Logger logger = Logger.getLogger(BbsAction.class);
 
 public ActionForward add(ActionMapping mapping,
            ActionForm form,
            HttpServletRequest request,
            HttpServletResponse response)throws Exception{
  
  LazyValidatorForm lazyForm = (LazyValidatorForm) form;
  
  BbsVO vo = new BbsVO();
  
  BeanUtils.copyProperties(vo, lazyForm);
  
  logger.info(VODisplayer.display(vo));
  
  return null;
 }
 
 public ActionForward update(ActionMapping mapping,
            ActionForm form,
            HttpServletRequest request,
            HttpServletResponse response)throws Exception{
  
  logger.info("update.......");
  return null;
 }
 public ActionForward list(ActionMapping mapping,
            ActionForm form,
            HttpServletRequest request,
            HttpServletResponse response)throws Exception{
  
  logger.info("list.......");
  
  LazyValidatorForm lazyForm =
   (LazyValidatorForm)form;
  
  BbsCriteria cri = new BbsCriteria();
  BeanUtils.copyProperties(cri, lazyForm);
  
  logger.info(VODisplayer.display(cri));
  
  return null;
 }
}

- BbsTest 에서 Junit 으로 테스트

import java.io.File;
import servletunit.struts.MockStrutsTestCase;
public class BbsTest extends MockStrutsTestCase {
  public void setUp() throws Exception{
   super.setUp();
   this.setContextDirectory(new File("WebContent"));
  }
 
  public void testAdd() throws Exception{
   this.setRequestPathInfo("/bbs");
   request.addParameter("method", "add");
  
   request.addParameter("title", "게시물제목");
   request.addParameter("content", "게시물내용");
   request.addParameter("writer", "작성자");  
  
   this.actionPerform();
  }
 
  public void testList()throws Exception{
   this.setRequestPathInfo("/bbs");
   request.addParameter("method", "list");
   
   request.addParameter("pageNo", "5");
   request.addParameter("keyword", "워드");
   request.addParameter("type", "title");
   this.actionPerform();
  }
}

7. BbsCriteria.java 를 만들어서 파라미터를 수집한다.
LazyValidatorForm은 파라미터를 수집한다. 그래서 페이징 할 때, 파라미터를 던지지 말고 객체를 던져서 사용한다. 만약에 파라미터가 변경이 된다면 다 고쳐야 하지만, 이렇게 따로 만들어 놓으면 여기만 고치면 된다.

- BbsTest에서 testList() 로 테스트 한다.

기본 적으로 이렇게 만들어서 개발을 하고, 여기다가 화면을 붙이면 개발 끝~

'FrameWork > Struts1' 카테고리의 다른 글

Struts1 FileDownload  (0) 2009.08.18
Struts1 fileUpload  (0) 2009.08.18
Struts1의 Action 4  (0) 2009.08.16
Struts1의 Action 3  (0) 2009.08.16
Struts1의 Action 2  (0) 2009.08.12
Struts1의 Action 1  (0) 2009.07.27
Struts1에서 ActionForm 사용하기.  (0) 2009.07.25
Struts1 에서 iBatis 사용하기  (0) 2009.07.05
Struts 1 을 사용하여 간단한 회원가입, 리스트 불러오기.  (0) 2009.07.05
Struts1 개발환경 설정.  (0) 2009.07.05
DownloadAction 추상클래스로서 상속시 getStreamInfo()메소드를 다운로드가 가능한 형태로 구현한다.


1. struts-config.xml : action path 추가

<action path="/download"
    type="com.myhome.upload.actions.FileDownloadAction"/>

2. FileDownloadAction.java 작성


package com.myhome.upload.actions;

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

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

/*download*/
import org.apache.struts.actions.DownloadAction;
import java.io.File;
import com.myhome.upload.util.UploadUtil;

public class FileDownloadAction extends DownloadAction {
 
 @Override
 protected StreamInfo getStreamInfo(ActionMapping mapping,
            ActionForm form,
            HttpServletRequest request,
            HttpServletResponse response)
            throws Exception {
  
        String filename = request.getParameter("clip");
       
        File file = new File(UploadUtil.SAVE + filename);
       
        /*한글파일일 경우 헤더타입이 다르므로 변경한다.*/
        String contentType = "application/octet-stream";
        response.setContentType(contentType);
       
        
        /*txt, image파일들은 브라우저가 직접 결과를 전달한다.  
         * 다음과 같이 설정하지 않을 경우 text파일 같은 경우는 브라우져에서
         * 해석이 가능함으로 브라우져에서 바로 열린다. 이것을 처리해 주면
         * 무조건 다운로드 된다.
         * */
       
        response.setHeader("Content-disposition",
                     "attachment;filename="+
                     toEng(file.getName()));
        response.setHeader("Content-Length", ""+file.length());
     
        return new FileStreamInfo(contentType, file);
   }
 
   public String toKor(String data){
     if(data == null)return null;
     String temp = "";
     try{
     temp = new String(data.getBytes("ISO8859_1"),"EUC-KR");
     }catch(java.io.UnsupportedEncodingException uee){}
     return temp;
   }
 
   public String toEng(String data){
     if(data == null)return null;
     String temp = "";
     try{
     temp = new String(data.getBytes("MS949"),"ISO-8859-1");
     }catch(java.io.UnsupportedEncodingException uee){}
     return temp;
   }

자세한 사항은 파일을 참조 한다. FileUploadDownload 다 포함.



'FrameWork > Struts1' 카테고리의 다른 글

struts1 커스터마이징하여 사용하기.  (0) 2009.11.11
Struts1 fileUpload  (0) 2009.08.18
Struts1의 Action 4  (0) 2009.08.16
Struts1의 Action 3  (0) 2009.08.16
Struts1의 Action 2  (0) 2009.08.12
Struts1의 Action 1  (0) 2009.07.27
Struts1에서 ActionForm 사용하기.  (0) 2009.07.25
Struts1 에서 iBatis 사용하기  (0) 2009.07.05
Struts 1 을 사용하여 간단한 회원가입, 리스트 불러오기.  (0) 2009.07.05
Struts1 개발환경 설정.  (0) 2009.07.05


- mmons project의
upload API를 사용한다.
(commons-fileupload-1.2.1.jar, commons-io-1.4.jar)

- Struts1의 파일 업로드는 FormFile class를 사용한다.

- File Upload에서 고려해야 할 사항 3가지는 
1) 저장할 디렉터리 위치
2) 파일 용량 제한
3) 동일한 파일 이름 해결(Rename Policy)
 : 1/1000초 로 계산하여 파일 이름 변경, 파일 명 뒤에 숫자 붙여서 저장

그리고 다 아는 것처럼 DB에는 파일이 저장되는게 아니라 파일 이름과 사이즈가 저장된다. 그걸 통해서 파일을 업로드 다운로드 한다.

1. struts-config.xml 파일 작성 (DispatchAction을 사용하였다.)



<?xml version="1.0" encoding="EUC-KR" ?>
<!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>
<!-- ================================================ Form Bean Definitions -->
<!-- form으로 들어오는 데이터를 bean객체에 담는다 -->
    <form-beans>
       <form-bean name="uploadBean" type="com.myhome.upload.beans.UploadFormBean"/> <!-- name은 아무거나 하고 type는 담을 object 객체를 써준다.(전달된 파라미터 데이터가 설정된 빈 - MyBean - 으로 저장이 된다) -->
    </form-beans>

<!-- ========================================= Global Exception Definitions -->
<!-- 어떤 Action에서 Exception이 발생되었는지 모를 때 정의된 곳으로 페이지 이동시킨다. -->
    <global-exceptions>
    </global-exceptions>

<!-- =========================================== Global Forward Definitions -->
<!--  -->
    <global-forwards>
       
    </global-forwards>

<!-- =========================================== Action Mapping Definitions -->
<!-- url패턴으로 맵핑 시킴 -->
  <action-mappings>
  <action path="/index"
    type="org.apache.struts.actions.ForwardAction"
    parameter="/upload/register.jsp"/>
 
  <action path="/upload"
    name="uploadBean"
    scope="request"
    parameter="method"
    unknown="true"
    type="com.myhome.upload.actions.UploadDispatchAction">
 
  <forward name="result" path="/upload/result.jsp"/>
  <forward name="fail" path="/upload/fail.jsp"/>
  <forward name="list" path="/upload/list.jsp"/>
  <forward name="query" path="/upload/modify.jsp"/>
  <forward name="update" path="/upload/template.jsp"/>
  <forward name="delete" path="/upload/template.jsp"/>
  </action>
 
  <action path="/download"
    type="com.myhome.upload.actions.FileDownloadAction"/>
 
 </action-mappings>
 
 <!-- controller processor Definition : Action으로 호출하지 전 처리할 부분-->
 <controller processorClass="com.myhome.info.processor.InfoRequestProcessor"/>
</struts-config>


2. web.xml 추가



<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
  <display-name>Struts1FileUploadDownload</display-name>
  <servlet>
    <servlet-name>action</servlet-name>
    <servlet-class> 
    org.apache.struts.action.ActionServlet
   </servlet-class>
    <init-param>
      <param-name>config</param-name>
      <param-value>
        /WEB-INF/struts-config.xml
  </param-value>
    </init-param>
  </servlet>
  <servlet-mapping>
    <servlet-name>action</servlet-name>
    <url-pattern>*.do</url-pattern>
  </servlet-mapping>
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
</web-app>


- iBatis 설정 제외(파일 참조)

3. Bean 작성

package com.myhome.upload.beans;

import org.apache.struts.action.ActionForm;
import org.apache.struts.upload.FormFile;

@SuppressWarnings("serial")
public class UploadFormBean extends ActionForm implements java.io.Serializable{
 
/*form property*/
 private int    num;
 private String name;
 private String sex;
 private String tel;
 private String wdate;
 
 /*upload property*/
 private FormFile file;

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

 public String getWdate() {
  return wdate;
 }
 
 public void setWdate(String wdate) {
  this.wdate = wdate;
 }

 public FormFile getFile() {
  return file;
 }

 public void setFile(FormFile file) {
  this.file = file;
 }
 
}



4. 데이터를 저장할 DTO 작성

package com.myhome.upload.dto;

public class UploadDTO{
 
 /*entity property*/
 private int    num;
 private String name;
 private String sex;
 private String tel;
 private String wdate;
 private String fileName;
 private long   fileSize;
 
 
 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;
 }
 public String getWdate() {
  return wdate;
 }
 public void setWdate(String wdate) {
  this.wdate = wdate;
 }
 public String getFileName() {
  return fileName;
 }
 public void setFileName(String fileName) {
  this.fileName = fileName;
 }
 public long getFileSize() {
  return fileSize;
 }
 public void setFileSize(long fileSize) {
  this.fileSize = fileSize;
 }
 
}

5. 데이타베이스에 데이터를 입력하기 위한 DAO 작성

package com.myhome.upload.dao;

import java.sql.SQLException;
import java.util.List;

import com.myhome.manager.SQLManager;
import com.myhome.upload.dto.UploadDTO;

public class UploadDAO extends SQLManager{
 
 public void insert(UploadDTO dto) throws SQLException{
  this.getSqlMap().insert("uploadInsert",dto);
 }

 @SuppressWarnings("unchecked")
 public List<UploadDTO> list() throws SQLException{
  return (List<UploadDTO>)this.getSqlMap().queryForList("uploadList");
 }
}

6. UploadSqlMap.xml

<?xml version="1.0" encoding="euc-kr"?>
<!DOCTYPE sqlMap PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN"
 "http://ibatis.apache.org/dtd/sql-map-2.dtd">

<sqlMap>
  <typeAlias alias="Upload"
      type="com.myhome.upload.dto.UploadDTO"/> <!-- alias : 별칭을 잡겠다는 의미 -->
 
  <insert id="uploadInsert" parameterClass="Upload"> <!-- typeAlias한 Info를 넣는다 없으면 com.. 그대로 넣어도 된다. -->
   INSERT INTO UPLOAD
    (NUM, NAME, SEX, TEL, WDATE, FILENAME, FILESIZE)
   VALUES
    (NUMSEQ.NEXTVAL, #name#, #sex#, #tel#, #wdate#,#fileName#,#fileSize#) <!-- ## Info 안에 가지는 프로퍼티 대소문자가 정확하게 맞아야 한다. -->
  </insert>
 
  <statement id="uploadList" resultClass="Upload">
   <![CDATA[
   SELECT NUM, NAME, SEX, TEL, WDATE, FILENAME, FILESIZE
   FROM UPLOAD
   WHERE NUM > 0
   ]]>
   ORDER BY NUM DESC
  </statement>
   
</sqlMap>



7.  UploadUtil.java를 만들어서 파일 경로와 사이즈를 관리한다.


package com.myhome.upload.util;

public final class UploadUtil {

 public static final String SAVE = "D://Java_webprogramming_2/Java_Web2/edu/upload/"; //경로
 
 public static final String SIZE = "1024*1024*20"; //사이즈 20M 지정
}


8. 비즈니스 로직을 수행할 UploadDispatchAction.java

package com.myhome.upload.actions;

import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;

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.DispatchAction;
import org.apache.struts.upload.FormFile;

import com.myhome.upload.beans.UploadFormBean;
import com.myhome.upload.dao.UploadDAO;
import com.myhome.upload.dto.UploadDTO;
import com.myhome.upload.util.UploadUtil;

public class UploadDispatchAction extends DispatchAction{
 
 public ActionForward register(ActionMapping mapping,
          ActionForm form,
          HttpServletRequest request,
          HttpServletResponse response)
          throws Exception{
  
  UploadFormBean bean = (UploadFormBean)form;
  UploadDTO dto = new UploadDTO();
  BeanUtils.copyProperties(dto, bean);
  if(bean.getFile() != null){
   this.upload(bean.getFile());
   dto.setFileName(bean.getFile().getFileName());
   dto.setFileSize(bean.getFile().getFileSize());
  }else{
   dto.setFileName("");
   dto.setFileSize(0L);
   new NullPointerException("파일을 올려주세요!!");
  }
  dto.setWdate(this.getWdate());
  
  new UploadDAO().insert(dto);
  request.setAttribute("dto", dto);
  return mapping.findForward("result");
 }

 public void upload(FormFile ff) throws Exception {
     InputStream is = ff.getInputStream();
     OutputStream os = new FileOutputStream(UploadUtil.SAVE + ff.getFileName());
     byte buffer[] = new byte[8192];
     int n = 0;
     while((n = is.read(buffer,0,8192)) != -1){
          os.write(buffer, 0, n);
     }
     /*
     System.out.println("File Name: "+ff.getFileName());
     System.out.println("File Size: "+ff.getFileSize());
     System.out.println("[File Info]");
     System.out.println(new String(ff.getFileData()));
     */
     is.close();
     os.close();
 }
 
 /*리스트 부분*/
 public ActionForward list(ActionMapping mapping,
         ActionForm form,
         HttpServletRequest request,
         HttpServletResponse response)
         throws Exception{
  
  request.setAttribute("list", new UploadDAO().list());
  
  return mapping.findForward("list");
 }
 
 protected String getWdate(){
  return new java.text.SimpleDateFormat("yyyy-MM-dd").format(new java.util.Date());
 }
}


'FrameWork > Struts1' 카테고리의 다른 글

struts1 커스터마이징하여 사용하기.  (0) 2009.11.11
Struts1 FileDownload  (0) 2009.08.18
Struts1의 Action 4  (0) 2009.08.16
Struts1의 Action 3  (0) 2009.08.16
Struts1의 Action 2  (0) 2009.08.12
Struts1의 Action 1  (0) 2009.07.27
Struts1에서 ActionForm 사용하기.  (0) 2009.07.25
Struts1 에서 iBatis 사용하기  (0) 2009.07.05
Struts 1 을 사용하여 간단한 회원가입, 리스트 불러오기.  (0) 2009.07.05
Struts1 개발환경 설정.  (0) 2009.07.05

■ SwitchAction

 Context 내에 여러 개의 모듈이 있을 때  현재 작업중인 모듈에서 다른 모듈로 전환하고 새로운 모듈내의 포워드 하는 일을 수행
.


일반적인 그룹핑은 web.xml 안에서 설정해 놓은 xml 파일들을 아래와 같이 추가하여 사용한다.

  <!-- groupping module -->
 <init-param>  
  <param-name>config</param-name>  <!-- 이름은 아무거나 -->
  <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>  <!-- /WEB-INF/(기본베이스 - 다른폴더일때는 경로를 설정해주어야 함)폴더 안에 struts-config.xml파일 위치 지정  - 여기까지 작성후 struts-config.xml파일을 생성 -->
 </init-param>

그러나 SwitchAction을 사용하면 아래와 같이 모듈별로 설정을 할 수 있다.

<!-- switch Action module types -->
  <init-param>
   <param-name>config</param-name>
   <param-value>/WEB-INF/config/struts-config.xml</param-value>
  </init-param>
  <init-param>
   <param-name>config/dispatchModule</param-name>
   <param-value>/WEB-INF/config/struts-dispatchModule.xml</param-value>
  </init-param>
  <init-param>
   <param-name>config/lookupModule</param-name>
   <param-value>/WEB-INF/config/struts-lookupModule.xml</param-value>
  </init-param>
  <init-param>
   <param-name>config/mappingModule</param-name>
   <param-value>/WEB-INF/config/struts-mappingModule.xml</param-value>
  </init-param>
  <init-param>
   <param-name>config/uploadModule</param-name>
   <param-value>/WEB-INF/config/struts-uploadModule.xml</param-value>
  </init-param>
  <init-param>
   <param-name>config/validatorModule</param-name>
   <param-value>/WEB-INF/config/struts-validatorModule.xml</param-value>
  </init-param>
   <init-param>
   <param-name>config/tilesModule</param-name>
   <param-value>/WEB-INF/config/struts-tilesModule.xml</param-value>
  </init-param>

web.xml 에 위와 같이 설정을 해주고 각각의 모듈별 xml을 만든다.

위에 보이는 경로대로

/WEB-INF/config/ 폴더 안에 각각의 모듈 xml 파일을 만든다. 여기서 중요한것은 

<init-param>
   <param-name>config</param-name>
   <param-value>/WEB-INF/config/struts-config.xml</param-value>
  </init-param>

config 가 기본적으로 있어야한다.


그림에서 같이 WEB-INF에(SwitchAction을 사용하지 않은 경우) 있는 xml 파일들이 config 폴더에 모듈별로 들어가 있는 것을 볼 수 있다.

그리고 config 폴더 안에 있는 모든 xml 파일 안에는 아래와 같은 설정이 있어야 한다.

<!-- switchAction을 사용할때는 모든 config파일에 SwitchAction설정이 되어있어야 한다. -->
     <action path="/toModule"
                type="org.apache.struts.actions.SwitchAction"/>

- strus-dispatchModule.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>

    <!-- Form Bean Definitions -->
    <form-beans>
     <form-bean name="infoBean" type="com.myhome.info.beans.InfoFormBean"/>
    </form-beans>

 <!-- Global Exception Definitions -->
 <global-exceptions>
 </global-exceptions>
 
 <!-- Global Forward Definitions -->
 <global-forwards>
 </global-forwards>
 
    <!-- dispatch action mappings -->
 <action-mappings>
 
    <action path="/toModule"
               type="org.apache.struts.actions.SwitchAction"/>
      
    <action path="/index"
         type="org.apache.struts.actions.ForwardAction"
          parameter="/register.jsp"/>
        
    <action path="/dispatchModule"
            name="infoBean"
          scope="request"
          parameter="method"
          unknown="true"
          type="com.myhome.dispatch.InfoDispatchAction">
       <forward name="result"  path="/result.jsp"/>
       <forward name="list"    path="/list.jsp"/>
       <forward name="query"   path="/modify.jsp"/>
       <forward name="update"  path="/template.jsp"/>
       <forward name="delete"  path="/template.jsp"/>
    </action>       
    </action-mappings>
   
 <!-- Controller Processor Definition --> 
 <controller processorClass="com.myhome.info.processor.InfoRequestProcessor"/>

 <!-- Message Resources Definitions -->
 
 <!-- Plug Ins Configuration -->
 <!-- Tiles plugin -->
 <!-- Validator plugin -->
 
</struts-config>


모듈을 변경하는 방법은 URI가 아래와 같다면

http://localhost:8080/toModule.do?prefix=/moduleB&page=/index.do

prefix 가 어느 모듈을 사용하는지를 결정하고, page가 그 모듈에서 어떤 액션을 사용할지를 결정한다.

- jsp 페이지에서 prefix와 page로 파라미터를 전송한다.

<script type="text/javascript">
    function module(prefix, page){
          document.indexform.prefix.value=prefix;
          document.indexform.page.value=page;
          document.indexform.submit();
    }      
 </script> 

<form method="POST" name="indexform" action="toModule.do">
    <input type="hidden" name="prefix">
    <input type="hidden" name="page">  

이렇게 설정을 하고 사용할 모듈과 액션을 보내주면 그에 맞는 모듈이 실행된다.

'FrameWork > Struts1' 카테고리의 다른 글

struts1 커스터마이징하여 사용하기.  (0) 2009.11.11
Struts1 FileDownload  (0) 2009.08.18
Struts1 fileUpload  (0) 2009.08.18
Struts1의 Action 3  (0) 2009.08.16
Struts1의 Action 2  (0) 2009.08.12
Struts1의 Action 1  (0) 2009.07.27
Struts1에서 ActionForm 사용하기.  (0) 2009.07.25
Struts1 에서 iBatis 사용하기  (0) 2009.07.05
Struts 1 을 사용하여 간단한 회원가입, 리스트 불러오기.  (0) 2009.07.05
Struts1 개발환경 설정.  (0) 2009.07.05



 LookupDispatchAction은 getKeyMethodMap() 메서드를 구현하고 리소스 번들의 키와 메소드명을 매핑한다.
파라미터로 메소드 이름을 전달하면 그와 같은 메소드 명을 찾아서 실행하는 것이다.
 HTML 폼에서 동일한 이름을 가진 여러 개의 버튼을 사용하는 경우에 유용하다. 이 버튼의 이름은 해당하는 ActionMapping의 매개 변수 속성에 의해 지정된다.

작업 순서

1) mapping 할 메시지번들을 생성한다.
2) LookupDispatchAction을 상속받는 Class를 만들고 getKeyMethodMap() 메소들를 Override한다.
3) struts-config-lookup.xml 파일을 작성한다.
4) web.xml 파일에 struts-config-lookup.xml 파일 설정을 추가한다.

1. mapping 할 메시지 번들 파일(.properties)를 만든다.

메모장에 아래와 같이 추가하고 InfoMessageResource.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

이 파일을 이클립스 안으로 복사해서 붙여 넣는다.(이클리스 안에서 properties 파일을 오류를 발생하기 때문이 이렇게 한다.)

그리고 이 파일을 이클립스에서 열을 경우 한글이 깨져서 나오는것을 알 수 있다. 이 문제를 해결하기 위해서 인코딩 타입을 euc-kr로 파일을 native2ascii 변환하는 작업을 해주어야 한다.

변화작업은 다음 글을 참조한다.
http://thinkingblog.tistory.com/14

InfoMessageResource.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

2. InfoLookupDispatchAction.java 파일 작성.

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

}

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">
<!-- method 라는 value를 받아서 type에 선언된 클래스로 이동하고 getKeyMethodMap() 메소드를 통해서 InfoMessageResource.properites 파일안에 맵핑 되는 메소드를 실행하게 된다.-->
   
   <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>

4. web.xml 에 struts-config-lookup.xml 파일을 추가한다.

<init-param>
 <param-name>config</param-name> 
 <param-value>
 
  /WEB-INF/struts-config-lookup.xml 
</param-value>   /WEB-INF/(기본베이스 - 다른폴더일때는 경로를 설정해주어야 함)폴더 안에 struts-config.xml파일 위치 지정  - 여기까지 작성후 struts-config.xml파일을 생성-->
</init-param>

5. jsp 파일에서 값을 넘겨 줄때

 <form method="POST" name="listform" action="lookup.do">
     <input type="hidden" name="method" value="쿼리">

lookup.query = 쿼리

InfoMessageResource_ko.properties  파일에서 한글로 설정 쿼리 부분과 일치하고, 그 일치한 메소드를 실행한다.

자세한 내용은 파일을 참조 한다.





'FrameWork > Struts1' 카테고리의 다른 글

struts1 커스터마이징하여 사용하기.  (0) 2009.11.11
Struts1 FileDownload  (0) 2009.08.18
Struts1 fileUpload  (0) 2009.08.18
Struts1의 Action 4  (0) 2009.08.16
Struts1의 Action 2  (0) 2009.08.12
Struts1의 Action 1  (0) 2009.07.27
Struts1에서 ActionForm 사용하기.  (0) 2009.07.25
Struts1 에서 iBatis 사용하기  (0) 2009.07.05
Struts 1 을 사용하여 간단한 회원가입, 리스트 불러오기.  (0) 2009.07.05
Struts1 개발환경 설정.  (0) 2009.07.05
■ MappingDispatchAction

 하나의 Action에서 두개 이상의 ActionMapping를 구현할 때 사용된다. DispatchAction 은 하나의 parameter에 실행할 메소드를 넣는 방식에다가 하나의 액션네임에 하나의 ActionClass를 사용한다. 그러나 MappingDispatchAction은 여러개의 액션네임에 하나의 ActionClass를 사용한다.



- DispatchAction과 <action-mappings> 부분이 다르다.

    <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"> <!-- parameter 는 Class의 Method이름이다 -->
            <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>


자세한 내용은 파일 참조




'FrameWork > Struts1' 카테고리의 다른 글

struts1 커스터마이징하여 사용하기.  (0) 2009.11.11
Struts1 FileDownload  (0) 2009.08.18
Struts1 fileUpload  (0) 2009.08.18
Struts1의 Action 4  (0) 2009.08.16
Struts1의 Action 3  (0) 2009.08.16
Struts1의 Action 1  (0) 2009.07.27
Struts1에서 ActionForm 사용하기.  (0) 2009.07.25
Struts1 에서 iBatis 사용하기  (0) 2009.07.05
Struts 1 을 사용하여 간단한 회원가입, 리스트 불러오기.  (0) 2009.07.05
Struts1 개발환경 설정.  (0) 2009.07.05


Struts1의 다양한 Action들


struts-extras-1.3.8.jar에서 지원하며 다양한 액션을 구현 할 수 있다.

■ Action 상속 관계도



1. ForwardAction



 struts-config.xml 의 ActionMapping에서 action 요소에 parameter 속성으로 지정한 URL로 forward 하게 된다. 직접 해당 URL을 호출하면 RequestProcessor을 통해 바로 View page로 이동하지만
ForwardAction을 사용하게 되면 스트럿츠 컨트롤러 서블릿의 기능(폼 빈의 처리 등)을 사용 할 수 있다는 장점이 있다.

<!--직접 해당 URL 호출-->
<action path="/info/index" forward="/info/register.jsp"/>

<!-- ForwardAction을 사용해서 ViewPage요청 -->
<action path="/info/index"
            type=“org.apache.struts.actions.ForwardAction”
            parameter="/info/register.jsp” />


2. IncludeAction.

 

 ForwardAction과 동일한 방식이며 비즈니스 로직에서 처리 후 RequestProcessor로 진입하지 않고 바로 페이지로 이동한다. View page로의 빠른 이동이 가능하다는 장점이 있지만, Request Prcessor를 통과 하지 않기 때문에 page Encoding,validator 등 을 사용할 수 없다.

<!-- IncludeActiond 사용 -->
<action path="/index"
type = "org.apache.struts.actions.IncludeAction"
parameter = "/info/register.jsp"/>

3. DispatchAction

 하나의 Action에서 두개 이상의 ActionForward를 구현할 때 사용된다.


 JSP form 페이지에서 name이 struts-config.xml 에서 설정해논 parameter의 이름과 일치해야 실행된다.

- struts-config.xml

.... 생략 ....

    <action-mappings>
   
   <action path = "/dispatchIndex"
    type = "org.apache.struts.actions.ForwardAction"
    parameter = "/dispatch/register.jsp"/>
    
  <!-- unknow 은 input 속성을 대체하기 위한 속성이다. 입력 폼이 여러개 발생할 때 사용된다.  -->
  <action path = "/dispatch"
    name = "bean"
    scope = "request"
    unknown = "true"
    parameter = "method"
    type = "com.myhome.dispatch.InfoDispatchAction">
    
<!-- forward 이름이 메소드 마다 달라야 한다 -->
   <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>

.... 생략 ....

- InfoDispatchAction .java

//하나의 Action에서 여러개의 action을 구현했다.

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


자세한 내용은 파일을 참조한다.





'FrameWork > Struts1' 카테고리의 다른 글

Struts1 FileDownload  (0) 2009.08.18
Struts1 fileUpload  (0) 2009.08.18
Struts1의 Action 4  (0) 2009.08.16
Struts1의 Action 3  (0) 2009.08.16
Struts1의 Action 2  (0) 2009.08.12
Struts1에서 ActionForm 사용하기.  (0) 2009.07.25
Struts1 에서 iBatis 사용하기  (0) 2009.07.05
Struts 1 을 사용하여 간단한 회원가입, 리스트 불러오기.  (0) 2009.07.05
Struts1 개발환경 설정.  (0) 2009.07.05
Struts(스트럿츠) 란?  (0) 2009.06.27
http://thinkingblog.tistory.com/4
에서 update와 delete를 추가하면서 설명. Struts1.war 파일에 추가 됨.



1. InfoFormBean.java 에서 ActionForm을 상속 받는다.

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;

...... 생략 ......

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

<!-- Form Bean Definitions -->
<!-- form으로 들어오는 데이터를 bean객체에 담는다 -->

    <form-beans> 
        <form-bean
            name="bean"  
            type="com.myhome.info.beans.InfoFormBean"/>  <!-- name은 아무거나 하고 type는 담을 object 객체를 써준다.(전달된 파라미터 데이터가 설정된 빈 으로 저장이 된다) -->
       
        <!--
         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>

3. struts-config.xml 에서 <action-mapping> 설정한다.

 <!--
         [action Attributes]
         path = "request 경로"
         name = "폼정보를 받아 줄 빈 클래스 이름" - form-bean에 정의 된 이름
         scope = "request|session|application" - 다음의 영역으로 들어오는 정보
         input = "/info/modify.jsp" - 입력받은 폼 페이지 명 명시
                                             - 정의된 곳에서 들어오는 데이터를 사용하겠다.
         
         forward 부분에서 path만 잡아 주면 주소창은 변하지 않고 페이지만 변경 시킨다.
         그래서 redirect를 true를 설정하면 주소 까지 바뀌어 버린다.
         -->


        <!-- 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>
        
        <!-- 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>
  
  <!--
   path - 다음과 같은 url패턴으로 들어왔을때
   type - 다음에 실행 될  액션을 설정한다.
   forward - 다음페이지로 이동되어질 곳을 정한다.
   -->


4. Action Class 에서 설정.

//ActionForm을 상속한 경우
public class InfoUpdateAction extends Action{

 @Override
 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");
 }
 
}

//DynaActionForm을 사용한 경우
public class InfoDeleteAction extends Action {

 @Override
 public ActionForward execute(ActionMapping mapping,
         ActionForm form,
         HttpServletRequest request,
         HttpServletResponse response)
         throws Exception {
  
  DynaActionForm dyna = (DynaActionForm)form;
  InfoDTO dto = new InfoDTO();
  dto.setNum((Integer)dyna.get("num"));
  new InfoDAO().delete(dto);
  return mapping.findForward("success");
 }
 
}

5. InfoDAO.java, SqlMap.xml에 update, delete 추가.

6. jsp 페이지 수정.


자세한 내용은 war 파일을 참조 한다.

'FrameWork > Struts1' 카테고리의 다른 글

Struts1 FileDownload  (0) 2009.08.18
Struts1 fileUpload  (0) 2009.08.18
Struts1의 Action 4  (0) 2009.08.16
Struts1의 Action 3  (0) 2009.08.16
Struts1의 Action 2  (0) 2009.08.12
Struts1의 Action 1  (0) 2009.07.27
Struts1 에서 iBatis 사용하기  (0) 2009.07.05
Struts 1 을 사용하여 간단한 회원가입, 리스트 불러오기.  (0) 2009.07.05
Struts1 개발환경 설정.  (0) 2009.07.05
Struts(스트럿츠) 란?  (0) 2009.06.27

1. iBatis 사이트에서 library 다운.

 WEB-INF/lib 폴더에 library 를 추가한다.

2. sql을 관리할 sql 폴더를 만든다.

이클립스에서 맨 왼쪽 아래 아이콘 클릭 하여 Navigator 클릭.
src/com/myhome/info/ 에서 sql 폴더를 하나 만든다.
sql폴더 안에 SqlMap.xml, SqlMapConfig.xml 을 만든다.
SqlMapConfig.xml 안에서 JNDI에 관한 내용 구현.

3. SqlMapConfig.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sqlMapConfig
 PUBLIC "-//ibatis.apache.org//DTD SQL Map Config 2.0 //EN"
 "http://ibatis.apache.org/dtd/sql-map-config-2.dtd">

<sqlMapConfig>
    <settings
  cacheModelsEnabled="true"
  enhancementEnabled="true"
  lazyLoadingEnabled="true"
  maxRequests="32"
  maxSessions="10"
  maxTransactions="5"
  useStatementNamespaces="false"
 />

<!-- JNDI resource type-->
   <transactionManager type="JDBC" >
 <dataSource type="JNDI">
   <property name="DataSource"
      value="java:comp/env/jdbc/XE"/>
 </dataSource>
   </transactionManager>
 <sqlMap resource="com/myhome/info/sql/SqlMap.xml" />
</sqlMapConfig>

JNDI를 사용하기 때문에 server.xml에 JNDI 설정을 추가한다.

4. Server의 server.xml

이 부분은 이미 서버 설정하는 글에서 해주었다.

<GlobalNamingResources> 여기 사이에 추가한다.</GlobalNamingResources>


<Resource name="jdbc/XE"
              auth="Container"
              type="javax.sql.DataSource"
              driverClassName="oracle.jdbc.driver.OracleDriver"
              factory="org.apache.commons.dbcp.BasicDataSourceFactory"
              url="jdbc:oracle:thin:@localhost:1521:XE"
              username="user01"
              password="user01"
              maxActive="20"
              maxIdle="10"
              maxWait="-1" />

5. Server의 context.xml 가장 하단에 추가한다.

<ResourceLink global="jdbc/XE"
                  name="jdbc/XE"
                  type="javax.sql.DataSource"/>

※ JNDI말고 다른 방법을 사용하는 경우.

SqlMapConfig.xml에 다음에 같이 추가한다.

1) simple datasource type  사용

<transactionManager type="JDBC" commitRequired="false">
        <dataSource type="SIMPLE">
            <property name="JDBC.Driver"
                      value="oracle.jdbc.driver.OracleDriver"/>
            <property name="JDBC.ConnectionURL"
                      value="jdbc:oracle:thin:@localhost:1521:XE"/>
            <property name="JDBC.Username" value="user01"/>
            <property name="JDBC.Password" value="user01"/>
        </dataSource>
    </transactionManager>

2) DBCP datasource type 사용

<properties resource=" info/model/dao/db.properties " />
   <transactionManager type="JDBC" >
  <dataSource type="SIMPLE">
  <property name="JDBC.Driver" value="${driver}"/>
  <property name="JDBC.ConnectionURL" value="${url}"/>
  <property name="JDBC.Username" value="${username}"/>
  <property name="JDBC.Password" value="${password}"/>
  <property name="JDBC.DefaultAutoCommit" value="true" />
  <property name="Pool.MaximumActiveConnections" value="10"/>
  <property name="Pool.MaximumIdleConnections" value="5"/>
  <property name="Pool.MaximumCheckoutTime" value="120000"/>
  <property name="Pool.TimeToWait" value="500"/>
  </dataSource>
  </transactionManager>

6. SqlMap.xml 설정.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sqlMap PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN"
 "http://ibatis.apache.org/dtd/sql-map-2.dtd">

<sqlMap>
  <typeAlias alias="Info" type="com.myhome.info.dto.InfoDTO"/> <!-- alias : 별칭을 잡겠다는 의미 -->
 
  <insert id="infoInsert" parameterClass="Info"> <!-- typeAlias한 Info를 넣는다 없으면 com.. 그대로 넣어도 된다. -->
   INSERT INTO INFO
    (NUM, NAME, SEX, TEL, WDATE)
   VALUES
    (NUMSEQ.NEXTVAL, #name#, #sex#, #tel#, #wdate#) <!-- ## Info 안에 가지는 프로퍼티 대소문자가 정확하게 맞아야 한다. -->
  </insert>
 
  <select id="infoList" resultClass="info">
   SELECT
    NUM, NAME, SEX, TEL, WDATE
   FROM
    INFO
   Order by
    NUM desc
  </select>
   
</sqlMap>

7. SQLManager.java 만들기.

package com.myhome.manager;

import com.ibatis.common.resources.Resources;
import com.ibatis.sqlmap.client.SqlMapClient;
import com.ibatis.sqlmap.client.SqlMapClientBuilder;

public abstract class SQLManager {
 
 private SqlMapClient sc = null;
 
 public SQLManager(){
  try{
   sc = SqlMapClientBuilder.buildSqlMapClient(
            Resources.getResourceAsReader(
              "com/myhome/info/sql/SqlMapConfig.xml"));
  }catch(java.io.IOException ie){
   ie.printStackTrace();
  }
 }
 
 public SqlMapClient getSqlMap(){
      return sc; 
    
 }
}

8. InfoDAO.java 만들기.

package com.myhome.info.dao;

import com.myhome.info.dto.InfoDTO;
import com.myhome.manager.SQLManager;
import java.sql.SQLException;
import java.util.List;

public class InfoDAO extends SQLManager{

 /*등록부분*/
 public void register(InfoDTO dto) throws SQLException{
  this.getSqlMap().insert("infoInsert", dto);
 }

 /*회원 리스트 부분*/
 public List<InfoDTO> getAllQuery() throws SQLException{
  List<InfoDTO> list = null;
  list = this.getSqlMap(). queryForList("infoList");
  return list;
 }
 
}

'FrameWork > Struts1' 카테고리의 다른 글

Struts1 FileDownload  (0) 2009.08.18
Struts1 fileUpload  (0) 2009.08.18
Struts1의 Action 4  (0) 2009.08.16
Struts1의 Action 3  (0) 2009.08.16
Struts1의 Action 2  (0) 2009.08.12
Struts1의 Action 1  (0) 2009.07.27
Struts1에서 ActionForm 사용하기.  (0) 2009.07.25
Struts 1 을 사용하여 간단한 회원가입, 리스트 불러오기.  (0) 2009.07.05
Struts1 개발환경 설정.  (0) 2009.07.05
Struts(스트럿츠) 란?  (0) 2009.06.27




순서 : 기본 설정 - 비즈니스 로직 작성 - DB 테이블 생성(퀀텀DB 사용) - Bean - DTO - struts-config.xml 설정 - RequestProcessor 설정 - iBatis 설정(SqlMapConfig.xml) - DAOmanager - SqlMap.xml - DAO -비즈니스로직에서 DAO와 연동


1. 기본 설정

web.xml

   <servlet>
      <servlet-name>action</servlet-name> <!-- 다른 이름으로 해도 된다.. -->
      <servlet-class>  <!-- 클래스 지정 -->
       org.apache.struts.action.ActionServlet
   </servlet-class> 

<!-- groupping module -->
 <init-param>  <!--struct-config.xml 설정 -->
  <param-name>config</param-name>  <!-- config 는 예약어다 파라미터 키를 잡기위해-->
  <param-value>
   /WEB-INF/struts-config.xml
  </param-value>   <!-- /WEB-INF/(기본베이스 - 다른폴더일때는 경로를 설정해주어야 함)폴더 안에 struts-config.xml파일 위치 지정  - 여기까지 작성후 struts-config.xml파일을 생성 -->
 </init-param>

<!-- url 패턴 설정 -->
<servlet-mapping>    
<servlet-name>action</servlet-name> <!-- *.do로 들어오면 servlet-name이 action 실행 -->
   <url-pattern>*.do</url-pattern>
  </servlet-mapping>


2. 비즈니스 로직을 수행하기 위한 준비.

 servlet 을 사용하기 위해서는 자신이 만든 프로젝트이름에서 오른쪽 마우스를 클릭하고 Built Path - Configure Build Path를 클릭해서 새창이 나오면 Libraries 탭으로 이동한다.
 오른쪽에 Add Library 를 클릭 - Server Runtime 클릭 자신이 설치한 Apache Tomcat vX.X 가 보인다. 선택하고 finish 하면 끝. F5키를 눌러 Refresh 한다.


3. Quantum DB 을 이용해 테이블 생성(이전 글에서 방법 작성)

4. Bean 만들기

5. DTO((Data Transfer Object: 데이터 전송 객체, Value Object) 빈즈) 만들기
 
 데이타 , 객체 자체가 움직이기 때문에 직렬화가 필요하다.
객체 직렬화를 하기 위해 implements java.io.Serializable 구현한다.

6. struts-config.xml 설정

<!-- config.xml에서 액션 서블릿으로 넘어온걸 처리, 가장 중요하다-->
 <action-mappings>
<action path="/index"
       forward="/info/register.jsp"/>
     <action path="/register"
       type="com.myhome.info.actions.InfoRegisterAction">
      <forward name="success" path="/info/result.jsp"/> <!-- success 가 오면 result.jsp로 보내줘라 -->  
     </action>
     <action path="/list"
       type="com.myhome.info.actions.InfoListAction">
      <forward name="success" path="/info/list.jsp"/>
     </action>
</action-mappings>

<!-- controller processor Definition -->
 <controller processorClass="com.myhome.info.processor.InfoRequestProcessor"/>

7. RequestProcessor 설정 

- Action으로 호출하기 전 처리할 내용을 기술.
- processPreprocess 오바라이드 구현.
- form parameter에 대한 엔코딩을 수행한다.
- struts-config.xml 에서
<!-- controller processor Definition -->
 <controller processorClass="com.myhome.info.processor.InfoRequestProcessor"/>
내용을 입력한다.

8. iBatis 설정(퍼시스턴트 모델을 구현)
 
http://thinkingblog.tistory.com/6  참조.

iBatis 사이트에서 api 다운. - 우선 JNDI 사용해서 구현.

 이클립스에서 맨 왼쪽 아래 아이콘 클릭 하여 Navigator 클릭.
src/com/myhome/info/ 에서 sql 폴더를 하나 만든다.
sql폴더 안에 info.sql, SqlMap.xml, SqlMapConfig.xml 을 만든다.
SqlMapConfigl.xml 안에서 JNDI에 관한 내용 구현.

9. DAOmanager를 만든다

 SqlMapConfigl을 읽어오는데 목적이 있다.
 SQLManager.java 를 만든다.(추상클래스로 만든다.)

10. SqlMap.xml 설정

11. DAO 를 만든다.

 SQLManager.java를 구현한다.

12. 비즈니스로직(InfoRegisterAction.java)에서 DAO와 연동.

자세한 내용은 Struts1.war 프로젝트를 참조 하면서 본다.

'FrameWork > Struts1' 카테고리의 다른 글

Struts1 FileDownload  (0) 2009.08.18
Struts1 fileUpload  (0) 2009.08.18
Struts1의 Action 4  (0) 2009.08.16
Struts1의 Action 3  (0) 2009.08.16
Struts1의 Action 2  (0) 2009.08.12
Struts1의 Action 1  (0) 2009.07.27
Struts1에서 ActionForm 사용하기.  (0) 2009.07.25
Struts1 에서 iBatis 사용하기  (0) 2009.07.05
Struts1 개발환경 설정.  (0) 2009.07.05
Struts(스트럿츠) 란?  (0) 2009.06.27


http://thinkingblog.tistory.com/2

위 글에서 작성한 설정을 다 하고 마지막으로 아래 설정을 하면 struts1을 개발 할 수 있는 환경 설정 완료.

■ struts-config.xml 설정

 
 스트럿츠 사이트에서 struts-1.3.10-all 파일을 다운로드 받는다.

http://struts.apache.org/download.cgi#struts1310

 struts-config.xml은 sturts에서 제공하는 xml을 사용한다.
struts-blank-1.3.10 파일안에 존재하는 struts-config.xml 파일을 이클립스에서 생성한 프로젝트의 WEB-INF에 복사해 넣는다.

struts-1.3.10-all\struts-1.3.10\apps 안에 있는 struts-blank-1.3.10 압축 파일을 풀고 WEB-INF에 있는 struts-config.xml 파일을 복사해 사용한다.

Struts1 환결 설정 끝.

'FrameWork > Struts1' 카테고리의 다른 글

Struts1 FileDownload  (0) 2009.08.18
Struts1 fileUpload  (0) 2009.08.18
Struts1의 Action 4  (0) 2009.08.16
Struts1의 Action 3  (0) 2009.08.16
Struts1의 Action 2  (0) 2009.08.12
Struts1의 Action 1  (0) 2009.07.27
Struts1에서 ActionForm 사용하기.  (0) 2009.07.25
Struts1 에서 iBatis 사용하기  (0) 2009.07.05
Struts 1 을 사용하여 간단한 회원가입, 리스트 불러오기.  (0) 2009.07.05
Struts(스트럿츠) 란?  (0) 2009.06.27

 Java EE 웹 어플리케이션을 개발하기 위한 오픈소스 프레임워크이다. MVC 아키텍처를 적용하는 개발자들을 지원하기 위하여 자바 서블릿 API 를 사용하고 확장하였다. 이것은 크레이그 맥클라나한(Craig McClanahan) 에 의해 최초로 만들어졌으며 아파치 재단2000년 5월 이관되었다. 
 이 프레임워크는 페이지 디자이너, 컴포넌트 개발자, 프로젝트 일부를 담당하는 다른 개발자 등 성격이 다른 그룹들에 의해 다루어지는 대형 웹 어플리케이션의 설계와 구현을 가능케 한다.
I18N (국제화), 강력한 커스텀 태그 라이브러리, 타일형 디스플레이, 폼 유효성 검사등의 특징을 가진다. 또한 다양한 프레젠테이션 레이어들을 지원하여, JSP, XML/XSLT, JSF, 벨로시티 등을 포함하고 있으며 또한 JavaBeansEJB 등 다양한 모델 레이어를 포함하고 있다.(위키백과)
 라고 나와있다.
간단하게 말하자면 오픈소스 프레임워크(꽁짜라는것!)과 자바 서블릿(Java Servlet), 자바 서버 페이지(Java Server Pages), 자바빈즈(Java Beans), 리소스번들(Resource Bundle) 그리고 확장 마크업 랭귀지(XML)와 같은 표준 기술들에 기반한 오픈 소스 프레임워크라는 것이다.

스트럿츠를 사용하면서 스트럿츠가 무엇인지 자세하게 알지 못하면서 사용하는거 같아 내가 이해하는 스트럿츠가 먼가에 대한 정의 필요한것 같음.

스트럿츠에 관해 자세하게 설명한 블로그가 있어서 링크를 걸었다.

http://blog.naver.com/mir2050/120001811295

스트럿츠란 무엇인가? 그것이 문제로다....ㅋ

'FrameWork > Struts1' 카테고리의 다른 글

Struts1 FileDownload  (0) 2009.08.18
Struts1 fileUpload  (0) 2009.08.18
Struts1의 Action 4  (0) 2009.08.16
Struts1의 Action 3  (0) 2009.08.16
Struts1의 Action 2  (0) 2009.08.12
Struts1의 Action 1  (0) 2009.07.27
Struts1에서 ActionForm 사용하기.  (0) 2009.07.25
Struts1 에서 iBatis 사용하기  (0) 2009.07.05
Struts 1 을 사용하여 간단한 회원가입, 리스트 불러오기.  (0) 2009.07.05
Struts1 개발환경 설정.  (0) 2009.07.05

+ Recent posts