注册登录验证码页面: https://blog.csdn.net/ChrisLee2013/article/details/82022547
这里使用的是jdbc.properties文件配置数据库
本章改为c3p0连接池
这里需要导入c3p0的开发包
c3p0-config.xml文件内容
com.mysql.jdbc.Driver
jdbc:mysql:///charRoom
root
1205755403
JdbcUtils工具类,会自动找到路径下的c3p0-config.xml文件连接数据库
public class JdbcUtils {
private static ComboPooledDataSource dataSource = new ComboPooledDataSource();
//获取连接池
public static DataSource getDataSource(){
return dataSource;
}
//获取Connection对象
public static Connection getConnection() throws Exception{
Connection connection = dataSource.getConnection();
return connection;
}
// 关闭操作
public static void closeConnection(Connection connection) throws SQLException{
if(connection != null){
connection.close();
}
}
public static void closeStatement(Statement statement) throws SQLException{
if(statement != null){
statement.close();
}
}
public static void closeResultSet(ResultSet resultSet) throws SQLException{
if(resultSet != null){
resultSet.close();
}
}
}
登录成功后跳到主页面当中
//重定向到另一个登录界面
response.sendRedirect(request.getContextPath() + "/afterLogin/main.jsp");
为了让登录到聊天室的人显示到页面上,我们将登录成功的user存放到session当中
然后通过全局共享域selvletContext获得在线人员列表
这里需要设置监听器监听
//登录成功后保存登录成功的user
request.getSession().setAttribute("loginUser", user);
//为了登录信息被所有人看到放到全局共享域中
ServletContext application = getServletContext();
监听全局共享域的创建于销毁:编写一个类实现ServletContextListener接口实现监听
public class MyServletContextListener implements ServletContextListener{
/*
* servletContext对象创建执行这个方法
* ServletContextEvent事件对象,监听器对象-- ServletContext对象(事件源)
*/
public void contextInitialized(ServletContextEvent sce) {
//通过事件对象获得事件源对象
ServletContext servletContext = sce.getServletContext();
//创建userMap存放登录人员的信息和Sessiond对象
Map userMap = new HashMap();
servletContext.setAttribute("userMap", userMap);
}
...
}
对于session的监听,我们需要将user与session绑定,所以在user类上实现HttpSessionBindingListener
public class User implements HttpSessionBindingListener{
...
//将User对象与session域对象绑定
//将java对象往session中存放就是绑定
//session.setAttribute("")
//request.getSession().setAttribute("loginUser", user);
public void valueBound(HttpSessionBindingEvent event) {
//通过事件对象获得事件源对象
HttpSession session = event.getSession();
//从ServletContext中获得人员列表的Map集合
Map userMap = (Map) session
.getServletContext().getAttribute("userMap");
//将用户对象和对应的session存入到map集合中
//登录成功将user存入session对象中就会启动这个函数
//this:当前登录的User
userMap.put(this, session);
}
...
}
我们已经在在线人员与其对应的session放到了“userMap”当中所以遍历userMap显示在线人员列表
${entry.key.username }
在不是管理员的在线人员列表上添加一个点击事件
首先判断user.type 是不是管理员是管理员的话,就不能被踢下线,不是管理员的话就踢下线
在不是管理员的成员上添加点击事件将用户名称传递,提交到kickServlet后台处理
${ entry.key.username }
踢下线
kickServlet:这里有个bug!!空指针问题 妈的困了我很久!! 出现的问题一律后面说明
通过名称找到要销毁的用户将它对应的session销毁,用户就销毁了!!
String username = new String(request.getParameter("username").getBytes("ISO-8859-1"),"utf-8");
//踢人从userMap当中将其对应的session销毁
//从servletContext当中获得userMap集合
Map userMap = (Map) getServletContext().getAttribute("userMap");
User user = new User();
user.setUsername(username);
//从Map集合当中获得用户对应的session
HttpSession session = userMap.get(user);
//销毁该用户的session
session.invalidate();
//重定向到main.jsp
response.sendRedirect(request.getContextPath() + "/afterLogin/main.jsp");
在main.jsp中检查用户是否被踢下线
每一秒执行一次函数
window.setInterval("check()",1000);
...
function check(){
$.post("${pageContext.request.contextPath}/CheckServlet" + new Date().getTime(),function(data){
if(data == 1){
// 提示用户下线了
alert("用户已经被踢下线了!");
// 回到登录页面!
window.location = "${pageContext.request.contextPath}/login/login.jsp";
}
});
}
CheckServlet
User user = (User) request.getSession().getAttribute("loginUser");
if(user == null){
response.getWriter().println("1");
}else{
response.getWriter().println("0");
}
点击除了自己以外的在线人员,将在线人员添加到聊天对象当中,在在线人员上添加点击事件
${ entry.key.username }
function set(selectPerson)函数
//点击在线人员列表的名称,选择聊天对象
function set(selectPerson){
if(selectPerson != "${loginUser.username}"){
document.form1.selectPerson.value = selectPerson;
}else{
alert("请重新选择聊天对象!")
}
}
这里的button!!我又出现问题了!!
//在文本域上加了一个滚动条
#message{
width:613;
height:100%;
overflow-y:scroll;
}
// 发送消息
function send(){
if(form1.selectPerson.value=="聊天对象"){
alert("请选择聊天对象");
selectPerson.focus();
return false;
}
if(form1.sendMessage.value==""){
alert("请输入聊天信息!");
sendMessage.focus();
return false;
}
$.post("${pageContext.request.contextPath}/SendMessageServlet?"+new Date().getTime(),$("#form1").serialize(),function(data){
$("#message").html(data);
});
$("#sendMessage").html("");
sendMessage.focus();
return true;
}
String person = request.getParameter("person");
String selectPerson = request.getParameter("selectPerson");
String message = request.getParameter("sendMessage").toString();
Date date=new Date();
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String sendTime = df.format(date);
ServletContext application = getServletContext();
String sourceMessage = (String) application.getAttribute("chatMessage");
sourceMessage += "" + person
+ " 对"
+ "[" + selectPerson + "] say:"
+ message + " ("
+ sendTime + ")";
application.setAttribute("chatMessage", sourceMessage);
response.sendRedirect(request.getContextPath() + "/GetMessageServlet");
String message = (String)getServletContext().getAttribute("chatMessage");
if(message != null){
response.getWriter().println(message);
}
https://pan.baidu.com/s/19-zlqg9pBRtotxdb35mQ6A