个人登录
数狐在线-做最好的在线学习社区java c# liferay jsp
jQuery是如何解析XML数据段的?详细例子演示!
北鼎K105养生壶 进口加厚玻璃水果茶花草茶煎药壶电水壶养身壶
    2017-12-16 1:2:29    作者: jQueryEx      进入评论页
   
  一,回复信息的时候,向数据库里添新行的逻辑
           $buttonRes=$("",{type:"button",value:"回复此条咨询"});
                  $buttonRes.click(function(){

    $("#cm_aboveMessage").val(messageBody);

    // alert($messageList.html());

    sendMessageFromReceiverPage($inputRes);

    $buttonRes.val(($("#satxt").html()));

    $("#cm_messageStatus").val("0");

    // $inputRes.remove();

    $inputRes.css("display","none");

    $("#cm_receiver").val(ttime);

    $buttonRes.unbind( "click" );

    setSendTime();

   

    });


               可以看到有个按钮,按钮单击后,调用setSendTime方法,而该方法:
               /messageapp/test/addMessage
       com.idatafox.chat.business.AddChatMessageAction

              在录入数据以后,对聊天实例的状态进行了实时的变更,例如:

                   if(cm_title.equals("RES")){
             
                           if(ChatController.chatInstancesList.containsKey(cm_receiver)){
                                 ChatController.chatInstancesList.remove(cm_receiver);
                           }
                 }
       
             else{
         
                            ChatController.chatInstancesList.put(cm_initTime,"0");
              }              
           记住这里有个很大的逻辑问题,这里没有对用户名进行判断,这样就会出现冲突,比如A公司的用户
          打开了这个页面,但是用户是发给B用户的,A用户虽然没有看到B用户的信息,但是却提前进行了删除对话
         实例的操作,这显然是有问题的,因此这里必须要考虑到用户的问题。


        /messageapp/trace/newMessagesTraceSeeds       
        com.idatafox.chat.business.TraceRequestNewMessages
        上面的功能,需要加入对用户的判断,这非常重要!客服选择的客服用户名与当前的用户名是否一致?
        如果不一致,就无法调用前面的功能,这是非常非常关键的验证!
        
         String targetUserName=(String)session.getAttribute("targetUserName");

     if(targetUserName==null) targetUserName="NUser-you missing the name!";

         

 UserBasicInformation userinfo=(UserBasicInformation)session.getAttribute("userInformation");



       
               基于会话的层级去比较客户端提交的用户,与后台客户的用户名是没有意义的,因为这不是基于会话的层级
而是基于全局的层级。
              我们需要按照当前后台的登录名,遍历数据库,查找出所有的会话初始编号,然后与全局编号集合里的进行比较。
