利用的是一种默认的配置。
User和Message是2个Javabean,封装用户及消息数据。
ChatLogon负责登录后跳转到聊天页面。
Chat聊天的主类。
如下是具体代码:
User.java:
package com.dwr.chat.demo; public class User { private String userId; private String area; public String getUserId() { return userId; } public void setUserId(String userId) { this.userId = userId; } public String getArea() { return area; } public void setArea(String area) { this.area = area; } }
Message.java:
package com.dwr.chat.demo; public class Message { private String from; private String to; private String msg; private String area; public String getFrom() { return from; } public void setFrom(String from) { this.from = from; } public String getTo() { return to; } public void setTo(String to) { this.to = to; } public String getMsg() { return msg; } public void setMsg(String msg) { this.msg = msg; } public String getArea() { return area; } public void setArea(String area) { this.area = area; } }
ChatLogon.java:
package com.dwr.chat.demo; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; /** * Servlet implementation class ChatLogon */ public class ChatLogon extends HttpServlet { private static final long serialVersionUID = 1L; /** * @see HttpServlet#HttpServlet() */ public ChatLogon() { super(); // TODO Auto-generated constructor stub } /** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doPost(request, response); } /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String userId = request.getParameter("userId"); String area = request.getParameter("area"); if (userId == null || "".equals(userId) || area == null || "".equals(area)) { response.sendRedirect("/chat/jsp/logon.jsp"); } else { HttpSession session = request.getSession(); User user = new User(); user.setArea(area); user.setUserId(userId); session.setAttribute("user", user); request.getRequestDispatcher("/chat/jsp/chat.jsp").forward(request, response); } } }
Chat.java:
package com.dwr.chat.demo; import java.util.Collection; import javax.servlet.http.HttpSession; import org.directwebremoting.ScriptBuffer; import org.directwebremoting.ScriptSession; import org.directwebremoting.WebContext; import org.directwebremoting.WebContextFactory; public class Chat { public void sendMsg(String msg, String to) { WebContext context = WebContextFactory.get(); HttpSession session = context.getSession(); ScriptSession ss = context.getScriptSession(); Collection<ScriptSession> sess = context.getAllScriptSessions(); System.out.println("sess length:" + sess.size()); if (msg == null || "".equals(msg)) { return; } session.setAttribute("flag", session.hashCode()); ss.setAttribute("flag", session.hashCode()); User user = (User) session.getAttribute("user"); if (ss.getAttribute("user") == null) { ss.setAttribute("user", user); } Message message = new Message(); message.setFrom(user.getUserId()); message.setMsg(msg); message.setTo("".equals(to) ? "所有人" : to); message.setArea(user.getArea()); ScriptBuffer sbf = new ScriptBuffer(); sbf.appendScript("Chat.recvMsg("); sbf.appendData(message); sbf.appendScript(");"); // 是否有这个人 boolean hasThisPerson = true; // 是否可以私聊 boolean isPPOk = false; // 是否在同一区域。 boolean isInSameArea = true; ScriptSession ssTo = null; // 是否是与自己聊天 boolean isWithSlef = false; for (ScriptSession ssr : sess) { if (ssr != null) { User user2 = (User) ssr.getAttribute("user"); if (user2 != null) { if ("".equals(to)) { // 发送信息给所有人。 ssr.addScript(sbf); System.out.println("发送给所有人。"); } else { if (user2.getArea().equals(user.getArea())) { if (user2.getUserId().equals(to)) { // 如果是自己,则不能进行私聊 if (user2.getUserId().equals(user.getUserId())) { isWithSlef = true; break; } else { ssTo = ssr; // 私聊 isPPOk = true; break; } } else { // 没有这个人呢。 hasThisPerson = false; break; } } else { isInSameArea = false; // 用户与您不在同一区域 break; } } } } } if (!hasThisPerson) {// 没有这个人。 ss.addScript(new ScriptBuffer(// 不能return "alert('对不起,没有这个人!');")); System.out.println("对不起,没有这个人!"); } if (!isInSameArea) { ss.addScript(new ScriptBuffer("alert('" + to + "与您不在同一区域!');")); System.out.println("不再同一个区域。。。"); } if (isPPOk) { // 私聊 ssTo.addScript(sbf); // 同时,发给自己 ss.addScript(sbf); System.out.println("私聊。"); // 不能return ssTo = null; } if (isWithSlef) { ss.addScript(new ScriptBuffer("alert('自己不能跟自己聊天!');")); System.out.println("自己不能跟自己聊天。");// 不能return } } public void exitPage() { WebContext context = WebContextFactory.get(); HttpSession ses = context.getSession(); if (ses.getAttribute("flag") != null) { int flag = (Integer) ses.getAttribute("flag"); Collection<ScriptSession> colls = context.getAllScriptSessions(); for (ScriptSession ss : colls) { if (ss != null) { if ((Integer) ss.getAttribute("flag") == flag) { ss.invalidate(); return; } } } } } }
Chat.js:
var Chat = new function() { this.sendMsg = function(){ var msg = document.getElementById("msg").value; var pp = document.getElementById("pps"); if (pp.checked) { // 如果选中复选框,说明是私聊。 pp = document.getElementById("pp").value; } else { pp = ""; } if (msg !== "") { ChatServer.sendMsg(msg,pp); document.getElementById("msg").value = ""; } else { alert("发送的消息不能为空!"); return; } }; this.recvMsg = function(data) { var dd = document.getElementById("msgCenter"); if (data !== null) { var tr = document.createElement("tr"); var td1 = document.createElement("td"); var td2 = document.createElement("td"); var td3 = document.createElement("td"); var td4 = document.createElement("td"); td1.innerText = dd.rows.length; td2.innerText = data.from; td3.innerText = data.to; td4.innerText = data.msg; tr.appendChild(td1); tr.appendChild(td2); tr.appendChild(td3); tr.appendChild(td4); dd.appendChild(tr); } }; this.keySendMsg = function(e) { e = e || event; if (e.keyCode == 10) { sendMsg(); } }; // 在选中私聊复选框时,显示 this.showOrHidePP = function(oItem) { var pp = document.getElementById("pp"); if (oItem.checked) { pp.style.display = "block"; } else { pp.style.display = "none"; } }; };
Login.jsp:
<%@ page language="java" contentType="text/html; charset=gb18030" pageEncoding="gb18030"%> <!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=gb18030"> <title>logon</title> <link href="../css/global.css"></link> </head> <body> <fieldset style="width: 600px;"> <legend>用户登录</legend> <form action="/dwr/chat/logon.action" method="post"> <table width="500px" cellpadding="0" cellspacing="0"> <tr> <td>用户ID:</td> <td><input type="text" name="userId"> </td> </tr> <tr> <td>区域:</td> <td><input type="radio" name="area" value="etc01" checked="checked">电信一区 <input type="radio" name="area" value="etc02">电信二区</td> </tr> <tr align="center"> <td colspan="2"><input type="submit" value="登录系统"> </td> </tr> </table> </form> </fieldset> </body> </html>
chat.jsp:
<%@ page language="java" contentType="text/html; charset=gb18030" pageEncoding="gb18030"%> <%@page import="com.dwr.chat.demo.User"%> <!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=gb18030"> <title>chat</title> <link href="../css/global.css"></link> <script type="text/javascript" src="/dwr/dwr/engine.js"></script> <script type="text/javascript" src="/dwr/dwr/util.js"></script> <script type="text/javascript" src="/dwr/dwr/interface/ChatServer.js"></script> <script type="text/javascript" src="/dwr/chat/js/chat.js"></script> <script type="text/javascript"> window.onunload = ChatServer.exitPage(); document.onunload = ChatServer.exitPage(); </script> </head> <body onload="dwr.engine.setActiveReverseAjax(true);ChatServer.sendMsg('','');"> <div> <% User user = (User)session.getAttribute("user"); %> <span style="color:red;font-size:15px;">欢迎<%=user==null?"":user.getUserId() %></span> </div> <div style="width:500px;"> <fieldset> <legend>输入内容</legend> <input type="checkbox" id="pps" onclick="Chat.showOrHidePP(this);">私聊<input type="text" id="pp" style="display:none;"> <table width="500px" cellpadding="0" cellspacing="0"> <tr> <td>输入消息:</td> <td><textarea rows="8" cols="55" id="msg" name="msg"></textarea> </td> </tr> <tr align="center"> <td colspan="2"><input type="button" value="发送" onclick="Chat.sendMsg();"> </td> </tr> </table> </fieldset> </div> <div style="width:500px;"> <fieldset> <legend>消息中心:</legend> <table width="500px" cellpadding="0" cellspacing="0" id="msgCenter" border="1"> <tr> <td>编号</td> <td>发信人</td> <td>收信人</td> <td>消息内容</td> </tr> </table> </fieldset> </div> </body> </html>
web.xml:
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5"> <display-name>dwr</display-name> <welcome-file-list> <welcome-file>index.html</welcome-file> <welcome-file>index.htm</welcome-file> <welcome-file>index.jsp</welcome-file> <welcome-file>default.html</welcome-file> <welcome-file>default.htm</welcome-file> <welcome-file>default.jsp</welcome-file> </welcome-file-list> <servlet> <servlet-name>dwr-invoker</servlet-name> <servlet-class>org.directwebremoting.servlet.DwrServlet</servlet-class> <init-param> <param-name>activeReverseAjaxEnabled</param-name> <param-value>true</param-value> </init-param> <init-param> <param-name>debug</param-name> <param-value>true</param-value> </init-param> <init-param> <param-name>crossDomainSessionSecurity</param-name> <param-value>false</param-value> </init-param> <init-param> <param-name>allowScriptTagRemoting</param-name> <param-value>true</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>dwr-invoker</servlet-name> <url-pattern>/dwr/*</url-pattern> </servlet-mapping> <servlet> <description></description> <display-name>ChatLogon</display-name> <servlet-name>ChatLogon</servlet-name> <servlet-class>com.dwr.chat.demo.ChatLogon</servlet-class> </servlet> <servlet-mapping> <servlet-name>ChatLogon</servlet-name> <url-pattern>/chat/logon.action</url-pattern> </servlet-mapping> </web-app>
dwr.xml:
<?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="ChatServer"> <param name="class" value="com.dwr.chat.demo.Chat"></param> </create> <convert converter="bean" match="com.dwr.chat.demo.User"></convert> <convert converter="bean" match="com.dwr.chat.demo.Message"></convert> </allow> </dwr>
相关推荐
实现聊天功能,首先我们需要配置Spring3的环境,包括创建Spring配置文件,定义Bean来封装业务逻辑和服务接口。例如,我们可以创建一个`ChatService`接口和其实现类,处理发送和接收消息的业务逻辑,使用Spring的`@...
Java+dwr框架实现聊天室是使用Java语言和dwr框架实现的服务器推技术,实现了实时通信的聊天室功能。下面将详细介绍该技术的实现过程和相关知识点。 一、dwr 框架简介 dwr(Direct Web Remoting)是一种基于Ajax...
本教程通过一个简单的聊天室应用,深入探讨DWR的核心功能和使用方法。** ### 1. DWR基本原理 DWR通过在服务器端部署一个Servlet,这个Servlet处理来自客户端的AJAX请求,并将结果以JSON或XML格式返回。在客户端,...
在本项目"jsp DWR框架推模式实现的聊天室"中,我们将探讨如何利用DWR的推送(Push)模式来构建一个实时的在线聊天应用。** 首先,我们需要了解DWR的基本工作原理。DWR通过在浏览器和服务器之间建立一个持久连接,...
在DWR中,可以使用Comet技术来实现聊天系统的实时推送功能,使用户在接收到新消息时无需刷新页面。 5. **群聊实现**: 在这个项目中,开发者使用DWR构建了一个支持多用户参与的聊天系统。每个用户都能即时看到其他...
2. **DWR 3 推送功能概述** 在传统的DWR调用中,通常是客户端发起请求,服务器响应。而推送功能则反其道而行,由服务器主动向客户端发送数据,即服务器推送。这在实时性要求高的应用场景中非常有用,如聊天、股票...
在前端JavaScript部分,你可以使用DWR提供的API来调用后端的`MyReverse`类,实现聊天功能。例如: ```javascript var myReverse = DWRUtil.createObject('myrevsrse'); myReverse.sendChatMessage('Hello, world!',...
DWR(Direct Web Remoting)是一种Java技术,用于在Web应用...通过以上分析,我们可以看出DWR在这个在线即时聊天系统中的关键作用,它不仅简化了前后端的交互,还实现了高效的实时通信,使得私聊功能得以流畅地运行。
DWR 在线即时聊天系统,实现了对指定用户发送消息,和即时显示功能.rarDWR 在线即时聊天系统,实现了对指定用户发送消息,和即时显示功能.rarDWR 在线即时聊天系统,实现了对指定用户发送消息,和即时显示功能.rarDWR 在线...
综上所述,这个基于DWR的Web聊天系统集成了多种技术,实现了高效的实时通信、动态内容呈现、天气查询以及丰富的用户体验。通过DWR,它可以实现实时的聊天消息推送,无需用户手动刷新页面;JSP负责后台逻辑和页面生成...
**二、DWR实现聊天室的关键技术** 1. **实时推送**:DWR的ReverseAjax特性实现了服务器端向客户端的主动推送。当有新消息时,服务器可以直接调用客户端的JavaScript函数,将消息推送给用户,而无需客户端不断地发起...
而DWR反转Ajax解决了这个问题,通过建立持久连接,服务器可以在有新消息时立即推送给客户端,从而实现聊天功能的实时性。 标签中的“dwr”是指DWR库,“反转”是指DWR提供的服务器推送机制,“AJAX”是指这种技术的...
Spring框架和Direct Web Remoting (DWR) 是构建Web应用程序的强大组合,尤其适用于实现动态、实时的交互功能,如无刷新聊天室。这个项目展示了如何利用这两个技术来创建一个无需刷新页面就能进行实时通信的聊天应用...
DWR的主要功能之一是推送技术,这使得服务器可以主动向客户端发送数据,而不仅仅是响应客户端的请求。这种能力在创建实时更新的应用程序,如聊天应用,股票报价或者在线游戏时非常有用。 DWR推送技术的核心在于其...
要实现聊天应用的实时性,DWR提供了两种主要机制:Polling 和 Reverse Ajax (也称为 comet 技术)。Polling 是客户端定时向服务器发送请求检查新消息,而Reverse Ajax则是服务器主动推送给客户端新消息。在这个例子...
DWR实现。无数据库" 在这个项目中,我们关注的是如何使用DWR(Direct Web Remoting)框架来实现一个无需数据库支持的实时在线聊天应用,包括私聊和群聊功能。DWR是一种在浏览器和服务器之间进行实时通信的技术,它...
客户端(通常是JavaScript)可以直接调用这些方法,实现即时的聊天功能。 `com`目录下很可能包含了Java源代码,其中可能包括了聊天系统的业务逻辑和服务端接口。`chat`目录可能包含了聊天界面的HTML、CSS和...
DWR3的消息推送功能在实时应用,如聊天室、股票报价、在线游戏等场景中非常有用。它减少了延迟,提高了用户体验。然而,需要注意的是,由于Comet技术基于长连接,可能会对服务器负载和并发性产生影响,因此在设计和...
通过以上步骤,我们可以利用DWR创建一个功能完备的反转聊天应用。DWR简化了服务器与客户端之间的通信,使得开发者可以专注于业务逻辑,而无需过于关注底层的通信细节。不过,需要注意的是,尽管DWR提供了强大的功能...
【标题】"DWR实现Web类似Web桌面功能"揭示了一个技术应用场景,即使用Direct Web Remoting (DWR)框架在Web应用中实现类似桌面应用的交互体验。DWR是一种JavaScript库,它允许JavaScript代码直接调用服务器端的Java...