jsp聊天室程序(servlet+jsp+ajax+tomcat+eclipse+jstl)



jsp聊天室程序(servlet+jsp+ajax+tomcat+eclipse+jstl)。

1.过滤器配置

例如:

1).Web.xml中写入:

<filter>

        <filter-name>CharacterEncodingFilter</filter-name>     <filter-class>com.wgh.filter.CharacterEncodingFilter</filter-class>

        <init-param>

            <param-name>encoding</param-name>

            <param-value>UTF-8</param-value>

        </init-param>

    </filter>

    <filter-mapping>

        <filter-name>CharacterEncodingFilter</filter-name>

        <url-pattern>/*</url-pattern>

        <dispatcher>REQUEST</dispatcher>

        <dispatcher>FORWARD</dispatcher>

    </filter-mapping>

2).代码配置中:

package com.wgh.filter;

import java.io.IOException;

import javax.servlet.*;

public class CharacterEncodingFilter implements Filter{

    protected String encoding = null;

    protected FilterConfig filterConfig = null;

public void init(FilterConfig filterConfig) throws ServletException {

        this.filterConfig = filterConfig;

        this.encoding = filterConfig.getInitParameter(“encoding”);

    }

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {

        if (encoding != null) {

            request.setCharacterEncoding(encoding);

            response.setContentType(“text/html; charset=”+encoding);

        }

        chain.doFilter(request, response);

    }

    public void destroy() {

        this.encoding = null;

        this.filterConfig = null;

    }

}

3).使用时如果没有以上配置,下面的输出发言人form会是乱码。

// 发送聊天信息

    public void sendMessages(HttpServletRequest request,

           HttpServletResponse response) throws ServletException, IOException {

       System.out.println(“发送消息”);

       response.setContentType(“text/html;charset=UTF-8″);

       request.setCharacterEncoding(“UTF-8″);

       String from = request.getParameter(“from”); // 发言人

       System.out.println(from);

}

 

2.监听器配置

public class UserListener implements javax.servlet.http.HttpSessionBindingListener {

private String user;

    private UserInfo container = UserInfo.getInstance(); // 获得UserInfo类的对象

    public UserListener() {

       user = ”";

    }

    // 设置在线监听人员

    public void setUser(String user) {

       this.user = user;

    }


    // 获取在线监听

    public String getUser() {

       return this.user;

    }

    // 当Session有对象加入时执行的方法

    public void valueBound(HttpSessionBindingEvent arg0) {

       System.out.println(“上线用户:” + this.user);

    }

    // 当Session有对象移除时执行的方法

    public void valueUnbound(HttpSessionBindingEvent arg0) {

       System.out.println(“下线用户:” + this.user);

       if (user != ”") {

           container.removeUser(user);

       }

    }

}

3.有人员登录

给对应的人员申请监听,加入用户,并加入session

// 保存用户信息

if (flag) {

    UserListener ul = new UserListener(); // 创建UserListener的对象

    ul.setUser(username); // 添加用户

    user.addUser(ul.getUser()); // 添加用户到UserInfo类的对象中

    session.setAttribute(“user”, ul);//将UserListener对象绑定到Session中

    session.setAttribute(“username”, username); // 保存当前登录的用户名

    session.setAttribute(“loginTime”, new Date().toLocaleString());// 保存登录时间

    ServletContext application = getServletContext();

    String sourceMessage = ”";

    if (null != application.getAttribute(“message”)) {

sourceMessage = application.getAttribute(“message”).toString();

}

    sourceMessage += ”系统公告:<font color=’gray’>” + username

                  + ”走进了聊天室!</font><br>”;

    application.setAttribute(“message”, sourceMessage);

try {                request.getRequestDispatcher(“login_ok.jsp”).forward(request,response);

catch (Exception ex) {            Logger.getLogger(Messages.class.getName()).log(Level.SEVERE, null, ex);

    }

}

4. sendRedirectgetRequestDispatcher区别

1).request.getRequestDispatcher()是请求转发,前后页面共享一个request ,返回的是一个RequestDispatcher对象。

response.sendRedirect()是重新定向,前后页面不是一个request

2).RequestDispatcher.forward()是在服务器端运行,对于浏览器来说是透明的。

HttpServletResponse.sendRedirect()是通过向客户浏览器发送命令来完成,对于浏览器来说不是透明的。

例如:request.getRequestDispatcher(“login_ok.jsp”).forward(request,       response);

将请求转发到login_ok.jsp这个页面 ,再request就是客户端的请求,通过response可以往客户端写响应

 

5.login_ok.jsp

使用<c:redirect>标签可以使得JSP页面自动的从一个当前页面跳转到其他页面(JSP||HTML),而不用用户发出点击事件即可完成这种自动的跳转,并且可以通过<c:param>标签对跳转到的页面进行用户参数传递。

 

6. response.sendRedirectforward区别

response.sendRedirect做转向的原理,它其实是向浏览器发送一个特殊的Header,然后由浏览器来做转向,转到指定的页面,所以用sendRedirect时,浏览器的地址栏上可以看到地址的变化。

<jsp:forward page=”"/>则不同,它是直接在server做的,浏览器并不知道,也不和浏览器打交道,这从浏览器的地址并不变化可以看出。

7.jsp页面EL表达式

1).首先在web.xml文件中加入:<web-app version=“2.5″ 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_2_5.xsd”>

2).之后,如果需要有效的话,需要在jsp页面中写入以下句子:<%@ page isELIgnored =“false” %>

这样的话里面的字段${message}才能显示正常。

messageServletContext中的一个变量

 

8.ajax部分

见实际代码main.jspAjaxRequest.js

   聊天室程序+ajax+jsp+tomcat+eclipse.rar    聊天室程序(servlet+jsp+ajax+tomcat+eclipse+jstl).doc