'프로그래밍/자바'에 해당되는 글 5건

  1. 2010.12.28 MySQL과 Java, JSP 연동시 한글 인코딩 방법 [UTF-8] (2)
  2. 2010.05.17 JBoss Tip (245)
  3. 2010.04.07 Spring 업로드 구현 Spring (3)
  4. 2010.04.03 톰켓 버전별 한글처리(4.1.30 vs 5.0.27) (1)
  5. 2010.04.03 자바 - JSP, MySQL DB에 한글깨짐 (1)
2010. 12. 28. 12:38

최근에 Connection Pool 연동에 이어서 CharacterSet 설정까지 몇 일 동안 삽질의 연속이었습니다.

정말 오랜만에 프로그래밍 공부를 하면서 좌절을 맛본거 같네요. 아... 멀고도 험난한 Web Programming의 길 ㅠ.ㅜ;;

 

어쨌든 저와 같이 헤매는 사람이 더 이상 나오지 않기를 바라며 이렇게 글을 씁니다.

최대한 이해하기 쉽게 자세히 순차적으로 설명하였으니 분명히 도움이 되시리라 생각됩니다.

 

그럼, 시작합니다.

 

 

본 강좌는 UTF-8 인코딩 설정으로 쓰여졌고, 다른 인코딩 설정 방법 또한 아래의 설명들과 다를 것이 없음도 알려드립니다.

 

1. MySQL의 CharacterSet을 UTF-8로 설정하기

 

MySQL 설치시 Character Set / Collation을 utf8로 설정한다.

만약에 설치가 되어있다면 MySQL Server Instance Config Wizard에서 다시 설정할 수 있다.

 

                                                                                    [그림] Character Set 설정 옵션

 

설정 후 MySQL Query에서 show variables like 'c%' 를 입력하면 아래와 같은 화면이 출력 된다.

 

 

 

 

 





2. 톰캣의 세팅을 UTF-8로 바꾸기

 

톰캣의 conf라는 폴더를 보면 server.xml과 server-minimal.xml 이란 파일을 볼 수 있다. 텍스트 에디터로 열어서 <connector...>라는 항목을 찾아 다음과 같이 설정하자.

server.xml

<Connector port="8080" maxHttpHeaderSize="8192"
    maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
    enableLookups="false" redirectPort="8443" acceptCount="100"
    connectionTimeout="20000" disableUploadTimeout="true" URIEncoding="UTF-8" />

 

server-minimal.xml

<Connector port="8080" URIEncoding="UTF-8">

server-minimal.xml이 존재하지 않거나 server.xml만 바꾸었을때 제대로 동작하면 server-minimal.xml은 세팅할 필요 없다.

 

이 세팅은 웹페이지의 URL에서 문자열을 읽어올 때 서버가 처리하는 URL의 인코딩 타입을 변경하는 것이다. Internet Explorer에서 "URL을 항상 UTF-8로 보냄"이 켜져 있으면 브라우저는 서버에 UTF-8로 보낸다. 이를 서버에서 읽어들일때 UTF-8이 세팅되어 있어야 하는 것이다.

 

이제 기본 세팅과의 차이점을 보자.

 

페이지 설정과 POST방식으로 전송된 데이터의 처리는 그대로 두어도 좋다. 서버를 UTF-8로 세팅한 만큼 가급적 UTF-8의 방식으로 페이지 설정을 하자.

 

GET방식으로 전송된 데이터의 처리는, 다음 항목이 필요가 없어진다. 당연하다. 있으면 오히려 에러가 발생할 것이다. 앞부분에 주석처리를 해버리자.

request.setCharacterEncoding("UTF-8");

//String data = new String(request.getParameter("data").getBytes("8859_1"),"UTF-8");

//Latin-1(8859_1)로 읽어들인 데이터를 다시 UTF-8로 재해석하는 코드

한글 파일의 전송은 다음과 같이 처리한다.

<a href = "http://[server]:[port]/[folder]/<%= java.net.URLEncoder.encode( "한글파일.html" ,  "UTF-8" )%>">

한글파일 링크</a>

이렇게 하면 URLEncoder에 의해서 %xx%xx 형식의 UTF-8로 인코딩된 URL코드가 링크될 것이다.

 

그외에 Internet Explorer에서는 “URL을 항상 UTF-8로 보냄”이 기본 체크 되어있으므로 주소창에 한글을 직접 써도 서버에서 알아서 처리해준다. 물론 저 항목을 끄면 또 에러 발생.. (FireFox에서는 OS에 따라 MS949로 보낼 수도 있으므로 주의하자.)

 

 

 

