利用Servlet和JSP实现三个简便的Web聊天室系统,PHP总结当前在线用户数实例疏解

onLineUser.java 传承HttpSessionBindingListener达成在线人数记录效能

不足为奇,当访客访问网址时,页面记录用户的cookie新闻,当cookie过期即以为用户不在线。本文中大家利用PHP记录访客IP,并在客户端记录cookie及超时时间,同不经常间经过天涯论坛IP地址接口,获取访客的地理地点(本例只记录省份),壹并写入mysql表中,就可以计算一段时间内的访客总量,也能够查阅访客的地域布满。

  • JSP Java Server Pages,动态web技术。
  • web服务器中经过转为Servlet来调用

应用Servlet和JSP实现一个简练的Web聊天室系统,servlet聊天室

package com.trs;

import java.util.*;  
import javax.servlet.http.*;  
import javax.servlet.*;  

/**
*HttpSessionBindingListener接口有两方需要实现的方法:
*public synchronized void valueBound(HttpSessionBindingEvent httpsessionbindingevent)
*public synchronized void valueUnbound(HttpSessionBindingEvent httpsessionbindingevent)
*Session创建的时候Servlet容器将会调用valueBound方法;Session删除的时候则调用valueUnbound方法.
*/
public class onLineUser implements HttpSessionBindingListener
{  
    public onLineUser()
    { 
    } 

    //保存在线用户的向量
    private Vector users=new Vector();

    //得到用户总数
    public int getCount()
    { 
        users.trimToSize(); 
        return users.capacity(); 
    }

