Model:用户信息
点击(此处)折叠或打开
- package com.chat.model;
- import java.util.Vector;
- /**
- *采用单例模式来管理用户信息
- * @author Tom
- */
- public class UserInfo {
- private static UserInfo user=new UserInfo();
- private Vector vector=null;
-
- private UserInfo(){
- this.vector=new Vector();
- }
- public static UserInfo getInstance(){
- return user;
- }
-
- public boolean addUser(String user){
- if(user!=null){
- this.vector.add(user);
- return true;
- }else{
- return false;
- }
- }
-
- //获取用户列表
- public Vector getList(){
- return this.vector;
- }
- //移除用户
- public void removeUser(String user){
- if(user!=null){
- vector.removeElement(user);
- }
- }
-
- }
业务处理类:
点击(此处)折叠或打开
- package com.chat.servlet;
- import com.chat.model.UserInfo;
- import javax.servlet.http.HttpSessionBindingEvent;
- public class UserListener implements javax.servlet.http.HttpSessionBindingListener {
-
- private String user;
- private UserInfo container=UserInfo.getInstance();
-
- public UserListener(){
- user="";
- }
- //设置在线监听人员
- public void setUser(String user){
- this.user=user;
- }
- //获取在线监听
- public String getUser(){
- return this.user;
- }
- //当session有对象加入时执行的方法
- public void valueBound(HttpSessionBindingEvent event) {
- System.out.println("上线用户:"+this.user);
- }
- //当session对象有用户移除的时候执行的方法
- public void valueUnbound(HttpSessionBindingEvent event) {
- System.out.println("下线用户:"+this.user);
- if(user!=""){
- container.removeUser(user);
- }
- }
-
- }
消息处理类:
点击(此处)折叠或打开
- package com.chat.servlet;
- import java.util.*;
- import com.chat.model.UserInfo;
- import java.io.IOException;
- import java.io.PrintWriter;
- import java.util.Vector;
- import java.util.logging.Level;
- import java.util.logging.Logger;
- import javax.servlet.ServletContext;
- import javax.servlet.ServletException;
- import javax.servlet.http.HttpServlet;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- import javax.servlet.http.HttpSession;
- public class Messages extends HttpServlet {
-
- protected void processRequest(HttpServletRequest request, HttpServletResponse response)
- throws ServletException, IOException {
- response.setContentType("text/html;charset=UTF-8");
- String action=request.getParameter("action");
-
- try {
- if("loginRoom".equals(action)){ //登录时,写入系统公告
- this.loginRoom(request, response);
- }else if("sendMessage".equals(action)){ //发送聊天信息
- this.sendMessages(request, response);
- }else if("getMessages".equals(action)){ //从XML文件中读取聊天信息
- this.getMessages(request, response);
- }
- } finally {
-
- }
- }
-
- //将页面重定向到显示聊天信息的页面
- public void getMessages(HttpServletRequest request,HttpServletResponse response) {
- response.setContentType("text/html;charset=UTF-8");
- try{
- request.getRequestDispatcher("content.jsp").forward(request, response);
- }catch(Exception ex){
- Logger.getLogger(Messages.class.getName()).log(Level.SEVERE, null, ex);
- }
- }
-
- // 登录时,写入系统公告
- public void loginRoom(HttpServletRequest request, HttpServletResponse response)
- throws ServletException, IOException {
- response.setContentType("text/html;charset=UTF-8");
- HttpSession session=request.getSession();
- String username=request.getParameter("username"); //获得登录用户名
- UserInfo user=UserInfo.getInstance(); //获得UserInfo类的对象
- session.setMaxInactiveInterval(600); //设置Session的过期时间为10分钟
- Vector vector = user.getList();
- boolean flag = true; //标记是否登录的变量
- //判断用户是否登录
- System.out.println("vector的size:" + vector.size());
-
- if(vector!=null && vector.size()>0){
- for(int i=0;i<vector.size();i++){
- System.out.println("vector"+i+""+vector.elementAt(i)+" user"+username);
- if(username.equals(vector.elementAt(i))){
- PrintWriter out;
- try{
- out = response.getWriter();
- out.println("");
- }catch(IOException e){
- e.printStackTrace();
- }
- flag=false;
- break;
- }
- }
- }
-
- //保存用户信息
- if(flag){
- UserListener ul=new UserListener(); //创建UserListener的对象
- ul.setUser(username); //添加用户
- user.addUser(ul.getUser());
- 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+="系统公告:" + username + "走进聊天室!
"; - 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);
- }
- }
- }
- // 发送聊天信息
- public void sendMessages(HttpServletRequest request, HttpServletResponse response)
- throws ServletException, IOException {
- response.setContentType("text/html;charset=UTF-8");
- request.setCharacterEncoding("UTF-8");
- Random random=new Random();
- String from = request.getParameter("from"); //发言人
- String face =request.getParameter("face"); //表情
- String to =request.getParameter("to"); //接收者
- String color = request.getParameter("color"); //字体颜色
- String content = request.getParameter("content"); //发言内容
- String sendTime = new Date().toLocaleString(); //发言时间
- ServletContext application = getServletContext();
- String sourceMessage = application.getAttribute("message").toString();
-
- try {
- //发言时间
- sourceMessage += "" + from + "" + face + "对[" + to + "]说:" + "" + content + "(" + sendTime + ")
"; - application.setAttribute("message", sourceMessage);
- request.getRequestDispatcher("Messages?action=getMessages&nocache=" + random.nextInt(10000)).forward(request, response);
- } catch (Exception ex) {
- Logger.getLogger(Messages.class.getName()).log(Level.SEVERE, null, ex);
- }
-
-
-
- }
-
-
-
-
- @Override
- protected void doGet(HttpServletRequest request, HttpServletResponse response)
- throws ServletException, IOException {
- processRequest(request, response);
- }
- /**
- * Handles the HTTP
POSTmethod. - * @param request servlet request
- * @param response servlet response
- * @throws ServletException if a servlet-specific error occurs
- * @throws IOException if an I/O error occurs
- */
- @Override
- protected void doPost(HttpServletRequest request, HttpServletResponse response)
- throws ServletException, IOException {
- processRequest(request, response);
- }
- @Override
- public String getServletInfo() {
- return "Short description";
- }//
- }
Filter:
点击(此处)折叠或打开
- package com.chat.filter;
- import java.io.IOException;
- import javax.servlet.*;
- /**
- *
- * @author Tom
- */
- 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"); //从web.xml中获取编码格式参数
- }
- 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;
- }
- }
web.xml:
点击(此处)折叠或打开
- <?xml version="1.0" encoding="UTF-8"?>
- <web-app version="2.5" xmlns="" xmlns:xsi="" xsi:schemaLocation=" /web-app_2_5.xsd">
- <servlet>
- <servlet-name>Messages</servlet-name>
- <servlet-class>com.chat.servlet.Messages</servlet-class>
- </servlet>
- <servlet-mapping>
- <servlet-name>Messages</servlet-name>
- <url-pattern>/Messages</url-pattern>
- </servlet-mapping>
- <session-config>
- <session-timeout>
- 30
- </session-timeout>
- </session-config>
- <welcome-file-list>
- <welcome-file>index.jsp</welcome-file>
- </welcome-file-list>
- <filter>
- <filter-name>CharacterEncodingFilter</filter-name>
- <filter-class>com.chat.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>
-
- </web-app>
附件: