'2010/04'에 해당되는 글 3건

  1. 2010.04.07 Spring 업로드 구현 Spring 5
  2. 2010.04.03 톰켓 버전별 한글처리(4.1.30 vs 5.0.27) 3
  3. 2010.04.03 자바 - JSP, MySQL DB에 한글깨짐 1
2010. 4. 7. 17:57

2010/03/23 16:48

복사 http://blog.naver.com/blue_0227/130082936209

1. jar추가.
필요한 jar파일은 다음과 같다.
 - commons-fileupload-1.2.jar
 - commons-io-1.3.jar

2. Spring Bean설정.
아래와 같이 CommonsMultipartResolver를 추가해준다.
 <bean id="multipartResolver"

 class="org.springframework.web.multipart.commons.CommonsMultipartResolver">

 <property name="maxUploadSize" value="30720000" />

</bean>


그리고 컨트룰러 등록. 여기서 업로드 기본디렉토리를 설정해준다.
  <bean id="cpnupload"
  class
="net.tino.controller.cpOper.CpnUploadController">

  <property name="uploadDir" value="E://COUPONE" />

</bean>


3. 업로드폼
주의할점은... enctype="multipart/form-data"를 반드시 명시해야 한다는점은 왠만하면 다 알고있을터... method="post"도 반드시 명시해줘야하고, 필드명에 반드시 name 명시를
해주어야 한다는것이다. 컨트룰러에서 value를 name을 인식해서 가져오는거같다.(보통 난 폼 컨트롤할때 id를 쓰는데... 이거 때문에 삽질좀 했다 ㅡ_ㅡ;;;)

 <%@ page language="java" contentType="text/html; charset=EUC-KR"

       pageEncoding="EUC-KR"%>

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>

<%@ taglib uri="http://www.springframework.org/tags" prefix="spring"%>

<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form"%>

<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%>

 

<html>

<head>

<meta http-equiv="content-type" content="text/html; charset=euc-kr">

<title>ㄷㄷㄷ;;;</title>

<script language="javascript" src="../scripts/inc_util.js"></script>

<script language="JavaScript">

function upload(){

       var fileName = str_trim(document.frm.f1.value);

 

       var arr=("file:///"+fileName.replace(/ /gi,"%20").replace(/\\/gi,"/")).split("/");

       var chkFile = arr[arr.length-1];

       var len = chkFile.length;

       var codeLen = 0;

 

       for (i=0; i < len; i++)

             (chkFile.charCodeAt(i) > 255)? codeLen+=2:codeLen++;

 

       if (len != codeLen) {

             alert("한글 파일은 업로드 없습니다.");

             return false;

       }

 

       if(fileName.length == 0 && fileName.length == 0){

             alert("업로드할 파일을 선택하십시오.");

             document.frm.f1.focus();

             return false;

       } else {

             document.frm.submit();

       }

}

</script>

</head>

<body>

<center>

<form name="frm" action="../cpnupload/insert.html" method="post" enctype="multipart/form-data" >

       <input type="file" id="f1" name="f1" size="30"/>

       <input type="button" style="width:80" value="확인" onclick="javascript:upload();">

</form>

${resultMessage }

</center>

 

</body>

</html>



4. 컨트룰러 제작
import java.io.File;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import org.apache.log4j.Logger;

import org.springframework.web.multipart.MultipartFile;

import org.springframework.web.multipart.MultipartHttpServletRequest;

import org.springframework.web.servlet.ModelAndView;

import org.springframework.web.servlet.mvc.multiaction.MultiActionController;

 

