2014년 10월 21일 화요일

[ Tip] Mac에서 FileZilla 클라이언트가 화면 영역 밖으로 벗어난 경우 초기화 방법

이번에 파일질라가 클라이언트가 업데이트 문제인지 맥에서 화면 여역 밖으로 벗어 나는 경우가 발생하는 경우가 있다. (윈도우도 현상이 동한지 확인은 못했다.) 

이때 화면 중앙으로 초기화 하는 방법은 다음과 같다. 아래의 파일을 삭제해 주면 화면 중앙으로 초기화 하게 된다.

 /Users/[User]/.filezilla/filezilla.xml

또는 위의 파일을 열어서 아래의 부분을 수정해 주면 된다. 

<Setting name="Window position and size">0 18 24 944 665 </Setting>

 2번째 변수가 x,  3번째가 y 좌표 이므로 해당 값을 변경해 주면 된다. 

2014년 9월 16일 화요일

[css] input 필드의 입력 모드(한/영)를 제어 하는 ime-mode 속성 정리

input 필드의 입력 모드를 제어 하는 ime-mode  속성


input 필드에서 한/영 입력을 제어 하고 싶을때
css/style로 ime-mode 값을 설정 함으로써 제어가 가능하다.

속성은 다음과 같다.

auto (default) : 현재 모드 값을 사용한다.  한/영 변환 가능
inactive : 영문 모드로 자동 전환, 한/영 변화 가능
disabled : 영문 모드로 자동 전환 ,한/영 변환 불가
active : 한글 모드로 자동 전환, 한/영 변환 가능
deactivated: 한글기본, 한/영 전환 가능

ex> 영문/숫자만 입력하고 싶은 경우
<input type="text" name="name" value="" style="ime-mode:disabled;">


참조 : https://developer.mozilla.org/en-US/docs/Web/CSS/ime-mode

* 이 스타일 속성은 표준이 아니고 몇몇 브라우져에서는 정상 동작하지 않는 경우가 있으니 사용을 지양하는게 좋을것 같다. (크롬에서는 잘 동작하고 사파리에서는 정상 동작하지 않았다.)
* 가끔 가다가 특이한 케이스로 허용되지 않은 입력이 되는 경우가 있기 때문에 반드시 서버단에서 다시 확인을 해야 한다.

2014년 9월 11일 목요일

[javascript] jQuery에서 XML 파싱 하는 방법

jQuery 에서 xml 파싱하는 방법

<script>
function doSomething ( xmlData) {

    this.itemList = new Array();

    var xmlDoc = $.parseXML(xmlData);
    var $xml = $(xmlDoc);

    $xml.find('item').each(function (idx) {
        var item = new item(idx, $(this));
        this.itemList.push(item);
    });

    // 여기에서 파싱해서 만든 객체로 원하는 처리를 하면 됩니다.
}


var Item = function($xmlData) {
    var myItem = this;
    this.id = $xmlData.attr('id');
    this.type = $xmlData.attr('type');

    return myItem;
};

var xmlData = "<?xml version='1.0' encoding='UTF-8'?> " +
     "<Item id=‘id1’ type=‘triangle’>" +
     "</Item>" +
     "<Item id=‘id2’ type=‘square’>" +
     "</Item>" +
     "<Item id=‘id3’ type=‘circle’>" +
     "</Item>";
</script>

일반적으로 위와 같이 find 로 해서 each 로 사용하면 됩니다.
하지만 아래와 같이 item 엘리멘트가 상위와 하위에 중첩이 되어 있는 경우는
위 와 같은 방법은 문제가 생기게 됩니다.
find로 찾으면 상위에 있는것과 하위에 있는것을 모두 찾아 주기 때문에 다음과 같은 방법을 이용 하면 됩니다.

<script>
function doSomething ( xmlData) {

    this.itemList = new Array();
    this.groupList = new Array();

    var xmlDoc = $.parseXML(xmlData);
    var $xml = $(xmlDoc);

    $xmlData.children().each(function(idx1) {
        var eName = $(this)[0].tagName;

        if (eName == "Item) {
            var item = new Item($(this));
            this.itemList.push(item);
        } else if (eName == "Group") {
            var group = new Group($(this));
            this.groupList.push(group);
        }
    });


    // 여기에서 파싱해서 만든 객체로 원하는 처리를 하면 됩니다.
}


