본문 바로가기
Work

DWR 설정

by 승수 2009. 7. 23.

DWR 설정 및 사용

DWR 이 우선 무엇인지 잠깐 설명을 하자면 Java 와 JavaScript 간의 통신을 가능하도록 해주는 lib 이다.
본인 역시 자세히 모르기 때문에 아는정도만 기술해보기로 하겠다.

우선 DWR lib 를 다운받는다. [ http://directwebremoting.org/ ]

WAS WEB-INF/lib/  에 라이브러리를 추가하고


web.xml 에 dwr servlet 을 추가한다.


 <servlet>
      <servlet-name>dwr-invoker</servlet-name>
      <servlet-class>org.directwebremoting.servlet.DwrServlet</servlet-class>
      <init-param>
           <param-name>debug</param-name>
           <param-value>false</param-value>
      </init-param> 

 </servlet>


 <servlet-mapping>
      <servlet-name>dwr-invoker</servlet-name>
      <url-pattern>/dwr/*</url-pattern>
 </servlet-mapping>

 

이처럼 추가한다.

그리고 dwr.xml 을 WEB-INF/ 에 생성한다.

 

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE dwr PUBLIC "-//GetAhead Limited//DTD Direct Web Remoting 2.0//EN" "http://www.getahead.ltd.uk/dwr/dwr20.dtd">

<dwr>
     <allow>
          <create creator="new" javascript="Test">
               <param name="class" value="test.TestDwr" />
          </create>
          <convert converter="bean" match="test.TestBean"/>
     </allow>
</dwr>

 

그럼  TestDwr.java 와 TestBean.java 를 만들장.

===================================

package test.action;

 
public class TestDwr{
 public TestBean hello(TestBean b){
  TestBean bean = new TestBean();
  bean.setName(b.getName());
  bean.setAge(b.getAge());
  return bean;
 }
}

 

=====================================

package test.action;

 
public class TestBean{ 
 String name;
 String age;
 public String getName() {
  return name;
 }
 public void setName(String name) {
  this.name = name;
 }
 public String getAge() {
  return age;
 }
 public void setAge(String age) {
  this.age = age;
 }
}


그럼 html 에서 javascript 를 어찌 사용하는지 보겠다.


<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<c:set var="contextPath" value="${pageContext.request.contextPath}" scope="request" />


<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>
<head>
 <meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
 <title>Insert title here</title>
</head>
<script language="javascript" src="${contextPath}/dwr/interface/Test.js"></script>
<script language="javascript" src="${contextPath}/dwr/engine.js"></script>
<script language="javascript" src="${contextPath}/dwr/util.js"></script>
<script language="javascript">

 

function hi(name){
 var p = {name:"a", age:"19"};
 Test.hello(p, callBackHi);
}

function callBackHi(data){
 alert(data.name + "/" + data.age);
}


</script>

<body>
<input type="button" value="DWR Test" onclick="hi('D2')"> 
</body>
</html>

 

이러면 설정과 테스트 환경은 끝냈다.

그럼 잠시 설명을 하자면

dwr.xml 에서 create 로 생성한 javasript 이름으로 javascript 를 불러들인다.

<create creator="new" javascript="Test">

<script language="javascript" src="${contextPath}/dwr/interface/Test.js"></script>

src 경로에서 dwr/interface 는 고정이다. (참고로 dwr 은 web.xml 에서 servlet-pattern 명이다.)

이렇게 하면 dwr.xml 에서 TestDwr 내에 <param name="class" value="test.TestDwr" /> 의 클래스를 사용하겠다는 뜻이다. 그럼 javascript 내에서 해당 클래스를 호출한다. 참고로 javascript 내에서 호출할때는 javascript 이름으로 호출해야 한다.

 

Test.hello(p, callBackHi);

요것을 잘보면 p 는 java class 의 hello 메소드에 넘겨질 파라미터 값이다. 그럼 callBackHi 는 java 수행후 호출된 javascript 메소드가 되겠다.(콜백함수)

hello 메소드는 TestBean 을 반환시킨다. 때문에 callBackHi 는 그 빈형태로 데이타를 받아서 속성을 꺼낼수 있다. 이때 이렇게 String 이 아닌 다른 Object 로 파라미터나, 반환값이 될때는 해달 값이 어떤 Object Type 인지 dwr 이 알아야 한다. 그러기 위해서 convert 를 사용한다.

파라미터 또는 반환값의 Class 를 미리 dwr.xml 에 정의해놓아야 javascript 에서 object 형식으로 사용할 수 있다는 것을 명심하자.