    //判断是否存在指定的用户
    public boolean existUser(String userName)
    { 
        users.trimToSize(); 
        boolean existUser=false; 
        for (int i=0;i
        { 
            if (userName.equals((String)users.get(i)))
            {
                existUser=true; 
                break;
            }
        }
        return existUser; 
    }

    //删除指定的用户
    public boolean deleteUser(String userName)
    { 
        users.trimToSize(); 
        if(existUser(userName))
        { 
            int currUserIndex=-1; 
            for(int i=0;i
            { 
                if(userName.equals((String)users.get(i)))
                { 
                    currUserIndex=i; 
                    break; 
                } 
            } 
            if (currUserIndex!=-1)
            { 
                users.remove(currUserIndex); 
                users.trimToSize(); 
                return true; 
            } 
        } 
        return false; 
    }

    //得到当前在线用户的列表
    public Vector getOnLineUser() 
    {
        return users; 
    } 

    public void valueBound(HttpSessionBindingEvent e)
    {  
        users.trimToSize(); 
        if(!existUser(e.getName()))
        { 
            users.add(e.getName()); 
            System.out.print(e.getName()+"\t  登入到系统\t"+(new Date())); 
            System.out.println("     在线用户数为:"+getCount()); 
        }else 
            System.out.println(e.getName()+"已经存在"); 
    }  

    public void valueUnbound(HttpSessionBindingEvent e)
    {  
        users.trimToSize(); 
        String userName=e.getName(); 
        deleteUser(userName); 
        System.out.print(userName+"\t  退出系统\t"+(new Date())); 
        System.out.println("     在线用户数为:"+getCount()); 
    }
}  

www.5929.com 1

语法: <%= 变量或表达式 %><%= new java.util.Date() %>

1 主题素材讲述                                               

使用Java EE相关手艺达成一个粗略的Web聊天室系统,具体要求如下。

(一)编写一个报到页面,登6音讯中有用户名和密码,分别用五个按键来交付和重新初始化登六音信。

(二)编写一个Servlet程序Main.java通过请求指派来拍卖用户提交的记名新闻,假设用户名称叫本小组成员的名字且密码为相应的学号时,跳转到LoginSuccess展现聊天分界面(类似于QQ群聊天分界面,可应用HTML中的frameset标签生成七个窗口,贰个用来贯彻用户音信输入,另2个彰显全部用户聊天记录的);不然跳转到LoginFail页面,提醒用户重新登入(注:此页面要含有前边的登入界面)。

(三)编写八个Servlet程序,分别用来显示“新闻输入”窗口和“聊天记录展现”窗口的源委;用户在“音讯输入”窗口中键入聊天内容,点击“发送”开关后,在“聊天记录展现”窗口中显得发送讯息的用户名称和聊天内容。提醒:利用HTML中的textarea标签来落到实处。

(四)在登6分界面上落到实处记住用户名和密码的功效,使稳当用户挑选了此功效并打响登6后,在其下一次报到时方可毫不再输入用户名和密码就可以登六。提醒:此意义可由此三个库克ie来落实。

以下职能选做:

利用Servlet和JSP实现三个简便的Web聊天室系统,PHP总结当前在线用户数实例疏解。(5)编写3个Listener程序来监听会话的始建和销毁事件,以此计算当前在线(登六)人数,并将其出示在聊天分界面上。

(6)增加二个Filter对本系统具有的Servlet程序进行过滤,该Filter完结对请求和响应对象的编码格式的装置(实现此功效后,Servlet能够直接从呼吁对象中拿走参数消息而不需求兑现对请求进行格式的编码)。在【GlassFish
Server】视图中输出程序在Filter和其剩余资金源之间的推行各样。

 

 

logout.jsp

HTML
作者们在页面上放置1个显妥贴前在线人数的div#利用Servlet和JSP实现三个简便的Web聊天室系统,PHP总结当前在线用户数实例疏解。total以及二个用来呈现访客地区遍布的列表#onlinelist,暗许大家在列表中放置一张与加载动画图片,后边大家用jQuery调节当鼠标滑向时显得详细列表。

语法:

2 缓慢解决方案                                               

<%@ page contentType="text/html;charset=GB2312" pageEncoding="GBK"%>
<%@ page import="com.trs.onLineUser,java.util.*" %>  
<jsp:useBean id="onlineuser" class="com.trs.onLineUser" scope="application"/> 
<html>
<head>
<title>show</title>
</head>  
<body>
<%  
String name=(String)session.getValue("name");
if(name!=null &amp;&amp; name.length()!=0)
{
if(onlineuser.deleteUser(name)) 
  out.println(name+"已经退出系统!"); 
else 
  out.println(name+"没有登陆到系统!"); 
}
%>
</body>
</html>
<div class="demo"> 
  <div id="total">当前在线:</div> 
  <ul id="onlinelist"> 
    <li><img src="loader.gif"></li> 
  </ul> 
</div> 

<% 多行java代码 %>//在<%
%>中得以定义变量、编写语句,不可能定义方法。

二.一 预期效果                    

 www.5929.com 2

图一:网络聊天系统运作暗暗表示图

 

online.jsp

CSS
小编们用CSS来渲染彰显效果,为了正是不让大家的演示很掉价,下边包车型大巴代码中,大家利用了CSS三,时期在向上呀,所以提议利用当代浏览器预览效果。

<% int sum=0;//声明变量 /*编写语句*/ for (int i=1;i<=100;i++){ sum+=i; } out.println("<h1>Sum="+sum+"</h1>");%>

<% int x = 10; out.println;%><p>这是JSP页面文本</p><% int y = 20; out.println;%>

www.5929.com,二.2 系统结构示意图                 

 

 www.5929.com 3

 

图二:系统结构暗意图

welcome.jsp具体页面:

www.5929.com 4

图三:welcome.jsp实际运维图

None
.demo{width:150px; margin:20px auto; font-size:14px} 
#total{padding:6px 10px; background:#090 url(arr.png) no-repeat right top; color:#fff; 
cursor:pointer; -moz-border-radius:5px; -webkit-border-radius:5px; border-radius:5px; 
-moz-box-shadow:0 0 3px #ccc; -webkit-box-shadow:0 0 3px #ccc;box-shadow:0 0 3px #ccc;} 
#onlinelist{background:#f7f7f7; border:1px solid #d3d3d3; display:none; -moz-border-radius:5px; 
-webkit-border-radius:5px; border-radius:5px; -moz-box-shadow:0 0 3px #ccc; 
-webkit-box-shadow:0 0 3px #ccc;box-shadow:0 0 3px #ccc;} 
#onlinelist li{height:20px; line-height:20px;padding:4px 6px;border-bottom:1px dotted #d9d9d9} 
#onlinelist li span{float:right} 
#onlinelist li:hover{background:#fff} 

单个脚本片断中的Java语句能够是不完全的,然则,多少个脚本片断组合后的结果必须是壹体化的Java语句

二.三 具体编码                    

(1)Main.java(Servlet类)通过请求指派来拍卖login.jsp页面用户提交的报到消息(并动用Cookie完成记住用户登入用户名和密码成效),成功则跳转到welcome.jsp,退步则跳转到login.jsp。具体实现如下:

英特网聊天系统登入首页login.jsp页面代码:

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";

String username = "";
String password = "";
//String[] checkBox = request.getParameterValues("save_password");
//获取当前站点的所有Cookie
 Cookie[] cookies = request.getCookies();

 for (int i = 0; i < cookies.length; i++) {
          //对cookies中的数据进行遍历,找到用户名、密码的数据
         if ("username".equals(cookies[i].getName())) {
          //读取时URLDecoder.decode进行解码(PS:Cookie存取时用URLEncoder.encode进行编码)
             username = java.net.URLDecoder.decode(cookies[i].getValue(),"UTF-8");
         } else if ("password".equals(cookies[i].getName())) {
             password =  java.net.URLDecoder.decode(cookies[i].getValue(),"UTF-8");
         }
  }
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    <title>网上聊天室登陆页面</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="content-type" content="text/html; charset=utf-8">
    <meta http-equiv="description" content="This is my page">
    <!--
    <link rel="stylesheet" type="text/css" href="styles.css">
    -->
    <style type="text/css">
        *
        {
            margin: 0;
            padding: 0;
        }
        body
        {

            font-size: 0px;
            padding: 200px;


        }

    </style>
  </head>
 <body>
 <form action="Main" method="post">
 <div>记住密码
<input type="submit" value="登陆" name="login">Main.java类代码:

package com.liuzhen.chart;

import java.io.IOException;
import java.net.URLEncoder;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


@SuppressWarnings("serial")
public class Main extends HttpServlet {

    /**
     * Constructor of the object.
     */
    public Main() {
        super();
    }

    /**
     * Destruction of the servlet. <br>
     */
    public void destroy() {
        super.destroy(); // Just puts "destroy" string in log
        // Put your code here
    }


    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

         doPost(request,response);
    }


    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        //response.setContentType("text/html;charset=utf-8"); 
        //此出注解是因为使用CodeFilter类过滤所有Servlet,转换编码
        //request.setCharacterEncoding("utf-8");
        String userName = request.getParameter("username");
        String passWord = request.getParameter("password");
        String checkBox = request.getParameter("save_password");

        System.out.println("userName:"+userName+"\n"+"passWord:"+passWord);
        request.getSession().setAttribute("nameSession", userName);   //将用户名存入session中
        String[] name_one = {"柳真","刘仁杰","吴超","张浩东","陈初相"};
        String[] pwd_one = {"201421092073","201421092068","201421092077","201421092082","201421092119"};
        String name_two = "";
        String pwd_two = "";
        boolean login_test = false;
        for(int i=0;i<5;i++){
            name_two = name_one[i];
            pwd_two = pwd_one[i];
            if(userName.equals(name_two) && passWord.equals(pwd_two))
                login_test = true;                           
        }

        if(login_test) {
            if ("save".equals(checkBox)) {
                //Cookie存取时用URLEncoder.encode进行编码(PS:读取时URLDecoder.decode进行解码)
                String name = URLEncoder.encode(userName,"UTF-8");
                //创建两个Cookie对象
                Cookie nameCookie = new Cookie("username", name);
                //设置Cookie的有效期为3天
                nameCookie.setMaxAge(60 * 60 * 24 * 3);
                String pwd = URLEncoder.encode(passWord,"UTF-8");
                Cookie pwdCookie = new Cookie("password", pwd);
                pwdCookie.setMaxAge(60 * 60 * 24 * 3);
                response.addCookie(nameCookie);
                response.addCookie(pwdCookie);
             }
             request.getRequestDispatcher("welcome.jsp").forward(request, response);           
        }   
        else{
             response.sendRedirect("loginFail.jsp");      
              // request.getRequestDispatcher("loginFail.jsp").forward(request, response);             
        }


    }

