- 쿼리문을 만들어 줄 Class

package org.bnk.util;

import java.io.FileInputStream;
import java.io.InputStream;
import java.util.Scanner;

public class QueryUtil {
 
 public void makeQuery()throws Exception{
   
    InputStream in = new FileInputStream("query.txt");
    Scanner scanner = new Scanner(in);
   
    while(true){
    
     try{
      String str = scanner.nextLine();
      System.out.println("buffer.append(\" "+ str+"\\n\");");
     
     }catch(Exception e){
      break;
     }  
    }
    in.close();
   }
  
   public static void main(String[] args)throws Exception {
    new QueryUtil().makeQuery();
   }
}

- query.txt 파일을 프로젝트 밑에 만들고 거기 안에다가 쿼리 문을 넣는다.

그리고 실행하면 PreparedStatement 에서 사용할 쿼리가 만들어 진다.

INSERT into TBL_BBS (bbsno, title, content, writer)
values(SEQ_BBS.NEXTVAL, 'AAAAAAAAA', 'BBBBBBBB', 'CCCCCC');


위 문장이 텍스트 파일에 있었다면

실행을 하고 만들어지는 문장은

buffer.append(" INSERT into TBL_BBS (bbsno, title, content, writer)\n");
buffer.append(" values(SEQ_BBS.NEXTVAL, 'AAAAAAAAA', 'BBBBBBBB', 'YNK')\n");


이렇게 많들어 진다.

이걸 PreparedStatement 에서 사용할 문자로 바꾸면 이렇게 된다.

buffer.append("  INSERT into TBL_BBS (bbsno, title, content, writer) \n");
buffer.append("  values(SEQ_BBS.NEXTVAL, ?, ?, ?)  \n");



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
system, sys 비밀번호 변경 시...

콘솔 창에서

sqlplus "/as sysdba" 입력

SQL> alter user system identified by 새로변경할 패스워드;
SQL> alter user sys identified by 새로변경할 패스워드;

이렇게 해주면 패스워드가 변경되고

바뀐 비밀번호로 접속을 하면 된다.
■ EQUI JOIN

가장 많이 사용하는 조인 방법으로서 조인 대상이 되는 두 테이블에서 공통적으로 존재하는 컬럼의 값이 일치되는 행을 연결하여 결과를 생성하는 조인 방법이다.

FROM 절에 조인할 두 테이블 명을 제시하고, WHERE 조건에 두 테이블에 공통된 컬럼을 조인 조건으로 제시한다.

조인 조건은 테이블 N개를 조인시 N - 1개의 조인 조건을 주어야 한다. 2개 테이블 조인시 조건 1개, 3개시 2개....

SELECT e.ENAME, d.DNAME
FROM EMP e, DEPT d
WHERE E.DEPTNO = D.DEPTNO;

- EQUI JOIN에다가 AND 연산을 추가 할 수 있다.

SELECT E.ENAME, D.DNAME
FROM EMP e, DEPT d
WHERE E.DEPTNO = D.DEPTNO;
AND e.ename='SCOTT';

■ NON-EQUI JOIN

NON-EQUI JOIN은 조인 조건에 특정 범위 내에 있는지를 조사하기ㅐ 위해서 WHERE 절에 조인 조건을 = 연산자 이외의 비교 연산자를 사욯한다.

SELECT e.ename, e.sal, s.grade
FROM EMP e, SALGRADE s
WHERE e.sal >= S.LOSAL AND e.sal <=S.HISAL;

- BETWEEN AND 사용시

SELECT e.ename, e.sal, s.grade
FROM EMP e, SALGRADE s
WHERE e.sal BETWEEN S.LOSAL AND s.hisal;

SELECT e.ename, D.DNAME, E.SAL, s.grade
FROM EMP e, SALGRADE s, DEPT d
WHERE e.deptno = D.DEPTNO 
AND e.sal BETWEEN S.LOSAL AND s.hisal;

■ SELF JOIN 

