본문 바로가기
Backend

10월 18일 금 | SPRING 04 - 스프링 프로젝트 mymelon

by 구라미 2019. 10. 18.

새로운 프로젝트

1) New -> Spring Legacy Project

2) 설정해주기 

 

 

* 어제한 것 경로설정

* 파일IO 디펜던시 추가하고 설정변경

 

//1) pom.xnl -> file 업로드/다운로드 관련 의존성추가
//2) MediaDTO -> posterMF, filenameMF 필드 추가, getter setter 함수 생성
//3) servlet-context.xml에 스프링빈 등록

 

 

 

◐ MediaDTO.java

// 스프링파일 객체 멤버변수
// <input type='file' name='posterMF' size='50'>
	private MultipartFile posterMF;
// <input type='file' name='filenameMF' size='50'>
	private MultipartFile filenameMF;

 

 servlet-context.xml

<!-- File 전송이 있는 경우 Spring 등록  -->
	<!-- CommonsMultipartResolver -->
	<beans:bean id="MultipartResolver"  
			    class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
	</beans:bean>	

 

Static - 공유, 이어진다. 이미 메모리에 올라가 있는 것이기 때문.

 

 

 


 

mymelon 프로젝트

mp3,mp4 파일을 올릴 수 있고 audio, video가 재생되는 CRUD 게시판

 

기본적인 디렉토리 구조는 다음과 같다.

 

 

 


1. src/main/java

DBPKG

1) DBOpen.java

package DBPKG;
import java.sql.*;

public class DBOpen {
	public static Connection getConnetion() throws Exception{			
		Class.forName("oracle.jdbc.OracleDriver");
		Connection con = DriverManager.getConnection ("jdbc:oracle:thin:@//localhost:1521/xe","오라클아이디","오라클비밀번호");
		return con;		
	}	
}

 

 

kr.co.mymelon

1) HomeController.java

package kr.co.mymelon;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;

@Controller
public class HomeController {
	public HomeController() {
		System.out.println("---------------HomeController() 객체생성됨");
	}
	
	private static final Logger logger = LoggerFactory.getLogger(HomeController.class);
	
	//mymelon 프로젝트 첫페이지 호출 명령어 등록
	//http://localhost:8090/mymelon/home.do
	@RequestMapping(value = "/home.do", method = RequestMethod.GET) //root 페이지 등록
	public ModelAndView home() {
		ModelAndView mav = new ModelAndView();
		//redirect <-  등록된 명령어를 호출한다.
		mav.setViewName("redirect:/media/list.do"); //* 이런 형식도 가능하다.
		return mav;
	}//home end
}

 


 

kr.co.mymelon.media

1) MediaCont.java

package kr.co.mymelon.media;
import javax.servlet.http.HttpServletRequest;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.servlet.ModelAndView;
import net.utility.UploadSaveManager;
import net.utility.Utility;

@Controller
public class MediaCont {
	public MediaCont() {
		System.out.println("---------------MediaCont() 객체생성됨");
		//확인용에는 절대 void 적지말기 
	}
	
	private MediaDAO dao=new MediaDAO();
	
	//결과확인 http://localhost:8090/mymelon/media/list.do
	@RequestMapping(value="/media/create.do", method=RequestMethod.GET)
	public String createForm() {
		return "media/createForm";
	}
	//결과확인 http://localhost:8090/mymelon/media/create.do
	
	
	//1) Insert Data
	@RequestMapping(value="/media/create.do", method=RequestMethod.POST)
	public ModelAndView createProc(MediaDTO dto, HttpServletRequest req) {System.out.println(dto);
		//1) pom.xml -> file 업로드/다운로드 관련 의존성추가
		//2) MediaDTO -> posterMF, filenameMF 필드 추가, getter setter 함수 생성
		//3) servlet-context.xml에 스프링빈 등록
		
		ModelAndView mav = new ModelAndView();
		mav.setViewName("media/msgView");
		mav.addObject("root", Utility.getRoot()); //mymelon
		
		//전송된 파일 처리
		// -> 실제 파일은 /media/storage폴더에 저장
		// -> 저장된 파일관련 정보는 media테이블에 저장
		// 파일에 저장될 실제 물리적인 경로
		String basicPath = req.getRealPath("/media/storage");
		
		//1)<input type='file' name='posterMF'>
		//파일 가져오기
		MultipartFile posterMF = dto.getPosterMF();
		//파일 저장하고 리네임된 파일명 반환
		String poster = UploadSaveManager.saveFileSpring30(posterMF, basicPath); //파일명과 경로명
		//리네임된 파일명 dto객체 담기
		dto.setPoster(poster);
		
		//2) <input type='file' name='filenameMF'>
		MultipartFile filenameMF = dto.getFilenameMF();
		String filename = UploadSaveManager.saveFileSpring30(filenameMF, basicPath);
		dto.setFilename(filename);
		dto.setFilesize(filenameMF.getSize());
		
		int cnt = dao.create(dto);
		if(cnt == 0) {
			mav.addObject("msg1", "<p>음원등록 실패!</p>");
			mav.addObject("img", "<img src='../images/fail.png'>");
			mav.addObject("link1", "<input type='button' value='목록으로' onclick='location.href=\"list.do\"'>");
			mav.addObject("link1", "<input type='button' value='목록으로' onclick='location.href=\"create.do\"'>");
			
		} else {
			mav.addObject("msg1", "<p>음원등록 성공!</p>");
			mav.addObject("img", "<img src='../images/sound.png'>");
			mav.addObject("link1", "<input type='button' value='목록으로' onclick='location.href=\"list.do\"'>");
		}//if end
		return mav;
	}
	
	//2) List
	@RequestMapping("/media/list.do")
	public ModelAndView list() {
		ModelAndView mav = new ModelAndView();
		mav.setViewName("media/list");
		mav.addObject("list", dao.list());
		mav.addObject("root", Utility.getRoot()); //root  
		return mav;
	} 
	
	//3) Read
	@RequestMapping("/media/read.do")
	public ModelAndView read(MediaDTO dto) {
		ModelAndView mav = new ModelAndView();
		
		int mediano = dto.getMediano();
		dto = dao.read(mediano);
		
		if(dto != null) {
			String filename = dto.getFilename();
			filename = filename.toLowerCase();
			if(filename.endsWith(".mp3")) {
				mav.setViewName("media/readMP3");
			} else if(filename.endsWith(".mp4")) {
				mav.setViewName("media/readMP4");
			}//if end
		}//if end
		mav.addObject("dto",dto);
		return mav;
	}//read end
	
	
	//4) Update
	@RequestMapping(value ="/media/update.do", method=RequestMethod.GET)
	public ModelAndView updateForm(MediaDTO dto) {
		ModelAndView mav = new ModelAndView();
		mav.setViewName("media/updateForm");
		mav.addObject("dto", dao.read(dto.getMediano()));
		return mav;
	}
	
	@RequestMapping(value ="/media/update.do", method=RequestMethod.POST)
	public ModelAndView updateProc(MediaDTO dto, HttpServletRequest req ) {
		ModelAndView mav = new ModelAndView();
		mav.setViewName("media/msgView");
		String basePath = req.getRealPath("/media/storage");
		
		//수정전 지정된 기존의 정보 가져오기
		MediaDTO oldDTO = dao.read(dto.getMediano());
		
		//////////////////////////////////////////////
		//--------- 파일을 수정할 것인지? --------- //
		MultipartFile posterMF = dto.getPosterMF();
		if(posterMF.getSize() > 0) {
			//1)파일 크키가 0보다 큼 = 파일이 잘 전송됨
			//2)기존파일 삭제
			
			UploadSaveManager.deleteFile(basePath, oldDTO.getPoster());
			String poster = UploadSaveManager.saveFileSpring30(posterMF, basePath);
			dto.setPoster(poster);
			
		}else {
			dto.setPoster(oldDTO.getPoster());
		}
			
		 MultipartFile filenameMF = dto.getFilenameMF();
	     if(filenameMF.getSize()>0){
	       UploadSaveManager.deleteFile(basePath, oldDTO.getFilename());
	       String filename = UploadSaveManager.saveFileSpring30(filenameMF, basePath);
	       dto.setFilename(filename);             
	       dto.setFilesize(filenameMF.getSize());           
	     }else {
	       dto.setFilename(oldDTO.getFilename());
	       dto.setFilesize(oldDTO.getFilesize());
	     }//if end
		
	     int cnt=dao.update(dto);   
			if(cnt==0) {
				mav.addObject("msg1",   "<p>음원수정실패!!</p>");
				mav.addObject("img",   "<img src='../images/fail.png'>");
				mav.addObject("link1", "<input type='button' value='목록으로' onclick='location.href=\"list.do\"'>");
				mav.addObject("link2", "<input type='button' value='다시시도' onclick='javascript:history.back()'>");
			}else {
				mav.addObject("msg1", "<p>음원수정성공~~</p>");
				mav.addObject("img",   "<img src='../images/sound.png'>");
				mav.addObject("link1", "<input type='button' value='목록으로' onclick='location.href=\"list.do\"'>");
			}//if end		
			return mav;
	}
	
	//5) delete
		@RequestMapping(value ="/media/delete.do", method=RequestMethod.GET)
		public ModelAndView deleteForm(MediaDTO dto) {
			ModelAndView mav = new ModelAndView();
			mav.setViewName("media/deleteForm");
			mav.addObject("dto", dao.read(dto.getMediano()));
			return mav;
		}
	
		@RequestMapping(value= "/media/delete.do", method=RequestMethod.POST)
		public ModelAndView delete(MediaDTO dto) {
			ModelAndView mav = new ModelAndView();
			mav.setViewName("media/msgView");
			int cnt=dao.delete(dto);   
			if(cnt==0) {
				mav.addObject("msg1",  "<p>음원삭제실패!!</p>");
				mav.addObject("img",   "<img src='../images/fail.png'>");
				mav.addObject("link1", "<input type='button' value='목록으로' onclick='location.href=\"list.do\"'>");
				mav.addObject("link2", "<input type='button' value='다시시도' onclick='javascript:history.back()'>");
			}else {
				mav.addObject("msg1", "<p>음원삭제성공~~</p>");
				mav.addObject("img",   "<img src='../images/sound.png'>");
				mav.addObject("link1", "<input type='button' value='목록으로' onclick='location.href=\"list.do\"'>");
			}//if end		
			return mav;
		}
}

 

