博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
项目:JavaWeb聊天室(问题汇总)
阅读量:4882 次
发布时间:2019-06-11

本文共 16952 字,大约阅读时间需要 56 分钟。

项目:JavaWeb聊天室(问题汇总)

项目需求:

建立一个网页聊天室

1.用户可以登录进来

2.用户进入聊天室之后可以互相发送消息

3.聊天室管理员有权限将普通用户踢下线

项目框架:

myeclipse建立基本的javaweb项目,采用基本的mvc三层架构:servlet,dao,service;

项目设计:

1.设计登录页面index.jsp,

index.jsp
<%@page contentType="text/html" pageEncoding="UTF-8"%>聊天室

${ msg }

 
 
用户名:
 
密  码:
 

 

 

2.设计主页面main.jsp,

 

<%@page contentType="text/html" pageEncoding="UTF-8"%><%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%><%@ include file="safe.jsp"%>聊天室
 
在线人员列表
聊天内容
  [${existUser.username} ]对 表情 说:   字体颜色:
   
   All  
main.jsp

 

3.显示在线人数页面online.jsp

<%@page import="cn.itcast.service.UserService"%><%@page contentType="text/html" pageEncoding="UTF-8" %><%@ page import="java.util.*"%><%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%><%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%>
欢迎来到心之语聊天室!
所有人
${ entry.key.username }
踢下线
当前在线[${ fn:length(userMap) }]人
online.jsp

 

4.userServlet.java 实现聊天室基本的逻辑处理