자신의 테이블만으로는 원하는 결과를 알아 낼 수 없으나 만일 자신과 같은 테이블이 두개 존재한다면 질의가 가능한 경우 마치 같은 테이블이 두개 인 것처럼 자기 자신 테이블과 조인하는 것을 SELF JOIN 이라고 한다. 이 경우 FROM 절에 같은 테이블 이름을 두 번 반복하게 되므로 반드시 테이블 별칭을 사용해야 한다.

SELECT e.ename || '의 매니저는 ' ||  m.ename || ' 입니다'
FROM EMP e, EMP m
WHERE e.mgr = m.empno;

■ OUTER JOIN

외부 조인은 조인 조건에 만족하지 못하였더라도 해당 행을 나타내고 싶을 때 사용한다. 컬럼 값이 NULL일 경우...
외부 조인은 "(+)" 연산자를 사용하여 NULL 값이기에 배제된 행을 결과에 포함시킬 수 있다.

SELECT e.ename || '의 매니저는 ' ||  m.ename || ' 입니다'
FROM EMP e, EMP m
WHERE e.mgr = m.empno(+);

KING의 매니저는 입니다. 라고 나타난다. NULL 값도 표시를 한다.





검색을 아래와 같은 쿼리로 실행할 경우,

SELECT *

FROM
(
SELECT rownum rn, bbsno, writer, content, title
FROM TBL_BBS
WHERE rownum <=20
ORDER BY bbsno DESC
)
WHERE rn > 10

낮은 코스트가 나온다

하지만 이 쿼리의 문제점은 데이터 양이 적을 때 풀 스캔을 먹는다는것이다.

- 힌트를 이용하여 강제로 풀스캔을 먹인 경우

SELECT /*+FULL(tbl_bbs)*/ rownum rn, bbsno, writer, content, title
FROM TBL_BBS
WHERE rownum <= 20
ORDER BY bbsno DESC

전체 디비를 검색하고 로우넘을 붙이고 마지막에 소팅을 한다. 코스트가 엄청 커진다.

검색 결과를 보면 처음부터 검색하는지 않고 중간에서 부터 결과가 나온다.

- 인덱스의 단점은 : 인덱스를 이용하여 insert나 delete 작업을 하면 떨어진다.

- 인덱스를 타고 싶은데 오라클 옵티마이저가 스스로 판단해서 full scan을 할때도 있기 때문에 로우넘이 꼬이는 경우가 있다. 그래서 hint를 사용하여 무조건 인덱스를 타게 해준다.

※ order by를 사용하지 않는다! 인덱스를 이용하여 아래에서 부터 검색
SELECT
/*+INDEX_DESC(tbl_bbs pk_bbs)*/ //->order by를 사용하지 않고 DESC를 사용해서
 rownum rn, bbsno, writer, content, title
FROM TBL_BBS
WHERE bbsno > 0 
AND rownum <= 20

SELECT
/*+INDEX(tbl_bbs pk_bbs)*/
 rownum rn, bbsno, writer, content, title
FROM TBL_BBS
WHERE bbsno > 0
AND rownum <= 20

■ 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
■ Static Parameters Interceptor


클라이언트가 보내는 파라미터를 무시하고 미리 설정해 놓은 파라미터로 값을 넣는다.

struts.xml
에 정의된 파라미터 값들을 액션에저장한다. <action> 태그 의 직속 자식으로<param> 태그가 있다.


- xml 파일에 아래와 같이 태그를 추가한다.

 <param name="name">홍길동</param>
          <interceptor-ref name="staticParams"/>

- action class 에서

param 네임으로 getter, setter를 생성한다.

■ 
Timer Interceptor


인터셉터와
처리를 포함하여 액션의 작업 처리 시간을 출력한다.


- xml 파일 안에 아래와 같이 추가

 <interceptor-ref name="timer"/>  <!-- 작업시간에 대한 결과를 출력한다. -->

이렇게 추가해 주고 실행하면 작업 시간이 콘솔 창이 나타난다.

Tomcat 6.0 설치

http://tomcat.apache.org/download-60.cgi 

사이트에서 Core : zip 버전을 다운로드하고 원하는 위치에 압축을 푼다.