2) MediaDAO.java

package kr.co.mymelon.media;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;

import DBPKG.DBOpen;

public class MediaDAO {

	// 1) create
	public int create(MediaDTO dto) {
		int cnt = 0;

		try {
			// 1. DB연결
			Connection con = DBOpen.getConnetion();
			StringBuilder sql = new StringBuilder();

			// 2. Insert SQL문 작성
			sql.append(" INSERT INTO media (mediano, title, rdate, poster, filename, filesize ) ");
			sql.append(" VALUES( (select nvl(max(mediano),0)+1 as mediano from media) ");
			sql.append(",? ,SYSDATE ,? ,? ,? ) ");

			// 3. SQL문 변환
			PreparedStatement pstmt = con.prepareStatement(sql.toString());

			// 4. Value값 불러오기
			pstmt.setString(1, dto.getTitle());
			pstmt.setString(2, dto.getPoster());
			pstmt.setString(3, dto.getFilename());
			pstmt.setLong(4, dto.getFilesize());

			// 5. 실행
			cnt = pstmt.executeUpdate();
		} catch (Exception e) {
			System.out.println("실패:" + e);
		}
		return cnt;
	}

	// 2) list
	public ArrayList<MediaDTO> list() {
		ArrayList<MediaDTO> list = null;

		try {
			// 1. DB연결
			Connection con = DBOpen.getConnetion();
			StringBuilder sql = new StringBuilder();

			// 2. Select SQL문 작성
			sql.append(" SELECT mediano, title, rdate, poster, filename, filesize, mview ");
			sql.append(" FROM media ");
			sql.append(" WHERE mview='Y'");
			sql.append(" ORDER BY mediano DESC ");

			// 3. SQL문 변환
			PreparedStatement pstmt = con.prepareStatement(sql.toString());

			// 4. 결과를 rs에 저장, ResultSet은 결과를 저장하는 하나의 집합
			ResultSet rs = pstmt.executeQuery();

			// 5. rs의 내용을 next로 읽기
			if (rs.next()) {

				// 6. list에 ArrayList<SungjukDTO>로 차곡차곡 저장
				list = new ArrayList<MediaDTO>(); // 전체 저장하기
				do {
					MediaDTO dto = new MediaDTO(); // 한 줄씩 저장하기
					dto.setMediano(rs.getInt("mediano"));
					dto.setTitle(rs.getString("title"));
					dto.setRdate(rs.getString("rdate"));
					dto.setPoster(rs.getString("poster"));
					dto.setFilename(rs.getString("filename"));
					dto.setFilesize(rs.getLong("filesize"));
					dto.setMview(rs.getString("mview"));
					list.add(dto);
				} while (rs.next());
			} else {
				list = null;
			} // if end
		} catch (Exception e) {
			System.out.println("목록 불러오기 실패!" + e);
		}
		return list;
	}
	
	// 3) read
	public MediaDTO read(int mediano) {
		MediaDTO dto = null;
		try {
			// 1. DB연결: DBOpen.java와 연결한다.
			Connection con = DBOpen.getConnetion();
			StringBuilder sql = new StringBuilder();

			// 2. Select SQL문 작성
			sql.append(" SELECT mediano, title, rdate, poster, filename, filesize, mview ");
			sql.append(" FROM media ");
			sql.append(" WHERE mediano=? ");

			// 3. SQL문 변환
			PreparedStatement pstmt = con.prepareStatement(sql.toString());
			pstmt.setInt(1, mediano); // ?순서와 ?에 들어갈 자료형 주의

			// 4. 결과를 rs에 저장
			ResultSet rs = pstmt.executeQuery();
			if (rs.next()) {
				do {
					dto = new MediaDTO(); // 한 줄씩 저장하기
					dto.setMediano(rs.getInt("mediano"));
					dto.setTitle(rs.getString("title"));
					dto.setRdate(rs.getString("rdate"));
					dto.setPoster(rs.getString("poster"));
					dto.setFilename(rs.getString("filename"));
					dto.setFilesize(rs.getLong("filesize"));
					dto.setMview(rs.getString("mview"));
				} while (rs.next());

			} else {
				dto = null;
			} // if end

		} catch (Exception e) {
			System.out.println("회원정보 열람실패:" + e);
		}
		return dto;
	}

	public int update(MediaDTO dto) {
		int cnt = 0;

		try {
			Connection con = DBOpen.getConnetion();
			StringBuilder sql = new StringBuilder();
			// 2. Update SQL문 작성
			sql.append(" UPDATE media ");
			sql.append(" SET title=?, poster=?, filename=?, filesize=? ");
			sql.append(" WHERE mediano =? ");

			// 3. SQL문 변환
			PreparedStatement pstmt = con.prepareStatement(sql.toString());

			// 4. dto로 데이터 받아오기
			pstmt.setString(1, dto.getTitle());
			pstmt.setString(2, dto.getPoster());
			pstmt.setString(3, dto.getFilename());
			pstmt.setLong(4, dto.getFilesize());
			pstmt.setInt(5, dto.getMediano());

			// 5. 실행횟수를 cnt에 담기
			cnt = pstmt.executeUpdate();

		} catch (Exception e) {
			System.out.println("게시물 수정실패!: " + e);
		}
		return cnt;
	}
	
	public int delete(MediaDTO dto) {
		int cnt = 0;

		try {
			Connection con = DBOpen.getConnetion();
			StringBuilder sql = new StringBuilder();
			// 2. Update SQL문 작성
			sql.append(" DELETE FROM media ");
			sql.append(" WHERE mediano =? ");

			// 3. SQL문 변환
			PreparedStatement pstmt = con.prepareStatement(sql.toString());

			// 4. dto로 데이터 받아오기
			pstmt.setInt(1, dto.getMediano());

			// 5. 실행횟수를 cnt에 담기
			cnt = pstmt.executeUpdate();

		} catch (Exception e) {
			System.out.println("게시물 수정실패!: " + e);
		}
		return cnt;
	}
}

 

 

3) MediaDTO.java

package kr.co.mymelon.media;
import org.springframework.web.multipart.MultipartFile;

public class MediaDTO {
	private int mediano; 
	private String title;
	private String poster;
	private String filename;
	private long filesize;
	private String mview;
	private String rdate;
	//--------------------------------------------------------------------
	// 스프링파일 객체 멤버변수
	// <input type='file' name='posterMF' size='50'>
	private MultipartFile posterMF;
	// <input type='file' name='filenameMF' size='50'>
	private MultipartFile filenameMF;
	//--------------------------------------------------------------------
	
	public MediaDTO() {}

	public int getMediano() {
		return mediano;
	}

	public void setMediano(int mediano) {
		this.mediano = mediano;
	}

	public String getTitle() {
		return title;
	}

	public void setTitle(String title) {
		this.title = title;
	}

	public String getPoster() {
		return poster;
	}

	public void setPoster(String poster) {
		this.poster = poster;
	}

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

	public String getMview() {
		return mview;
	}

	public void setMview(String mview) {
		this.mview = mview;
	}

	public String getRdate() {
		return rdate;
	}

	public void setRdate(String rdate) {
		this.rdate = rdate;
	}

	public MultipartFile getPosterMF() {
		return posterMF;
	}

	public void setPosterMF(MultipartFile posterMF) {
		this.posterMF = posterMF;
	}

	public MultipartFile getFilenameMF() {
		return filenameMF;
	}

	public void setFilenameMF(MultipartFile filenameMF) {
		this.filenameMF = filenameMF;
	}

	@Override
	public String toString() {
		return "MediaDTO [mediano=" + mediano + ", title=" + title + ", poster=" + poster + ", filename=" + filename
				+ ", filesize=" + filesize + ", mview=" + mview + ", rdate=" + rdate + ", posterMF=" + posterMF
				+ ", filenameMF=" + filenameMF + "]";
	}
	
}

 


 

net.utility

1) EncodeFilter.java

package net.utility;
import java.io.*;
import javax.servlet.*;

public class EncodeFilter implements Filter {

	@Override
	public void destroy() {}

	@Override
	public void doFilter(ServletRequest arg0, ServletResponse arg1,
			FilterChain arg2) throws IOException, ServletException {
		arg0.setCharacterEncoding("UTF-8");
		arg2.doFilter(arg0, arg1);
	}

	@Override
	public void init(FilterConfig arg0) throws ServletException {
		
	}
}//class end

 

2) FileDownload.java

package net.utility;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.URL;
import java.net.URLConnection;
import java.net.URLEncoder;
import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


public class FileDownload extends javax.servlet.http.HttpServlet {
  // 서블릿 버전, 생략 가능
  static final long serialVersionUID = 1L;

  // web.xml에 접근 가능
  private ServletConfig config = null;

  // 기본 생성자
  public FileDownload() {
    super();
  }

  /**
   * 톰캣 실행시 최초 1번만 실행 됩니다. init()은 생략가능
   * 
   * @param config
   *          web.xml에 접근가능, 서블릿 환경 정보 저장 객체
   */

  @Override
  public void init(ServletConfig config) throws ServletException {
    this.config = config;
  }//init() end