只有相同的才进行后面的操作。
           
          

  演示素材:
       /messageapp/listMessage    -  该处返回已经回复的消息列表,按照初始化的时间或接受者
      com.idatafox.chat.business.ResponseInformationAction
    之前的用法:

           $.post("/messageapp/listMessage",{initTime:initTime},function(resp){
             
                console.log("返回的数值为!!!!!!!"+resp);
                jQuery(resp).find("line-data").each(function(){
                  console.log("nnnnnnnnnnnnread!!!!!!!!");
                  var ttime=jQuery(this).attr('id');
                  });

            当用户返回数据的时候,返回的仅仅是XML的数据对象,在解析的时候好像遇到了问题,解析不出数据!
            但是单独测试的时候是没问题的,需要寻找出问题的根源。

           /messageapp/trace/listSeeds   - 该处返回是否有了新的回复消息
          com.idatafox.chat.business.TraceSeedsAction

     在上面的类中,我们添加了如下标志判断,以阻止前端的页面被重复刷新:

       if(ChatController.chatInstancesHaveReadList.containsKey(init_time)){
          out.println("-1");
       }
          else{
          out.println("-2");
       }



              $.post("/messageapp/trace/listSeeds",{init_time:initTime},function(resp){
               returnedValue=jQuery.trim(resp);
    
               }).do();
           

            上面的的方法完成的功能大概类似:
            String init_time=request.getParameter("init_time");
            if(ChatController.chatInstancesList.containsKey(init_time)){
               out.println("0");
           }
          else{
               out.println("-1");
          }
        import com.ittrain.global.control.ChatController;
                 public static HashMap chatInstancesList=new HashMap();

public static HashMap chatInstanceMessageCount=new HashMap();

public static HashMap chatInstanceMessageReadCount=new HashMap();


         这里的ChatController.chatInstancesList包含了所有开启的聊天实例ID,所以非常关键,在你这里做比较也
         就是寻找出当前存在的聊天实例窗口。
        
         现在需要打印出所有的聊天实例列表:



后台管理页面的分析:
首先会检测是否有新的消息发出从客户端,该功能是通过:

/messageapp/trace/newMessagesTraceSeeds  来实现的。

         com.idatafox.chat.business.TraceRequestNewMessages
       通过上面的功能来实现对新消息的监控,但是这里有个问题:
在输出的页面上,初始化的时间多了毫秒这样的单位,例如:
2017-12-15 14:34:38.0-  应该知道在实际的数值中,并没有后面的毫秒  

 for(Map.Entry entry:ChatController.chatInstancesList.entrySet()){
                String key=entry.getKey();
                String val=entry.getValue();
               // out.println("key="+key+" val="+val);
                if(val.equals("0")){
                        out.println("0");
                        return ;
                }
              }
通过上面的代码可以看到,这里的聊天实例中的value负责监控聊天实例的状态,比如这里的状态如果变成了0
则表示该聊天实例中有新的消息,需要进行后续的处理。

而后面就是按照用户名从数据库中读取新消息并展示到页面,这用到的类则是:

/messageapp/receivePage

com.idatafox.chat.business.ReceiverPageAction


上面的类则完成了对消息的列表展示,形成XML文档的格式返给前台的页面。

 logUtil.saveLogAsFile(logUtil.defaultFilePath,"info.xml");


可以看到把监控信息放到了info.xml 文件中了,从该文件里看,时间格式中仍然包含了毫秒。
具体这执行则交给了ChatTool .  public String createChatMessageXmlFromTable(String logFilePath,String userName,String fileName)方法
该方法的控制信息保存到了:/log/abc.xml文件中,而且这里需要注意,我们仅仅按照时间排序,显示了最近的9条聊天记录。

  String xmlRes=chatTool.createChatMessageXmlFromTable(patha,userName,"abc.xml");

在上面的方法中,内部调用了方法:
  resXml=resXml+getRowXmlFromTableByInitTime(ttemp,lform.res.getString(2),
  logFilePath,fileName)
该方法具体展示对话信息列表:
  
关于时间器的应用,针对doGetResponseData()方法只在用户提交消息的时候通过调用

setSendTime()来进行激活,并在doGetResponseData()中使用clearInterval(intervalId);进行消除!


通过上面的过程,基本上可以通过整个的测试流程的完成!



            三 ,针对全局类添加 ChatController chatInstancesHaveReadList  包含聊天窗口ID,和是否阅读标志

这非常重要,因为涉及到前端页面的及时获取后台客服发送的实时聊天信息的的开关!


 ChatController.chatInstancesHaveReadList.put(cm_receiver,"-1");

         上面的集合,在后台进行回复的时候,把当前的聊天实例放到这个集合中,别且设置为-1 ,表示还没有阅读。
  而当前端进行阅读后,则把该聊天实例从该聊天实例集合中进行删除即可。

   简单说就是在/messageapp/listMessage     
   com.idatafox.chat.business.ResponseInformationAction  类中进行删除该实例中的项目

   
           四,关于admin登录的逻辑问题

 比如当前用户点击的是OK100的页面与公司,则需要改公司对应的用户登录才能接收到用户的消息,因为在是RES的
时候需要删除聊天实例的时候,需要有类似的判断

 if(ChatController.chatInstancesList.containsKey(cm_receiver)){

                     ChatController.chatInstancesList.remove(cm_receiver);

              }

因为非对应用户,则无法删除,因此也就无法对话了,因为这里的cm_receiver是ok100而不是admin.
但是实际上是否这样,通过看代码好像又不是,经过仔细对比发现是这样的:在前端我们看到的聊天实例后台编号是:
2017-12-15 19:25:07   而在全局的聊天实例集合中是2017-12-15 19:25:7
因此这两个数值进行字符串比较的时候,肯定是不同的,这里为什么不一样,如何变成了07而不是7,需要仔细考虑
原因是在数据库中会进行日期格式的自动转化,把7变成07,因此这是mysql数据库进行的修改,如何再变回来特别
重要!或者在录入的时候,就把格式变成标准的!在这里我们选择后者,从页面开始,就变成标准的数据格式!

可以在chat.js文件中,寻找转变的方法,initDate();


ReceiverPageAction


  读取特定用户下的聊天实例,并形成XML文档传递给前台,相关页面是/log/abc.xml
   在该类中把实例集合中的状态设置为了3,到底为什么,目前还不清楚。

因为public ArrayList<String> getInstanceSetByUserName(String userName)
该方法,是按照用户名,检索其所拥有的聊天实例集合的,因此当你输入超级用户名的时候也因为
这个方法的存在,而看不到所有的实例,目前暂时是这样的,不过要给超级用户权限也很容易,只需要在这个方法里
添加下对超级用户的时候的判断,给与全部权限即可。


  











官方微信服务号
进入评论页
合作企业