var Item = function($xmlData) {
    var myItem = this;

    this.itemList = new Array();
    this.groupList = new Array();

    this.id = $xmlData.attr('id');
    this.type = $xmlData.attr('type');


    $xmlData.children().each(function(idx1) {
     var eName = $(this)[0].tagName;

     if (eName == "Item) {
     var item = new Item($(this));
     this.itemList.push(item);
     } else if (eName == "Group") {
     var group = new Group($(this));
     this.groupList.push(group);
    }
  });

    return myItem;
};

var Group = function($xmlData) {
    var myGroup = this;
   
    this.itemList = new Array();
    this.groupList = new Array();

    $xmlData.children().each(function(idx1) {
        var eName = $(this)[0].tagName;
    
        if (eName == "Item) {
            var item = new Item($(this));
            myGroup.itemList.push(item);
        } else if (eName == "Group") {
            var group = new Group($(this));
            myGroup.groupList.push(group);
        }
    });

    return myGroup;
};

var xmlData = "<?xml version='1.0' encoding='UTF-8'?> " +
  "<Item id='id1' type='triangle'>" +
  "    <Group>" +
  "        <Item id='id1_sub1' type='triangle_sub'>" +
  "        </Item>" +
  "        <Item id='id1_sub2' type='triangle_sub'>" +
  "        </Item>" +
  "    </Group>" +
  "</Item>" +
  "<Item id='id2' type='square'>" +
  "</Item>" +
  "<Item id='id3' type='circle'>" +
  "</Item>";
</script>


** 더 좋은 방법이 있으면 조언 부탁드립니다. 

2014년 8월 6일 수요일

Tomcat 설치 후 보안 조치 기본 사항

Tomcat 설치 후 보안 조치 기본 사항


1.  log file 권한 설정 
로그 파일및 폴더 의 권한을 750 이하로 유지 한다.
이 값은  umask 값과 관련 있기 때문에 톰캣을 실행 하는 계정의 umask 값을 027 으로 설정한다.

설정은 계정의 shell 에 설정해도 되고 보통 tomcat 의 기동 스크립트에 아래의 명령을 넣어 준다.
umask 027

* 계정 공통 : /etc/profile  에 설정이 가능한다.


2. 불필요한 파일 제거

$tomcat/webapps 아래에 불 필요한 폴더를 제거 한다.

 - examples
 - docs


3. 관리자 폴더 권한 변경 

$tomcat/webapps  아래 관리자용 폴더들의 권한을 제한 한다.

host-manager, manager 폴더의 권한에서 other s 의 권한을 제거 한다.
아래 명령어를 통해서 others 의 권한을 제거 한다.

chmod -Rf o-rwx host-manager
chmod -Rf o-rwx manager

* 옵션 설명
    -Rf : 하위 폴더를 강제로 모두 적용
    o-rwx : others 의 rex 권한을 제거 한다.