  // Form - get 방식 처리
  @Override
  protected void doGet(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {

    doProcess(request, response);

  }//doGet() end

  // Form - post 방식 처리
  @Override
  protected void doPost(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {

    doProcess(request, response);

  }//doPost() end

  protected void doProcess(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {

    ServletContext ctx = config.getServletContext();

    // 저장 폴더를 절대 경로로 변환
    String dir = ctx.getRealPath(request.getParameter("dir"));

    // 파일명 받기
    String filename = request.getParameter("filename");

    // 전체 절대 경로 조합
    File file = new File(dir + "/" + filename);
    String fileStr = dir + "/" + filename;
    String contentType = getType(fileStr);
    System.out.println("다운로드 타입: " + contentType);

    String disposition = getDisposition(filename, getBrowser(request));
    response.addHeader("Content-disposition", disposition);
    response.setHeader("Content-Transfer-Encoding", "binary");
    response.setContentLength((int) file.length());
    response.setContentType(contentType);
    response.setHeader("Connection", "close");

    // 파일을 읽어올 크기 지정
    byte buffer[] = new byte[4096];

    try {
      if (file.isFile()) {
        // 파일을 읽어 오는 역활
        BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));

        // 사이트에 접속된 접속자에게 출력
        BufferedOutputStream bos = new BufferedOutputStream(response.getOutputStream());

        int read = 0;
        // bis.read(buffer): 파일에서 4KB씩 읽어서
        // buffer에 저장
        // 파일의 끝이면 -1
        while ((read = bis.read(buffer)) != -1) {
          // 접속자로 출력
          bos.write(buffer, 0, read);
        }// while

        bis.close();
        bos.close();

      }

    } catch (Exception e) { }

  }//doProcess() end


  public String getType(String fileUrl) {
    String type = "";
    fileUrl = "file:" + fileUrl;
    try {
      URL u = new URL(fileUrl);
      URLConnection uc = u.openConnection();
      type = uc.getContentType();

    } catch (Exception e) {
      System.out.println(e.toString());
    }

    return type;

  }//getType() end
 

  public String getBrowser(HttpServletRequest request) {
    String header = request.getHeader("User-Agent");
    if (header.indexOf("MSIE") > -1) {
      return "MSIE";
    } else if (header.indexOf("Chrome") > -1) {
      return "Chrome";
    } else if (header.indexOf("Opera") > -1) {
      return "Opera";
    }
    return "Firefox";

  }//getBrowser() end
 

  public static synchronized String getDisposition(String filename, String browser) {
    String dispositionPrefix = "attachment;filename=";
    String encodedFilename = null;
    try {

      if (browser.equals("MSIE")) {
        encodedFilename = URLEncoder.encode(filename, "UTF-8").replaceAll("\\+", "%20");
      } else if (browser.equals("Firefox")) {
        encodedFilename ="\"" + new String(filename.getBytes("UTF-8"), "8859_1") + "\"";
      } else if (browser.equals("Opera")) {
        encodedFilename ="\"" + new String(filename.getBytes("UTF-8"), "8859_1") + "\"";
      } else if (browser.equals("Chrome")) {

        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < filename.length(); i++) {
          char c = filename.charAt(i);
          if (c > '~') {
            sb.append(URLEncoder.encode("" + c, "UTF-8"));
          } else {
            sb.append(c);
          }

        }

        encodedFilename = sb.toString();

      } else {
        System.out.println("Not supported browser");
      }

    } catch (Exception e) { }

    return dispositionPrefix + encodedFilename;

  }//getDisposition() end

}//class end

3) UploadSaveManager.java

package net.utility; 

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
 

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
 

import org.apache.commons.fileupload.DiskFileUpload;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUpload;
import org.apache.commons.fileupload.FileUploadException;
import org.springframework.web.multipart.MultipartFile;
 

/**

 * HttpServletRequestWrapper 클래스는 HttpServletRequest
 * 인터페이스를 임시로 구현한 클래스로 개발자가 내부객체인
 * request를 사용하지않고 새로운 형태로 request 객체를
 * 만들어 사용할 경우 상속받는 클래스입니다.  
 * Apahce FileUpload 콤포넌트를 사용하기 편리하게 지원합니다.
 * FileUpload API를 사용하는 HttpServletRequestWrapper 클래스로서
 * HttpServletRequest에 기반한 API를 사용하기 위한 래퍼이다.

 * 

  ServletRequest
  │       △ 
  │       │구현
  │       └ ServletRequestWrapper
  │                        △
  │                        │                 
  └─ HttpServletRequest   │
       △     request       │상속 
       │                   │
       │ 구현              │ 
       └─ HttpServletRequestWrapper
            △
            │
            │상속   
            UploadManager - requestWrap
  

  request = requestWrap;

  public interface HttpServletRequest extends ServletRequest

  public class HttpServletRequestWrapper extends ServletRequestWrapper 
          implements HttpServletRequest

  public class UploadManager extends HttpServletRequestWrapper
 */

  public class UploadSaveManager extends HttpServletRequestWrapper {

    private boolean multipart = false;
    private HashMap parameterMap;  // 일반 <INPUT> 폼태그
    private HashMap fileItemMap;   // 전송된 <FILE> 태그 객체가 저장

    /**
     * 기본 생성자
     * @param request
     * @throws FileUploadException
     */

    public UploadSaveManager(HttpServletRequest request) throws FileUploadException{
        this(request, -1, -1, null);
    }

    /**
     * 생성자
     * @param request HttpServletRequest 객체
     * @param threshold 메모리에 저장할 최대크기
     * @param max 업로드할 최대 파일크기
     * @param repositoryPath 업로드 경로
     * @throws FileUploadException
     */

    public UploadSaveManager(HttpServletRequest request,
        int threshold, int max, String repositoryPath) throws FileUploadException {

        super(request);

        parsing(request, threshold, max, repositoryPath);
    }

    /**
     * 일반 입력 필드와 파일 필드를 MAP에 저장
     * @param request HttpServletRequest 객체
     * @param threshold 메모리에 저장할 최대크기
     * @param max 업로드할 최대 파일크기
     * @param repositoryPath 업로드 경로
     * @throws FileUploadException
     */

    private void parsing(HttpServletRequest request,
        int threshold, int max, String repositoryPath) throws FileUploadException {

        if (FileUpload.isMultipartContent(request)) {
            multipart = true;
            parameterMap = new java.util.HashMap();
            fileItemMap = new java.util.HashMap();

            DiskFileUpload diskFileUpload = new DiskFileUpload();
            if (threshold != -1) {
                diskFileUpload.setSizeThreshold(threshold);
            }

            diskFileUpload.setSizeMax(max);
            if (repositoryPath != null) {
                diskFileUpload.setRepositoryPath(repositoryPath);
            }

            java.util.List list = diskFileUpload.parseRequest(request);

            for (int i = 0 ; i < list.size() ; i++) {
                FileItem fileItem = (FileItem) list.get(i);
                String name = fileItem.getFieldName();

                if (fileItem.isFormField()) {
                    // 일반 폼태그라면 처리
                    String value = fileItem.getString();
                    String[] values = (String[]) parameterMap.get(name);
                    if (values == null) {
                        values = new String[] { value };
                    } else {
                        String[] tempValues = new String[values.length + 1];
                        System.arraycopy(values, 0, tempValues, 0, 1);
                        tempValues[tempValues.length - 1] = value;
                        values = tempValues;
                    }
                    parameterMap.put(name, values);
                } else {
                    // 파일 태그라면 처리
                    System.out.println("전송 파일 발견됨 저장명: " + name);
                    System.out.println("전송 파일 발견됨 파일명: " + fileItem.getName());

                    // 키: 파일명, 파일 객체
                    fileItemMap.put(name, fileItem);
                }

            }

            addTo(); // request 속성으로 설정한다.

        }

    }

    /**
     * 파일을 전송하는 enctype="multipart/form-data"인경우 true리턴
     * @return enctype="multipart/form-data"인경우 true리턴
     */

    public boolean isMultipartContent() {
        return multipart;
    }

    /**
     * 주어진 파라미터에 대한 값을 리턴
     */

    public String getParameter(String name) {
        if (multipart) {
            String[] values = (String[])parameterMap.get(name);
            if (values == null) return null;
            return values[0];
        } else
            return super.getParameter(name);
    }

    /**
     * 파라미터의 값들을 리턴
     */

    public String[] getParameterValues(String name) {
        if (multipart)
            return (String[])parameterMap.get(name);
        else
            return super.getParameterValues(name);
    }

    /**
     * 전체 파라미터의 이름을 리턴
     */

    public Enumeration getParameterNames() {
        if (multipart) {
            return new Enumeration() {
                Iterator iter = parameterMap.keySet().iterator();
                public boolean hasMoreElements() {
                    return iter.hasNext();
                }

                public Object nextElement() {
                    return iter.next();
                }
            };
        } else {
            return super.getParameterNames();
        }

    }

    public Map getParameterMap() {
        if (multipart)
            return parameterMap;
        else
            return super.getParameterMap();
    }

    /**
     * 지정한 파라미터 이름과 관련된 FileItem을 리턴합니다.
     * @param name
     * @return
     */

    public FileItem getFileItem(String name) {
        if (multipart)
            return (FileItem) fileItemMap.get(name);
        else
            return null;
    }

    /**
     * 임시로 사용된 업로드 파일을 삭제합니다.
     */

    public void delete() {
        if (multipart) {
            Iterator fileItemIter = fileItemMap.values().iterator();
            while( fileItemIter.hasNext()) {
                FileItem fileItem = (FileItem)fileItemIter.next();
                fileItem.delete();
            }
        }
    }

    /**
     * 래퍼객체 자체를 request 객체에 저장합니다.
     */
    public void addTo() {
        super.setAttribute(UploadSaveManager.class.getName(), this);
    }

    /**
     * request 속성에 저장된 FileUploadRequestWrapper를 리턴합니다.
     * @param request
     * @return
     */

    public static UploadSaveManager getFrom(HttpServletRequest request) {
        return (UploadSaveManager)request.getAttribute(UploadSaveManager.class.getName());
    }

    /**
     * 지정한 request가 래퍼를 속성으로 포함하고 있으면 true를 리턴합니다.
     * @param request
     * @return
     */

    public static boolean hasWrapper(HttpServletRequest request) {
        if (UploadSaveManager.getFrom(request) == null) {
            return false;
        } else {
            return true;
        }
    }

    // fileItem: 전송된 파일객체
    // upDir: 저장할 디렉토리
    public static String saveFile(FileItem fileItem, String upDir){
        String filename = "";       //업로드 파일명
        // 파일 태그
        System.out.println("전송된 파일명: " + fileItem.getName());

        // 폴더 구분자 추출
        int idx = fileItem.getName().lastIndexOf("\\"); //윈도우 기반

        if (idx == -1) { // 유닉스, 리눅스 기반
            idx = fileItem.getName().lastIndexOf("/");
        }

        // 순수 파일명 추출
        filename = fileItem.getName().substring(idx + 1);

        try {
            //-----------------------------------------------
            //대상 폴더에 저장할 파일 객체 생성, 폴더 + 파일명
            //-----------------------------------------------
            File uploadedFile = new File(upDir, filename);

            //올릴려는 파일과 같은 이름이 존재하면 중복파일 처리
            if ( uploadedFile.exists() == true ){
                for(int k=0; true; k++){
                    // 파일명 중복을 피하기 위한 일련 번호를 생성하여
                    // 파일명으로 조합
                    uploadedFile = new File(upDir, "("+k+")"+filename);
                    // 조합된 파일명이 존재하지 않는다면, 일련번호가
                    // 붙은 파일명 다시 생성
                    // 존재하지 않는 경우
                    // !을 이용해 false일 경우 참으로 처리되도록 변환
                    boolean bol = uploadedFile.exists();
                    if(bol == false){
                        // 존재하지 않는 새로운 파일명 확정
                        // (0)abc.txt
                        filename = "("+k+")"+filename;
                        break;
                    }
                }
            }

            // storage 폴더에 파일명 저장
            fileItem.write(uploadedFile);

        } catch(Exception e) {
              System.out.println(e.toString());    
        }

        return filename; // 업로드된 파일명 리턴

    }

    //---------------------------------------------------------------
    //Fileupload 콤포넌트 관련 코드 끝
    //---------------------------------------------------------------

    /** 
     * 파일을 삭제합니다. 
    */

    public static boolean deleteFile(String folder, String fileName){
        boolean ret = false;

        try{
            if ( fileName != null){ // 기존에 파일이 존재하는 경우 삭제
                File file = new File(folder + "/" + fileName);
                ret = file.delete();
            }

        }catch(Exception e){
            e.printStackTrace();
        }

        return ret;

    }

    public HashMap getFileItemMap() {
        return fileItemMap;
    }

    public void setFileItemMap(HashMap fileItemMap) {
        this.fileItemMap = fileItemMap;
    }

    /**
     * 전송받은 파일의 갯수를 리턴
     * @return
     */
    public int getFileCount(){
        return this.fileItemMap.size();
    }

    // Spring
    public static String saveFileSpring30(MultipartFile multipartFile, String basePath) {
        // input form's parameter name
        String fileName = "";
        // original file name
        String originalFileName = multipartFile.getOriginalFilename();
        // file content type
        String contentType = multipartFile.getContentType();
        // file size
        long fileSize = multipartFile.getSize();

        System.out.println("fileSize: " + fileSize);
        System.out.println("originalFileName: " + originalFileName);

        InputStream inputStream = null;
        OutputStream outputStream = null;

        try {
            if( fileSize > 0 ) { // 파일이 존재한다면
                // 인풋 스트림을 얻는다.
                inputStream = multipartFile.getInputStream();
                File oldfile = new File(basePath, originalFileName);
                if ( oldfile.exists()){
                    for(int k=0; true; k++){
                        //파일명 중복을 피하기 위한 일련 번호를 생성하여
                        //파일명으로 조합
                        oldfile = new File(basePath,"("+k+")"+originalFileName);
                        //조합된 파일명이 존재하지 않는다면, 일련번호가
                        //붙은 파일명 다시 생성
                        if(!oldfile.exists()){ //존재하지 않는 경우
                            fileName = "("+k+")"+originalFileName;
                            break;
                        }
                    }
                }else{
                    fileName = originalFileName;
                }

                //make server full path to save
                String serverFullPath = basePath + "\\" + fileName;

                System.out.println("fileName: " + fileName);
                System.out.println("serverFullPath: " + serverFullPath);

                outputStream = new FileOutputStream( serverFullPath );

                // 버퍼를 만든다.
                int readBytes = 0;
                byte[] buffer = new byte[8192];

                while((readBytes = inputStream.read(buffer, 0, 8192)) != -1 ) {
                    outputStream.write( buffer, 0, readBytes );
                }

                outputStream.close();
                inputStream.close();

            }

        } catch(Exception e) {
            e.printStackTrace();  
        }finally{

        }

        return fileName;

    }

}//class end

 

