java5 로 넘어오면서 많이 바꼈는데 가장 맘에드는건 저너릭스와 enum 타입이 생긴것이다.

annotation 은 어떤곳에 써야할지 아직은 감이 안잡힌다.





1. static 멤버 import 하기

  - static import 를 사용하면 클래스명을 안쓰고 static 멤버변수와 static 메소드에 접근할수 있다.


import static java.lang.Math.*;

public class StaticImportTest {
public static void main(String args[]) {
double y = sin(1.2);
System.out.println("SIN(1.2) : " + y);
System.out.println("PI : " + PI);
}
}




2. Eunumerated 타입

  - c 언어의 enum 타입처럼 자동으로 숫자를 매겨주는 변수를 만들수 있다

  - 이것과 관련해서 enumMap 이라는 클래스도 있다


public class EnumTest {
public enum testEnum {ITEM1,ITEM2,ITEM3};

public static void main(String args[]){
System.out.println(testEnum.ITEM1);
}
}




3. 새로운 for 문 형태

  - 자바스크립트의 for in 구문 같이 배열을 자동으로 탐색할수있다.

  - 단 for 문 안에서 꼭 String tmp 와 같은형태로 선언해야 한다는것은 좀 이상했다.


public class NewForTest {
public static void main(String args[]) {
String strs[] = {"test1","test2","test3"};
for (String tmp : strs) {
  System.out.println(tmp);
}
}
}




4. autoBoxing, autoUnBoxing

  - wrapper 클래스로 변환히 한층 더 자유로워졌다.


public class AutoBoxingTest {
public static void main(String args[]) {
Integer i = 10;
int i2 = i;

System.out.println("I:" + i2);
}
}




5. c언어의 printf 와 유사한기능 추가

  - . 뒤에있는것이 소숫점이하 자릿수가 아니라 전체 자릿수이다.


public class PrintfTest {
public static void main(String args[]) {
double PI = 3.141592;
System.out.printf("%7.3g",PI);
}
}




6. 가변 파라메터(varargs)를 갖는 메소드

  - 이건 왜 이제야 지원하는지 의심스럽다.


public class VarargsTest {
public static int sum(int... data) {
int total = 0;
for (int n : data) {
  total += n;
}
return total;
}
public static void main(String args[]) {
int total = sum(1,2,3,4,5,6,7,8,9,10);
System.out.println("SUM : " + total);
}
}





7. 저너릭스(generics)

  - 이제 클래스 생성할때 리턴 타입도 지정받을수 있게 됬다.

  - 아래 예제를 보면 알겠지만 클래스를 만들때 리턴 타입까지 고려해서 만들수가 있게되었다.


class MyMemory<M> {
private int size = 0;
private Object objects[];

public MyMemory(int size) {
this.size = size;
objects = new Object[size];
}

public M get(int i) {
return (M)objects[i];
}
public void put(int i,M obj) {
objects[i] = obj;
}
public int getSize() {
return size;
}
}


public class GenericsTest {
public static void main(String args[]) {
MyMemory<String> mem = new MyMemory<String>(10);
mem.put(1, "test");
mem.put(2, "test2");
mem.put(3, "test3");
System.out.println(mem.get(1));
System.out.println(mem.get(2));
System.out.println(mem.get(3));
}
}




8. 주석(annotation)

  - 이놈은 좀 길기때문에 다음회에 연재하겠다.

신고

'알짜정보 > Java' 카테고리의 다른 글

JNLP 테스트  (36) 2010.02.14
JAVA 리눅스 IP 주소 알아내기  (38) 2008.12.02
apache 프로젝트의 commons-dbcp 를 이용하여 connection pool 만들기.  (42) 2008.08.15
java 에서 xmlrpc 사용하기  (38) 2008.07.13
annotation 주석?  (43) 2006.12.16
JAVA5(1.5) 달라진점!  (19) 2006.12.16
by cranix 2006.12.16 20:13

먼저 알아야 할것은 dom 으로 파싱을 하려면 파싱하려는 문서의 contextType 이 text/xml 이어야 한다는 것이다. (이것때문에 좀 고생했다..ㅡ.ㅡ;)

윗쪽에 "<?xml version="1.0" encoding="euc-kr" ?>" 이처럼 xml 선언을 해 주어도 페이지 contextType 이 text/xml 이 아니면 파싱이 안되니 주의하자. (거꾸로 이처럼 xml 선언을 안해줘도 contextType 이 text/xml 이면 파싱이 가능하다.)



이 문서에서 쓸 테스트 xml 파일을 만들어 보자.


