반응형
반응형
반응형

문자스트림: 16비트 유니코드 문자 데이터를 다룬다.(2bytes = 16bit)
바이트스트림: 8비트 데이터를 다룬다.(1bytes = 8bit)

스트림 : 입력스트림 : 출력스트림
문자스트림: Reader : Writer
바이트스트림: InputStream : OuputStream


File file = new File();

FileWriter fw = new Filewriter(file)

fileoutputstream(file)

bufferedwriter(fw)

printwriter(fw)

 

직렬화된 객체에 대한 작업을 할때는
연결스트림인 FileOutputStream 과 FileInputStream에
연쇄스트림인 ObjectOutputStream과 ObjectInputStream을 써서 처리

텍스트 파일에 대한 작업을 할 때는
연결스트림인 FileWriter 와 FileReader 을 쓰고,
효율향상을 위한 연쇄스트림인 BufferedWriter 와 BufferedReader 를 사용

 

FileWriter 클래스에 PrintWriter 클래스를 붙여 println() 메소드를 포함한 편리한 메소드를 사용
(성능면에선 별로 - 사용 자제..ㅋ)

반응형
반응형


1. LOG4J 구조
① Logger(Category) : 로그의 주체 (로그 파일을 작성하는 클래스)
 - 로깅 메세지를 Appender에 전달합니다.
 - Log4j의 심장부에 위치하며, 개발자가 로그출력 여부를 런타임에 조정되도록 해준다.
 - Logger는 로그레벨을 가지고 있으며, 로그의 출력여부는 로그문의 레벨과 로거의 레벨을 가지고 결정된다.
 - 어플리케이션을 작성하기전 어떤 로거를 사용해야 할지 정해야 한다.
   ex) static Logger logger = Logger.getLogger(getClass());


② Appender : 로그를 출력하는 위치
 - 전달된 로깅 메세지를 파일에다 기록할 것인지, 콘솔에 출력할 것인지 아니면 DB에 저장할 것인지 매개체 역활을 합니다.


③ Layout : Appender의 출력포맷
 - 어떤 형식으로 출력할 것이지 출력 layout을 결졍합니다.

 ※ Layout의 종류
 1) DateLayout
 2) HTMLLayout
 3) PatternLayout (일반적으로 PatternLayout을 사용하는 것이 디버깅에 가장 적합함)
 4) SimpleLayout
 5) XMLLayout

 

2. LOG4J 로깅 레벨
① FATAL : 가장 크리티컬한 에러가 일어 났을 때 사용합니다.
② ERROR : 일반 에러가 일어 났을 때 사용합니다.
③ WARN : 에러는 아니지만 주의할 필요가 있을 때 사용합니다.
④ INFO : 일반 정보를 나타낼 때 사용합니다.
⑤ DEBUG : 일반 정보를 상세히 나타낼 때 사용합니다

 

3. 설정 포맷

① 로그파일명 포맷 (DatePattern)
 - 로그파일명 포맷입니다. 날짜, 시간 및 분단위로까지 로그 파일을 분리할 수 있습니다.

 ※ 형식 설명
  '.'yyyy-MM 매달 첫번째날에 로그파일을 변경합니다
  '.'yyyy-ww 매주의 시작시 로그파일을 변경합니다. 
  '.'yyyy-MM-dd 매일 자정에 로그파일을 변경합니다.
  '.'yyyy-MM-dd-a 자정과 정오에 로그파일을 변경합니다.
  '.'yyyy-MM-dd-HH 매 시간의 시작마다 로그파일을 변경합니다.
  '.'yyyy-MM-dd-HH-mm 매분마다 로그파일을 변경합니다.


② PatternLayout 포맷
 - 로그자체를 어떤 포맷으로 남길지 결정합니다.
 - layout에는 HTMLLayout, PatternLayout, SimpleLayout, XMLLayout등이 있으며 PatternLayout이 일반적으로 가장 많이 쓰입니다.