5) Utility.java

package net.utility;

import java.util.*;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.awt.image.PixelGrabber;
import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.net.URLConnection;
import java.net.URLEncoder;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.Random;
import java.util.StringTokenizer;

import javax.imageio.ImageIO;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import javax.swing.ImageIcon;

public class Utility {
  // 서비스시에는 도메인으로 변경됨.
  private static final String root = "/myweb"; //프로젝트이름
  public static synchronized String getRoot() {
    return root;
  }

  /**
   * 2048 -> 2가 리턴됨
   *
   * @param filesize
   * @return
   */
  public static synchronized long toUnit(long filesize) {
    long size = 0;

    if (filesize > 1024) {
      size = filesize / 1024; // KB
    } else {
      size = filesize / (1024 * 1024); // MB
    }

    return size;
  }

  /**
   * 2048 -> 2 KB가 리턴됨
   *
   * @param filesize
   * @return
   */
  public static synchronized String toUnitStr(long filesize) {
    String size = "";

    if (filesize > 1024) {
      size = filesize / 1024 + " KB"; // KB
    } else {
      size = filesize / (1024 * 1024) + " MB"; // MB
    }

    return size;
  }

  /**
   * 오늘 날짜를 문자열로 리턴합니다.
   *
   * @return
   */
  public static synchronized String getCalendarDay() {
    String str = "";
    Calendar cal = Calendar.getInstance();
    str = "" + cal.get(Calendar.DATE); // 날짜

    return str;
  }

  /**
   * 2010-12-14 형식의 날짜를 리턴합니다.
   *
   * @return 2008-01-30 형식의 문자열 리턴
   */
  public static synchronized String getDate() {
    SimpleDateFormat sd = new SimpleDateFormat("yyyy-MM-dd");

    String date = sd.format(new Date());

    // System.out.println(date);
    return date;
  }

  /**
   * 20101214 형식의 날짜를 리턴합니다.
   *
   * @return 20101214 형식의 문자열 리턴
   */
  public static synchronized String getDate2() {
    SimpleDateFormat sd = new SimpleDateFormat("yyyyMMdd");

    String date = sd.format(new Date());

    // System.out.println(date);
    return date;
  }

  /**
   * 20101214 형식의 날짜를 리턴합니다.
   *
   * @param _date
   * @return
   */
  public static synchronized String getDate3(Date _date) {
    SimpleDateFormat sd = new SimpleDateFormat("yyyyMMdd");
    String date = sd.format(_date);

    // System.out.println(date);
    return date;
  }

  /**
   * 2010년 12월 14일 형식의 날짜를 리턴합니다.
   *
   * @return
   */
  public static synchronized String getDate4() {
    SimpleDateFormat sd = new SimpleDateFormat("yyyy년 MM월 dd일");
    String date = sd.format(new Date());

    // System.out.println(date);
    return date;
  }

  /**
   * 20101214일 형식의 날짜를 리턴합니다.
   *
   * @param _date
   * @return
   */
  public static synchronized String getDate5(Date _date) {
    SimpleDateFormat sd = new SimpleDateFormat("yyyyMMdd");
    String date = sd.format(_date);

    // System.out.println(date);
    return date;
  }

  /**
   * 2010-12-14 형식의 날짜를 리턴합니다.
   *
   * @return 2008-01-30 형식의 문자열 리턴
   */
  public static synchronized String getDate6(int year, int month, int day) {
    SimpleDateFormat sd = new SimpleDateFormat("yyyy-MM-dd");

    new Date();
    String date = sd.format(new Date(year - 1900, month, day));

    // System.out.println(date);
    return date;
  }

  /**
   * 내용중에 특수문자 표현을 위해 HTML 특수문자로 변환합니다.
   * 예) 테이블 태그
   *     <TABLE> -> &lt;TABLE&gt;
   */
  public static synchronized String convertChar(String str) {

    str = str.replaceAll("<", "&lt;");
    str = str.replaceAll(">", "&gt;");
    str = str.replaceAll("'", "&apos;");   // '
    str = str.replaceAll("\"", "&quots;"); // "
    str = str.replaceAll("\r\n", "<BR>");  // 라인 변경
   
    return str;
  }
 
  public static synchronized String convertCharTA(String str) {

    str = str.replaceAll("<", "&lt;");
    str = str.replaceAll(">", "&gt;");
    str = str.replaceAll("'", "&apos;");   // '
    str = str.replaceAll("\"", "&quots;"); // "
   
    return str;
  }
 
  public static synchronized String getString(HttpServletRequest request, String variable) {
    String value = "";

    variable = request.getParameter(variable);
    if (variable != null) {
      variable = variable.trim();
      if (variable.length() > 0) {
        value = variable;
      }

    } else {
      value = variable;
    }

    return value;
  }

  public static synchronized int getInt(HttpServletRequest request, String variable) {
    int value = 0;

    variable = request.getParameter(variable);
    if (variable != null) {
      variable = variable.trim();
      if (variable.length() > 0) {
        value = Integer.parseInt(variable);
      }
    } else {
      value = 0;
    }

    return value;
  }

  // 줄 바꾸기
  public static synchronized String getConvertCharTextArea(String str) {
    for (int i = 0; i < str.length(); i++) {
      if (str.charAt(i) == '&') {
        str = str.substring(0, i) + "&" + str.substring(i + 1, str.length());
      }
    }
    return str;
  }