    /**
     * Initialization of the servlet. <br>
     *
     * @throws ServletException if an error occurs
     */
    public void init() throws ServletException {
        // Put your code here
    }

}

登入败北页面loginFail.jsp页面代码:

www.5929.com 5

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">

    <title>My JSP 'loginFail.jsp' starting page</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="content-type" content="text/html; charset=gb2312">
    <meta http-equiv="description" content="This is my page">
    <!--
    <link rel="stylesheet" type="text/css" href="styles.css">
    -->

  </head>

  <body>
    <br>
      <br>
           <h1>用户名和密码不匹配,请重新登陆!</h1>
           <a href="login.jsp">重新登陆</a>
  </body>
</html>

View Code

登入成功页面welcome.jsp页面代码(此处使用frameset标签,分为尾部、左部和高中级主页三片段,分别对象header.jsp、left.jsp和main.jsp页面):

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">

    <title>网上聊天室</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="content-type" content="text/html; charset=gb2312">
    <meta http-equiv="description" content="This is my page">
    <!--
    <link rel="stylesheet" type="text/css" href="styles.css">
    -->

  </head>
   <frameset rows="100,*" cols="*" frameborder="no" border="0" framespacing="0">
         <frame src="header.jsp" name="topFrame" scrolling="auto" noresize="noresize" id="topFrame"/>
      <frameset cols="213,*" frameborder="no" border="0" framespacing="0">
        <frame src="left.jsp" name="leftFrame" scrolling="No" noresize="noresize" id="leftFrame"/>
        <frame src="main.jsp" name="mainFrame" scrolling="auto" id="mainFrame"/>
      </frameset>
   </frameset> 
  <body>

  </body>