%p  debug, info, warn, error, fatal 등의 priority 가 출력된다.
%m  로그내용이 출력됩니다
%d  로깅 이벤트가 발생한 시간을 기록합니다. 포맷은 %d{HH:mm:ss, SSS}, %d{yyyy MMM dd HH:mm:ss, SSS}같은 형태로 사용하며 SimpleDateFormat에 따른 포맷팅을 하면 된다
%t  로그이벤트가 발생된 쓰레드의 이름을 출력합니다.
%%  % 표시를 출력하기 위해 사용한다.
%n  플랫폼 종속적인 개행문자가 출력된다. \r\n 또는 \n 일것이다.
%c  카테고리를 표시합니다. 예) 카테고리가 a.b.c 처럼 되어있다면 %c{2}는 b.c가 출력됩니다.
%C  클래스명을 포시합니다. 예) 클래스구조가 org.apache.xyz.SomeClass 처럼 되어있다면 %C{2}는 xyz.SomeClass 가 출력됩니다
%F  로깅이 발생한 프로그램 파일명을 나타냅니다.
%l  로깅이 발생한 caller의 정보를 나타냅니다
%L  로깅이 발생한 caller의 라인수를 나타냅니다
%M  로깅이 발생한 method 이름을 나타냅니다.
%r  어플리케이션 시작 이후 부터 로깅이 발생한 시점의 시간(milliseconds)
%x  로깅이 발생한 thread와 관련된 NDC(nested diagnostic context)를 출력합니다.
%X  로깅이 발생한 thread와 관련된 MDC(mapped diagnostic context)를 출력합니다.


test.jsp

[%c] [%C] [%d] [%F] [%l] [%L] [%m] [%M] [%n] [%p] [%r] [%t] [%x] [%X]

[test.jsp] [org.apache.jsp.test_jsp] [2005-03-10 12:37:23,561] [test_jsp.java] [org.apache.jsp.test_jsp._jspService(test_jsp.java:64)] [64] [fatal!!] [_jspService] [개행] [FATAL] [765567] [http-8080-Processor25] [] []

반응형
반응형

# Log4j Setting file(DEBUG ~ FATAL, OFF 일 경우 로그 사용 안함), 사용 로그 이름(appender 이름)
log4j.rootLogger=INFO, console


# log level and appender
log4j.logger.com.some=DEBUG, console
log4j.logger.com.some.Any=INFO, logfile
log4j.additivity.com.some=false  // 상위 로거의 속성을 상속받지 않겠다.(중복 출력하지 않는다)


# Console log
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=%-5p %l - %m%n


# Daily file log
log4j.appender.logfile=org.apache.log4j.DailyRollingFileAppender
log4j.appender.logfile.Append=true // restart 시 기존 파일에 추가, false : 새로 씀.
log4j.appender.logfile.Threshold=DEBUG // 이 appender 는 여기 명시된 priority 와 같거나 높은 메세지만 로깅한다
log4j.appender.logfile.ImmediateFlush=true // 로그메세지들이 전혀 버퍼되지 않는 것을 의미하며 대부분의 상황에 적당하다.
log4j.appender.logfile.File=./log_app.csv
log4j.appender.logfile.DatePattern='.'yyyy-MM-dd
log4j.appender.logfile.MaxFileSize=300KB
log4j.appender.logfile.MaxBackupIndex=1 // 최대 파일이 넘어갔을 경우 백업
log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
log4j.appender.logfile.layout.ConversionPattern=[%d{HH:mm:ss}][%-5p](%F:%L) - %m%n


# DB로그를 작성하기 위해서는 위와 같이 DB에 Table을 만들어야 한다
# jdbcappender.jar, ojdbc14.zip 파일 필요.

CREATE TABLE APP_LOG
(
  SYSTEMNAME  VARCHAR2(100 BYTE),
  LOGDATE     TIMESTAMP DEFAULT SYSDATE,
  LOGLEVEL    VARCHAR2(100 BYTE),
  MDC1        VARCHAR2(100 BYTE),
  MDC2        VARCHAR2(100 BYTE),
  MESSAGE     VARCHAR2(4000 BYTE),
  TROWABLE    VARCHAR2(4000 BYTE)
)