* 보통 chmod 750 ./* 같은 명령어를 사용하는 경우 권한이 추가될수 있기 때문에 사용을 지양한다.

4. 로그 포맷 설정

log 파일의 포맷 pattern 설정을 combined로 설정

$tomcat/conf/server.xml 파일 설정 



2014년 6월 30일 월요일

[SVG] SVG element의 class 값을 jquery 이용해서 변경하기


SVG 의 element 의 class 변경 하기

이러한 경우  jQuery 에서 제공하는 removeClass/addClass  메소드가 동작하지 않는다.

변경하는 방법은 다음과 같다.

$('#elementId').attr('class', 'changeClass');

여러개를 적용 하려면 다음과 같이 여러개의 클래스명을 사용하면 된다.

$('#elementId').attr('class', 'changeClass1 changeClass2');


** 기존의 class 를 통째로 교체 하기 때문에 필요한 클래스를 모두 써줘야 한다.

2014년 6월 16일 월요일

[JavaScript] this 의 용법

this 키워드는 JavaScript 코드를 가지고 있는 객체를 지칭한다. 
function에서 사용 되는 경우 그 function 을 가지고 있는 객체를 지칭하고 객체에서 사용하면 객체 자체를 가르킨다. 

<script>
function Person (name, age) {
    this.name = name;
    this.age = age;

    this.sayHello = function () {
          var name = "Person";
          return this.name +  " : Hello " + name + ".";
    }
}

var smith = new Person("smith", 37);
console.log (smith.sayHello ()); // smith : Hello Person.
</script>

위의 예제에서 출력 결과는 "smith : Hello Person.”이다.


Person 바로 아래에 있는 this 는 현재 코드를 소유한 객체(smith)를 지칭하게 되고 sayHello 아래에서 this 는 function 소유한 객체를 가키게 된다. 즉, smith 이다.
따라서 sayHello 함수에서의 this는 함수 자신이 아닌 smith이다. 그래서 this.name은 “smith” 가 되고 name은 함수 내부의 변수 “Person”을 가르키게 된다. 

이와 비슷한 형태로 혼동하기 쉬운 상황이 있다. 

<script>
function civil() {
    var name = "Neo";

    function sayMyName() {
         console.log ("name : " + name); // name : Neo
         console.log ("this.name : " +  this.name); // this.name : 
    }
    sayMyName();
}
    
civil();
</script>

이와 같은 경우는 function 에서 사용되는 경우이다. 
현재 civil() 을 실행 시키는 주체 window 이므로 코드를 소유한 객체는 window 가 된다 따라서 this 키워드는 window 객체를 가르 키게 된다. 
따라서 이 경우 this.name 은 내용이 없어서 안찍게 된다. 
실제로  civil(); 을 window.civil(); 로 해도 동일하게 동작하게 된다.  



2014년 6월 5일 목요일

[SVG] Raphaeljs 사용 팁 - ID 와 Class 설정


1. element에 아이디 설정하기
svg  요소를 조작하기위해서 아이디를 설정해야 하는 경우가 있다. 이때 다음과 같이 설정하면 된다. 

element.node.id = myid;

*notice : set 인경우에 id 항목이 없다. 따라서 해당 element 까지 내려가서 설정해야 한다. 
 ex) set1[0][0].node.id = myid;


2. element 에 css용 클래스 설정하기 

 element.node.setAttribute("class","myclass");

*notice : 위와 동일

2014년 1월 14일 화요일

[java] spring3 + tiles3 설정 하기

A free open-sourced templating framework for modern Java applications.
    Based upon the Composite pattern it is built to simplify the development of user interfaces.

For complex web sites it remains
         the easiest and most elegant way to work alongside any MVC technology.
위의 내용은 Tiles 공식 홈페이지 메인에 나오는 문구 입니다.
대충 번역을 하면 아래와 같습니다. 
tiles 는 java 어플리케이션에서 사용하는 무료 오픈 소스 templating 프레임 워크 이다. 
Composite pattern 에 기초를 두었고 개발자가 사용자 인터페이스 만드는것을 간단하게 해준다. 
복잡한 웹 사이트를 위해서 tiles는 어떤 MVC 기술과 함께 작업하기에 가장 쉽고 상당히 세련된 방법 으로 남을것이다. 

이 내용이 Tiles 의 목적과 추구하는 방향에 대해서 간명하게 설명을 해주고 있습니다. 
Tiles 는 복잡한 웹사이트 개발을 쉽게 하기 위해서 개발된  무료 오픈 소스 templating  프레임 워크 입니다. 
공통된 요소 들을 부분 적으로 모듈화 해서 페이지를 runtime 시에 조립 가능하게 만들어 소스 코드의 중복을 줄이고 재새용 가능한 templates으로 만들수 있게 해줍니다. 

설정하는 방법은 아래의 순서대로 진행하면 됩니다. 

1. maven에서 라이브러리 설정하기(추가) 
    pom.xml 에 다음을 추가 한다. 


    <properties>
        <org.apache.tiles.version>3.0.3</org.apache.tiles.version>
    </properties>

    <dependency>
        <groupId>org.apache.tiles</groupId>
        <artifactId>tiles-jsp</artifactId>
        <version>${org.apache.tiles.version}</version>
    </dependency>
    <dependency>
        <groupId>org.apache.tiles</groupId>
        <artifactId>tiles-core</artifactId>
        <version>${org.apache.tiles.version}</version>
    </dependency>



2.스프링의  context-servlet.xml 에 설정하기
Tiles의 설정 파일과 viewResolver를 설정 합니다. 

    <beans:bean id="tilesViewResolver" class="org.springframework.web.servlet.view.UrlBasedViewResolver">
        <beans:property name="viewClass" value="org.springframework.web.servlet.view.tiles3.TilesView" />
        <beans:property name="order" value="1"/>
    </beans:bean>

    <beans:bean id="tilesConfigurer" class="org.springframework.web.servlet.view.tiles3.TilesConfigurer">
        <beans:property name="definitions">
            <beans:list>
                 <beans:value>/WEB-INF/tiles/tiles-layout.xml</beans:value>
            </beans:list>
        </beans:property>
    </beans:bean>


 3. 기본 템플릿 페이지를 만듭니다. 
(default_template.jsp 이란 이름으로 파일을 생성했습니다.)


<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<tiles:insertAttribute name="header" />
</head>
<body>
<tiles:insertAttribute name="menu" />
<tiles:insertAttribute name="body" />
<tiles:insertAttribute name="footer" />
</body>
</html>


4. Tiles 설정 파일을 생성
위(2)에 Spring 에 설정된대로 WEB-INF/tiles/tiles-layout.xml 파일을 생성하고 설정을 합니다. 
각각의 jsp페이지는 해달 부분의 구현을 하면 됩니다. 
name에 * 표시한 부분은 {1} {2} 등으로 맵핑이 가능합니다.  

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE tiles-definitions PUBLIC
        "-//Apache Software Foundation//DTD Tiles Configuration 2.0//EN"
        "http://tiles.apache.org/dtds/tiles-config_2_0.dtd">
<tiles-definitions>

<!-- default : 템플릿에 설정된 페이지의 구성 요소에 대한 실제 파일을 지정합니다.  -->
<definition name="default" template="/WEB-INF/views/layouts/default_template.jsp">
<put-attribute name="header" value="/WEB-INF/views/layouts/default/header.jsp" />
<put-attribute name="menu" value="/WEB-INF/views/layouts/default/menu.jsp" />
<put-attribute name="body" value="/WEB-INF/views/layouts/default/body.jsp" />
<put-attribute name="footer" value="/WEB-INF/views/layouts/default/footer.jsp" />
</definition>

<!--  default를 확장하여 test 라는 URL로 시작되는 호출이 오는 경우 아래 설정에 의해서 페이지를 만들게 됩니다. -->
<definition name="test/*" extends="default">
<put-attribute name="body" value="/WEB-INF/views/test/{1}.jsp" />
</definition>
</tiles-definitions>


이렇게 설정후에 ~/test/~ 인 URL을 만들어서 호출하면 body 부분만 바뀌고  default   템플릿으로 구성된 페이지를 보게 됩니다. 

[참고 자료]

Tiles 공식 사이트에 가면 더 많은 정보를 얻을수 있습니다.
    http://tiles.apache.org


2014년 1월 13일 월요일

[java] jstl 과 scriptlet 간에 값 공유하기

jsp 에서 jstl과 스크립트릿간에 값을 전달해야 하는 경우가 생길수 있습니다. 

이런때 다음과 같이 pageContext를 사용해서 값을 전달하는게 가능합니다. 


1. jstl  -> scriptlet


<c:set var="str" value="hello scriptlet" />
<% 
    String str = (String)pageContext.getAttribute( "str" );
%>

2. scriptlet -> jstl
<%    
    String str = "hello jstl";
%>
<c:set var="strTxt2" value="${pageScope.str}" /> 


** 생각해 보니 jstl 사용시 되도록 scriptlet을 사용 하지 않는게 좋은것 같다.

2014년 1월 9일 목요일

[JSP] 접속된 클라이언트의 아이피 확인하는 방법

접속하는 클라이언트의 아이피를 확인 하려면 HttpServletRequest 객체에서 가져와서 확인하면 된다. 

request.getRemoteAddr() ;


그러나 프록시나 Load Balancer 같은것을 겨쳐 오게 되는 경우 위의 방법으로는 정확한 아이피를 가져 오지 못하게 된다. 


그래서 다음과 같이 메소드를 구현해서 사용 하는 것이 편리하다. 



public String getClientIP(HttpServletRequest request) {

    String ip = request.getHeader("X-FORWARDED-FOR"); 
   
    if (ip == null || ip.length() == 0) {
        ip = request.getHeader("Proxy-Client-IP");
    }

    if (ip == null || ip.length() == 0) {
        ip = request.getHeader("WL-Proxy-Client-IP");  // 웹로직
    }

    if (ip == null || ip.length() == 0) {
        ip = request.getRemoteAddr() ;
    }
   
    return ip;

}



** localhost에서 테스트 하는 경우 0:0:0:0:0:0:0:1 값으로 넘어 오는 경우가 있다.

이 값은 IPv6 에서 IPv4의 127.0.0.1 과 같은 값이다.
Tomcat으로  개발시 이게 문제가 되는 경우 vm arguments에  -Djava.net.preferIPv4Stack=true 값을 넣어 주면 된다.


2014년 1월 8일 수요일

[Tip] 맥에서 mysql 설치후 root 계정 패스워드 설정


Mysql 다운  : http://www.mysql.org

Mysql 설치 및 기동후에 아래의 절차에 따라 root 계정의 패스워드를 설정이 가능하다. 


da-base-069:bin myid$ cd /usr/local/mysql/bin
da-base-069:bin myid$ sudo ./mysql
Password:[엔터]
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 20
Server version: 5.6.15-log MySQL Community Server (GPL)

Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> use mysql
Database changed
mysql> update user set password=password('root') where user='root';
Query OK, 4 rows affected (0.00 sec)
Rows matched: 4  Changed: 4  Warnings: 0

mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

mysql> quit
Bye
da-base-069:bin myid$ ./mysql -u root -p
Enter password: [패스워드]
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 96
Server version: 5.6.15-log MySQL Community Server (GPL)

Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> exit
Bye





2014년 1월 6일 월요일

[TIP] tar 로 묶을때 tar: Error exit delayed from previous errors 가 발생하는 경우

tar 로 묶을때 다음과 같은 에러가 발생하는 경우가 있다.

tar: Error exit delayed from previous errors

일반 적으로 read 권한이 하위 폴더가 존재 하는 경우 발생을 하는데 만약 그 폴더가 필요없다면  "--ignore-failed-read" 옵션을 통해서 read 에러를 무시하고 묶는게 가능하다.

$ tar cvzf package.tar.gz ./target --ignore-failed-read

[Spring] spring + java web application 다국어 지원 설정

다국어를 사용하기 위해서는 코딩시에 여러가지 사항들을 고려 해야 한다.
spring framework 및 설정을 통해서 다국어를 사용하는 방법에 여러가지가 있다.
상황에 따라서 쿠키를 이용하거나 세션 그리고 브라우져의 언어 설정을 이용하는 방법등 다양한 방법이 있지만 세션을 이용하는게 현재 작업하는 내용과 가장 일치 하기 때문에 이 방법에 대해서 정리 하도록 한다.


[목차]

  1. 인코딩 설정 하기
  2. Spring 설정 
  3. Locale을 설정하는 Controller 클래스 작성
  4. 현재 설정된  Locale을 확인 하는 클래스 작성 
  5. 메시지를 언어 설정에 따라서 가져오는 클래스
  6. Javascript용 파일 생성하기
  7. JAVA에서 사용하는 방법
  8. JSP에서 사용 하는 방법 
  9. javascript  설정및 사용하는 방법

[설명]

1. 인코딩 설정하기 

다국어를 사용하기 위해서는 web.xml 에서 인코딩필터를 UTF-8 로 설정해 주어야 한다. 

  <filter>
    <filter-name>encodingFilter</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>
  </filter>
  <filter-mapping>
<filter-name>encodingFilter</filter-name>
  <url-pattern>/*</url-pattern>
  </filter-mapping>


2. Spring 설정하기


Spring 의 application-servlet.xml  파일에 MessageSource 를 설정한다.
아래 설정은 ReloadableResourceBundleMessageSource 을 사용하여 설정을 바꾸면 다시 읽도록 처리 하였다.

<!-- 
    MessageSource 를 선언하고 설정한다. 
    메시지는 classpath 에 선언된곳에 놓는다 .
-->
<bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
    <property name="defaultEncoding" value="UTF-8"/>
    <property name="basenames">
<list>
           <value>classpath:/com/test/mydomain/message</value>
        </list>
    </property>
    <property name="fallbackToSystemLocale" value="false"/>
    <property name="cacheSeconds" value="60"/>
</bean>
<bean id="localeResolver" class="org.springframework.web.servlet.i18n.SessionLocaleResolver">
    <property name="defaultLocale" value="ko" />
  </bean>

<!-- java 에서 사용하기 위해 만든 클래스 -->
<bean id="prop" class="com.common.util.Prop" />
  



  •  /com/test/mydomain 이 패키지 위치에  다국어 문장을 포함한 파일을 넣는다.
    message.property - 기본 언어 셋
    message_ko.property - 한국어 언어셋
    message_en.property - 영어 언어셋

  • 파일의 내용은 다음과 같은 형식이다.  ( 영어인 경우 아래 문장들이 영어로 번역되어 들어 가면된다.)

    test.message=안녕하세요.test.hello={0}님 안녕하세요. {1}
    {0}과 {1} 은 치환될 영역이다. 사용자가 해당 문구를 사용시에 치환해서 사용해야 하는 경우 이런식으로 메시지를 작성해서 치환하면 된다.
  • 기본적으로 한국어를 사용하면 굳이 message_ko.property를 만들지 않아도 된다.


3. Locale을 설정하는 Controller 클래스 작성

/**
 * 세션에 있는 로케일을 변환 하는 Controller 클래스
 */