3. 개발 툴에서 인코딩 방식을 변경한다.

 

                               [그림] EditPlus에서의 저장 인코딩 옵션

 

                                       [그림] Eclipse에서 인코딩 세팅화면

 

 

4. 작업 문서에서의 설정

 

① 페이지 설정

UTF-8을 쓰고자 하는 경우 *.html, *.htm, *.jsp 파일은 UTF-8 형식으로 저장한다.

EUC-KR, MS949는 ANSI, MS949등의 기본 형식으로 저장하면 된다.

 

모든 HTML, JSP에는 아래와 같은 META태그를 넣을 것을 권장한다.

<META HTTP-EQUIV="contentType" CONTENT="text/html;charset=UTF-8">

<!--EUC-KR인 경우 UTF-8을 EUC-KR로 바꾼다-->

JSP에서는 페이지 상단에 page 지시자를 다음과 같이 넣는다.

<%@ page contentType="text/html;charset=UTF-8" %>

<!--EUC-KR인 경우 UTF-8을 EUC-KR로 바꾼다-->

② POST 방식의 데이터 전송

POST방식으로 전송된 데이터는 UTF-8이든, EUC-KR이든 다음과 같은 라인을 추가하면 해결 된다.

request.setCharacterEncoding("UTF-8");

//EUC-KR인 경우 UTF-8을 EUC-KR로 바꾼다.

③ GET 방식의 데이터 전송

GET방식으로 전송된 데이터는 URL을 통해 전송되기 때문에 위의 방식으론 쓸 수 없다. URL에서의 데이터를 Latin-1(8859_1)인코딩으로 서버에서 처리하기 때문이다. 이를 톰캣의 버그라고 단정짓는 일부 서적의 말은 잘못된것이다.

 

불러온 데이터를 아래와 같이 처리해 주어야 한다.

request.setCharacterEncoding("UTF-8");

String data = new String(request.getParameter("data").getBytes("8859_1"),"UTF-8");

//Latin-1(8859_1)로 읽어들인 데이터를 다시 UTF-8로 재해석하는 코드

//EUC-KR인 경우  UTF-8을 EUC-KR로 바꾼다.

④ 한글 파일 전송

Latin-1(8859_1)로 세팅된 톰캣 서버에서는 URL을 무조건 영어로 처리하므로 한글 파일은 절대로 읽어들일 수 없다. 파일을 영어로 바꾸어 저장하거나, 한글 파일을 영어로 바꾸는 처리를 해주어야 한다.

 

⑤ DB URL의 인코딩

jdbc:mysql://localhost:3306/DB명?useUnicode=true&characterEncoding=utf8              [ Java 또는 JSP ]

jdbc:mysql://localhost:3306/DB명?useUnicode=true&amp;characterEncoding=utf8       [ XML ]

 

XML 문서에서는 기호 ('&')를 표시할 때 &amp;를 사용하기 때문에 일반 코드와 다르다.

 

 

 

 

 

 

 

Java와 JSP의 MySQL 연동시 한글 인코딩 방법은 매우 까다롭습니다.

그렇기 때문에 위에 제시된 내용 중 하나라도 빠뜨리신다면 실행이 제대로 안되실 수도 있습니다.

저 역시 이런저런 방법을 써봐도 제대로 한글 인코딩이 되지 않아서 고생했었답니다.

 

조금이나마 도움이 되었기를 바라며 이상으로 글을 마치겠습니다.


출처: http://blog.naver.com/seogi1004/110045319589
Posted by 굿데이

댓글을 달아 주세요

  1. BlogIcon christian louboutin 2013.07.19 12:43  댓글주소  수정/삭제  댓글쓰기

    슬퍼서 우는거 아니야..바람이 불어서 그래..눈이 셔서..

  2. BlogIcon cheap oakley sunglasses 2013.07.25 07:41  댓글주소  수정/삭제  댓글쓰기

    창밖을 봐 바람에 나뭇가지가 살며시 흔들리면 네가 사랑하는 사람이 널 사랑하고 있는거야.

2010. 5. 17. 15:45

 

 

jboss 툴 + eclipse#

https://www.jboss.org/tools/

 

jboss 주요 키워드#

  • JMX
  • MBean
  • JTA
  • EJB
  • JMS
  • JAAS
  • CMP
  •  

 

클래스 로딩에 대한 상세 로깅하기#