log4j.appender.dblog=org.apache.log4j.jdbcplus.JDBCAppender
log4j.appender.dblog.url=jdbc:oracle:thin:@127.0.0.1:1521:MCSDB // DB url 정의
log4j.appender.dblog.dbclass=oracle.jdbc.driver.OracleDriver  // DB 드라이버 클래스 정의
log4j.appender.dblog.username=sds     // DB User 정의
log4j.appender.dblog.password=sdsdb     // DB Password 정의
log4j.appender.dblog.sql=INSERT INTO APP_LOG( SYSTEMNAME, LOGDATE, LOGLEVEL, MDC1,MDC2, MESSAGE, TROWABLE ) values ('MCSMGR',TIMESTAMP '@TIMESTAMP@','@PRIO@','@MDC:APP@','@MDC:TSC@','@MSG@','@THROWABLE@') // INSERT SQL문 정의
log4j.appender.dblog.layout=org.apache.log4j.PatternLayout
log4j.appender.dblog.layout.ConversionPattern=%m
log4j.appender.dblog.buffer=1      // DB를 Update하기 전까지 SQL문의 Buffer 개수. 1이면 바로 Update 함
log4j.appender.dblog.commit=true     // commit 여부
log4j.appender.dblog.quoteReplace=true     // single quotes (')를 2 single quotes ('')로 변경 여부
log4j.appender.dblog.throwableMaxChars=3000    // throwable/exception stack trace의 최대 문자 개수 정의

반응형

'프로그래밍 > Java' 카테고리의 다른 글

IOStream 관련..  (0) 2009.07.21
[log4j] log4j 에 대한 설명.  (0) 2009.07.10
Enum 사용법.  (0) 2009.07.07
quartz 사용시 UserTransaction 에러 발생시 해결.  (0) 2009.06.18
abstract 와 interface 의 차이.  (0) 2009.06.05
반응형


###### Gender.java

public enum Gender {
 MALE("하하")
 , FEMAIL("호호");
 
 private String sound;
 
 Gender(String arg) {
  this.sound = arg;
 }
 
 String getSound() {
  return sound;
 }
}






####### TestEnum.java

public class TestEnum {

 /**
  * @param args
  */
 public static void main(String[] args) {
  // TODO Auto-generated method stub
  
  // 외부에서 정의.
  System.out.println(" ================ 외부 정의 Enum ===============");
  Gender d = Gender.MALE;
  
  switch (d) {
   case MALE: System.out.println("싫어");break;
         default:        System.out.println("좋아");break;
  }
  
  for(Gender g : Gender.values()){
      System.out.println(g);
      System.out.println("name : " + g.name());
   System.out.println("ordinal : " + g.ordinal());
      System.out.println("sound : " + g.getSound());
  }
  
  
  // 내부에서 정의.
  System.out.println(" ================ 내부 정의 Enum ===============");
  Gender2 d2 = Gender2.FEMAIL;
  
  switch (d2) {
   case MALE: System.out.println("싫어");break;
         default:        System.out.println("좋아");break;
  }
  
  for(Gender2 g : Gender2.values()){
   System.out.println(g);
   System.out.println("name : " + g.name());
   System.out.println("ordinal : " + g.ordinal());
  }
  
 }
 
 public enum Gender2 {
  MALE, FEMAIL
 }
}





################ 결과


 ================ 외부 정의 Enum ===============
싫어
MALE
name : MALE
ordinal : 0
sound : 하하
FEMAIL
name : FEMAIL
ordinal : 1
sound : 호호
 ================ 내부 정의 Enum ===============
좋아
MALE
name : MALE
ordinal : 0
FEMAIL
name : FEMAIL
ordinal : 1

반응형
반응형
JVM 메모리 용량 세팅.


-Xms128m -Xmx128m -XX:MaxPermSize=128m


이클립스

 Window -> Preferences -> Tomcat -> JVM Settings -> Append to JVM Parameters

에 추가.

반응형

'프로그래밍 > Java' 카테고리의 다른 글

jstl 예제 - fn, fmt, foreach  (2) 2009.02.18
JSTL  (0) 2009.02.18
[JSTL] 사용법  (0) 2009.02.11
StringTokenizer 와 String.split()  (0) 2009.02.11
JSTL fmt  (0) 2009.02.11
반응형

