DWR의 Reverse Ajax를 배워보자!!
설정부터 ~ 실행까지~~
1) web.xml 설정
dwr-invoker org.directwebremoting.servlet.DwrServlet debug true activeReverseAjaxEnabled true initApplicationScopeCreatorsAtStartup true 1 dwr-invoker /dwr/*
2) /WEB-INF/dwr.xml 설정
: <create>태그의 creator가 spring일 경우, spring은 spring Bean을 삽입하겠다는 의미이며,
<param name="beanName" value="Bean이름" /> 지정하시면 됩니다.
( 당연히 web-application-config.xml에 bean설정이 되어있야겟죠? )
ex) <bean id="RealtimeDWR" name="RealtimeDWR" class="com.nkia.realtime.RealtimeDWR"></bean>
: <create>태그의 creator가 new 일 경우, 일반적인 new 생성자를 사용하겠다는 의미구요,
<param name="class" value="class위치를 지정해주면 됩니다~"/>
: <convert>는 일반적인 bean 또는 VO(Value Object 맞나?) , DTO(Data Transfer Object)라고도 불리져!!
말그대로 돌려받는 객체를 지정하는 겁니다. (조심할거는 create태그 바깥에 해줄것!!)
: <include>는 해당 클래스에서 허용할 메소드를 의미해요!!
ps. 말그대로 메소드명! , 단, 오버로딩 할 경우 (같은 메소드명에 파라미터만 다른 경우)를 인식 못하는듯하니
: 메소드명을 다르게해서 처리하시는게 좋아요!
3) 제일 오래걸렸던 JavaCode... ReverseAjax가 쉽지 않음..ㅠㅠ
내가 가장 해메인 부분은... 나 역시 내용이 어려워 이해가 잘 안되는 부분이지만, 간단히 얘기하면,
1.일반적인 ReverseAjax 채팅예제에서처럼
JSP DWR 메소드 호출
-> JavaCode에서 WebContextFactory.get()을 이용하여 ScriptSession 가져옴
-> Push 서버기능
이런 방식은 잘 동작하지만...
2.제가 하고 싶었던 부분은
JavaCode에서 바로 ScriptSession을 가져와서
-> Push 서버기능
여러분도 보시다 싶이 JSP에서 호출하는 부분을 생략한 경우입니다.
문제가 된 부분은 WebContextFactory.get()이 계속 null을 리턴해 ScriptSession을 가져올수가 없었어요..ㅠ
몇시간동안 자바에서 그냥 JSP호출만 하는 더미Servlet을 만들까,
아 그냥.. 집에갈까.... 아님.. Polling으로 구현해부려?
혹시나 시간내에 못끝낼것같은 걱정 반 고민반...
하지만 구글신은 역시 우릴 버리지 않습니다....
Non-Web Threads and Reverse Ajax
DWR사이트만 잘 봐도 쉽게 해결됬겠지만... 영어에 약해.. 돌고 돌고 돌고 돌아 이해함..
1번의 경우, Web Thread 기반의 Reverse Ajax를 의미하며,
Jsp의 engine.js를 통해 Web Thread를 생성하여, WebContextFactory.get()을 통해 ScriptSession을 가져올 수 있습니다.
2번의 경우가, non-Web Thread기반..즉, 자바에서 direct로 ScriptSession을 구하려하는 경우죠..
그래서 2번의 경우(non-Web Thread기반) ScriptManager를 통해 ScriptSession을 가져올 수 있습니다.
package com.nkia.realtime; import java.util.Collection; import javax.servlet.ServletContext; import org.directwebremoting.Container; import org.directwebremoting.ScriptSession; import org.directwebremoting.ServerContext; import org.directwebremoting.ServerContextFactory; import org.directwebremoting.WebContext; import org.directwebremoting.WebContextFactory; import org.directwebremoting.extend.ScriptSessionManager; import org.directwebremoting.impl.DefaultServerContextBuilder; import org.directwebremoting.proxy.ScriptProxy; import com.nkia.common.event.FaultNotification; public class RealtimeDWR { private WebContext webContext; private ServletContext servletContext; private ServerContext serverContext; Collectionsessions; public void init(){ /** * JSP에서 호출시에는 WebContextFactory.get()을 통해 가져옴. */ try{ this.webContext = WebContextFactory.get(); System.out.println("webContext = "+webContext); if(webContext!=null) this.servletContext = webContext.getServletContext(); System.out.println("servletContext = "+servletContext); if(servletContext!=null) this.serverContext = ServerContextFactory.get(servletContext); System.out.println("ServerContextFactory = "+serverContext); }catch(Exception e){ e.printStackTrace(); } } public void doCallAllSessions(String url,String callbackfunction,Object vo){ try{ init(); /** * 이거때문에 시간 제일 오래걸린듯.. * Java에서 SessionScript를 가져오려면 SessionManager 호출해야한다. */ Container container = ServerContextFactory.get().getContainer(); ScriptSessionManager manager = container.getBean(ScriptSessionManager.class); if(serverContext==null){ sessions = manager.getAllScriptSessions(); }else{ sessions = serverContext.getScriptSessionsByPage(servletContext.getContextPath() + url); } System.out.println("sesseions = "+sessions.size()); ScriptProxy proxy = new ScriptProxy(sessions); proxy.addFunctionCall(callbackfunction,vo); }catch(Exception e){ e.printStackTrace(); } } public void callFaultNotificationTest(){ long value = 100; int i=0; FaultNotification fNoti = new FaultNotification(String.valueOf(i * 10), "locationID", "type", "", i + value, i + value, "장애 내용", null, "obsAtt", "", i % 6); doCallAllSessions("/fault/main.do","FaultNotificationCallback",fNoti);//DWR System.out.println("call end!!"); } public void callFaultNotification(FaultNotification fnoti){ doCallAllSessions("/fault/main.do","FaultNotificationCallback",fnoti);//DWR } }
4) JSP파일인데요. 여기선 뭐 별거 없어요.
프로젝트명/dwr/engine.js
프로젝트명/dwr/interface/dwr클래스명.js
이 JSP파일에서 ReverseAjax를 사용하겠다는 의미구요!!
window.onload=function(){
dwr.engine.setActiveReverseAjax(true);
dwr.engine.setNotifyServerOnPageUnload(true,true);
};
'Workspace' 카테고리의 다른 글
웹개발 환경 설정(tomcat, eclipse) (0) | 2013.01.11 |
---|---|
Polestar EMS Station(UI) 개발 환경설정 매뉴얼 (0) | 2013.01.11 |
Timeline js (0) | 2012.12.22 |
Timeline 참쉬운 사용법~ (0) | 2012.12.22 |
신입사원의 첫주를 보내며.. (0) | 2012.12.22 |