public class CpnUploadController extends MultiActionController {

 

private Logger logger = Logger.getLogger(CpnUploadController.class);

private File uploadDir;

 

public void setUploadDir(File uploadDir) {

this.uploadDir = uploadDir;

}

 

public ModelAndView insert(HttpServletRequest request, HttpServletResponse response) throws Exception {

logger.debug("### CpnUploadController - insert()");

String resultMessage = "";

 

response.setContentType("text/plain");

if (! (request instanceof MultipartHttpServletRequest)) {

response.sendError(HttpServletResponse.SC_BAD_REQUEST, "Expected multipart request");

return null;

}

 

MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request; // 빈 업로드디렉토리 설정해 둔위치에 위치에 파일을 저장

MultipartFile imgFile = multipartRequest.getFile("f1");                                                   // request "f1" 찾아 file객체에 세팅한다.

final String imgFileName = imgFile.getOriginalFilename().trim();

String filePath = uploadDir.getAbsolutePath() + File.separator;

 

// 여기에 파일 중복 체크 추가

 

// 용량 체크

long fileSize = imgFile.getSize();

if(fileSize > 20480000 || fileSize <= 0) {

resultMessage = "20MB 이상의 파일은 업로드 없습니다.";

}

 

// 확장자 체크

int pathPoint = imgFileName.lastIndexOf(".");

String filePoint = imgFileName.substring(pathPoint + 1, imgFileName.length());

String fileType = filePoint.toLowerCase();

 

if(!fileType.equals("jpg") && !fileType.equals("bmp") && !fileType.equals("gif")) {

resultMessage = "이미지 파일만 업로드 가능합니다.";

}

 

// 파일을 지정한 위치에 upload

File f = new File(filePath + "64");

if(!f.exists()) {

f.mkdirs();         // 디렉토리 생성

}

 

String finalFnm = filePath + "64" + File.separator + imgFileName;

logger.debug("finalFnm = " + finalFnm);

imgFile.transferTo(new File(finalFnm));

resultMessage = "정상적으로 업로드 하였습니다.";

resultMessage += "\n저장된 파일 => " + finalFnm;

 

// 여기서 DB 파일을 포함한 쿠폰정보 저장

 

logger.debug("resultMessage = "+resultMessage);

ModelAndView mav = new ModelAndView("redirect:uploadForm.html");

mav.addObject("resultMessage", resultMessage);

return mav;

}

 

public ModelAndView uploadForm(HttpServletRequest request, HttpServletResponse response) {

logger.debug("### CpnUploadController - uploadForm()");

ModelAndView mav = new ModelAndView("/cpOper/cpn_upload");

String resultMessage = request.getParameter("resultMessage");

logger.debug("resultMessage = "+resultMessage);

mav.addObject("resultMessage", resultMessage);

return mav;

}

 

}

 끝.
Posted by 굿데이
2010. 4. 3. 10:41

윈도우 톰켓 4.1.30

request로 받지 않을때

필터 적용의 경우
<%@ page language="java" contentType="text/html;charset=MS949" %>를 적용하지 않으면 한글깨짐 (°¡³ª´Uabc °¡³ª´U¼?≫b)

필터적용하지 않는경우
필터 적용하든 안하든 상단에 정의하지 않으면 전부 위와같이 깨짐

결론 :
톰켓 4.1.30의 경우 필터적용 유무와 관계없이 페이지 상단에 무조건 케릭셋 지정해야한다

폼태그를 통해 넘겨서 request로 받을경우
적용 문자 : "한글 abc" 라는 문자열 전송

 

필터 적용의 경우


get방식의 경우
<%@ page language="java" contentType="text/html;charset=MS949" %>를 적용하지 않으면 한글깨짐(?? abc)
getBytes로 처리하든지 않하든지 무조건 깨짐(?? abc)

<%@ page language="java" contentType="text/html;charset=MS949" %>를 적용하면
getBytes처리 하지않으면 정상출력
getBytes처리하면 깨짐 (?? abc)

post방식의 경우
<%@ page language="java" contentType="text/html;charset=MS949" %>를 적용하지 않으면 한글깨짐(?? abc)
getBytes로 처리하든지 않하든지 무조건 깨짐(?? abc)

<%@ page language="java" contentType="text/html;charset=MS949" %>를 적용하면
getBytes처리 하지않으면 정상출력
getBytes처리하면 깨짐 (?? abc)

*getBytes 처리방식 : String inputStr = new String(request.getParameter("param").getBytes("8859_1"), "MS949");

결론 :
필터적용의 경우 get방식이건 post방식이건 결과값은 같다 .
페이지 상단에 케릭셋 적용하지 않으면 무조건 깨지므로 일단 무조건 케릭셋은 MS949로 지정한다.
request로 받은 값은 getBytes처리하지 않는다.. 즉 필터에서 처리를 해주기때문에 처리하게되면 이중처리로 한글이 깨지게된다.
고로 필터 적용해야함 ㅡㅡ

 