▣ JSTL(JSP Standard TAG Library)의 사용
   - 많이 사용되는 사용자 정의 태그를 모아서 JSTL이라는 규약이 만들어졌습니다. 
   - 스크립틀릿, 표현식을 사용하는 것보다 훨씬 간결한 문법 구조를 지원합니다.
   - JSTL은 5가지의 태그를 지원합니다.
    라이브러리    기능                                 접두어    관련 URL
   -----------------------------------------------------------------------------------------------
   Core          변수지원, 흐름 제어, URL 처리        c         http://java.sun.com/jsp/jstl/core
   XML           XML 코어, 흐름 제어, XML 변환        x         http://java.sun.com/jsp/jstl/xml
   국제화        지역, 메시지 형식, 숫자 및 날짜 형식 fmt       http://java.sun.com/jsp/jstl/fmt
   데이터베이스  SQL                                  sql       http://java.sun.com/jsp/jstl/sql
   함수          콜렉션 처리, String 처리             fn        http://java.sun.com/jsp/jstl/functions

 

1. 설치(JSTL을 사용하기 위한 환경)
   - http://jakarta.apache.org/taglibs/doc/standard-doc/intro.html
     . Standard Taglib nightly snapshot에서 다운합니다.

   - 압축을 해제한 후 "F:\JAVA\jstl\jakarta-taglibs-standard-20050804\jakarta-taglibs\standard\lib"폴더안
     에 있는'jstl.jar', 'standard.jar'파일을 "D:\tomcat-5.0.19\common\lib" 폴더로 복사합니다.

 

 

 

▩ Core Tag

기능        태그명     기능설명
---------------------------------------------------------------------------
변수 지원   set        jsp에서 사용될 변수를 설정합니다.
            remove     설정한 변수를 제거합니다.
---------------------------------------------------------------------------
흐름 제어   if         조건에 따라 내부 코드를 수행합니다.
            choose     다중 조건을 처리할 때 사용됩니다.
            forEach    Collection의 각 항목을 처리할 때 사용합니다.
            forTokens  구분자로 분리된 각각의 토큰을 처리할 때 사용합니다.
---------------------------------------------------------------------------
URL 처리    import     URL을 사용하여 다른 자원의 결과를 삽입합니다.
            redirect   지정한 경로로 이동합니다.
            url        URL을 재 작성합니다.
---------------------------------------------------------------------------
기타 태그   catch      예외 처리에 사용합니다.
            out        jspWriter에 내용을 알맞게 처리한 후 출력합니다.
---------------------------------------------------------------------------

 

 

 

▩ EL & JSTL의 사용 - Core Tag: 변수 지원 태그의 사용

1. 변수지원 태그, http://127.0.0.1:8080/jstl/setTag.jsp
<%@ page contentType = "text/html; charset=euc-kr" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<c:set var="num1" value="${20}" />
<c:set var="num2">
10.5
</c:set>
<c:set var="today" value="<%= new java.util.Date() %>" />
<html>
<head>
    <title>set 태그와 remove 태그</title>
</head>
<body>
변수 num1 = ${num1} <br>
변수 num2 = ${num2} <br>
num1 + num2 = ${num1 + num2} <br>
오늘은 ${today} 입니다.

<c:remove var="num1" scope="page" />

<p>
삭제한 후의 num1 = ${num1} <br>
삭제한 후의 num1 + num2 = ${num1 + num2}
</body>
</html>

 

 


2. Map 객체의 사용, http://127.0.0.1:8080/jstl/setTag2.jsp
<%@ page contentType = "text/html; charset=euc-kr" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<c:set var="map" value="<%= new java.util.HashMap() %>" />
<html>
<head>
    <title>set 태그와 remove 태그</title>
</head>
<body>
<c:set target="${map}" property="name" value="왕눈이" />

변수 map에 저장된 name 값: ${map.name}

</body>
</html>

 

 

 

▩ EL & JSTL의 사용 - Core Tag: 흐름 제어 태그의 사용

1. if 흐름제어 태그의 사용
   - http://127.0.0.1:8080/jstl/ifTag.jsp
   - http://127.0.0.1:8080/jstl/ifTag.jsp?name=tree
   - http://127.0.0.1:8080/jstl/ifTag.jsp?name=tree&age=25
   - 한글은 비교가 안됩니다.