</html>

闲谈底部header.jsp页面代码:

www.5929.com 6

<%@ page language="java" import="java.util.*" contentType="text/html;charset=gb2312" pageEncoding="gb2312"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">

    <title></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">
    <meta http-equiv="Content-Type" content="text/html;charset=gb2312">
    <!--
    <link rel="stylesheet" type="text/css" href="styles.css">
    -->

  </head>

  <body topmargin="0" leftmargin="0" rightmargin="0">
     <form action="">
             <table  width="100%" height="79" border="0" cellpadding="0"
                     cellspacing="0" align=center>
             <tr>
                <td bgcolor="F9A859" valign="top">
                <table width="100%" height="50" border="0" align="center"
                       cellpadding="0" cellspacing="0" bgcolor="FBEAD0">
                 <tr>
                   <td align="center">
                     网上聊天室
                   </td>
                 </tr> 

                </table>

                </td>
             </tr>
               <tr>
                 <td bgcolor="F9A859" valign="top">
                 <table width="100%" border="0" align="center" cellpadding="0"
                         cellspacing="0">
                  <tr>
                     <td align="center">
                     欢迎<%=(String)request.getSession().getAttribute("nameSession") %>访问!
                     当前在线人数为<%=application.getAttribute("peopleOnline")%>人
                     </td>
                  </tr>       

                 </table>

                 </td>
              </tr>              

             </table>
           </form>
  </body>
</html>

View Code

聊天左部left.jsp页面代码(此处为了呈现雅观,使用了jquery-壹.四.二包):