<root>
<subtitle attr1="testattr1">
<subitem attr="testattr">item1</subitem>
<subitem>item2</subitem>
<subitem>item3</subitem>
</subtitle>
<subtitle2>test</subtitle2>
</root>


간단하다..



일단 위 파일을 XMLHttpRequest 로 받은후에 responseXML 속성을 받아서 파싱하면 되겠다.


1. subtitle 의 attr1 의 데이터 가져오기.


xmlObj.getElementsByTagName("subtitle")[0].getAttribute("attr1")


- 위와같이 하면되는데 getElementsByTagName("subtitle") 는 문서내에 있는 subtitle 라는 태그를 모두 배열에 담아 돌려준다는것을 기억하자.



2. subtitle2 의 텍스트 가져오기.


xmlObj.getElementsByTagName("subtitle2")[0].text


- 노드가 가지고있는 데이터 내용을 출력할때는 text 속성을 쓴다는것을 기억하자.



3. subtitle 하위태그로 있는 subitem 태그들을 배열로 받아보자.


xmlObj.getElementsByTagName("subtitle")[0].childNodes


- 위와같이 하면 된다. 현재 테스트 문서에 subitem 은 3개 있으니 .length = 3 이 되겠다.



4. 그럼 간단하게 subitem 의 모든내용을 출력하는 것을 만들어보자.


var nodes = xmlObj.getElementsByTagName("subtitle")[0].childNodes;

for (var i=0;i<nodes.length;i++) {

alert(nodes[i].text);

}



가장 기본적인 xml 탐색방법을 알아봤다.

이걸 응용해서 어떤 것이든 탐색이 가능하겠지만 귀찮다.

그래서 나온지는 모르겠는데(ㅡ.ㅡ;) 하여튼 나온게 XPATH 이다.

자 그럼 이제 xpath 탐색법을 배워보자.


- 아래는 xpath 연산자이다.