<%@ page contentType = "text/html; charset=euc-kr" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head><title>if 태그</title></head>
<body>
<c:if test="true">
무조건 수행<br>
</c:if>

<c:if test="${param.name == 'tree'}">
name 파라미터의 값이 ${param.name} 입니다.<br>
</c:if>

<c:if test="${18 < param.age}">
당신의 나이는 18세 이상입니다.
</c:if>
</body>
</html>

 

 


2. choose Tag
   - when tag는 조건이 true이면 실행합니다.
   - http://127.0.0.1:8080/jstl/chooseTag.jsp

<%@ page contentType = "text/html; charset=euc-kr" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head><title>choose 태그</title></head>
<body>

<ul>
<c:choose>
  <c:when test="${param.name == 'bk'}" >
    <li> 당신의 이름은 ${param.name} 입니다.
  </c:when>
  <c:when test="${param.age > 18}" >
    <li> 당신은 18세 이상입니다.
  </c:when>
  <c:otherwise>
    <li> 당신은 'bk'가 아니고 18세 이상이 아닙니다.
  </c:otherwise>
</c:choose>
</ul>

</body>
</html>

 

 


3. forEach 태그
   - Collection, Map, 배열에 저장되어 있는 값에 순차적으로 접근시에 사용합니다.
   - http://127.0.0.1:8080/jstl/forEachTag.jsp

<%@ page contentType = "text/html; charset=euc-kr" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%
    java.util.HashMap mapData = new java.util.HashMap();
    mapData.put("name", "아로미");
    mapData.put("today", new java.util.Date());
%>
<c:set var="intArray" value="<%= new int[] {1,2,3,4,5} %>" />
<c:set var="map" value="<%= mapData %>" />
<html>
<head><title>forEach 태그</title></head>
<body>
<h4>1부터 100까지 홀수의 합</h4>
<c:set var="sum" value="0" />
<c:forEach var="i" begin="1" end="100" step="2">
<c:set var="sum" value="${sum + i}" />
</c:forEach>
결과 = ${sum}

<h4>구구단: 4단</h4>
<ul>
<c:forEach var="i" begin="1" end="9">
   <li>4 * ${i} = ${4 * i}
</c:forEach>
</ul>

<h4>int형 배열</h4>

<c:forEach var="i" items="${intArray}" begin="2" end="4">
    [${i}]
</c:forEach>

<h4>Map</h4>

<c:forEach var="i" items="${map}">
    ${i.key} = ${i.value}<br>
</c:forEach>

</body>
</html>

 

 


4. forTokens Tag
   - http://127.0.0.1:8080/jstl/forTokensTag.jsp
<%@ page contentType = "text/html; charset=euc-kr" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<html>
<head><title>forTokens 태그</title></head>
<body>

콤마와 점을 구분자로 사용:<br>
<c:forTokens var="token"
             items="빨강색,주황색.노란색.초록색,파랑색,남색.보라색"
             delims=",.">
${token}
</c:forTokens>

</body>
</html>


반응형

'프로그래밍 > Java' 카테고리의 다른 글

JSTL  (0) 2009.02.18
[이클립스] JVM 메모리 용량 세팅  (0) 2009.02.11
StringTokenizer 와 String.split()  (0) 2009.02.11
JSTL fmt  (0) 2009.02.11
배열 정렬.  (0) 2009.02.11
반응형
StringTokenizer 와 String.split()
가끔씩 StringTokenzer를 사용해서 문자열을 분해 할 때 특정 요소의 값이 없을 경우 처리하는 것에 대한 질문을 받아서 문자열을 특정 구분자를 기준으로 분해 하는 것에 대해 정리를 해봤습니다.

jdk1.4.x를 기준으로 정리한 것입니다.

잘 못 된 부분이 있으면 지적 해주십시요.

---------------------------------------------------------------------------------------------

특정 구분자(경계기호:Delimter)를 기준으로 문자열을 분해 할 때 흔히 사용하는 방법이 java.util.StringTokenizer를 이용해서 분해를 하거나 jdk1.4대에 새로 추가 된 java.lang.String.split(String regex)을 사용하는 방법입니다.



