jsp这个东西还真是高级货,
<%@ page language="java" pageEncoding="UTF-8"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>123</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="This is my page"> <link rel="stylesheet" type="text/css" href="extjs/examples/shared/example.css" /> <script type="text/javascript" src="extjs/examples/shared/include-ext.js"></script> <script type="text/javascript" src="extjs/examples/shared/options-toolbar.js"></script> <script type="text/javascript" src="extjs/examples/shared/examples.js"></script> <script type="text/javascript" src="test/test.js"></script> <script> Ext.require([ 'Ext.direct.*', 'Ext.panel.Panel', 'Ext.form.field.Text', 'Ext.toolbar.TextItem' ]); Ext.onReady(function(){ function doEcho(field){ TestDirect.chat(field.getValue(), function(result, event){ var transaction = event.getTransaction(), content = Ext.String.format('<b>Successful call to {0}.{1} with response:</b><pre>{2}</pre>', transaction.action, transaction.method, Ext.encode(result)); updateMain(content); field.reset(); }); } function doMultiply(field){ TestDirect.multiply(field.getValue(), function(result, event){ var transaction = event.getTransaction(), content; if (event.status) { content = Ext.String.format('<b>Successful call to {0}.{1} with response:</b><pre>{2}</pre>', transaction.action, transaction.method, Ext.encode(result)); } else { content = Ext.String.format('<b>Call to {0}.{1} failed with message:</b><pre>{2}</pre>', transaction.action, transaction.method, event.message); } updateMain(content); field.reset(); }); } function updateMain(content){ main.update({ data: content }); main.body.scroll('b', 100000, true); } Ext.direct.Manager.addProvider(Ext.xuyi.REMOTING_API, { type: 'polling', url: Ext.xuyi.POLLING_URLS.message, listeners: { data: function(provider, event){ updateMain('<i>' + event.data + '</i>'); } } }); var main = Ext.create('Ext.panel.Panel', { // The id is used for styling id: 'logger', title: 'Remote Call Log', renderTo: document.body, 600, height: 300, tpl: '<p>{data}</p>', tplWriteMode: 'append', autoScroll: true, bodyPadding: 5, dockedItems: [{ dock: 'bottom', xtype: 'toolbar', items: [{ hideLabel: true, itemId: 'echoText', xtype: 'textfield', 300, emptyText: 'Echo input', listeners: { specialkey: function(field, event){ if (event.getKey() === event.ENTER) { doEcho(field); } } } }, { itemId: 'echo', text: 'Echo', handler: function(){ doEcho(main.down('#echoText')); } }, '-', { hideLabel: true, itemId: 'multiplyText', xtype: 'textfield', 80, emptyText: 'Multiply x 8', listeners: { specialkey: function(field, event){ if (event.getKey() === event.ENTER) { doMultiply(field); } } } }, { itemId: 'multiply', text: 'Multiply', handler: function(){ doMultiply(main.down('#multiplyText')); } }] }] }); }); </script> </head> <body> </body> </html>
directjngine.2.2.jar
gson-2.2.1.jar
yuicompressor-2.4.2.jar
这几个包是最重要的
web.xml
<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.cdg.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>
java代码
package com.cdg.direct; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Map; import org.apache.commons.lang.StringUtils; import com.cdg.bean.TestVO; import com.softwarementors.extjs.djn.config.annotations.DirectMethod; import com.softwarementors.extjs.djn.config.annotations.DirectPollMethod; 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; } @DirectMethod public String multiply(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); } }
注意jar包自动在里面生成的test.js代码,所以我的jsp里面也引入了代码.
上图