- 쿼리문을 만들어 줄 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 값도 표시를 한다.





+ Recent posts