종종 라이브러리가 분명히 존재하는데도, 라이브러리를 찾을 수없다고 하면서 jboss에서 ear,jar,war를 deploy하지 못하는 경우가 생긴다.

이를 위해 classloader 디버깅을 해주면 좋은데, 클래스 로더의 동작에 대한 로깅을 남기는 법이다.

  1. <appender name="UCL" class="org.apache.log4j.FileAppender">
        <param name="File" value="${jboss.server.home.dir}/log/ucl.log"/>
        <param name="Append" value="false"/>
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="[%r,%c{1},%t] %m%n"/>
        </layout>
    </appender>
    <category name="org.jboss.mx.loading" additivity="false">
        <priority value="TRACE" class="org.jboss.logging.XLevel"/>
        <appender-ref ref="UCL"/>
    </category>

요렇게 해 두면, 클래스 로더에 대한 로그가 ucl.log 라는 파일에 쌓인다. 필요 이상의 로그가 쌓이기 때문에 평소에는 주석처리 해 두었다가, 디버깅이 필요할때만 켜서 사용하자.

tomcat(jboss-web) 한글 설정하기#

jboss-web(내부적으로는 tomcat)은 기본값으로 한글 처리를 잘 해주지 못한다.

  1. get으로 전달되는 메시지의 한글이 깨짐
  2. post로 전달되는 메시지의 한글이 깨짐
  3. 결과로 전달되는 response 메시지의 한글이 깨짐

위의 세가지를 설정해주기 위해서는 몇가지 수정을 해 주어야한다.

 

server.xml 수정(get으로 전달되는 메시지의 한글 깨짐 해결)#

${jboss-deploy}/jboss-web/server.xml 파일에서 다음과 같은 부분을 수정한다.

  1. <Connector port="8080" ...... URIEncoding="euc-kr"/>

URIEncoding 부분을 추가한다. 위 부분을 UTF-8로 해도 될것 같긴 한데, 브라우저에서 메시지를 거의 euc-kr로 보내기 때문에 위와 같이 한다.

 ==> 현재 URL의 2바이트 문자를 보내는 인코딩은 UTF-8이 표준이라고 함. 단 이를 %인코딩을 통해서 고쳐서 보내주는 것이 맞음.