www.5929.com 7

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">

    <title>My JSP 'test.jsp' starting page</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="content-type" content="text/html; charset=gb2312">
    <meta http-equiv="description" content="This is my page">
    <!--
    <link rel="stylesheet" type="text/css" href="styles.css">
    -->
 <style type="text/css">
        *
        {
            margin: 0;
            padding: 0;
        }
        body
        {
            font-size: 15px;
            padding: 00px;
        }
        .menu
        {
            width: 500px;
            border-bottom: solid 1px gray;
        }
        .menu h3
        {
            border: solid 1px gray;
            height: 30px;
            line-height: 30px;
            padding-left: 10px;
            padding:0 5px;
            border-bottom: none;
            cursor: pointer;

        }
        .menu p
        {
            border-left: solid 1px gray;
            border-right: solid 1px gray;
            padding: 20px 0;
            padding-left: 5px;
        }
        .changecolor{background-color:red;}
    </style>
    <script src="js/jquery-1.4.2.min.js" type="text/javascript"></script>
    <script type="text/javascript">
          $(function () {
            $(".menu p:not(:first)").hide();
            $(".menu h3").css("background", "#ccc");       
            $(".menu h3").hover(function () { $(this).css("background-color", "gray").siblings("h3").css
("background-color", "#ccc");});
            $(".menu h3").mouseleave(function () { 
               $(".menu h3").css("background", "#ccc");}); //离开时将其变为原来颜色
            var index = $(".menu h3").index(this);
            $(".menu h3").click(function () { $(this).next("p").slideToggle().siblings("p").slideUp(); });
        });
    </script>
  </head>

  <body>
    <div class="menu">
        <h3>
            我的好友</h3>
        <p>
   <a href="index.jsp">周杰伦</a><br/><br/>
   <a href="index.jsp">周杰伦</a><br/><br/>
   <a href="index.jsp">周杰伦</a><br/><br/>
   <a href="index.jsp">周杰伦</a><br/><br/>
   <a href="index.jsp">周杰伦</a><br/><br/>
   <a href="index.jsp">周杰伦</a><br/><br/>
   <a href="index.jsp">周杰伦</a><br/><br/>
   <a href="index.jsp">周杰伦</a><br/>
            </p>
        <h3>
            我的朋友</h3>
        <p>
   <a href="index.jsp">李连杰</a><br/><br/>
   <a href="index.jsp">李连杰</a><br/><br/>
   <a href="index.jsp">李连杰</a><br/><br/>
   <a href="index.jsp">李连杰</a><br/><br/>
   <a href="index.jsp">李连杰</a><br/><br/>
   <a href="index.jsp">李连杰</a><br/><br/>
   <a href="index.jsp">李连杰</a><br/><br/>
   <a href="index.jsp">李连杰</a><br/>
         </p>
        <h3>
            陌生人</h3>
        <p>
   <a href="index.jsp">比尔盖茨</a><br/><br/>
   <a href="index.jsp">比尔盖茨</a><br/><br/>
   <a href="index.jsp">比尔盖茨</a><br/><br/>
   <a href="index.jsp">比尔盖茨</a><br/><br/>
   <a href="index.jsp">比尔盖茨</a><br/><br/>
   <a href="index.jsp">比尔盖茨</a><br/><br/>
   <a href="index.jsp">比尔盖茨</a><br/>
          </p>
    </div>
  </body>
</html>

View Code

闲话主页main.jsp页面代码:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">

    <title>My JSP 'main.jsp' starting page</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="content-type" content="text/html; charset=utf-8">
    <meta http-equiv="description" content="This is my page">
    <!--
    <link rel="stylesheet" type="text/css" href="styles.css">
    -->

  </head>

  <body>
  <form action="InputInformation" method=post>
  <textarea  cols="105" rows="25" name="show_textarea"><%=request.getAttribute("input_textarea")%></textarea>
  <br>
  <textarea  cols="105" rows="5"  name="input_textarea"></textarea><br>
  <input type="submit" value="发送" name="button_one" 
   style="width: 100px; height: 40px;font-size: 25px;"><br>
  </form>
  </body>
</html>

 

(二)InputInformation.java(Servlet类)通过请求指派获取main.jsp聊天输入框中输入音信,跳转到main.jsp页面,并在聊天记录突显框中突显聊天音信。具体落到实处如下:

 InputInformation.java类代码如下:

package com.liuzhen.chart;

import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@SuppressWarnings("serial")
public class InputInformation extends HttpServlet {
    public String chat_record = "";  //定义聊天记录变量,此处为全局变量

    /**
     * Constructor of the object.
     */
    public InputInformation() {
        super();
    }