  public static synchronized String convertToDBMSforTextArea(String str) {
    for (int i = 0; i < str.length(); i++) {
      if (str.charAt(i) == '<') {
        str = str.substring(0, i) + "<" + str.substring(i + 1, str.length());
      } else if (str.charAt(i) == '>') {
        str = str.substring(0, i) + ">" + str.substring(i + 1, str.length());
      }
    }
    return str;
  }

  public static synchronized String convertToHTMLforTextArea(String str) {
    str.replaceAll("<", "<");
    str.replaceAll(">", ">");

    return str;
  }

  /**
   * 로그인한 관리자 인지 검사
   *
   * @param session
   * @return
   */
  public static synchronized boolean isAdmin(HttpServletRequest request) {
    boolean sw = false;

    HttpSession session = request.getSession();
    String s_id = Utility.checkNull((String) session.getAttribute("s_id"));
    // System.out.println("현재 로그인 관리자 s_id: " + s_id);
    if (s_id.equals("") == true) { // 로그인하지 않은 경우
      sw = false;
    } else {
      sw = true;
    }

    return sw;
  }

  /**
   * 로그인한 사용자인지 검사
   *
   * @param request
   * @return
   */
  public static synchronized boolean isMember(HttpServletRequest request) {
    boolean sw = false;

    HttpSession session = request.getSession();
    String s_member_id = Utility.checkNull((String) session
        .getAttribute("s_member_id"));
    // System.out.println("현재 로그인 사용자 s_member_id: " + s_member_id);
    if (s_member_id.equals("") == true) { // 로그인하지 않은 경우
      sw = false;
    } else {
      sw = true;
    }

    return sw;
  }

  /**
   * 로그인한 사용자 인지 검사
   *
   * @param session
   * @return
   */
  public static synchronized boolean isUser(HttpServletRequest request) {
    boolean sw = false;

    HttpSession session = request.getSession();
    String s_member_id = Utility.checkNull((String) session
        .getAttribute("s_member_id"));
    if (s_member_id.length() > 1) { // 로그인하지 않은 경우
      sw = true;
    } else {
      sw = false;
    }

    return sw;
  }

  public static synchronized boolean checkImageFile(String filename) {
    boolean sw = false;

    if (filename != null) {
      sw = filename.endsWith(".jpg") || filename.endsWith(".jpeg")
          || filename.endsWith(".gif") || filename.endsWith(".png")
          || filename.endsWith(".bmp");
    }

    return sw;
  }

  public static synchronized String getBrowser(HttpServletRequest request) {
    String header = request.getHeader("User-Agent");
    if (header.indexOf("MSIE") > -1) {
      return "MSIE";
    } else if (header.indexOf("Chrome") > -1) {
      return "Chrome";
    } else if (header.indexOf("Opera") > -1) {
      return "Opera";
    }
    return "Firefox";
  }

  public static synchronized String getDisposition(String filename, String browser) {
    String dispositionPrefix = "attachment;filename=";
    String encodedFilename = null;
    try {
      if (browser.equals("MSIE")) {
        encodedFilename = URLEncoder.encode(filename, "UTF-8").replaceAll(
            "\\+", "%20");
      } else if (browser.equals("Firefox")) {
        encodedFilename =

        "\"" + new String(filename.getBytes("UTF-8"), "8859_1") + "\"";
      } else if (browser.equals("Opera")) {
        encodedFilename =

        "\"" + new String(filename.getBytes("UTF-8"), "8859_1") + "\"";
      } else if (browser.equals("Chrome")) {
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < filename.length(); i++) {
          char c = filename.charAt(i);
          if (c > '~') {
            sb.append(URLEncoder.encode("" + c, "UTF-8"));
          } else {
            sb.append(c);
          }
        }
        encodedFilename = sb.toString();
      } else {
        System.out.println("Not supported browser");
      }
    } catch (Exception e) {

    }