filter 사용(post로 전달되는 & 결과로 전달되는 reponse 메시지의 한글 깨짐 해결)#

  • 다음 소스를 다운 받는다. : SetCharacterEncodingFilter.java
  • 배포되는 war파일의 web.xml 파일에 다음과 같이 추가한다. 모든 url로 전달되는 처리 중간에 SetCharacterEncodingFilter를 사용한다는 것이고, 그내용은 인자로 설정된 인코딩으로 처리하겠다는 것이다.
  1. <filter>
           <filter-name>Set Character Encoding</filter-name>
           <filter-class>com.kisinfo.companydata.webservice.filters.SetCharacterEncodingFilter</filter-class>
           <init-param>
               <param-name>encoding</param-name>
               <param-value>euc-kr</param-value>
           </init-param>
        </filter>
       
        <filter-mapping>
           <filter-name>Set Character Encoding</filter-name>
           <url-pattern>/*</url-pattern>
        </filter-mapping>

 

웹서비스 시 호스트 주소 설정#

http://www.jboss.org/index.html?module=bb&op=viewtopic&p=4215755
jboss에서 호스트명 a.b.com 이런 식으로 해줘야 하는데, 이걸 세팅 안해주면,
그냥 http://a:80/ 처럼 참조 주소를 보내준다.
위의 url 설명을 참조하여, jboss-4.2.3.GA/server/default/deploy/jbossws.sar/jbossws.beans/META-INF/jboss-beans.xml
파일을 수정해주면, 그 내용대로 호스트 명을 설정해준다.

 

JVM 옵션 설정#

메모리 좀 늘려볼라구...

run.sh 파일에 다음을 추가

  1. JAVA_OPTS="$JAVA_OPTS -Xms1024m -Xmx2048m"

 

 

EJB 3.0 개발#

jboss rmi 서버 설정#

jndi 에서 EJB를 검색하고 나면, J2EE서버에 접속해서 EJB 클래스를 요청해야한다. 이때 jndi에서 돌려주는 J2EE서버의 주소는 jboss서버의 binding된 '호스트명' 또는 'IP주소'이다. 즉

  1. sh run.sh -b testserver

라는 이름으로 서비스를 실행했다면, 돌려주는 서버 이름도 'testserver'이다. 서버명이 공식 도메인명이면 상관 없겠지만, 개발중에 사용하는 임시 이름이라면,

서버에서 사용하는 'testserver'라는 이름이 클라이언트 서버에는 존재하지 않을 수도있다.

이때의 해결책은 3가지가 있다.

hosts 파일 변경#

hosts 파일 내에

  1. testserver 1.1.1.1

와 같이 host이름을 적어준다.

 

서버 구동시 binding 네임 변경#

  1. sh run.sh -b 1.1.1.1

이왕이면 서버에서만 사용되는 hostname보다는 공인 ip를 적어주면 된다.

 

명시적으로 rmi서버 이름 설정하기#

가장 근본적인 해결책으로 서비스 실행시 다음과 같은 옵션을 주어서 실행한다.

  1. sh run.sh -b testserver -Djava.rmi.server.hostname=1.1.1.1

 

 

데몬 띄우기#

기본 서비스 인증 추가하기#

다음의 서비스는 jboss에서 기본을 열어두는 서비스 이므로 실서버로 이전하기 전에 전부 막아두어야 한다.

 

  • jbossws
  • jbossws.bean
  • jboss-web
  • jmx-console

mysql 접속시 -ds.xml 설정#

  1. <?xml version="1.0" encoding="euc-kr"?>
    <datasources>
      <no-tx-datasource>
        <jndi-name>jdbc/jupiter</jndi-name>
        <!-- Sybase jConnect URL for the database.
        NOTE: The hostname and port are made up values. The optional
              database name is provided, as well as some additinal Driver
              parameters.
        -->
        <connection-url>jdbc:mysql://hostname:3306/접속DB명?useUnicode=true&amp;characterEncoding=euckr</connection-url>
        <driver-class>com.mysql.jdbc.Driver</driver-class>
        <user-name>사용자명</user-name>
        <password>패스워드</password>
        <min-pool-size>5</min-pool-size>
        <max-pool-size>30</max-pool-size>
        <idle-timeout-minutes>5</idle-timeout-minutes>
        <exception-sorter-class-name>com.mysql.jdbc.integration.jboss.ExtendedMysqlExceptionSorter</exception-sorter-class-name>
        <valid-connection-checker-class-name>com.mysql.jdbc.integration.jboss.MysqlValidConnectionChecker</valid-connection-checker-class-name>
      </no-tx-datasource>
    </datasources>

oracle 접속시 -ds.xml 설정#

  1. <?xml version="1.0" encoding="UTF-8"?>
    <datasources>
      <local-tx-datasource>
        <jndi-name>OracleDS</jndi-name>
        <connection-url>jdbc:oracle:thin:@IP주소:포트:SID</connection-url>
        <driver-class>oracle.jdbc.driver.OracleDriver</driver-class>
        <user-name>USERNAME</user-name>
        <password>PASSWORD</password>
        <!-- DriverManager.getConnection(props) 호출시 넘겨주는 속성값들 -->
        <connection-property name="char.encoding">UTF-8</connection-property>
        <!-- Connection Pool의 최대, 최소 커넥션의 개수 -->
        <min-pool-size>5</min-pool-size>
        <max-pool-size>20</max-pool-size>
        <!-- 사용하지 않는 커넥션이 있는 경우 닫을 때까지 대기하는  시간(기본 15분) -->
        <idle-timeout-minutes>1</idle-timeout-minutes>
        <!-- JDBC Resource의 Unclosed에 대한 모니터링 활성화 여부 -->
        <track-statements>true</track-statements>
        <!-- 모든 커넥션을 다 소진했을 때 대기하는 시간(ms) -->
        <blocking-timeout-millis>5000</blocking-timeout-millis>
        <!-- 트랜잭션 Query Timeout을 적용 -->
        <set-tx-query-timeout/>
        <!-- 트랜잭션 Query Timeout의 시간을 5분으로 설정 -->
        <query-timeout>300</query-timeout>
        <!-- 커넥션 풀에서 커넥션을 넘겨받기 전에 여전히 커넥션이 유효한지 검증하는 Checker. pingDatabase 메소드를 사용 -->
        <valid-connection-checker-class-name>org.jboss.resource.adapter.jdbc.vendor.OracleValidConnectionChecker</valid-connection-checker-class-name-->
        <!-- 치명적 에러시 사용하는 Oracle 에러 코드와 메시지를 확인 -->
        <exception-sorter-class-name>org.jboss.resource.adapter.jdbc.vendor.OracleExceptionSorter</exception-sorter-class-name>
        <!-- 새로운 커넥션을 획득했을 때 호출하는 SQL문 -->
        <new-connection-sql>some arbitrary sql</new-connection-sql>
        <!-- Connection Pool에서 커넥션을 얻었을 때 얻은 커넥션에 대해서 호출하는 SQL문 -->
        <check-valid-connection-sql>some arbitrary sql</check-valid-connection-sql>
        <!-- standardjbosscmp-jdbc.xml 파일내에 정의되어 있는 type-mapping과 일치 -->
        <metadata>
           <type-mapping>Oracle9i</type-mapping>
        </metadata>
      </local-tx-datasource>
    </datasources>

또는

  1. [C:\jboss-4.2.3.GA\server\default\deploy]에 저장해 둔다.
    <?xml version="1.0" encoding="UTF-8"?>
    <datasources>
      <local-tx-datasource>
        <jndi-name>OracleDS</jndi-name>
        <connection-url>jdbc:oracle:thin:@192.168.1.2:1521:orcl</connection-url>
        <!--
            Here are a couple of the possible OCI configurations.
            For more information, see http://otn.oracle.com/docs/products/oracle9i/doc_library/release2/java.920/a96654/toc.htm
        <connection-url>jdbc:oracle:oci:@youroracle-tns-name</connection-url>
            or
        <connection-url>jdbc:oracle:oci:@(description=(address=(host=youroraclehost)(protocol=tcp)(port=1521))(connect_data=(SERVICE_NAME=yourservicename)))</connection-url>
            Clearly, its better to have TNS set up properly.
         -->
        <driver-class>oracle.jdbc.driver.OracleDriver</driver-class>
        <user-name>dbaccessid</user-name>
        <password>dbaccesspassword</password>
        <!-- Uses the pingDatabase method to check a connection is still valid before handing it out from the pool -->
        <!--valid-connection-checker-class-name>org.jboss.resource.adapter.jdbc.vendor.OracleValidConnectionChecker</valid-connection-checker-class-name-->
        <!-- Checks the Oracle error codes and messages for fatal errors -->
        <exception-sorter-class-name>org.jboss.resource.adapter.jdbc.vendor.OracleExceptionSorter</exception-sorter-class-name>
            <!-- sql to call when connection is created
            <new-connection-sql>some arbitrary sql</new-connection-sql>
            -->
            <!-- sql to call on an existing pooled connection when it is obtained from pool - the OracleValidConnectionChecker is prefered
            <check-valid-connection-sql>some arbitrary sql</check-valid-connection-sql>
            -->
          <!-- corresponding type-mapping in the standardjbosscmp-jdbc.xml (optional) -->
          <metadata>
             <type-mapping>Oracle11g</type-mapping>
          </metadata>
      </local-tx-datasource>
    </datasources>

 

context-root 패스 변경하기#

내가 추가한 war에 특정 url할당하기#

war패키지 안의 WEB-INF/jboss-web.xml 파일을 만들어서 그 내용을 다음과 같이 수정한다.

  1. <jboss-web>
      <context-root>/myapp</context-root>
    </jboss-web>

위와 같이 하면 http://my.domain.com/myapp 라는 주소로 내가 만든 war파일을 액세스 할 수 있다.

 

사이트 root에 내 war할당하기#

  1. <jboss-web>
      <context-root>/</context-root>
    </jboss-web>

위와 같이 루트를 할당해버리면 최상위 디렉토리로 접속 가능하다. 혹시 사이트가 갱신되지 않을때는 '새로고침'을 하면 바뀔 것이다.

 

jboss의 virtual hosting#

http://nagpals.com/blog/post.cfm/running-railo-and-adobe-coldfusion-on-the-same-context-root-in-jboss

http://www.jboss.org/community/wiki/VirtualHosts

 

출처:  http://alexk.springnote.com/pages/2975760

 

Posted by 굿데이

댓글을 달아 주세요

  1. 이전 댓글 더보기
  2. BlogIcon 匿名 2014.09.29 20:54  댓글주소  수정/삭제  댓글쓰기

    이용약관위배로 관리자 삭제된 댓글입니다.

  3. BlogIcon 匿名 2014.09.29 20:55  댓글주소  수정/삭제  댓글쓰기

    이용약관위배로 관리자 삭제된 댓글입니다.

  4. BlogIcon 匿名 2014.09.29 20:55  댓글주소  수정/삭제  댓글쓰기

    이용약관위배로 관리자 삭제된 댓글입니다.

  5. BlogIcon 匿名 2014.09.29 20:56  댓글주소  수정/삭제  댓글쓰기

    이용약관위배로 관리자 삭제된 댓글입니다.

  6. BlogIcon 匿名 2014.09.29 20:57  댓글주소  수정/삭제  댓글쓰기

    이용약관위배로 관리자 삭제된 댓글입니다.

  7. BlogIcon 匿名 2014.09.29 20:58  댓글주소  수정/삭제  댓글쓰기

    이용약관위배로 관리자 삭제된 댓글입니다.

  8. BlogIcon 匿名 2014.09.29 20:59  댓글주소  수정/삭제  댓글쓰기

    이용약관위배로 관리자 삭제된 댓글입니다.

  9. BlogIcon 匿名 2014.09.29 20:59  댓글주소  수정/삭제  댓글쓰기

    이용약관위배로 관리자 삭제된 댓글입니다.

  10. BlogIcon 匿名 2014.09.29 21:00  댓글주소  수정/삭제  댓글쓰기

    이용약관위배로 관리자 삭제된 댓글입니다.

  11. BlogIcon 匿名 2014.09.29 21:01  댓글주소  수정/삭제  댓글쓰기

    이용약관위배로 관리자 삭제된 댓글입니다.

  12. BlogIcon 匿名 2014.09.29 21:02  댓글주소  수정/삭제  댓글쓰기

    이용약관위배로 관리자 삭제된 댓글입니다.

  13. BlogIcon 匿名 2014.09.29 21:03  댓글주소  수정/삭제  댓글쓰기

    이용약관위배로 관리자 삭제된 댓글입니다.

  14. BlogIcon 匿名 2014.09.29 21:04  댓글주소  수정/삭제  댓글쓰기

    이용약관위배로 관리자 삭제된 댓글입니다.

  15. BlogIcon 匿名 2014.09.29 21:04  댓글주소  수정/삭제  댓글쓰기

    이용약관위배로 관리자 삭제된 댓글입니다.

  16. BlogIcon 匿名 2014.09.29 21:05  댓글주소  수정/삭제  댓글쓰기

    이용약관위배로 관리자 삭제된 댓글입니다.

  17. BlogIcon 匿名 2014.09.29 21:06  댓글주소  수정/삭제  댓글쓰기

    이용약관위배로 관리자 삭제된 댓글입니다.

  18. BlogIcon 匿名 2014.09.29 21:06  댓글주소  수정/삭제  댓글쓰기

    이용약관위배로 관리자 삭제된 댓글입니다.

  19. BlogIcon 匿名 2014.09.29 21:07  댓글주소  수정/삭제  댓글쓰기

    이용약관위배로 관리자 삭제된 댓글입니다.

  20. BlogIcon 匿名 2014.09.29 21:08  댓글주소  수정/삭제  댓글쓰기

    이용약관위배로 관리자 삭제된 댓글입니다.

  21. BlogIcon 匿名 2014.10.01 04:24  댓글주소  수정/삭제  댓글쓰기

    이용약관위배로 관리자 삭제된 댓글입니다.

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 굿데이

댓글을 달아 주세요

  1. BlogIcon louis vuitton outlet 2013.07.20 08:04  댓글주소  수정/삭제  댓글쓰기

    당신 매력있어, 자기가 얼마나 매력있는지 모르는게 당신매력이야

  2. BlogIcon nike free run 2013.07.26 18:25  댓글주소  수정/삭제  댓글쓰기

    지금은 반짝반짝 빛이 나겠지,, 하지만 시간이 흐르면 그빛은 사라저버릴거야,지금 우리처럼

  3. BlogIcon 匿名 2014.07.10 17:07  댓글주소  수정/삭제  댓글쓰기

    이용약관위배로 관리자 삭제된 댓글입니다.

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 굿데이

댓글을 달아 주세요

  1. BlogIcon Ray Ban outlet 2013.07.26 17:46  댓글주소  수정/삭제  댓글쓰기

    창밖을 봐 바람에 나뭇가지가 살며시 흔들리면 네가 사랑하는 사람이 널 사랑하고 있는거야.

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 굿데이

댓글을 달아 주세요

  1. BlogIcon Chicago Blackhawks Jersey 2013.07.24 19:04  댓글주소  수정/삭제  댓글쓰기

    사람들은 죽을걸 알면서도 살잖아 .사랑은 원래 유치한거에요