필터 적용하지 않는경우
<%@ page language="java" contentType="text/html;charset=MS949" %>를 적용하지 않으면 한글깨짐
getBytes처리 하지않을때 현상 (CN±Uabc)
getBytes처리할때 현상(??abc)

<%@ page language="java" contentType="text/html;charset=MS949" %>를 적용하면
getBytes처리 하지않으면 한글깨짐 (??±?abc)
getBytes처리하면 정상출력

*getBytes 처리방식 : String inputStr = new String(request.getParameter("param").getBytes("8859_1"), "MS949");

결론 :
필터를 적용하지 않는경우는(톰켓 버전이낮은경우 필터가 안먹는경우가 있을때)
일단 상단에 무조건 케릭셋을 적용한다음..
request로 받은값은 무조건 getBytes처리나 request.setCharacterEncoding("MS949");의 처리를 해주어야한다.

윈도우 톰켓 5.0.27

request로 받지 않을때


필터 적용의 경우
<%@ page language="java" contentType="text/html;charset=MS949" %>를 적용하지 않아도 정상출력

필터적용하지 않는경우
필터 적용하든 안하든 무조건 정상출력됨

결론 :
톰켓 5.0.27의 경우 필터적용 유무와 관계없이 무조건 정상출력 된다
.

폼태그를 통해 넘겨서 request로 받을경우
적용 문자 : "한글 abc" 라는 문자열 전송

 

필터 적용의 경우

get방식의 경우
<%@ page language="java" contentType="text/html;charset=MS949" %>를 적용하지 않는경우
getBytes처리 하지않을때 정상출력
getBytes처리할때 한글깨짐(??abc)


<%@ page language="java" contentType="text/html;charset=MS949" %>를 적용하면
getBytes처리 하지않으면 정상출력
getBytes처리하면 깨짐 (?? abc)

post방식의 경우

<%@ page language="java" contentType="text/html;charset=MS949" %>를 적용하지 않는경우
getBytes처리 하지않을때 한글깨짐 (??abc)
getBytes처리할때 한글깨짐(??abc)

<%@ page language="java" contentType="text/html;charset=MS949" %>를 적용하면
getBytes처리 하지않을때 정상출력
getBytes처리할때 한글깨짐(??abc)


*getBytes 처리방식 : String inputStr = new String(request.getParameter("param").getBytes("8859_1"), "MS949");

 

필터 적용하지 않는경우

get방식의 경우
<%@ page language="java" contentType="text/html;charset=MS949" %>를 적용하지 않는경우
getBytes처리 하지않을때 정상출력
getBytes처리할때 한글깨짐(??abc)

<%@ page language="java" contentType="text/html;charset=MS949" %>를 적용하면
getBytes처리 하지않으면 한글깨짐 (??±?abc)
getBytes처리하면 정상출력

post방식의 경우

<%@ page language="java" contentType="text/html;charset=MS949" %>를 적용하지 않는경우
getBytes처리 하지않을때 한글깨짐 (??abc)
getBytes처리할때 한글깨짐(??abc)

<%@ page language="java" contentType="text/html;charset=MS949" %>를 적용하면
getBytes처리 하지않을때 정상출력
getBytes처리할때 한글깨짐(??abc)

*getBytes 처리방식 : String inputStr = new String(request.getParameter("param").getBytes("8859_1"), "MS949");

결론 :
필터를 적용하건 안하건 변화가 없다.
즉 톰켓5.0.27버전의 자체에서 필터처리를 해서 전체적인 케릭터셋을 정의해준다고 봐야할거 같다.
하지만 get방식과 post방식에따라 한글처리가 차이가 있다.
톰켓 5.0.27에서는 get방식으로 전송시 getBytes처리를 해주어야하고 post방식처리시에는 getBytes를 처리하면 안된다.

결론적으로 톰켓 5.0.27버전에서는 필터를 처리할필요가 없고 get방식의경우 getBytes처리를 해주어야하고 post방식처리시에는 getBytes를 처리하면 안된다.

Posted by 굿데이
2010. 4. 3. 10:40

DriverManager.getConnection("jdbc:mysql://localhost/DB명?useUnicode=true&characterEncoding=euc-kr","root","암호"); 




-----------------------------
이건 뽀너스

<%@ page language="java" import="java.sql.*" contentType="text/html;charset=euc-kr" %>
<% request.setCharacterEncoding("euc-kr"); %> 
Posted by 굿데이