    return dispositionPrefix + encodedFilename;
  }

  /**
   * 임의의 정수를 리턴합니다.
   *
   * @param range
   *          정수범위 0 ~ 범위-1
   * @return 난수 리턴
   */
  public static synchronized int random(int range) {
    // 0 ~ range-1까지 산출됨.
    int rnd = 0;
    Random random = new Random();
    rnd = random.nextInt(range);

    return rnd;
  }

  public static synchronized Date getDate(String date) {
    Date currentTime = new Date();
    SimpleDateFormat sd = new SimpleDateFormat("yyyy-MM-dd");
    try {
      currentTime = sd.parse(date);
    } catch (Exception e) {
    }
    // System.out.println(date);
    return currentTime;
  }

  public static synchronized String progress(String enddate) {
    java.util.Date nowtime = new java.util.Date();
    java.util.Date endtime = getDate(enddate);

    // System.out.println("nowtime: " + nowtime.toLocaleString());
    // System.out.println("endtime: " + nowtime.toLocaleString());
    String progress = null;

    if (nowtime.after(endtime) == true) {
      progress = "종료";
    } else {
      progress = "진행";
    }

    return progress;
  }

  /**
   * 천단위마다 컴마를 출력합니다.
   *
   * @param price
   *          금액
   * @return 컴마가 포함된 문자열
   */
  public static synchronized String comma(int price) {
    DecimalFormat comma = new DecimalFormat("###,##0");
    String cs = comma.format(price);

    return cs;
  }

  public static synchronized String comma(long price) {
    DecimalFormat comma = new DecimalFormat("###,##0");
    String cs = comma.format(price);

    return cs;
  }

  /**
   * null 문자를 공백 문자로 변경합니다.
   *
   * @param str
   *          검사할 문자열
   * @return null 값을 가지고 있는 객체는 공백 문자열로 리턴됨
   */
  public static synchronized String checkNull(String str) {
    if (str == null) {
      return "";  // null 이면 빈공백으로 리턴
    } else {
      return str; // 원래의 문자열 리턴
    }
  }

  /**
   * request 객체에서 문자열을 추출합니다.
   *
   * @param request
   * @param str
   *          추출할 변수
   * @return 변환된 문자열
   */
  public static synchronized String checkNull(HttpServletRequest request, String str) {
    String rstr = "";

    if (request.getParameter(str) != null) {
      rstr = request.getParameter(str);
    } else {
      rstr = "";
    }

    return rstr;
  }

  /**
   * 문자열이 Object 타입으로 전송된 것을 null 처리
   *
   * @param str
   * @return
   */
  public static String checkNull(Object str) {
    if ((String) str == null) {
      return "";
    } else {
      return (String) str;
    }
  }

  /**
   * FileUpload 1.2 한글 변환
   *
   * @param str
   * @return
   */
  public static synchronized String getEncodFileUpload12(String str) {
    String corean = null;
    try {
      corean = new String(str.getBytes("ISO-8859-1"), "UTF-8");
      // corean= new String(str.getBytes("ISO-8859-1"), "KSC5601");
    } catch (Exception e) {
      return corean;
    }
    return corean;
  }

  /**
   * MVC, Tomcat 7.0기반 JSP 페이지 한글 변환
   *
   * @param str
   * @return
   */
  public static synchronized String getEncodeMVC(String str) {
    String corean = null;
    try {
      corean = new String(str.getBytes("ISO-8859-1"), "UTF-8");
      // corean= new String(str.getBytes("ISO-8859-1"), "KSC5601");
    } catch (Exception e) {
      return corean;
    }
    return corean;
  }

  /**
   * fileupload 1.2.2 한글 처리
   *
   * @param ko
   * @return
   */
  public static synchronized String fileupload122Enc(String ko) {
    String corean = null;
    try {
      // corean= new String(ko.getBytes("8859_1"), "euc-kr");
      corean = new String(ko.getBytes("ISO-8859-1"), "utf-8");
      // corean= new String(ko.getBytes("8859_1"), "iso-8859-1");
      // corean= new String(ko.getBytes("utf-8"), "8859_1");
      // corean= new String(ko.getBytes("8859_1"), "KSC5601");
    } catch (Exception e) {
      return corean;
    }
    return corean;
  }

  /**
   * fileupload 1.2.2 한글 처리
   *
   * @param ko
   * @return
   */
  public static synchronized String fileupload122DownEnc(String ko) {
    // charsetTest(ko);

    String corean = null;
    try {
      // corean= new String(ko.getBytes("iso-8859-1"), "euc-kr");
      // corean= new String(ko.getBytes("iso-8859-1"), "utf-8");
      // corean= new String(ko.getBytes("8859_1"), "iso-8859-1");
      // corean= new String(ko.getBytes("utf-8"), "8859_1");
      // corean= new String(ko.getBytes("iso-8859-1"), "KSC5601");
      corean = new String(ko.getBytes("KSC5601"), "EUC-KR");
    } catch (Exception e) {
      return corean;
    }
    return corean;
  }

  public static synchronized String getType(String fileUrl) {
    String type = "";
    fileUrl = "file:" + fileUrl;
    try {
      URL u = new URL(fileUrl);
      URLConnection uc = u.openConnection();
      type = uc.getContentType();

    } catch (Exception e) {
      System.out.println(e.toString());
    }

    return type;
  }

  /**
   * 주어진 문자셋의 문자코드를 변환합니다.
   *
   * @param ko
   * @return
   */
  public static synchronized String ko(String ko) {
    String str = null;
    try {
      // corean= new String(ko.getBytes("8859_1"), "euc-kr");
      // corean= new String(ko.getBytes("8859_1"), "utf-8");
      // corean= new String(ko.getBytes("8859_1"), "iso-8859-1");
      // corean= new String(ko.getBytes("8859_1"), "utf-8");
      str = new String(ko.getBytes("8859_1"), "KSC5601");
      for (int i = 0; i < str.length(); i++) {
        if (str.charAt(i) == ' ') {
          str = str.substring(0, i) + "%20"
              + str.substring(i + 1, str.length());
          i = i + 3;
        }
      }

    } catch (Exception e) {

    }
    return str;
  }

  /**
   * 내용중에 특수문자 표현을 위해 HTML 특수문자로 변환합니다.
   */
  public static synchronized String getConvertBR(String str) {
    return str.replace("\n", "<BR>");
  }

  /**
   * 파일 Download시 한글 파일 인코딩
   *
   * @param str
   * @return
   */
  public static synchronized String getEncod(String str) {
    try {
      // resin UTF-8 로 지정
      // str = java.net.URLEncoder.encode(str, "EUC-KR");
      // str = java.net.URLEncoder.encode(str, "UTF-8");
      str = java.net.URLEncoder.encode(str, "KSC5601");
    } catch (Exception e) {

    }

    // System.out.println(str);

    for (int i = 0; i < str.length(); i++) {
      if (str.charAt(i) == '+') {
        str = str.substring(0, i) + "%20" + str.substring(i + 1, str.length());
        i = i + 3;
      }
    }
    // System.out.println("최종변환 형태: "+str);
    return str;
  }

  /**
   * Struts2 GET방식 한글 문자셋 인코딩
   *
   * @param str
   * @return
   */
  public static synchronized String getEncodGet(String str) {
    try {

      str = java.net.URLEncoder.encode(str, "EUC-KR");
      // str = java.net.URLEncoder.encode(str, "UTF-8");
      // str = java.net.URLEncoder.encode(str, "KSC5601");

      for (int i = 0; i < str.length(); i++) {
        if (str.charAt(i) == '+') {
          str = str.substring(0, i) + "%20"
              + str.substring(i + 1, str.length());
          i = i + 3;
        }
      }
    } catch (Exception e) {

    }

    return str;
  }

  /**
   * 스트럿츠 자료실 한글 출력 메소드
   *
   * @param str
   * @return
   */
  public static synchronized String encodStruts2(String str) {
    try {
      // str = java.net.URLEncoder.encode(str, "EUC-KR");
      // str = java.net.URLEncoder.encode(str, "UTF-8");
      str = java.net.URLEncoder.encode(str, "KSC5601");

      for (int i = 0; i < str.length(); i++) {
        if (str.charAt(i) == '+') {
          str = str.substring(0, i) + "%20"
              + str.substring(i + 1, str.length());
          i = i + 3;
        }
      }
    } catch (Exception e) {

    }

    return str;
  }

  /**
   * FCKEditor 2.6.8 한글 변환
   *
   * @param str
   * @return
   */
  public static synchronized String encodFCK268(String str) {
    String corean = null;
    try {
      corean = new String(str.getBytes("ISO-8859-1"), "UTF-8");
      // corean= new String(str.getBytes("ISO-8859-1"), "KSC5601");
    } catch (Exception e) {
      return corean;
    }
    return corean;
  }

  /**
   * 파일을 삭제합니다.
   *
   * @param folder
   *          파일이 저장된 폴더
   * @param filename
   *          삭제할 파일명
   * @return true-삭제 성공, false-삭제 실패
   */
  public static synchronized boolean deleteFile(String folder, String filename) {
    boolean ret = false;

    try {
      if (filename != null) { // 기존에 파일이 존재하는 경우 삭제
        File file = new File(folder + "/" + filename);
        // 파일이 존재하는지 확인 후 삭제
        if (file.exists()) {
          ret = file.delete();
        }
      }
    } catch (Exception e) {
      e.printStackTrace();
    }

    return ret;
  }

  /**
   * application이름을 입력받아 절대 경로를 산출합니다. 예) getRealPath(request, "WEB-INF/config")
   *
   * @param request
   * @param dir
   *          application 이름
   * @return 절대 경로 리턴
   * @throws IOException
   */
  public static synchronized String getRealPath(HttpServletRequest request, String dir) {
    // ByteArrayOutputStream baos = new ByteArrayOutputStream();
    String path = "";
   
    try{
      path = request.getRealPath(dir) + "/"; 
      System.out.println("Upload path: " + path);
    }catch(Exception e){
      System.out.println(e.toString());
    }

    return path;
  }

  /**
   * 한글 변환 코드를 찾는 기능을 지원
   *
   * @param s
   */
  public static synchronized void charsetTest(String s) {
    try {
      String[] charset = { "EUC-KR", "KSC5601", "ISO-8859-1", "8859_1",
          "ASCII", "UTF-8" };
      for (int i = 0; i < charset.length; i++) {
        for (int j = 0; j < charset.length; j++) {
          if (i == j)
            continue;
          System.out.print(charset[i] + " -> " + charset[j] + " : ");
          System.out.println(new String(s.getBytes(charset[i]), charset[j]));
        }
      }
    } catch (Exception e) {
      e.printStackTrace();
    }
  }

  /**
   * null 문자를 숫자 0으로 변경합니다.
   *
   * @param request
   *          request 객체
   * @param str
   *          검사할 문자열
   * @return 숫자를 리턴
   */
  public static synchronized int checkInt(HttpServletRequest request, String str) {
    int su = 0;
    if (request.getParameter(str) != null) {
      su = Integer.parseInt(request.getParameter(str));
    }

    return su;
  }

  public static int checkInt(String str) {
    int su = 0;
    if (str != null) {
      su = Integer.parseInt(str);
    }

    return su;
  }

  /**
   * null 문자를 숫자 0으로 변경합니다.
   *
   * @param request
   *          request 객체
   * @param str
   *          검사할 문자열
   * @return 숫자를 리턴
   */
  public static synchronized int checkAttrInt(HttpServletRequest request, String str) {
    int su = 0;
    if (request.getAttribute(str) != null) {
      Integer itg = (Integer) (request.getAttribute(str));
      su = itg.intValue();
    }

    return su;
  }

  /**
   * Ajax 한글 변환
   *
   * @param ko
   * @return
   */
  public static synchronized String koAjax(String ko) {
    String corean = null;
    try {
      // corean= new String(ko.getBytes("ISO-8859-1"), "UTF-8");
      corean = new String(ko.getBytes("KSC5601"), "EUC-KR");
    } catch (Exception e) {
      return corean;
    }
    return corean;
  }

  /**
   * 자바스크립트 특수문자, 줄바꿈 문자 변환
   *
   * @param str
   * @return
   */
  public static synchronized String toJS(String str) {
    if (str != null) {
      return str.replace("\\", "\\\\").replace("\'", "\\\'")
          .replace("\"", "\\\"").replace("\r\n", "\\n").replace("\n", "\\n");

    } else {
      return "";
    }
  }

  /**
   * Ajax 한글 변환
   *
   * @param ko
   * @return
   */
  public static synchronized String koAndroid(String ko) {
    String corean = null;
    try {
      // corean= new String(ko.getBytes("UTF-8"), "EUC-KR");
      // corean= new String(ko.getBytes("ISO-8859-1"), "UTF-8");
      // corean= new String(ko.getBytes("KSC5601"), "EUC-KR");
      corean = new String(ko.getBytes("8859_1"), "UTF-8");
    } catch (Exception e) {
      return corean;
    }
    return corean;
  }

  /**
   * 문자열 경로를 받아 모든 파일 목록을 리턴
   *
   * @param dir
   * @return
   */
  public static synchronized String[] fileNameList(String dir) {
    File sdDir = null;
    String[] str = null;

    try {
      // Check SD Card mount.
      sdDir = new File("."); // /sdcard
      // 존재/쓰기 여부 확인
      if (sdDir.exists() && sdDir.canWrite()) {
        File _dir = new File(dir);
        if (_dir.exists() && _dir.canRead()) {
          str = _dir.list();
        }
      }
    } catch (Exception e) {
      e.printStackTrace();
    }

    return str;
  }

  /**
   * 파일 객체를 받아 파일 목록을 리턴
   *
   * @param dir
   * @return
   */
  public static synchronized String[] fileNameList(File dir) {
    String[] str = null;

    try {
      str = dir.list();
    } catch (Exception e) {
      e.printStackTrace();
    }

    return str;
  }

  /**
   * 파일 목록에서 확장자를 제거함
   *
   * @param str
   * @return
   */
  public static synchronized ArrayList convertFilenameNotExtend(String[] str) {
    ArrayList retVal = new ArrayList();
    ;

    for (int i = 0; i < str.length; i++) {
      int point = str[i].indexOf(".");
      retVal.add(str[i].substring(0, point));
    }

    return retVal;
  }

  /**
   * 파일에서 확장자를 제거함. 예) data.txt --> data
   *
   * @param str
   * @return
   */
  public static synchronized String convertFilenameNotExtend(String str) {
    String noExt = "";
    int point = str.indexOf(".");
    noExt = str.substring(0, point);

    return noExt;
  }

  // 폴더를 생성
  public static synchronized void makeFolder(String _dir) {
    File sdDir = null; // 폴더명
    File dir = null;

    sdDir = new File(".");
    dir = new File(sdDir.toString() + "/" + _dir);

    if (sdDir.exists() && sdDir.canWrite()) {
      if (dir.exists() == false) {
        dir.mkdir();
      }
    }

  }

  public static synchronized String onlyFilename(String _str) {
    // /sdcard/smartalbum/20101201_090101.jpg
    int ps = _str.lastIndexOf("/");
    // System.out.println("ps: " + ps);

    String str = _str.substring(ps + 1); // 20101201_090101.jpg

    int pd = str.lastIndexOf(".");
    System.out.println("pd: " + pd);

    str = str.substring(0, pd);

    return str;
  }

  public static synchronized String convertFilename(String str) {
    // 20101201_090101
    // 012345678901234
    // 2010년 12월 1일 09시 01분 01초
    String year = str.substring(0, 4);
    String month = str.substring(4, 6);
    String day = str.substring(6, 8);
    String hour = str.substring(9, 11);
    String minute = str.substring(11, 13);
    String second = str.substring(13);

    String _str = year + "년 " + month + "월 " + day + "일 " + hour + "시 "
        + minute + "분 " + second + "초 ";

    return _str;
  }

  /**
   * 파일 삭제
   * @param fname
   * @return
   */
  public static synchronized boolean deleteFile(String fname) {
    File file = new File(fname);
    boolean ret = false;
   
    if (file.exists()){
      ret = file.delete();
    }
   
    return ret;
  }

  /**
   * 바이트배열로 되어 있는 문자열을 받아 원래의 문자열로 변환
   *
   * @param str
   * @return
   */
  public static synchronized String byteToString(String str) {
    String retVal = "";

    try {
      StringTokenizer st = new StringTokenizer(str, ",");
      byte[] _str = new byte[st.countTokens()];
      int i = -1;

      while (st.hasMoreTokens()) {
        i++;
        _str[i] = Byte.parseByte(st.nextToken());
      }
      retVal = new String(_str, 0, _str.length, "UTF-8");
    } catch (Exception e) {

    }

    return retVal;
  }

  /**
   * 문자열을 바이트 배열 문자열로 변환
   *
   * @param str
   * @return
   */
  public static synchronized String stringToByte(String str) {
    String deli = ","; // 구분자
    String retVal = "";
    try {
      byte[] bstr = str.getBytes("UTF-8");

      for (int i = 0; i < bstr.length; i++) {
        retVal = retVal + deli + bstr[i];
      }
    } catch (Exception e) {

    }
    return retVal;

  }

  /**
   * 현재 시간을 1970년 1월 1일부터 수치형식으로 리턴
   *
   * @return
   */
  public static synchronized long getTimeNumber() {
    long time = System.currentTimeMillis();

    return time;
  }

  /**
   * 주어진 시간을 1970년 1월 1일부터 수치형식으로 리턴
   *
   * @return
   */
  public static synchronized long getTimeNumber(String date) {
    Date _date = new Date();
    SimpleDateFormat sd = new SimpleDateFormat("yyyy-MM-dd");
    try {
      _date = sd.parse(date);
    } catch (Exception e) {
    }
    // System.out.println(date);
    long time = _date.getTime();

    return time;
  }

  /**
   * 주어진 날짜와 기간을 계산하여 새글 여부 판단 현재 날짜가 2013-02-04 글을 등록날짜 2013-02-02
   * getTimeNew("2013-02-04", 2) : 새글 처리, true getTimeNew("2013-02-04", 3) : 새글
   * 처리, false
   *
   * @param date
   *          문자열로 된 날짜
   * @param period
   *          새글로 지정할 기간
   * @return
   */
  public static synchronized boolean getTimeNew(String date, int period) {
    boolean sw = false;

    Date _date = new Date();
    SimpleDateFormat sd = new SimpleDateFormat("yyyy-MM-dd");
    try {
      _date = sd.parse(date);
    } catch (Exception e) {
    }
    // System.out.println(date);
    // 1970년1월1일부터 시간을 1000을 1초로하여 계산하여 리턴
    long time = _date.getTime(); // 글을 작성한 시간

    // 현재 시간을 1970년 1월 1일부터 수치형식으로 리턴
    long currentTime = System.currentTimeMillis();

    // 현재 시간과 글 등록시간의 차이를 계산
    long diff = currentTime - time;

    // 1일 86,400,000: 1초를 1000으로 하루를 계산
    // 0.0001 --> 1: 오늘 날짜
    // 1.00002 --> 2: 어제 날짜
    int day = (int) Math.ceil(((double) diff / 86400000));

    if (day <= period) {
      sw = true; // 최신글 처리
    }
    return sw;
  }

  /**
   * 이미지 사이즈를 변경하여 새로운 이미지를 생성합니다. 원본 이미지는 축소후 삭제합니다.
   *
   * @param dir
   *          기준 폴더
   * @param _src
   *          원본 이미지
   * @param width
   *          생성될 이미지 너비
   * @param height
   *          생성될 이미지 높이, ImageUtil.RATIO는 자동 비례 비율
   * @throws IOException
   */
  public static synchronized String imgResize(String dir, String filename, int width,
      int height) throws IOException {

    File src = new File(dir + "/" + filename);
    File dest = new File(dir + "/" + Utility.convertFilenameNotExtend(filename)
        + "_s.jpg");

    int RATIO = 0;
    int SAME = -1;

    Image srcImg = null;
    // 파일의 확장자 추출
    String suffix = src.getName().substring(src.getName().lastIndexOf('.') + 1)
        .toLowerCase();
    // 이미지의 확장자를 검색하여 이미지 파일인지 검사
    if (suffix.equals("jpg") || suffix.equals("bmp") || suffix.equals("png")
        || suffix.equals("gif")) {
      srcImg = ImageIO.read(src); // 메모리에 이미지 생성
    } else {
      srcImg = new ImageIcon(src.getAbsolutePath()).getImage();
    }

    int srcWidth = srcImg.getWidth(null); // 원본 이미지 너비 추출
    int srcHeight = srcImg.getHeight(null); // 원본 이미지 높이 추출

    int destWidth = -1, destHeight = -1; // 대상 이미지 크기 초기화

    if (width == SAME) { // 너비가 같은 경우
      destWidth = srcWidth;
    } else if (width > 0) {
      destWidth = width;
    }

    if (height == SAME) { // 높이가 같은 경우
      destHeight = srcHeight;
    } else if (height > 0) {
      destHeight = height;
    }

    // 비율에 따른 크기 계산
    if (width == RATIO && height == RATIO) {
      destWidth = srcWidth;
      destHeight = srcHeight;
    } else if (width == RATIO) {
      double ratio = ((double) destHeight) / ((double) srcHeight);
      destWidth = (int) ((double) srcWidth * ratio);
    } else if (height == RATIO) {
      double ratio = ((double) destWidth) / ((double) srcWidth);
      destHeight = (int) ((double) srcHeight * ratio);
    }

    // 메모리에 대상 이미지 생성
    Image imgTarget = srcImg.getScaledInstance(destWidth, destHeight,
        Image.SCALE_SMOOTH);
    int pixels[] = new int[destWidth * destHeight];
    PixelGrabber pg = new PixelGrabber(imgTarget, 0, 0, destWidth, destHeight,
        pixels, 0, destWidth);
    try {
      pg.grabPixels();
    } catch (InterruptedException e) {
      throw new IOException(e.getMessage());
    }
    BufferedImage destImg = new BufferedImage(destWidth, destHeight,
        BufferedImage.TYPE_INT_RGB);
    destImg.setRGB(0, 0, destWidth, destHeight, pixels, 0, destWidth);

    // 파일에 기록
    ImageIO.write(destImg, "jpg", dest);

    System.out.println(dest.getName() + " 이미지를 생성했습니다.");

    // 원본 파일 삭제
    boolean ret = Utility.deleteFile(dir + "/" + filename);
    if (ret == true) {
      System.out.println("파일을 삭제 했습니다.: " + filename);
    }

    return dest.getName();
  }

  /**
   * 이미지 사이즈를 변경하여 새로운 이미지를 생성합니다.
   *
   * @param src
   *          원본 이미지
   * @param dest
   *          생성되는 이미지
   * @param width
   *          생성될 이미지 너비
   * @param height
   *          생성될 이미지 높이, ImageUtil.RATIO는 자동 비례 비율
   * @throws IOException
   */
  public static synchronized String imgResize(File src, File dest, int width, int height)
      throws IOException {
    int RATIO = 0;
    int SAME = -1;

    Image srcImg = null;
    // 파일의 확장자 추출
    String suffix = src.getName().substring(src.getName().lastIndexOf('.') + 1)
        .toLowerCase();
    // 이미지의 확장자를 검색하여 이미지 파일인지 검사
    if (suffix.equals("jpg") || suffix.equals("bmp") || suffix.equals("png")
        || suffix.equals("gif")) {
      srcImg = ImageIO.read(src); // 메모리에 이미지 생성
    } else {
      srcImg = new ImageIcon(src.getAbsolutePath()).getImage();
    }

    int srcWidth = srcImg.getWidth(null); // 원본 이미지 너비 추출
    int srcHeight = srcImg.getHeight(null); // 원본 이미지 높이 추출

    int destWidth = -1, destHeight = -1; // 대상 이미지 크기 초기화

    if (width == SAME) { // 너비가 같은 경우
      destWidth = srcWidth;
    } else if (width > 0) {
      destWidth = width;
    }

    if (height == SAME) { // 높이가 같은 경우
      destHeight = srcHeight;
    } else if (height > 0) {
      destHeight = height;
    }

    // 비율에 따른 크기 계산
    if (width == RATIO && height == RATIO) {
      destWidth = srcWidth;
      destHeight = srcHeight;
    } else if (width == RATIO) {
      double ratio = ((double) destHeight) / ((double) srcHeight);
      destWidth = (int) ((double) srcWidth * ratio);
    } else if (height == RATIO) {
      double ratio = ((double) destWidth) / ((double) srcWidth);
      destHeight = (int) ((double) srcHeight * ratio);
    }

    // 메모리에 대상 이미지 생성
    Image imgTarget = srcImg.getScaledInstance(destWidth, destHeight,
        Image.SCALE_SMOOTH);
    int pixels[] = new int[destWidth * destHeight];
    PixelGrabber pg = new PixelGrabber(imgTarget, 0, 0, destWidth, destHeight,
        pixels, 0, destWidth);
    try {
      pg.grabPixels();
    } catch (InterruptedException e) {
      throw new IOException(e.getMessage());
    }
    BufferedImage destImg = new BufferedImage(destWidth, destHeight,
        BufferedImage.TYPE_INT_RGB);
    destImg.setRGB(0, 0, destWidth, destHeight, pixels, 0, destWidth);

    // 파일에 기록
    ImageIO.write(destImg, "jpg", dest);

    System.out.println(dest.getName() + " 이미지를 생성했습니다.");

    return dest.getName();
  }

  /**
   * FileUpload 1.2 한글 변환
   *
   * @param str
   * @return
   */
  public static synchronized String encodFileUpload12(String str) {
    String corean = null;
    try {
      corean = new String(str.getBytes("ISO-8859-1"), "UTF-8");
      // corean= new String(str.getBytes("ISO-8859-1"), "KSC5601");
    } catch (Exception e) {
      return corean;
    }
    return corean;
  }

  /**
   * 이미지인지 검사
   * @param filename
   * @return
   */
  public static synchronized boolean isImage(String filename) {
    boolean sw = false;

    if (filename != null) {
      filename = filename.toLowerCase();
      sw = filename.endsWith(".jpg") || filename.endsWith(".jpeg")
          || filename.endsWith(".gif") || filename.endsWith(".png")
          || filename.endsWith(".bmp");
    }

    return sw;
  }

  public static synchronized String trim(String str, int length) {
    String _str = "";
    if (str.length() > length) {
      _str = str.substring(0, length);
    } else {
      _str = str;
    }

    return _str;
  }

}//class end

 


 