    /**
     * Destruction of the servlet. <br>
     */
    public void destroy() {
        super.destroy(); // Just puts "destroy" string in log
        // Put your code here
    }


    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        doPost(request,response);
    }


    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        //response.setContentType("text/html;charset=utf-8"); 
        //此出注解是因为使用CodeFilter类过滤所有Servlet,转换编码
        //request.setCharacterEncoding("utf-8");
        String input_textarea = request.getParameter("input_textarea");
        Date now = new Date();    //创建日期对象,及系统当前时间
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//设置日期格式
        String time = dateFormat.format( now ); //按照给定的日期格式获取系统当前时间
        String t = (String)request.getSession().getAttribute("nameSession");  //获取登陆页面用户名
        chat_record += t+"  "+input_textarea+"  "+time+"\n";   //聊天记录存储
        request.setAttribute("input_textarea",chat_record); //将当前聊天输入内容存储
        request.getRequestDispatcher("main.jsp").forward(request,response);  //跳转到当前聊天输入界面,即界面布局不变
    }

    /**
     * Initialization of the servlet. <br>
     *
     * @throws ServletException if an error occurs
     */
    public void init() throws ServletException {
        // Put your code here
    }

}

 

(三)CodeFilter.java(过滤器类)截取系统具有Servlet类,完结对请求和响应对象的编码格式的安装,均安装为UTF-八。具体贯彻如下:

 CodeFilter.java类代码如下:

package com.liuzhen.chart;

import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

//采用注解方式配置URL,此处就不必再在web.xml文件中配置。如果两者均配置的话,系统将以web.xml文件中配置信息为准
@WebFilter(filterName="CodeFilter",urlPatterns={"/*"})      

public class CodeFilter implements Filter{


         @Override
         public void destroy() {
             System.out.println("destroy---CodeFilter");                          
         }

         @Override
         public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2)
                 throws IOException, ServletException {
             System.out.println("start----doFilter--CodeFilter");

             HttpServletRequest request =(HttpServletRequest) arg0;
             HttpServletResponse response =(HttpServletResponse) arg1;
             //以上是强制内型转换,使用request对象和response对象

             request.setCharacterEncoding("utf-8");          //设置过滤页面提取数据的编码
             response.setContentType("text/html;charset=utf-8");  //设置过滤页面显示数据的编码

             arg2.doFilter(arg0, arg1);//在页面跳转之前执行此语句前面的代码,执行完页面的代码之后,在执行后面的语句
             System.out.println("第一个字符过滤器");
             System.out.println("end------doFilter--CodeFilter");    
             }

         @Override
         public void init(FilterConfig filterConfig) throws ServletException {
             System.out.println("init----CodeFilter");
         }

}

 

(肆)OnlineListener.java(监听器类)主动监听系统Web容器,再次来到当前闲谈系统在线人数,具体落到实处如下:

 OnlineListener.java类代码如下:

package com.liuzhen.chart;

import javax.servlet.ServletContext;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;

public class OnlineListener implements HttpSessionListener{

    public void sessionCreated(HttpSessionEvent arg0) {
           ServletContext context = arg0.getSession().getServletContext();

           Integer count = (Integer) context.getAttribute("peopleOnline");
           if (count == null) {
               count = 1;
           } else {
               count++;
           }
           context.setAttribute("peopleOnline", count);
        }

        public void sessionDestroyed(HttpSessionEvent arg0) {
           ServletContext context = arg0.getSession().getServletContext();
           Integer count = (Integer) context.getAttribute("peopleOnline");

           count--;
           context.setAttribute("peopleOnline", count);
        }

}

此处还要给OnlineListener监听器类在web.xml文件中布局路线,web.xml配置代码具体如下(辛巳革命标志代码):

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" 
    xmlns="http://java.sun.com/xml/ns/javaee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
    http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
  <display-name></display-name>

  <listener>
    <listener-class>com.liuzhen.chart.OnlineListener</listener-class>
  </listener>

  <servlet>
    <description>This is the description of my J2EE component</description>
    <display-name>This is the display name of my J2EE component</display-name>
    <servlet-name>Main</servlet-name>
    <servlet-class>com.liuzhen.chart.Main</servlet-class>
  </servlet>
  <servlet>
    <description>This is the description of my J2EE component</description>
    <display-name>This is the display name of my J2EE component</display-name>
    <servlet-name>InputInformation</servlet-name>
    <servlet-class>com.liuzhen.chart.InputInformation</servlet-class>
  </servlet>



  <servlet-mapping>
    <servlet-name>Main</servlet-name>
    <url-pattern>/Main</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>InputInformation</servlet-name>
    <url-pattern>/InputInformation</url-pattern>
  </servlet-mapping>
  <welcome-file-list>
    <welcome-file>login.jsp</welcome-file>
  </welcome-file-list>