@Controller
public class LocaleController {

    @RequestMapping(value = "/changeLocale")
    public String changeLocale(HttpServletRequest request, HttpServletResponse response, @RequestParam(required = false) String locale) {
        HttpSession session = request.getSession();
        Locale lo = null;
        
        //step. 파라메터에 따라서 로케일 생성, 기본은 KOREAN 
        if (locale.matches("en")) {
                lo = Locale.ENGLISH;
        } else {
                lo = Locale.KOREAN;
        }

        // step. Locale을 새로 설정한다.          session.setAttribute(SessionLocaleResolver.LOCALE_SESSION_ATTRIBUTE_NAME, lo);
        // step. 해당 컨트롤러에게 요청을 보낸 주소로 돌아간다.
        String redirectURL = "redirect:" + request.getHeader("referer");
        return redirectURL;
    }


}


4. 현재 설정된  Locale을 확인 하는 클래스 작성


public class LocaleUtil {

    /**
    * 기본 로케일을 리턴한다. 기본은 한글이다. 
    */
    public static Locale getDefaultLocale() {
        return Locale.KOREAN;
    }

    /**
    *  HttpServletRequest 를 받아서 저장되어 있를 locale 값을 리턴한다. 없는 경우는 기본 로케일을 리턴한다. 
    */

