• spring整合dwr 3.0 聊天功能


    此文章 思路参考此链接  1.http://yourgame.iteye.com/blog/199079?page=2#comments

                                  2.http://www.cnblogs.com/hoojo/archive/2011/06/08/2075201.html#2361970

                                  非常感谢热心群友:Andy Hun,空

    此文章只是一个测试例子 过多的我就不往上贴了。仅供大家参考学习。此文章包含对scriptSession的处理。

    DWR文件配置

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE dwr PUBLIC "-//GetAhead Limited//DTD Direct Web Remoting 3.0//EN" "http://getahead.org/dwr/dwr30.dtd">
    <dwr>
     <allow>
      <convert match="com.*.*.dwr.entity.MessageDwr" converter="bean" />
    
    spring方式创建
      <create creator="spring" javascript="ChatManager">
       <param name="beanName" value="chatManager" />
      </create>
     </allow>
    
    </dwr>

    web.xml配置

    <!-- dwr反转ajax配置 -->
     <servlet>
      <display-name>DWR Sevlet</display-name>
      <servlet-name>dwr-invoker</servlet-name>
      <servlet-class>org.directwebremoting.servlet.DwrServlet</servlet-class>
      <init-param>
       <!-- 是否打开调试功能 -->
       <param-name>debug</param-name>
       <param-value>true</param-value>
      </init-param>
       <init-param>  
                <description>调试DWR,发布系统时应将其设为false</description>  
                <param-name>debug</param-name>  
                <param-value>true</param-value>  
            </init-param>  
    
      <init-param>
       <description>日志级别有效值为: FATAL, ERROR, WARN (the default), INFO and DEBUG.</description>
       <param-name>logLevel</param-name>
       <param-value>DEBUG</param-value>
      </init-param>
            <init-param>  
                <description>使用服务器推技术(反转AJAX)</description>  
                <param-name>activeReverseAjaxEnabled</param-name>  
                <param-value>true</param-value>  
            </init-param>  
            <init-param>  
                <param-name>  
                    initApplicationScopeCreatorsAtStartup   
                </param-name>  
                <param-value>true</param-value>  
            </init-param>  
            <init-param>  
                <param-name>maxWaitAfterWrite</param-name>  
                <param-value>100</param-value>  
            </init-param>  
            <load-on-startup>1</load-on-startup>  
        </servlet>  
        <servlet-mapping>  
            <servlet-name>dwr-invoker</servlet-name>  
            <url-pattern>/dwr/*</url-pattern>  
        </servlet-mapping> 
    
       <!-- 如果你想在你的service中使用request 请在web.xml文件中加入  Spring中添加 request -->
     <listener>
         <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
     </listener>

    配置一切就绪后 下面开始代码

    //controller开始
    
    package com.sme.web.dwr;
    
    import org.apache.struts2.convention.annotation.Result;
    import org.apache.struts2.convention.annotation.Results;
    
    import com.sme.web.core.BaseController;
    
    @Results({ @Result(name = "reload", location = "/WEB-INF/content/bim/chat.jsp") })
    public class ChatMessageClientController extends BaseController {
    
     /**
      * 
      */
     private static final long serialVersionUID = 1L;
     private String name;
     private Long id;
    
     public String input() {
      name = this.getCreatorId().getName();
      id = this.getCreatorId().getId();
      return "reload";
     }
    
     public String getName() {
      return name;
     }
    
     public void setName(String name) {
      this.name = name;
     }
    
     public Long getId() {
      return id;
     }
    
     public void setId(Long id) {
      this.id = id;
     }
    
    }

    关键service开始

    package com.baoku.common.dwr.service;
    
    import java.text.SimpleDateFormat;
    import java.util.Collection;
    import java.util.Date;
    import java.util.HashMap;
    import java.util.HashSet;
    import java.util.Map;
    import java.util.Set;
    import javax.servlet.http.HttpServletRequest;
    import org.directwebremoting.ScriptBuffer;
    import org.directwebremoting.ScriptSession;
    import org.directwebremoting.WebContextFactory;
    import org.directwebremoting.proxy.dwr.Util;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
    import com.baoku.common.dwr.entity.MessageDwr;
    import com.baoku.tools.string.StringUtils;
    
    @Service("chatManager")
    public class ChatManager {
        @Autowired
        private HttpServletRequest request;
        /** 保存当前在线用户列表 */
        public static Set<MessageDwr> users = new HashSet<MessageDwr>();
        private static Map<String, ScriptSession> SCR_MAPS = new HashMap<String, ScriptSession>();
    
        /**
         * 更新当前在线用户
         * 
         * @param userid
         * @param username
         * @return
         */
        public String updateUsersList(String userid, String username) {
            MessageDwr user = new MessageDwr(userid, username);
            // 保存用户到列表
            users.add(user);
            // 将用户id和页面脚本session绑定
            this.setScriptSessionFlag(userid);
            // 获取当前最新scriptSession
            Collection<ScriptSession> sessions = SCR_MAPS.values();
            Util util = new Util(sessions);
            // 处理这些页面中的一些元素
            util.removeAllOptions("receiver");
            util.addOptions("receiver", users, "byid", "msg");
    
            return null;
        }
    
        /**
         * 将用户id和页面脚本session绑定
         * 
         * @param userid
         */
        public void setScriptSessionFlag(String userid) {
            ScriptSession session = getOnlyScriptSession(userid);
            if (null != session.getAttribute("userid")) {
                String uid = (String) session.getAttribute("userid");
                if (StringUtils.isBlank(uid)) {
                    session.setAttribute("userid", userid);
                }
            } else {
                session.setAttribute("userid", userid);
            }
        }
    
        // 储存最新scriptSession
        public ScriptSession getOnlyScriptSession(String userid) {
            ScriptSession scriptSession = SCR_MAPS.get(userid);
            scriptSession = WebContextFactory.get().getScriptSession();
            SCR_MAPS.put(userid, scriptSession);
            return scriptSession;
        }
    
        /**
         * 根据用户id获得指定用户的页面脚本session
         * 
         * @param userid
         * @return
         */
        public ScriptSession getScriptSession(String userid) {
            ScriptSession scriptSessions = null;
            Collection<ScriptSession> sessions = SCR_MAPS.values();
            for (ScriptSession session : sessions) {
                String xuserid = (String) session.getAttribute("userid");
                if (xuserid != null && xuserid.equals(userid)) {
                    scriptSessions = session;
                }
            }
            return scriptSessions;
        }
    
        /**
         * 发送消息
         * 
         * @param sender
         *            发送者
         * @param receiverid
         *            接受者id
         * @param msg
         *            消息
         */
        public void send(String sender, String receiverid, String msg) {
            ScriptSession session = this.getScriptSession(receiverid);
            ScriptBuffer sb = new ScriptBuffer();
            sb.appendScript("showMessage({msg: ")
                    .appendData(msg)
                    .appendScript(", time: '")
                    .appendScript(
                            new SimpleDateFormat("HH:mm:ss").format(new Date()))
                    .appendScript("',sender:'").appendScript(sender)
                    .appendScript("'})");
            session.addScript(sb);
        }
    
    }

    //实体开始

     

    @Entity
    @Table(name = "COMMON_MESSAGE")
    public class MessageDwr implements Serializable {
     /**
      * 
      */
     private static final long serialVersionUID = 1L;
     private Long id;
     private String msg;
     private String time;
    
     @Id
     @SequenceGenerator(name = "SME_SEQ", sequenceName = "COMMON_MESSAGE_SEQ", allocationSize = 1)
     @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SME_SEQ")
     public Long getId() {
      return id;
     }
    
     public void setId(Long id) {
      this.id = id;
     }
    
     @Column(length = 100)
     public String getMsg() {
      return msg;
     }
    
     public void setMsg(String msg) {
      this.msg = msg;
     }
    
     @Column(length = 20)
     public String getTime() {
      return time;
     }
    
     public void setTime(String time) {
      this.time = time;
     }
    
     private String byid;
    
     @Transactional
     public String getByid() {
      return byid;
     }
    
     public void setByid(String byid) {
      this.byid = byid;
     }
    
     public MessageDwr(String userid, String username) {
      super();
      this.byid = userid;
      this.msg = username;
     }
    
    //在Set中添加相同实体会重 把hashCode重写
    
     @Override
     public int hashCode() {
      return byid.hashCode() * 7 + msg.hashCode() * 11;
     }
    
     @Override
     public boolean equals(Object obj) {
      if (obj.getClass() != this.getClass()) {
       return false;
      }
      MessageDwr meDwr = (MessageDwr) obj;
      if (null != this.getByid() && this.getByid().equals(meDwr.getByid())
        && this.getMsg() != null
        && this.getMsg().equals(meDwr.getMsg())) {
       return true;
      }
      return false;
     }

     

    //JSP开始

    <%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
    <%@ include file="http://www.cnblogs.com/../common/taglibs.jsp"%>
    <html>  
        <head>  
            <title>chat</title>  
            <!-- jQuery -->
            <script type='text/javascript' src="${ctx}/plugin/jquery.js"></script>
            <!-- 通用JS -->
            <script type='text/javascript' src="${ctx}/plugin/common.js" ></script>
            <script type='text/javascript' src='${ctx}/dwr/interface/ChatManager.js'></script>  
            <script type='text/javascript' src='${ctx}/dwr/engine.js'></script>  
            <script type='text/javascript' src='${ctx}/dwr/util.js'></script>  
            <script type="text/javascript">
            dwr.engine.setNotifyServerOnPageUnload(true);
            /**  
             * 页面初始化  
             */  
            function init() {   
                ChatManager.updateUsersList($('userid').value,$('username').value); // 当你打开界面的时候,先获得在线用户列表.   
            }   
    
            /**  
             * 发送消息  
             */  
            function send() {   
                var sender = dwr.util.getValue('username'); // 获得发送者名字   
            var receiver = dwr.util.getValu('receiver'); // 获得接受者id 
                var msg = dwr.util.getValue('message'); // 获得消息内容   
                ChatManager.send(sender, receiver, msg); // 发送消息   
            }   
              
            function showMessage(data) {
                var message = decodeURIComponent(decodeURIComponent(data.msg));
                var text = dwr.util.getValue("info");
                if (!!text) {  
                    dwr.util.setValue("info", text+"\n" +data.sender+ " " + data.time + "\n" + message);
                } else {
                    dwr.util.setValue("info", data.sender+" "+data.time + "\n" + message);
                }
            }
    
            window.onload = init;//页面加载完毕后执行初始化方法init  
            
            </script>
        </head>  
        <body>  
            <input type="hidden" name="userid" value="${id}"/>  
            <table class="tablemodule">
     <thead>
      <tr>
       <td>昵称: ${name}<input type="hidden" name="username" value="${name}"/> </td>
      </tr>
     </thead>
     <tbody>
      <tr>
       <td>
        <textarea rows="20" cols="60" id="info" readonly="readonly"></textarea>
       <textarea  rows="3" cols="50" name="message" id="message"></textarea>
       <input type="button" value="发送" id="send" name="send" onclick="send();" />  
       </td>
       <td style="vertical-align: top;">
        <select name="receiver" id="receiver"  style="300px; height:200px;" multiple="multiple">  
                </select> 
              </td>
      </tr>
     </tbody>
    </table>
        </body>  
    </html>  

    //以上就是我的介绍 关于更多的DWR问题 请google

    /以下是我运行效果

     

  • 相关阅读:
    pdf在线转换器
    抖音修复老照片动起来笑起来的程序app的下载地址
    FFmpeg.AutoGen Unable to load DLL 'avutil.56' 解决方法
    Array.prototype.fill 填充值被复用的问题
    Recoil Input 光标位置被重置到末尾的问题
    TypeScript 扩展全局 Window 时报错的解决
    Recoil 中默认值的正确处理
    Recoil 中多级数据联动及数据重置的合理做法
    Recoil 默认值及数据级联的使用
    Recoil 的使用
  • 原文地址:https://www.cnblogs.com/sjzzqy/p/zqy.html
Copyright © 2020-2023  润新知