package cn.itcast.action;import java.io.IOException;import java.util.Date;import java.util.Map;import javax.servlet.ServletContext;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import javax.servlet.http.HttpSession;import org.apache.commons.beanutils.BeanUtils;import cn.itcast.service.UserService;import cn.itcast.utils.BaseServlet;import cn.itcast.vo.User;public class UserServlet extends BaseServlet {    /**     * 检查session是否过期     * @throws IOException      */    public String check(HttpServletRequest req,HttpServletResponse resp) throws IOException{        // 从session中获得用户的信息        User existUser = (User) req.getSession().getAttribute("existUser");        // 判断session中的用户是否过期        if(existUser == null){            // 登录的信息已经过期了!            resp.getWriter().println("1");        }else{            // 登录的信息没有过期            resp.getWriter().println("2");        }        return null;    }        /**     *  退出聊天室     * @throws IOException      */    public String exit(HttpServletRequest request,HttpServletResponse response) throws IOException{        // 获得session对象        HttpSession session = request.getSession();        // 将session销毁.        session.invalidate();        // 页面转向.        response.sendRedirect(request.getContextPath()+"/index.jsp");        return null;    }        /**     * 发送聊天内容     * @throws IOException      */    public String sendMessage(HttpServletRequest req,HttpServletResponse resp) throws IOException{        // 1.接收数据 。        System.out.println("sendMessage invoke....");        String from = req.getParameter("from"); // 发言人        String face = req.getParameter("face"); // 表情        String to = req.getParameter("to"); // 接收者        String color = req.getParameter("color"); // 字体颜色        String content = req.getParameter("content"); // 发言内容        // 发言时间 正常情况下使用SimpleDateFormat        String sendTime = new Date().toLocaleString(); // 发言时间        // 2.获得ServletContext对象.        ServletContext application = getServletContext();        //  从ServletContext中获取消息        String sourceMessage = (String) application.getAttribute("message");        // 3.拼接发言的内容:xx 对 yy 说 xxx        sourceMessage += "" + from                + "" + face                + "[" + to + "]说:"                + "" + content + "("                + sendTime + ")
"; // 4.将消息存入到application的范围 application.setAttribute("message", sourceMessage); return getMessage(req, resp); } /** * 获取消息的方法 * @throws IOException */ public String getMessage(HttpServletRequest req,HttpServletResponse resp) throws IOException{ String message = (String) getServletContext().getAttribute("message"); if(message != null){ resp.getWriter().println(message); } return null; } /** * 踢人的功能 * @throws IOException */ public String kick(HttpServletRequest req,HttpServletResponse resp) throws IOException{ // 1.接收参数 int id = Integer.parseInt(req.getParameter("id")); // 2.踢人:从userMap中将用户对应的session销毁. // 获得userMap集合(在线列表) Map
userMap = (Map
) getServletContext() .getAttribute("userMap"); // 获得这个用户对应的session.如何知道是哪个用户呢? id已经传递过来.去数据库中查询. // 重写user的equals 和 hashCode 方法 那么只要用户的id相同就认为是同一个用户. User user = new User(); user.setId(id); // 从map集合中获得用户的对应的session HttpSession session = userMap.get(user); // 销毁session session.invalidate(); // 3.重定向到页面 resp.sendRedirect(req.getContextPath()+"/main.jsp"); return null; } /** * 登录的功能 */ public String login(HttpServletRequest req,HttpServletResponse resp){ // 接收数据 Map
map = req.getParameterMap(); User user = new User(); // 封装数据 try { BeanUtils.populate(user, map); // 调用Service层处理数据 UserService us = new UserService(); User existUser = us.login(user); if (existUser == null) { // 用户登录失败 req.setAttribute("msg", "用户名或密码错误!"); return "/index.jsp"; } else { // 用户登录成功 // 第一个BUG的解决:第二个用户登录后将之前的session销毁! req.getSession().invalidate(); // 第二个BUG的解决:判断用户是否已经在Map集合中,存在:已经在列表中.销毁其session. // 获得到ServletCOntext中存的Map集合. Map
userMap = (Map
) getServletContext() .getAttribute("userMap"); // 判断用户是否已经在map集合中' if(userMap.containsKey(existUser)){ // 说用map中有这个用户. HttpSession session = userMap.get(existUser); // 将这个session销毁. session.invalidate(); } // 使用监听器:HttpSessionBandingListener作用在JavaBean上的监听器. req.getSession().setAttribute("existUser", existUser); ServletContext application = getServletContext(); String sourceMessage = ""; if (null != application.getAttribute("message")) { sourceMessage = application.getAttribute("message") .toString(); } sourceMessage += "系统公告:
" + existUser.getUsername() + "走进了聊天室!
"; application.setAttribute("message", sourceMessage); resp.sendRedirect(req.getContextPath() + "/main.jsp"); return null; } } catch (Exception e) { e.printStackTrace(); } return null; }}
userServlet.java

 

5.userDao.java与userDaoImple.java分别是创建数据库接口和从数据库获取相关属性值,

package cn.itcast.dao;import cn.itcast.vo.User;public interface UserDao {    public User login(User user);}
userDao
package cn.itcast.dao;import java.sql.SQLException;import org.apache.commons.dbutils.QueryRunner;import org.apache.commons.dbutils.handlers.BeanHandler;import cn.itcast.utils.JDBCUtils;import cn.itcast.vo.User;public class UserDaoImple implements UserDao {    public User login(User user) {        QueryRunner queryRunner = new QueryRunner(JDBCUtils.getDataSource());        String sql = "select * from user where username = ? and password = ?";        User existUser;        try {            existUser = queryRunner.query(sql, new BeanHandler
(User.class), user.getUsername(),user.getPassword()); } catch (SQLException e) { e.printStackTrace(); throw new RuntimeException("用户登录失败!"); } return existUser; }}
userDaoImple

 

6.userService.java是用户业务需求,

package cn.itcast.service;import cn.itcast.dao.UserDao;import cn.itcast.dao.UserDaoImple;import cn.itcast.vo.User;public class UserService {    public User login(User user) {        UserDao dao = new UserDaoImple();        return dao.login(user);    }        }
userService.java

 

(附:

1.MyServletContextListener.java是监听器,监听ServletContext对象创建和销毁,

package cn.itcast.listener;import java.util.HashMap;import java.util.Map;import javax.servlet.ServletContextEvent;import javax.servlet.ServletContextListener;import javax.servlet.http.HttpSession;import cn.itcast.vo.User;/** * 监听ServletContext对象创建和销毁 * @author 姜涛 * */public class MyServletContextListener implements ServletContextListener{    // ServletContext对象创建 下面这个方法就会执行    // ServletContextEvent事件对象. 监听器对象---》ServletContext对象.(事件源)    public void contextInitialized(ServletContextEvent sce) {        Map
userMap = new HashMap
(); sce.getServletContext().setAttribute("userMap", userMap); } public void contextDestroyed(ServletContextEvent sce) { }}
myServletContextListener.java

2.baseServlet.java可以让一个servlet同时处理多个请求,

package cn.itcast.utils;import java.io.IOException;import java.lang.reflect.Method;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;public class BaseServlet extends HttpServlet {    /*     * 它会根据请求中的m,来决定调用本类的哪个方法     */    protected void service(HttpServletRequest req, HttpServletResponse res)            throws ServletException, IOException {        req.setCharacterEncoding("UTF-8");        res.setContentType("text/html;charset=utf-8");        // 例如:http://localhost:8080/demo1/xxx?method=login        String methodName = req.getParameter("method");// 它是一个方法名称                // 当没用指定要调用的方法时,那么默认请求的是execute()方法。        if(methodName == null || methodName.isEmpty()) {            methodName = "execute";        }        Class c = this.getClass();        try {            // 通过方法名称获取方法的反射对象            Method m = c.getMethod(methodName, HttpServletRequest.class,                    HttpServletResponse.class);            // 反射方法目标方法,也就是说,如果methodName为add,那么就调用add方法。            String result = (String) m.invoke(this, req, res);            // 通过返回值完成请求转发            if(result != null && !result.isEmpty()) {                req.getRequestDispatcher(result).forward(req, res);            }        } catch (Exception e) {            throw new ServletException(e);        }    }}
baseServlet.java

3.JDBCUtils.java数据库连接池工具类,

package cn.itcast.utils;import java.io.IOException;import java.io.InputStream;import java.sql.Connection;import java.sql.DriverManager;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Statement;import java.util.Properties;import java.util.ResourceBundle;import javax.sql.DataSource;import com.mchange.v2.c3p0.ComboPooledDataSource;/** * JDBC工具类: *     * 加载驱动 *  * 获得连接 *  * 释放资源 *      * 代码都重复. * @author 姜涛 * */public class JDBCUtils {        private static ComboPooledDataSource dataSource = new ComboPooledDataSource();        // 获得连接池:    public static DataSource getDataSource(){        return dataSource;    }        // 获得连接    public static Connection getConnection() {        Connection conn = null;        try {            conn = dataSource.getConnection();        } catch (SQLException e) {            e.printStackTrace();        }        return conn;    }        }
JDBCUtils.java

4.user.java实体类,创建对象,

package cn.itcast.vo;import java.util.Map;import javax.servlet.http.HttpSession;import javax.servlet.http.HttpSessionBindingEvent;import javax.servlet.http.HttpSessionBindingListener;public class User implements HttpSessionBindingListener {    private int id;    private String username;    private String password;    private String type;    @Override    public int hashCode() {        final int prime = 31;        int result = 1;        result = prime * result + id;        return result;    }    @Override    public boolean equals(Object obj) {        if (this == obj)            return true;        if (obj == null)            return false;        if (getClass() != obj.getClass())            return false;        User other = (User) obj;        if (id != other.id)            return false;        return true;    }    public int getId() {        return id;    }    public void setId(int id) {        this.id = id;    }    public String getUsername() {        return username;    }    public void setUsername(String username) {        this.username = username;    }    public String getPassword() {        return password;    }    public void setPassword(String password) {        this.password = password;    }        public String getType() {        return type;    }    public void setType(String type) {        this.type = type;    }        public void valueBound(HttpSessionBindingEvent event) {        System.out.println("进入了....");        HttpSession session = event.getSession();        Map
userMap = (Map
) session .getServletContext().getAttribute("userMap"); userMap.put(this, session); } // 当session和对象解除绑定的时候 public void valueUnbound(HttpSessionBindingEvent event) { System.out.println("退出了...."); HttpSession session = event.getSession(); // 获得人员列表 Map
userMap = (Map
) session .getServletContext().getAttribute("userMap"); // 将用户移除了 userMap.remove(this); }}
user.java

5.c3p0-config.xml数据库连接配置文件

com.mysql.jdbc.Driver
jdbc:mysql:///mychatroom
root
123456
c3p0-config.xml

 

6.web.xml初始化配置信息

cn.itcast.listener.MyServletContextListener
UserServlet
cn.itcast.action.UserServlet
UserServlet
/user
index.jsp
web.xml

 

 

转载于:https://www.cnblogs.com/zhzJAVA11/p/9259157.html

你可能感兴趣的文章
PHP命名空间(Namespace)的使用详解
查看>>
java项目@override报错问题
查看>>
DataTable 和Json 字符串互转
查看>>
Django中Template does not exit
查看>>
Redis安装 java中的连接 序列化 反序列化
查看>>
hdu 1896 优先队列的应用
查看>>
递推和迭代的比较
查看>>
OpenGL 头文件,库文件
查看>>
点与不规则图形关系判断
查看>>
linux不开启图形界面
查看>>
菜鸟学习SSH(二)——Struts国际化
查看>>
iOS 自定义控件--重写一些方法
查看>>
第二次冲刺作业
查看>>
【转】HTML, CSS和Javascript调试入门
查看>>
折线图-小案例
查看>>
STL:优先队列Priority Aueue
查看>>
蓝桥历年试题 套娃
查看>>
EF4.0和EF5.0增删改查的写法区别及执行Sql的方法
查看>>
作业一
查看>>
微信支付体验
查看>>