    public static Locale getLocale(HttpServletRequest request) {
        Locale locale = null;
        HttpSession session = request.getSession(); 
        locale = (Locale)session.getAttribute(SessionLocaleResolver.LOCALE_SESSION_ATTRIBUTE_NAME);

        if (locale == null ) {
            locale = getDefaultLocale();
        }
        return locale;
    }


}

5. 메시지를 언어 설정에 따라서 가져오는 클래스

public class Prop implements MessageSourceAware {
    
    private static MessageSource msg;

    public void setMessageSource (MessageSource msg) {
        Prop.msg = msg;
    }
    
    /**
     * 시스템 속성을 얻기위한 함수
     * 호출 내용은 기존 메시지와 동일하나 기능적으로 구분하기 위해서 추가한 메소드 이다. 
     */
    public static String prop(String key) {
    return Prop.msg(key);
    }
    
    public static String prop(String key, Locale locale) {
    return Prop.msg(key, locale);
    }
    
    public static String propFormat(String key, Object...objects) {
         return MessageFormat.format(Prop.msg(key),objects);
    }
    
    public static String propFormat(String key, Locale locale, Object...objects) {
        return MessageFormat.format(Prop.msg(key, locale),objects);
    }
    
   /**
    * 메지시를 리턴한다.
    */
    public static String msg(String key){
        return msg.getMessage(key, null, Locale.getDefault());
    }
    