2. WEB-INF

spring 

1) root-context.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd">
	<!-- Root Context: defines shared resources visible to all other web components -->	
</beans>

 

spring > appServlet

1) servlet-context.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/mvc"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:beans="http://www.springframework.org/schema/beans"
	xmlns:context="http://www.springframework.org/schema/context"
	xsi:schemaLocation="http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd
		http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">

	<!-- DispatcherServlet Context: defines this servlet's request-processing infrastructure -->
	
	<!-- Enables the Spring MVC @Controller programming model -->
	<annotation-driven />

	<!-- Handles HTTP GET requests for /resources/** by efficiently serving up static resources in the ${webappRoot}/resources directory -->
	<!-- <resources mapping="/resources/**" location="/resources/" /> -->
	<default-servlet-handler/> <!-- myweb 형식 잊지말기 !!!! l -->

	<!-- Resolves views selected for rendering by @Controllers to .jsp resources in the /WEB-INF/views directory -->
	<beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
		<beans:property name="prefix" value="/" />
		<beans:property name="suffix" value=".jsp" />
	</beans:bean>
	
	<!-- File 전송이 있는 경우 Spring 등록 l -->
	<!-- CommonsMultipartResolver -->
	<!-- id 소문자로...해야한다..... -->
	<beans:bean id="multipartResolver"  
			    class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
	</beans:bean>	
	<context:component-scan base-package="kr.co.mymelon" />
	
</beans:beans>

 

 

views

1) web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee https://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">

	<!-- The definition of the Root Spring Container shared by all Servlets and Filters -->
	<context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>/WEB-INF/spring/root-context.xml</param-value>
	</context-param>
	
	<!-- Creates the Spring Container shared by all Servlets and Filters -->
	<listener>
		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
	</listener>

	<!-- Processes application requests -->
	<servlet>
		<servlet-name>appServlet</servlet-name>
		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
		<init-param>
			<param-name>contextConfigLocation</param-name>
			<param-value>/WEB-INF/spring/appServlet/servlet-context.xml</param-value>
		</init-param>
		<load-on-startup>1</load-on-startup>
	</servlet>
		
	<servlet-mapping>
		<servlet-name>appServlet</servlet-name>
		<url-pattern>/</url-pattern>
	</servlet-mapping>
	
	<!-- filer (한글) l -->	
	<filter>
		<filter-name>CharacterEncodingFilter</filter-name>
		<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
		<init-param>
			<param-name>encoding</param-name>
			<param-value>UTF-8</param-value>
		</init-param>
		<init-param>
			<param-name>forceEncoding</param-name>
			<param-value>true</param-value>
		</init-param>
	</filter>

	<filter-mapping>
		<filter-name>CharacterEncodingFilter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>

</web-app>

 

 


 

3. pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/maven-v4_0_0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>kr.co</groupId>
	<artifactId>form1</artifactId>
	<name>BasicAjax</name>
	<packaging>war</packaging>
	<version>1.0.0-BUILD-SNAPSHOT</version>
	<properties>
		<java-version>1.6</java-version>
		<org.springframework-version>3.1.1.RELEASE</org.springframework-version>
		<org.aspectj-version>1.6.10</org.aspectj-version>
		<org.slf4j-version>1.6.6</org.slf4j-version>
	</properties>
	<dependencies>
		<!-- Spring -->
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-context</artifactId>
			<version>${org.springframework-version}</version>
			<exclusions>
				<!-- Exclude Commons Logging in favor of SLF4j -->
				<exclusion>
					<groupId>commons-logging</groupId>
					<artifactId>commons-logging</artifactId>
				 </exclusion>
			</exclusions>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-webmvc</artifactId>
			<version>${org.springframework-version}</version>
		</dependency>
				
		<!-- AspectJ -->
		<dependency>
			<groupId>org.aspectj</groupId>
			<artifactId>aspectjrt</artifactId>
			<version>${org.aspectj-version}</version>
		</dependency>	
		
		<!-- Logging -->
		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>slf4j-api</artifactId>
			<version>${org.slf4j-version}</version>
		</dependency>
		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>jcl-over-slf4j</artifactId>
			<version>${org.slf4j-version}</version>
			<scope>runtime</scope>
		</dependency>
		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>slf4j-log4j12</artifactId>
			<version>${org.slf4j-version}</version>
			<scope>runtime</scope>
		</dependency>
		<dependency>
			<groupId>log4j</groupId>
			<artifactId>log4j</artifactId>
			<version>1.2.14</version>
			<exclusions>
				<exclusion>
					<groupId>javax.mail</groupId>
					<artifactId>mail</artifactId>
				</exclusion>
				<exclusion>
					<groupId>javax.jms</groupId>
					<artifactId>jms</artifactId>
				</exclusion>
				<exclusion>
					<groupId>com.
					sun.jdmk</groupId>
					<artifactId>jmxtools</artifactId>
				</exclusion>
				<exclusion>
					<groupId>com.sun.jmx</groupId>
					<artifactId>jmxri</artifactId>
				</exclusion>
			</exclusions>
			<scope>runtime</scope>
		</dependency>

		<!-- @Inject -->
		<dependency>
			<groupId>javax.inject</groupId>
			<artifactId>javax.inject</artifactId>
			<version>1</version>
		</dependency>
				
		<!-- Servlet -->
		<dependency>
			<groupId>javax.servlet</groupId>
			<artifactId>servlet-api</artifactId>
			<version>2.5</version>
			<scope>provided</scope>
		</dependency>
		<dependency>
			<groupId>javax.servlet.jsp</groupId>
			<artifactId>jsp-api</artifactId>
			<version>2.1</version>
			<scope>provided</scope>
		</dependency>
		<dependency>
			<groupId>javax.servlet</groupId>
			<artifactId>jstl</artifactId>
			<version>1.2</version>
		</dependency>
	
		<!-- Test -->
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>4.7</version>
			<scope>test</scope>
		</dependency>
		
		<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-log4j12</artifactId>
    <version>1.7.5</version>
</dependency>
		
		
		<!-- pom.xml 외부라이브러리 다운 External Library -->
		<!-- User가 필요한 Library Download -->
		<!-- begin -->

		<!-- Java Mail Library -->
		<!-- https://mvnrepository.com/artifact/javax.mail/mail -->
		<dependency>
			<groupId>javax.mail</groupId>
			<artifactId>mail</artifactId>
			<version>1.4.7</version>
		</dependency>

		<!-- File upload/download 관련 Library -->
		<!-- https://mvnrepository.com/artifact/commons-fileupload/commons-fileupload -->
		<dependency>
			<groupId>commons-fileupload</groupId>
			<artifactId>commons-fileupload</artifactId>
			<version>1.3.3</version>
		</dependency>

		<!-- JSON Library -->
		<!-- https://mvnrepository.com/artifact/com.googlecode.json-simple/json-simple -->
		<dependency>
			<groupId>com.googlecode.json-simple</groupId>
			<artifactId>json-simple</artifactId>
			<version>1.1.1</version>
		</dependency>

		<!-- Spring JDBC Template Library -->
		<!-- https://mvnrepository.com/artifact/org.springframework/spring-jdbc -->
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-jdbc</artifactId>
			<version>5.1.5.RELEASE</version>
		</dependency>

		<!-- mybatis -->
		<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
		<dependency>
			<groupId>org.mybatis</groupId>
			<artifactId>mybatis</artifactId>
			<version>3.4.6</version>
		</dependency>

		<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis-spring -->
		<dependency>
			<groupId>org.mybatis</groupId>
			<artifactId>mybatis-spring</artifactId>
			<version>1.3.2</version>
		</dependency>

		<!-- MySQL Library -->
		<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
			<version>6.0.6</version>
		</dependency>

		<!-- Oracle Library -->
		<!-- 저장소 위치를 별도로 지정해야한다. build 아래에  -->
		<!-- https://mvnrepository.com/artifact/com.oracle/ojdbc6 -->
		<dependency>
			<groupId>com.oracle</groupId>
			<artifactId>ojdbc6</artifactId>
			<version>12.1.0.1-atlassian-hosted</version>
			<!-- <scope>test</scope> -->
		</dependency>

		<!-- end -->
		
		        
	</dependencies>
    <build>
        <plugins>
            <plugin>
                <artifactId>maven-eclipse-plugin</artifactId>
                <version>2.9</version>
                <configuration>
                    <additionalProjectnatures>
                        <projectnature>org.springframework.ide.eclipse.core.springnature</projectnature>
                    </additionalProjectnatures>
                    <additionalBuildcommands>
                        <buildcommand>org.springframework.ide.eclipse.core.springbuilder</buildcommand>
                    </additionalBuildcommands>
                    <downloadSources>true</downloadSources>
                    <downloadJavadocs>true</downloadJavadocs>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>2.5.1</version>
                <configuration>
                    <source>1.6</source>
                    <target>1.6</target>
                    <compilerArgument>-Xlint:all</compilerArgument>
                    <showWarnings>true</showWarnings>
                    <showDeprecation>true</showDeprecation>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>exec-maven-plugin</artifactId>
                <version>1.2.1</version>
                <configuration>
                    <mainClass>org.test.int1.Main</mainClass>
                </configuration>
            </plugin>
        </plugins>
    </build>
    
    
	<!-- Oracle 저장소 별도지정 위치 l -->
	<repositories>
		<repository>
			<id>oracle</id>
			<url>https://repo.spring.io/plugins-release/</url>
		</repository>
	</repositories>
    
</project>

 

 

 

 

 

 

댓글