이들 둘은 "문자열에서 특정 구분자를 기준으로 문자열을 분해 한다"는 기본 기능은 같지만 그 결과는 "분해 할 문자열이 어떻게 구성이 되어 있느냐"에 따라서 서로 다른 결과값을 도출합니다.



예를 살펴보기 위해서 다음과 같은 가정을 하겠습니다.

분해 할 문자열은 "아이디, 이름, 전자우편주소,휴대전화"로 구성 된다.
"아이디, 이름" 이외의 항목은 있을 수도 있고 그렇지 않을 수도 있다.
각 항목을 구분하는 구분자는 ","로 한다.
1. 먼저 각 항목이 모두 존재 하는 경우를 살펴 보겠습니다. 이 경우라면 다음과 같은 형태가 될 것입니다.

neoburi,inkuk,neoburi@neoburi.com,019-366-5815
이 경우는 다음과 같이 분해를 할 수 있을 것입니다.

String str = "neoburi,inkuk,neoburi@neoburi.com,019-366-5815";

String[] values = str.split(",");

또는,

StringTokenizer values = new StringTokenizer( str, "," );

이 때에는 String.split(String regex)이나 StringTokenizer의 결과 값은 같게 나옵니다.



그런데 문제는 이렇게 모든 항목이 존재하지 않는 경우가 있을 때입니다.




2. 일부 항목만으로 문자열이 구성 된 경우를 살펴 보겠습니다.



예를 든다면 다음과 같은 값을 가질 때겠지요.

"아이디,이름,,전화번호" 일 경우
"아이디,이름,전자우편," 일 경우
또는 "아이디,이름,," 일 경우
1) "아이디,이름,,전화번호" 일 경우를 살펴 보겠습니다.

문자열은 다음과 같이 구성이 될 것입니다.



String str = "neoburi,inkuk,,019-366-5815";



String[] values = str.split(",");을 사용 할 경우 해보면 결과는 아래와 같습니다.
for( int x = 0; x < values.length; x++ ){

System.out.println( "문자(열) " + (x+1) + " : " + values[x] );

}



결과 :

문자(열) 1 : neoburi

문자(열) 2 : inkuk

문자(열) 3 :

문자(열) 4 : 019-366-5815



StringTokenizer tokens = new StringTokenizer( str, "," );를 사용 할 경우
for( int x = 1; tokens.hasMoreElements(); x++ ){

System.out.println( "문자(열) " + x + " : " + tokens.nextToken() );

}



결과 :

문자(열) 1 : neoburi

문자(열) 2 : inkuk

문자(열) 3 : 019-366-5815



결과와 같이 split(String regex)을 이용한 경우에는 비록 값이 존재하지 않더라고 해당 데이터가 없다는 것을 확실하게 판단을 할 수 있습니다. 즉 구분자를 기준으로 데이터가 없는 부분도 그 결과를 반환해준다는 얘기지요.



그렇지만 StringTokenizer는 비록 구분자로 문자열간 구분이 되어 있더라도 구분자와 구분자 사이에 데이터가 존재하지 않으면 (",,"의 경우) 해당 데이터는 무시를 하고 실제 값이 존재하는 부분만 값을 반환합니다.



두 결과 사이에는 많은 차이가 남을 볼 수 있습니다.

2) "아이디,이름,전자우편," 일 경우

이 역시 문자열은 다음과 같이 구성이 될 것입니다.



String str = "neoburi,inkuk,neoburi@neoburi.com,";



String[] values = str.split(",");
for( int x = 0; x < values.length; x++ ){

System.out.println( "문자(열) " + (x+1) + " : " + values[x] );

}



결과 :

문자(열) 1 : neoburi

문자(열) 2 : inkuk

문자(열) 3 : neoburi@neoburi.com



StringTokenizer tokens = new StringTokenizer( str, "," );
for( int x = 1; tokens.hasMoreElements(); x++ ){

System.out.println( "문자(열) " + x + " : " + tokens.nextToken() );

}

결과 :

문자(열) 1 : neoburi

문자(열) 2 : inkuk

문자(열) 3 : neoburi@neoburi.com



