[DWR Reverse Ajax] start point Java!!

2013. 1. 3. 09:47 - 에릭투스

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.xmlbean설정이 되어있야겟죠? )

 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을 가져올 수 있습니다.


Container container = ServerContextFactory.get().getContainer(); 
ScriptSessionManager manager = container.getBean(ScriptSessionManager.class);
sessions = manager.getAllScriptSessions();

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;
	Collection sessions;
	
	
	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

다른 카테고리의 글 목록

Workspace 카테고리의 포스트를 톺아봅니다