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
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
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
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
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
by cranix 2006. 12. 16. 04:24