위에서 보는 바와 같이 분해하고자 하는 문자열의 마지막 요소가 존재하지 않을 경우 String.split(String regex)과 StringTokenizer는 같은 결과를 보여줍니다.



두 결과사이에는 차이가 없음에도 불구하고 잃어 버리는 데이터가 생겼습니다. 개발자는 분명히 사용자의 정보로부터 4개의 항목을 얻어 표현을 하고 싶지만 그렇게 할 수가 없습니다. 물론 어거지로 한다면 가능은 하겠지만요.^^



그러면 String.split(String regex)과 StringTokenizer를 사용 하더라고 분해하고자 하는 마지막 항목이 없을 경우는 분해 할 방법이 없을까요? 그렇지 않습니다.



API를 어느정도 보신 분들이라면 아마 "그것은 이렇게 하면 되지!"라고 속으로 생각 하실 겁니다.



java.lang.String클래스에는 split()메소드가 2개가 있습니다.

하나는 split( String regex )이고
다는 하나는 split( String regex, int limit )입니다.
String.split( String regex, int limit )를 사용해서 분해를 해보겠습니다.

String[] values = str.split(",", 4);
for( int x = 0; x < values.length; x++ ){

System.out.println( "문자(열) " + (x+1) + " : " + values[x] );

}



결과 :

문자(열) 1 : neoburi

문자(열) 2 : inkuk

문자(열) 3 : neoburi@neoburi.com

문자(열) 4 :



비록 마지막 분해 요소의 값이 존재하지 않더라고 split( String regex, int limit )를 이용하면 고스란히 원하는 형태의 데이터를 얻는 것을 볼 수 있습니다.


StringTokenizer의 경우는 구분자 사이에 분해할 요소의 값이 존재하지 않으면 무시하게 되어 있습니다. 완전하게 모든 요소의 값이 존재하는 경우라면 사용을 해도 되겠지만 예에서 본 바와 같이 가변적인 데이터라면 사용하기 불편한(?) 것이 사실입니다.




String.split()의 경우 limit를 저정 하지 않았을 경우에는 제일 마지막에 오는 요소의 값이 없을 경우 그 요소를 무시하도록 되어 있습니다. 이 역시 데이터가 정형화 되어 있는 경우라면 사용해도 무리 없겠지만 가변요소가 존재 한다면 StringTokenizer와 크게 다를 게 없습니다.



대신 limit를 지정 했을 경우 해당 숫자만큼만 분해를 합니다. limit는 분해를 한 후 얻고자 하는 String[]의 요소크기라고 보시면 됩니다.

limit가 분해하고자 하는 요소의 개수와 같거나 클 경우 요소의 개수만큼의 String[]을 되돌려 주지만, 요소의 개수보다 작을 경우 지정한 숫자만큼의 String[]으로 되돌려 줍니다.

반응형

'프로그래밍 > Java' 카테고리의 다른 글

[이클립스] JVM 메모리 용량 세팅  (0) 2009.02.11
[JSTL] 사용법  (0) 2009.02.11
JSTL fmt  (0) 2009.02.11
배열 정렬.  (0) 2009.02.11
UTF-8 개발에 관한 정리  (0) 2009.02.11
반응형
JSTL

날짜 포멧..
<fmt:parseDate value='2007-11-11' var='contStartDate' pattern='yyyy-MM-dd'/>
<fmt:formatDate value='${contStartDate}' pattern='yyyyMMdd'/>



숫자 포멧.
<fmt:formatNumber type="number" maxFractionDigits="0" minFractionDigits="0" value="${item.price}" />

반응형

'프로그래밍 > Java' 카테고리의 다른 글

[JSTL] 사용법  (0) 2009.02.11
StringTokenizer 와 String.split()  (0) 2009.02.11
배열 정렬.  (0) 2009.02.11
UTF-8 개발에 관한 정리  (0) 2009.02.11
Request 내부 객체  (0) 2009.02.11
반응형
배열 정렬 함수.

ex)

String[] arr;

Arrays.sort(arr);

오름차순으로 정열됨.

^^

반응형

'프로그래밍 > Java' 카테고리의 다른 글