1. 환경변수 설정에서 JAVA_HOME 셋팅 되어 있는지 확인한다. 거의 모든 WAS가 JAVA_HOME 경로를 참조하기 때문이다.

2. 오라클이 설치된 경우에는 8080포트는 사용할 수 없다.
- XE버전일 때는 톰캣의 포트를 수정하는 편이 편한다.

3.  아파치-톰캣 conf경로 안에 있는 server.xml 파일을 수정한다. 

C:\apache-tomcat-6.0.20\conf - server.xml

67번째 줄에 있는.

//8080을 -> 다른 포트 번호로 수정한다.

<Connector port="8081" protocol="HTTP/1.1"
 
               connectionTimeout="20000"
               redirectPort="8443" />

4. 콘솔 창으로 접속 한 다음에 C:\apache-tomcat-6.0.20\bin 폴더에서 startup 실행을 한다.



만약 다음과 같이 오류가 발생한다면.

CATALINA_HOME environment variable... 메시지가 떴다면 환경변수를 수정해야 된다.

현재 톰캣의 경로 : C:\apache-tomcat-6.0.20 환경 변수에 셋팅한다.

CATALINA_HOME 추가

환경변수 추가 방법은 http://thinkingblog.tistory.com/42 글을 참조 한다.


환경변수 수정하고 나면 명령프롬프트를 새로 시작하고 다시 

콘솔 창으로 C:\apache-tomcat-6.0.20\bin 폴더에서 접근한 다음에 startup 실행을 한다.

새로운 창이 뜨면서 실행이 성공한다.



http://127.0.0.1:8081 으로 접속해서 창이 뜨는지 확인한다.



창이 제대로 뜬다면 설정 성공!

종료는 shutdown 을 콘솔 창에서 입력한다.

1. 테이블 만들면서 복사해오기

CREATE table emp as
SELECT employee_id empid, first_name ||' ' ||  last_name name
FROM hr.employees

2. 원래 테이블에다가 select 해서 복사하는 방법

INSERT into emp (empid, name)
SELECT employee_id empid, first_name ||' ' ||  last_name name
FROM hr.employees

3. 자가 복사

INSERT into emp (empid, name)
SELECT empid, name FROM EMP

4. DB백업 방식!