    public static String msg(String key, Locale locale){
        return msg.getMessage(key, null, locale);
    }
}


6. javascript용 파일 생성하기
message.i18n.js  는 사용하기 편리 하도록 만든 파일이다. 파일 내용은 아래와 같다.

function loadBundles(lang) {
        jQuery.i18n.properties({
            name:'message'
            path:'/js/message/prop/'
            mode:'both',
            language:lang, 
            callback: function() {
        }
    });
}

i18nProp = jQuery.i18n.prop;


7. JAVA에서 사용하는 방법

자바에서 controller 에서 HttpRequest 객체를 넣어서 현재 locale 를 얻어 온 다음에 Prop 클래스를 통해서 메시지를 가져 온다.


Locale locale = LocaleUtil.getLocale(request);


String message= Prop.propFormat("message.java", locale,  "[Message]","java");


8. JSP에서 사용 하는 방법
spring tag 를 통해서 값을 가져온다.



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

<spring:message code="message.jsp" arguments=" 메시지, JSP"/>


9. javascript  설정및 사용하는 방법
javascrpit 는 설정 파일을 별도로 만들었다. 이 경우 javascript에서 파일(message.i18n.js)을 지정해서 하나만 사용하는 편이 편하다.



<script type="text/javascript" language="JavaScript"  src="/js/lib/jquery.i18n.properties-min-1.0.9.js"></script>
<script type="text/javascript" language="JavaScript"  src="/js/message/message.i18n.js"></script>

<script type="text/javascript">
<!--
jQuery(document).ready(function() {
loadBundles('<%=(LocaleUtil.getLocale(request)).toString()%>');
});
//-->


</script>