StringTokenizer 와 String.split()  (0) 2009.02.11
JSTL fmt  (0) 2009.02.11
UTF-8 개발에 관한 정리  (0) 2009.02.11
Request 내부 객체  (0) 2009.02.11
JSP 액션, 선언, 스크립트릿  (0) 2009.02.11
반응형
UTF-8 개발에 관한 정리입니다.

1. 모든 문서는 UTF-8 인코딩으로 저장되어야 합니다.

에디트 플러스의 경우 도구 -> 기본설정 -> 파일 부분에서 새 파일 형식을

UTF-8 로 해놓음으로써 새파일 작성시 UTF-8을 기본으로 작성할수 있고,

이미 다른 인코딩 타입에서 작성된 문서인 경우 내용을 모조리 Ctrl+C로 복사후

문서 -> 인코딩 변경 로드에서 UTF-8로 변경후 다시 붙여넣기 하면 됩니다.

 

이클립스의 경우 Package Explorer 에서 프로젝트에서 우측 버튼을 누른 후

Properties->Info->Text file encoding->Other 을 UTF-8 로 잡아주면 됩니다.

( 기존 다른 인코딩 타입에서 작성된 문서 내부 한글은 모조리 깨지게 됨 )

 

* ascii 로 작성된 자바스크립트 파일을 utf 문서에서 불러와 수행시킬 경우

자바스크립트 에러 나는 문제도 있더군요.(한글 주석이 영향을 줬을수도...)

 

2. jsp 파일 상단에는 다음과 같은 방식으로 UTF-8 설정합니다.

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

 

3. 서블릿은 다음과 같은 방식으로 UTF-8을 설정합니다.

request.setCharacterEncoding("utf-8")

 

4. 자바스크립트에서 encodeURIComponent 처리 및 톰캣 server.xml 의 설정 변경

위 1,2,3번의 방식으로 하면 post 방식의 데이터는 잘 받지만

get 방식의 데이터는 한글이 깨집니다.

이와 같은 경우 자바스크립트의 encodeURIComponent 함수와

server.xml 을 이용하여 처리하면 됩니다.

 

4.1 server.xml

톰캣 폴더의 conf 폴더에는 server.xml 파일이 존재합니다.

에디터로 열어보면

 

예)

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

 

값이 약간 틀릴수 있지만 초기 셋팅 값이 보통 저러하고,

Connector 은 초기에 2개가 있는데 8080 포트 부분을 수정하면 됩니다.

수정하는 방법은

URIEncoding="UTF-8" 을 추가하면 됩니다.

 

예)

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

 

위와 같이 했다고 해결되는 것은 아닙니다. get 방식으로 데이터를 전송하면

자바 파일에서 확인 했을 경우 물음표 값만 넘어옵니다.

 

get 방식으로 보낼 경우 자바스크립트로 변환을 해줍니다.

예를 들어 "한글"을 자바스크립트에서

<SCRIPT>alert( encodeURIComponent("한글") )</SCRIPT>

처럼 encodeURIComponent 함수로 변환하게 되면 %ED%95%9C%EA%B8%80 으로

변환됩니다. 이 값을 주소에 "한글" 대신에 넣게 되면 자바에서 알아서 잘~ 받습니다 ^^

 

5. HttpURLConnection 을 통하여 UTF-8 로 된 URL 을 읽을 경우.

다른 부분은 동일하고, 

BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream(), "UTF-8"));

로 변경합니다.

 

6. jsp -> bean 데이터 전송은 문제 없지만 jsp -> jsp 에서 한글이 깨진다면

받는 부분에서

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

 test = new String(test .getBytes("8859_1"), "UTF-8");

처럼 변환해서 저장합니다.

 

ps. 참고 사이트

http://cafe.naver.com/phpinfo.cafe?iframe_url=/ArticleRead.nhn%3Farticleid=434


반응형

'프로그래밍 > Java' 카테고리의 다른 글

JSTL fmt  (0) 2009.02.11
배열 정렬.  (0) 2009.02.11
Request 내부 객체  (0) 2009.02.11
JSP 액션, 선언, 스크립트릿  (0) 2009.02.11
파일 다운로드 구현할때 한글 이름 깨지는 문제..  (0) 2009.02.11

+ Recent posts