연산자
의미
/
자식노드 지정
root/subtitle (<root>의 자식인 <subtitle>)
//
후손전체지정
root//subitem (<root>의 후손중 모든 <subitem>)
*
와일드카드
root/* (<book>의 모든 자식요소)
root/@* (<book>의 속성전체)
.
자기자신
.//subtitle
..
부모노드
../subtitle
|
노드의 논리합
root/subtitle|root/subtitle2
( root/subtitle 와 root/subtitle2 을 모두 찾는다)


- 이제 예제들을 보자.


1. root/subtitle 노드를 탐색해 보자.


xmlObj.selectSingleNode("root/subtitle")


- selectSingleNode 하면 매칭되는 노드가 여러개있어도 그중 최상위 하나만 돌려준다.

  모두 검색하려면 selectNodes(xpath) 를 쓰면 된다.



2. 이제 getElementsByTagName() 처럼 모든 태그를 검색해서 원하는 노드를 가지고오는 것을 해보자.


xmlObj.selectSingleNode("//subtitle")


- 위와같이 "//" 연산자를 쓰게되면 해당 노드의 하위를 검색해서 일치하는 이름의 노드를 돌려준다.

- "//" 연산자는 어디든 올수있다. 예를들어 "root//subtitle" 라고 검색을 하게되면 root 이하의 노드에서 subtitle 를 찾게되는것이다.

- 단 "//" 연산자는 쓰기는 편하나 xml 파일이 커질수록 부하가 늘어난다는점을 기억하자.


3. 이제 좀더 나가서 subtitle 의 subitem 중 item2 라는 데이터값을 가지고있는 노드를 검색해보자.


xmlObj.selectNodes("/root/subtitle/subitem[.='item2']")


- 이거 놀랍지 않은가? for 문 같은거 안써도 된다..ㅡ.ㅡ;;

- item 값옆에 [] 를 쓰고 해당 데이터값을 기준으로 검색할수가 있다.

- 여기서 '.' 은 자기 자신을 의미한다.



4. subtitle 의 subitem 중 attr 속성이 'testattr' 인것을 검색해보자.


xmlObj.selectNodes("/root/subtitle/subitem[@attr='item2']")


- '@' 요걸 쓰면 된다.

- 단 [] 구문은 / 옆이 아니라 item 이름 옆에 온다는것을 기억하자.



5. 이제 좀헷깔리는 문제를 보자. 아래두 구문의 차이는 무엇일까?


xmlObj.selectNodes("/root/subtitle[subitem='item2']")

xmlObj.selectNodes("/root/subtitle/subitem[.='item2']")


- 둘다 subitem 의 데이터를 검색하긴 한다 그러나 위에것은 subtitle 노드를 돌려주고 아래것은 subitem 노드를 돌려준다.

- [] 구문은 바로 옆에 있는 노드를 돌려준다는것을 기억하자.


6. 자 아래 구문을 보자.


xmlObj.selectNodes("/root/subtitle/subitem/@*");


- 어떤 노드의 속성을 모두 탐색하고 싶다면 위와같이 하면 된다.

- 속성이 속성값이 아니라 하나의 노드로 인식해서 돌려주게된다.

- 위의 내용은 subitem 에 속성은 attr 밖에 없으니까 attr 노드를 돌려주게 되는것이다.

- 소스로 설명하면 아래와 같다.


<subitem attr="testattr"/>


위의 소스를


<subitem>

  <attr>testattr</attr>

</subitem>


위와같이 인식하는 것이다.


신고

' > Web' 카테고리의 다른 글

부분적으로 XSL 적용하기.  (22) 2007.08.22
XSL 엘리먼트 정리  (22) 2007.08.22
텍스트 로 자바스크립트 실행하는 방법  (44) 2007.08.01
xsl 에서 태그 속성 바꾸기.  (23) 2007.07.16
웹페이지 인코딩  (23) 2007.06.11
JAVASCRIPT 에서 XML 문서 DOM,XPATH 로 파싱하기  (26) 2006.12.16
by cranix 2006.12.16 20:13

스트러츠 1.X 버젼들을 써봤기때문에 금방 접근할수 있겠지..


라고 생각했었는데 오산이었다..ㅡ.ㅡ;;


2.0 은 모든게 바꼈다.


이 문서에서는 tomcat 5.5, jdk1.5 를 쓰겠다.







먼저 struts2 를 다운받아보자.


http://people.apache.org/builds/struts/2.0.1/struts-2.0.1-all.zip


압축을 풀면 아래와같은 디렉토리가 나온다.


apps/

: 스트러츠로 작성되어있는 샘플 프로그램이 들어있다.

struts2-blank-XXX.war 파일은 스트러츠 기본 디렉토리 구조이다.

(참고로 war 파일은 알집으로 풀린다.)


docs/

: API 문서가 들어있다.


j4/

: 기본 jar 파일이 들어있다. (왜 있는지는 잘 모르겠다..ㅡ.ㅡ;)


lib/

: 스트러츠에서 제공되는 모든 jar 파일이 들어있다.

struts2-all-2.0.1.jar 이 파일도 같이 있는데 이것은 파일명에서 볼수있듯이

다른 파일들을 묶어 놓은것이다.

이상하게 이걸 라이브러리로 쓰니까 실행이 안된서 저걸 빼고 다른걸 라이브러리로 썻다.


src/

: 소스가 들었다.




이제 톰켓에 스트러츠2를 써서 hello Struts2 를 찍어보겠다..;;



1. 톰켓에 새로운 애플리케이션을 추가한다.


2. 추가된 애플리케이션의 WEB-INF/lib 에다가 struts2 의 lib/ 디렉토리에 있는것을 복사한다.

  (단 struts2-all-2.0.1.jar 파일은 중복되므로 복사하지 않는다.)


3. WEB-INF/classes 디렉토리에 struts.properties 파일을 만들고 아래와같이 저장한다.


struts.action.extension=action

struts.configuration.files=struts-default.xml,struts.xml


- URL EXTENSION 을 여기서 설정한다. (안쓰면 기본으로 action 이 된다.)


4. WEB-INF/classes 디렉토리에 struts.xml 파일을 만들어서 아래와같이 저장한다.

[code]<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
  "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
  "http://struts.apache.org/dtds/struts-2.0.dtd">
 
<struts>
  <package name="default" extends="struts-default">
       <action name="hello">
           <result>pages/helloStruts2.jsp</result>
       </action>
  </package>
</struts>[/code]


5. WEB-INF 디렉토리에 web.xml 파일에다가 아래 두가지 구문을 추가한다.

[code]<filter>
<filter-name>webwork</filter-name>
<filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
</filter>
<filter-mapping>
<filter-name>webwork</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

<security-constraint>
<web-resource-collection>
  <web-resource-name>PreventViewingJSPs</web-resource-name>
<description>웹으로 접속한 사용자가 JSP파일로 직접 접근할 수 없도록 한다.</description>
  <url-pattern>*.jsp</url-pattern>
  <http-method>GET</http-method>
  <http-method>POST</http-method>
</web-resource-collection>
<auth-constraint>
  <role-name></role-name>
</auth-constraint>
</security-constraint>[/code]

- 이전버젼에서는 servlet 으로 했는데 filter 로 바꼈다.

  또한 이전 버젼에서는 여기서 config 파일 지정을 해줬었는데 없어졌다.

  아마 어딘가에 있을꺼 같은데 찾지를 못하겠다.

- 또 여기서 중요한것은 web.xml 에서 태그는 순서를 가린다는 것이다.

   예를들어 welcome-file-list 가 filter 보다 위에있으면 안되는데 위에 있게되면

  제대로 안되는경우가 있으니 dtd 파일을 잘 확인해서 설정할수 있도록 하자.


6. 어플리케이션 루트에 pages 라는 디렉토리를 만들고 위에서 정의한 helloStruts2.jsp 파일을 만들어서 "hello Struts2" 라고 쓰고 저장한다.


7. 이제 톰켓을 실행하고 http://[URL]/[애플리케이션명]/hello.action 이라고 쳐서 제대로 나오나 확인해보자.





http://struts.apache.org/2.x/ 예제들이 있으니 확인해 보길 바란다.


단.. 영어라는거..ㅡ.ㅡ;


신고

' > Jsp' 카테고리의 다른 글

jsp 직접실행 막기  (53) 2007.12.12
JSP 페이지를 열때마다 자동으로 캐시 지우기  (42) 2007.03.18
TOMCAT5.5 + MYSQL5.0 + JNDI 설정하기  (44) 2006.12.16
스트러츠 2.0  (92) 2006.12.16
by cranix 2006.12.16 20:09

AJAX

AJAX 를 구현하려면 XMLHttpRequest 객체부터 생성해야 한다.


XMLHttpRequest 객체는 최초 IE5에서 ActiveX Component 형식으로 먼저 제공되었으며 현재 대부분의 브라우저들이 지원하고 있다. XMLHttpRequest는 W3C의 표준이 아니므로 IE 는 ActiveX 형식으로, 다른 브라우저(FIreFox, Safari, Opera등)은 Native Javascript로 구현되었다.)


AJAX 요소 기술로는 앞서 얘기한 XMLHttpRequest를 필두로 XHTML,CSS,XML,XLST,Javascript,DOM 등이 사용되며, Javascript가 ECMA표준이며 다른 기술은 W3C표준이므로, 모든 브라우저 개발 업체/단체의 합의하에 통용되는 표준으로 자리매김되어 있다.




먼저 AJAX 초기화하려면 아래와같이 두개로 나눠서 해야한다.

위에서 설명한대로 IE 와 타 브라우저가 다르게 지원하기때문에 모두에 맞추려면 아래와같이 나눠서 처리해줘야 한다.

[code]function createXMLHttpRequest() {
var xmlHttp = null;
if (window.ActiveXObject) {
xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
}
else if (window.XMLHttpRequest) {
xmlHttp = new XMLHttpRequest();
}

if (xmlHttp == null)
alert("XML 객체를 생성하지 못했습니다.");

return xmlHttp;
}[/code]


이것을 쓰기위해서는 아래와같이 오브젝트의 onreadystatechange 속성 에 이벤트를 걸어서 사용하는방법이 많이 사용된다.

[code]var xmlObj = createXMLHttpRequest();
xmlObj.open("GET","[URL]");
xmlObj.send();
xmlObj.onreadystatechange = function() {
if (xmlObj.readyState == 4) {
    [처리구문...]
}
}[/code]




이렇게 초기화 하고나면 처리를 해야하는데 처리 하기위한 메소드와 속성들을 알아보자.


- Method


- void open(String method,String url, boolean asynch, String username,String password)

: 요청을 초기화한다.

* method - 'POST','GET','PUT' 중 하나를 사용(필수)

* url - 요청 서버의 url (필수)

* asynch - true(default), false 설정(서버 응답까지 대기)


- void send(content)

: 요청을 서버로 보낸다. 비동기시 요청한다음 끝이지만 동기시면 응답 받을때까지 대기한다.

* content - DOM 객체(XML 객체)이거나 input stream,String 값등으로 설정

open() Parameter의 method 값이 'POST'로 설정되어 있으면

HttpRequest body에 포함되어 서버로 전달된다.

GET방식으로 요청하려면 null 을 설정하면 된다.


- void setRequestHeader(string header,String value)

: open() 다음에 위치해서 HttpRequest 헤더에 value를 설정하는 메소드


- void abort() : 요청을 중지한다.


- string getAllResponseHeaders()

: 요청에 대응되는 응답의 헤더정보를 리턴한다.

즉, Content-Length, Date, URI 등을 포함하는 헤더정보를 string 형식으로 반환한다.


- string getResponseHeader(string header)

: 응답의 헤더정보중에서 header 에 대응되는 값을 string 형식으로 반환한다.



- Attribute


- onreadystatechange

: 자바스크립트 콜백함수(function pointer) 를 저장한다.

이 함수는 readyState 값이 변할때 마다 호출된다.


- readyState

: 현재 요청의 상태를 의미한다.

상태는 아래와같이 다섯가지가 있다.

코드

상태

설명

0

UNINITIALIZED

XMLHttpRequest 객체를 생성하였지만, 초기화되지 않았다.

, open() 메소드를 실행하지 않은 상태

1

LOADING

XMLHttpRequest 객체를 생성하였고, open() 메소드를 수행하였지만, send() 메소드를 수행하지 않은 상태

2

LOADED

send() 메소드를 수행하였지만, 서버가 처리를 준비하고 있는 상태

3

INTERACTIVE

처리를 완료하지 않았지만, 진행 중인 상태

4

COMPLETED

처리를 완료한 상태


- responseText

: 서버의 응답을 string 형식으로 나타낸다.

그냥 단순히 내용을 text 로 돌려준다.


- responseXML

: 서버의 응답을 XML로 나타낸다.

이 속성은 DOM객체로 파싱할 수 있다.


- status

: 서버로부터의 HTTP 상태코드

200 - OK

404 - NOT Found

202 - 결과 값이 없을때

등등...


- statusText

: HTTP 상태코드에 대한 텍스트 값이다.

OK, NOT Found 등등...





자 이제 덤으로 DOM 을 알아보자.

파싱을 하려면 어쩔수없이 써야하는거다.



- Method


- selectSingleNode(xpath)

: 특정 노드를 xpath 를 이용해 검색해서 단일레코드를 돌려준다.


- selectNodes(xpath)

: 특정 노드를 xpath 를 이용해 검색해서 매칭된 레코드들을 돌려준다.

여기서 xpath 란 xml 상의 정규식 이라고 보시면 된다.


- getElementById(id)

: document 에서 특정한 ID 속성값을 가지고있는 요소를 반환한다.


- getElementsByTagName(name)

: 특정한 태그 이름을 가지고있는 자식요소로 구성된 배열을 리턴한다.


- hasChildNodes()

: 자식요소가 있는지 없는지 boolean 을 리턴한다.


- getAttribute(name)

: 해당 요소의 속성값을 리턴한다.


- appendChild(childNode)

: 특정 노드를 현재 엘리먼트의 자식 노드에 추가시킨다.


- setAttribute(name,value)

: 속성값을 지정한다.


- insertBefore(newNode,targetNode)

: newNode targetNode 앞에 삽입한다.


- removeAttribute(name)

: 해당 요소의 name 속성을 제거한다.


- removeChild(childNode)

: 자식 요소를 제거한다.


- replaceChild(newNode, oldNode)

: oldNode 를 newNode 로 치환한다.


- document.createElement(tagName)

: 해당 태그명으로된 요소를 생성한다 (table 를 주면 table 요소가 생성된다.)


- document.createTextNode(text)

: 정적 텍스트를 담고있는 노드를 생성한다.



- Attribute


childNodes : 현재 요소의 자식을 배열로 표현한다.

firstChild : 현재 요소의 첫번째 자식이다.

lastChild : 현재 요소의 마지막 자식이다.

nextSibling : 현재 요소와 바로 다음 요소를 의미한다.

text : 해당 요소의 값을 읽고 쓸 수 있는 속성을 정의한다. (==data,==nodeValue)

parentNode : 해당 요소의 부모노드이다.

previousSibling : 현재 요소와 바로 이전의 요소를 의미한다.




신고

' > Ajax' 카테고리의 다른 글

AJAX 폼데이터 POST 로 그대로 넘기기.  (25) 2007.08.19
AJAX  (47) 2006.12.16
by cranix 2006.12.16 20:05

첫글

첫글..


헷깔린거 싫타.


복잡한거 싫타.


직관적이지 않은거 싫타
신고

'자유글' 카테고리의 다른 글

설치형 블로그와 미니홈피  (6) 2006.12.21
피곤한 이유는?  (48) 2006.12.21
디스커버리호 하늘을 뚫다  (18) 2006.12.19
파워인터뷰 '한비야' 편에서..  (36) 2006.12.18
여기는 서울가는 고속버스안..  (39) 2006.12.17
첫글  (68) 2006.12.16
by cranix 2006.12.16 04:24