</web-app>

在调用监听器类达成监听系统当前在线人数时,本机上同2个浏览器同期登录八个用户,只好算作一回,本机上差异浏览器登入则分级算作贰次。以下分别是在IE、谷歌(谷歌)和360浏览器登录在线人数字展现示:

图4:IE浏览器登入,展现在线人数一位

 www.5929.com 8

图5:谷歌(谷歌)浏览器登录,展现在线人数四个人

 www.5929.com 9

图6:360浏览器登录,呈现在线人数二人

 附:本文系统代码Coding链接:

 仿效资料:

壹、cookie达成记住密码

贰、监听器(完毕在线计算人数,踢人)

叁、Java Filter过滤机制详解

四、jsp与servlet之间页面跳转及参数字传送递实例

 

壹 难点讲述 利用 Java EE 相关能力完成一个大约的 Web
聊天室系统,具体需要如下…

供给证实的是这种办法符合唯有单台服务器的小网址使用,假使网址有多台webserver则不能够利用这种艺术记录在线人数。

Mysql
笔者们要绸缪一张数据表online,用来记录访客IP、地区及走访时间。整个示例计算进程都依靠那张表,其布局如下:

<% for (int i=1; i<5; i++) {%> <H1>http://localhost:8080/JavaWeb_Jsp_Study_20140603/</H1><% }%>
CREATE TABLE IF NOT EXISTS `online` ( 
 `id` int(11) NOT NULL AUTO_INCREMENT, 
 `ip` varchar(30) NOT NULL, 
 `province` varchar(64) NOT NULL, 
 `addtime` int(10) NOT NULL DEFAULT '0', 
 PRIMARY KEY (`id`) 
) ENGINE=MyISAM DEFAULT CHARSET=utf8; 

JSP页面中编辑的有着代码,默许会翻译到servlet的service方法中,
而Jsp评释中的java代码被翻译到_jspService方法的外场。所以,JSP评释可用来定义JSP页面转变到的Servlet程序的静态代码块、成员变量和格局。
三个静态代码块、变量和函数能够定义在一个JSP评释中,也得以独家独立定义在几个JSP申明中。
JSP隐式对象的遵守范围只限于Servlet的_jspService方法,所以在JSP扬言中无法使用这一个隐式对象。

PHP online.php用来记录访客消息,包含IP地址和地域。首先检验数据表中是或不是有访客IP记录,要是有,则只更新访问时间,不然,获取用户省份区域,并将用户IP即省份区域插入到表中。在此,能够看清是不是留存来访的客人的cookie记录,即便不存在则向网易IP地址库请求获取访客的区域新闻,并设置cookie值和过期时间。最终,大家删除表中已经过期的笔录,总结总记录数并出口,详细请看代码注释。

<%!static { System.out.println("loading Servlet!"); }private int globalVar = 0;public void jspInit(){ System.out.println("initializing jsp!");}%><%!public void jspDestroy(){ System.out.println("destroying jsp!");}%>
include_once('connect.php'); //连接数据库 

$ip = get_client_ip(); //获取客户端IP 
$time = time(); 
//查询表中是否有ip为当前访客IP的记录 
$query = mysql_query("select id from online where ip='$ip'"); 
if(!mysql_num_rows($query)){//如果不存在访客IP 
  if($_COOKIE['geoData']){//如果存在cookie,则获取用户的区域 
    $province = $_COOKIE['geoData']; //区域(省份) 
  }else{ 
    $api = "http://int.dpool.sina.com.cn/iplookup/iplookup.php?format=json&ip=$ip"; 
    $json = file_get_contents($api);//
    $arr = json_decode($json,true);//解析json 
    $province = $arr['province'];//获取省份 
    setcookie('geoData',$province,$time+600); //设置cookie,设置过期时间为10分钟 
  } 
  //将访客信息插入到数据表中 
  mysql_query("insert into online (ip,province,addtime) values ('$ip','$province','$time')"); 
}else{//如果存在,则更新该用户访问时间 
  mysql_query("update online set addtime='$time' where ip='$ip'"); 
} 
//删除已过期的记录 
$outtime = $time-600; 
mysql_query("delete from online where addtime<$outtime"); 
//统计总记录数,即在线用户数 
list($totalOnline) = mysql_fetch_array(mysql_query("select count(*) from online")); 
echo $totalOnline;//输出在线总数 
mysql_close(); 

显式注释:直接利用HTML风格的注释:<!- – 注释内容- ->

函数get_client_ip()用来赢得用户真正IP。

隐式注释:间接运用JAVA的笺注://、/……/

function get_client_ip() { 
  if (getenv("HTTP_CLIENT_IP") && strcasecmp(getenv("HTTP_CLIENT_IP"), "unknown")) 
    $ip = getenv("HTTP_CLIENT_IP"); 
  else if (getenv("HTTP_X_FORWARDED_FOR") && strcasecmp(getenv("HTTP_X_FORWARDED_FOR"), 
"unknown")) 
    $ip = getenv("HTTP_X_FORWARDED_FOR"); 
  else if (getenv("REMOTE_ADDR") && strcasecmp(getenv("REMOTE_ADDR"), "unknown")) 
    $ip = getenv("REMOTE_ADDR"); 
  else if (isset ($_SERVER['REMOTE_ADDR']) && 
$_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], "unknown")) 
    $ip = $_SERVER['REMOTE_ADDR']; 
  else 
    $ip = "unknown"; 
  return ($ip); 
} 