SELECT 'insert into emp2 (empid, name) values (' || employee_id || ',''' ||  first_name || ''');' FROM hr.employees

- SQLGate에서 실행

셀 전체 복사
insert into emp2 (empid, name) values (100,'Steven');
....
insert into emp2 (empid, name) values (107, 'Gietz');

메모장에 붙여 넣기 하고 맨 마지막에 commit; 추가 한다.

aaa.sql 파일로 만든다. C 드라이브에 저장.

- slq 접속.
sql>@C:\\aaa.sql 을 실행한다.

※ 만약에 셀 전체를 해서 SQLGate에서 sql 창을 새로 열어서 복사하고 실행하면 실행 속도가 오래 걸린다!

■ JUnit 이란 독립된 테스트를 할 수 있도록 도와주는 framework이다.

테스트시 권장 사항으로 test 로 시작하는 메서드 이름을 작성한다. 

register() 라는 메서드를 테스트 하려면 testRegister()로 만드는 것이 좋다.

그리고 eclipse의 JUnit 플러그인은 test로 시작된 메서드들을 찾아서 리플렉션을 통해서 테스트를 수행하게 한다.

■ 실습해보기.

1. Java Project를 하나 만든다.

2. Project 이름에서 오른쪽 마우스를 클릭하고 Properties를 클릭한다.

3. Java Build Path를 클릭한다.

4. Libraries 탭을 클릭하고 Add Library를 클릭한다.



5. JUnit 을 선택하고 Next를 클릭.



6. 버전을 선택하고 Finish



7. JUnit3이 추가 된 모습을 확인 할 수 있다.




8. Project 에서 오른쪽 마우스 클릭하고, New에서 JUnit Test Case를 클릭한다.

 

만약 저 위치에 없다면 Other를 클릭하고 Java 폴더 - JUnit 폴더에서 선택하면 된다.



9. Name에 클래스 이름을 입력하고 Finish.



10. 클래스를 작성 한다.

- TestVO.java

- Test.java


11. Test 클래스 이름을 더블클릭하고 오른쪽 마우스를 클릭한 다음에 Run As -> JUnit Test를 실행한다.



테스트가 성공한 모습을 볼 수 있다.



12. 오류가 있는 경우 에러가 발생한다.

오류가 있는 코드를 삽입한 결과.


오류가 있는 메소드에서 에러가 발생한 모습을 볼 수 있다.

JUnit을 사용하면 이렇게 에러가 발생한 곳을 찾을 수 있고, 단계별로 검사를 진행하면서 하면 나중에 큰 문제 없이 프로젝트를 완성할 수 있다.



JDBC 드라이버는 데이타베이스에 맞는 드라이버를 사용해야된다. 

버전이 다를 경우 오류가 발생 할 수 있는데, 무슨 오류인지 몰라서 잡기가 힘들다.

데이타베이스는 그에 맞는 드라이버를 제공한다. 

Oracle Database 10g Express Edition 의 경우

C:\oraclexe\app\oracle\product\10.2.0\server\jdbc\lib 

경로 아래에 두개의 Jar File 이 있다.



ojdbc14_g 파일은 디버깅용으로 속도가 좀 떨어진다.

여기에 있는 Jar File을 가져다가 사용하자.


■ system 계정으로 로그인 해서 user01 만든다.

(SQLGate 사용 또는 오라클 데이타베이스 홈페이지 접속 해서 실행)

CREATE USER USER01 IDENTIFIED BY USER01;

//DBA 권한 부여

GRANT CONNECT, DBA TO USER01;


■ 로그아웃 후 USER01 계정으로 접속한다.

- hr 계정의 employees에서 불러온다.
SELECT employee_id, first_name, last_name
FROM hr.employees;

- first_name과 last_name을 합쳐서 불러온다.
SELECT employee_id, first_name || last_name
FROM hr.employees

- first_name과 last_name 사이에 공백을 넣어서 불러온다.
SELECT employee_id, first_name || '' ||last_name
FROM hr.employees

- first_name과 last_name을 합친 컬럼 명을 name으로 ALIAS(별칭) 한다. name 앞에 AS가 생략됨.(AS name)
SELECT employee_id, first_name ||' ' ||  last_name
name
FROM hr.employees

- emp라는 테이블을 만들면서 hr 계정의 employees 테이블의 데이터들도 불러온다.
CREATE table emp as
SELECT employee_id empid, first_name ||' ' ||  last_name name
FROM hr.employees

- emp 테이블의 데이터 양을 두배로 늘린다. 실행후 107개가 214개가 되어 있음을 확인 할 수 있다.
INSERT INTO emp (empid, name)
SELECT employee_id empid, first_name ||' ' ||  last_name name
FROM hr.employees


Oracle Databae 10g Express Edition 에서 HR 계정을 사용하기 위해서는 잠금을 해제해야 된다.

브라우저 창에서
http://127.0.0.1:8080/apex 나 시작 메뉴의 오라클 메뉴에서 Database 홈페이지로 이동 을 선택해서 관리 창으로 들어간다.

system 계정으로 로그인 한다.(비밀 번호는 오라클 설치시 설정한 번호)

로그인이 성공하면

관리 클릭 -> 데이타베이스 사용자 클릭 해서 들어가면 HR 계정에 자물쇠로 잠겨 있는 모습을 볼 수 있다.



HR 계정을 클릭해서 들어가 보면


계정 상태 에서 잠금 해제됨을 선택하고(암호 입력) 사용자 변경을 누르면 잠금이 해제 된다.

로그아웃을 하고 다시 HR 계정으로 로그인 하면 인사관리와 관련된 테이블들을 볼 수 있다.

※ emp 테이블은 scott 계정에 있다.

접속 : sqlplus sys as sysdba 암호 : MANAGER

@C:\oraclexe\app\oracle\product\10.2.0\server\RDBMS\ADMIN\scott.sql

CONNECT SCOTT/TIGER

들어가서 보면 emp 테이블이 만들어져 있다.



■ DB 설치
 
Oracle 사이트에서 Oracle Database 10g Express Edition (Universal) 다운로드. 다운로드를 하기 위해서 회원가입해야 됨.

 Oracle XE(10g) 개발자용은 스키마를 만들 수 없음.

 약관 및 설치 위치를 설정하고, 암호를 설정한 다음 다음버튼 클릭!.


 요약 정보가 나옴. HTTP리스너용 포트 번호를 보면 8080으로 되어있음 아파치 WAS포트 번호도 8080이므로 둘중에 하나 변경해야됨. 설치 클릭!.
 

 설치 후 오라클 홈페이지를 실행하면(시작 메뉴에서 오라클 메뉴 - Database 홈페이지로 이동 클릭!) 로그인 창이 나타난다.


 아이디는 system 암호는 설치하면서 정한 비밀번호를 입력한다.

 로그인 후 관리에서 데이타베이스 사용자 - 사용자 관리(페이지에서 생성 클릭!) 또는 생성으로 이동.


 사용자 이름 및 암호를 입력하고 생성 클릭. 사용자 이름 : user01, 암호 : user01

■ 오라클 수동 시작으로 변경

오라클을 설치 해놓으면 윈도우가 시작 될때 느리고, 많은 메모리를 차지 하기 때문에 수동으로 설정해준다.

제어판 -> 관리도구 -> 구성 요소 서비스 -> 서비스(로컬) 에서


빨간 색 부분을 선택하여 수동으로 바꿔준다.



데이타베이스를 시작하기 위해서는 시작 - 모든프로그램 - 오라클 메뉴로 가서 데이타베이스 시작을 클릭한다.
■ 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
■ Java SDK 설치

 
Sun 사이트에서 다운로드. 기본적으로 Java SE Development Kit (JDK)를 다운.

이전 버전을 다운로드 하고 싶으시면 Previous Releases라고 다운로드 탭에서 이동.

WAS는 SDK가 기본적으로 깔리는 주소를 인식하기 때문에 변경하지 않고 그냥 설치 하는 것이 좋다.

C:\Program Files\Java\jdk1.6.0_12

또는 WAS가 JAVA_HOME을 기본적으로 검색한다고 한다.


■ 환경 변수 추가 방법

Java EE 에서는 환경변수에서 JAVA_HOME을 먼저 참조한다.

내 컴퓨터에서 오른쪽 버튼 클릭 - 속성 클릭 -고급 탭으로 이동 - 환경변수 클릭 - 새로 만들기 클릭

JAVA_HOME 추가. 아래와 같이 입력한다.



시스템 변수에서 Path에 경로 추가.

Path를 선택하고 편집을 클릭한다.

Path 에다가 붙여 넣기 할 때 : ;%JAVA_HOME%\bin; 붙여 넣는다. 마지막에 추가 할 때 ; 을 넣어 주어야 한다. 맨 앞에다가 추가시에는 없어도 된다.



(콘솔 창에서 java -version 을 쳐보면 설치 및 버전 확인 가능)
검색을 테스트 하기 위해 기본적으로 100만건 이상의 자료가 있어야 공부하는데 도움이 된다.

그래서 쉽게 DB에 자료를 증가시키는 방법을 사용한다.

INSERT와 SELECT의 조인문을 이용해서 자가복사를 통해 데이터를 증가 시킨다.

SQL>INSERT INTO 테이블명 SELECT (NUMSEQ.NEXTVAL : 넘버 시퀀스가 있을 경우), 필드명, 필드명 .... FROM 테이블명;

이렇게 쿼리문을 입력하고 계속 실행해주면 10개가 20개, 20개가 40 개씩 배로 늘어나게 된다.

몇번만 해주면 쉽게 백만건을 넣을 수 있다.

이제 쿼리문 연습을 해보자.



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

+ Recent posts