EXT 3.x詳しいExt.Direct(二)---pollingを使って、簡単にウェブチャット機能を実現する


Ext.Directのpolling機能はやはりパッケージ化されているのを見て、ホームページのチャットをして、あまり実用的ではありませんが、基本的に運用することができます.
コードを見てみましょう.
PS:具体的なExt.Directの配置はこちらでは紹介しませんが、詳しくは私が書いたEXT 3を参照してください.xは詳細解のExt.Direct(一)を用い,詳細である.
1.まずJAVA類を書きます.以下の通りです.
package com.xuyi.web.direct;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map;
import org.apache.commons.lang.StringUtils;
import com.softwarementors.extjs.djn.config.annotations.DirectMethod;
import com.softwarementors.extjs.djn.config.annotations.DirectPollMethod;
import com.xuyi.vo.TestVO;
import com.xuyi.vo.User;

/**
 * @author xuyi
 *
 */
public class TestDirect {
	static String chat_words="";
	
	
	//    
	@DirectMethod
	public String chat(TestVO vo){//               , ,     
		String user = vo.getUser();
		String chat = vo.getChat();
		if(StringUtils.isNotBlank(user)){
			chat_words = chat_words + "<p>   " + user + "   " + formatDate(new Date()) +"  : " + chat +"</p>";
		}
		return chat_words;
	}
	
	
	//direct polling  
	@DirectPollMethod(event="message")
	public String chatRoom(Map<String,String> params){
		//  polling       
		System.out.println(params.get("polling_date"));
		return chat_words;
	}
	
	private String formatDate(Date date){
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
		return sdf.format(date);
	}
}

 2.TestVO.java
package com.xuyi.vo;

/**
 * @author xuyi
 *
 */
public class TestVO {
	
	private String user;
	
	private String chat;

	public String getChat() {
		return chat;
	}

	public void setChat(String chat) {
		this.chat = chat;
	}

	public String getUser() {
		return user;
	}

	public void setUser(String user) {
		this.user = user;
	}
	
	
	
}
 
 
3.webを構成する.xml
web.xmlには、次のコードが追加されます.
<servlet>
		<servlet-name>action</servlet-name>
		<servlet-class>
			org.apache.struts.action.ActionServlet
		</servlet-class>
		<init-param>
			<param-name>config</param-name>
			<param-value>
				/WEB-INF/conf/struts/struts-config.xml
			</param-value>
		</init-param>
		<init-param>
			<param-name>debug</param-name>
			<param-value>3</param-value>
		</init-param>
		<init-param>
			<param-name>detail</param-name>
			<param-value>3</param-value>
		</init-param>
		<load-on-startup>0</load-on-startup>
	</servlet>

	<servlet>
		<servlet-name>DjnServlet</servlet-name>
		<servlet-class>
			com.softwarementors.extjs.djn.servlet.DirectJNgineServlet
		</servlet-class>

		<init-param>
			<param-name>debug</param-name>
			<param-value>true</param-value>
		</init-param>

		<init-param>
			<param-name>minify</param-name>
			<param-value>true</param-value>
		</init-param>

		<init-param>
			<param-name>providersUrl</param-name>
			<param-value>djn/directprovider</param-value>
		</init-param>

		<init-param>
			<param-name>batchRequestsMultithreadingEnabled</param-name>
			<param-value>false</param-value>
		</init-param>

		<!-- api :        param-name   ,            value     -->
		<init-param>
			<param-name>apis</param-name>
			<param-value>test</param-value>
		</init-param>

		<!-- test.       test/          js   -->
		<init-param>
			<param-name>test.apiFile</param-name>
			<param-value>test/test.js</param-value>
		</init-param>

		<!-- test.                      -->
		<init-param>
			<param-name>test.apiNamespace</param-name>
			<param-value>Ext.xuyi</param-value>
		</init-param>

		<!-- test.               -->
		<init-param>
			<param-name>test.classes</param-name>
			<param-value>com.xuyi.web.direct.TestDirect</param-value>
		</init-param>

		<load-on-startup>1</load-on-startup>
	</servlet>
	<!--   servlet   -->
	<servlet-mapping>
		<servlet-name>DjnServlet</servlet-name>
		<url-pattern>/djn/directprovider/*</url-pattern>
	</servlet-mapping>

4.test_direct_polling_1.jsp(jquery.jsを適当に使いましたが、まあ、切り捨てられませんね.結局jqueryの書き方はext coreよりずっと簡単です)
<%@ page language="java" pageEncoding="UTF-8"%>
<html>
	<head>
		<title>Ext3 Direct polling    </title>
	        <script type="text/javascript" src="${ctxPath }/scripts/jquery.js"></script>
		<script type="text/javascript" src="${ctxPath }/scripts/ext/ext-base.js"></script>
		<script type="text/javascript" src="${ctxPath }/scripts/ext/ext-all.js"></script>
		<script type="text/javascript" src="${ctxPath}/test/test.js"></script>
	</head>
	<body>
		<script type="text/javascript">
		
			var html="";
			
			var params={};
			
			//  namespace  ,      namespace        addProvider    
			Ext.Direct.addProvider(
				Ext.xuyi.REMOTING_API,
				{
					id: 'poll',
					type:'polling',
					url:Ext.xuyi.POLLING_URLS.message,
					baseParams:{'polling_date':new Date()},
					interval: 500
				}
			);	
			
				
			
			Ext.Direct.on('message',function(e){
				if(html=="<p>"+e.data+"</p>"){
					return;
				}else{
					html="<p>"+e.data+"</p>"
				}
				$('#main').html(html);
				$('#hid').hide();
				$('#sub').show();
			});	
			
			function addChat(){
			/*           polling    
				var dp = Ext.Direct.getProvider('poll');
				dp.disconnect();
				dp.connect.defer(2000, dp);
			*/
				params = {'user':$('#user').val(),'chat':$('#chat').val()};
				if($.trim($('#user').val())!=''){
					$('#sub').hide();
					$('#hid').show();
					TestDirect.chat(params,function(data){});
				}
			}
				
		</script>
		
		<div id="main"></div>
		
		  :<br/><br/>
		<div id="sub">
		   :<input type="text" id="user" name="user"><br/><br/>
		  :<input type="text" id="chat" name="chat"><br/><br/><input type="submit" value="  " onclick="addChat();">
		</div>
		<div id="hid" style="display:none">
		   ...   ...
		</div>
		
		
	</body>
	
	
</html>

 5.はい、いくつかのページを開いてお互いに会話することができます.効果は図面を参照してください.