JSP自身的疏解:<%- – 注释内容- -%>

geo.php用来总计外省份(区域)访客人数布满。通过查询数据库,并按省份分组排序就可以,注意大家将最后的数量集以JSON的款型出口,便于前端ajax交互。

注: 显式和隐式,注释内容不能够包罗jsp语法的片段至关心重视要字。

include_once('connect.php');//连接数据库 
//查询区域统计 
$sql = "select province,count(*) as total from online group by province order by total desc"; 
$result = mysql_query($sql); 
while($row=mysql_fetch_array($result)){ 
  $list[] = array( 
    'province' => $row['province'], 
    'total' => $row['total'] 
  );  
} 
echo json_encode($list);//以json格式输出 

PS一:关于jsp路线获取以及页面跳转 JSP常用跳转格局getRequestDispatcher
和sendRedirect差距及路线难点JSP页面跳转的三种实现格局JSP中获取各样门路的章程
PS二:jsp 中session &
cookie,session会在JSP中私下认可,也可以自身在page中配置
jsp中cookie与session等自个儿总结精粹关于jsp内置对象Session和Cookie使用的皮毛掌握,怎样选拔Session来总计网址在线人数

jQuery
前端页面必要做的是,页面加载时显得访客总的数量,即选用ajax请求online.php就可以。然后当鼠标滑向总括箭头时,通过ajax请求geo.php获取各区域省份的在线人数,并以下拉的法子表现效果。

$(function(){ 
  $("#onlinenum").load("online.php"); 

  $(".demo").hover(function(){ 
    $("#onlinelist").slideDown("fast"); 
    var str = ''; 
    $.getJSON("geo.php",function(json){ 
      $.each(json,function(index,array){ 
        str = str + "<li>"+array['total']+""+array['province']+"</li>"; 
      }); 
      $("#onlinelist").html(str); 
    }); 
  },function(){ 
    $("#onlinelist").slideUp("fast"); 
  }); 
}); 

终极,该示例注重,所以别忘了在页面中请先加载jquery库,近日早已到jquery-1.9.1本子了。

是还是不是内容很优秀,很丰富,正是享受给大家的,希望对我们的上学抱有协助。

你也许感兴趣的稿子:

  • 也谈php网址在线人数计算
  • php下用cookie总括用户访问网页次数的代码
  • php下总结用户在线时间的一种尝试
  • php达成用户在线时间总计详解
  • php+memcache实现的网址在线人数计算代码
  • php完结总括网站在线人数的章程
  • php使用Session和文书总括在线人数
  • php正确的计算在线人数的方法

Leave a Comment.