一、前沿

设计一个简单的聊天室,是很多同学感兴趣的项目,网上应该也有很多教程,但是代码量都比较多、读起来不是很容易明白到底是怎么一回事,其实,笔者认为,只要大家了解最核心部位的代码(jQuery包装好的Ajax技术)要怎么写就好了,其他的内容都是来源于基础的JavaWeb知识,自己再细心地去优化就好了。
下面笔者就写一个超简单的聊天室,希望对大家有帮助~

二、功能介绍

打开两个页面,都是这个项目这个页面,在第一个页面输进去的信息,按下回车键,在第二个页面就能立即显示最新信息,第二个页面输进去的信息,在第一个也页面同理也可以看到最新的信息。

三、代码结构与解释

四、代码与注释

①index.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>
<script type="text/javascript" src="script/jquery-1.7.2.js"></script>
<script type="text/javascript"> $(function() { $("#cin").keypress(function(evebt) { if (evebt.keyCode == 13) {//按下回车键(keyCode=13)来发送信息,同时保存到数据库中 var message = $.trim(this.value); $.post("s1", { "message" : message }); this.value = ""; } }) askForNew(); function askForNew() { $.post("s2", { "ss" : "ss" }, function(data) { $("#cout").empty(); for (var i = 0; i < data.length; i++) { $("#cout").append("<div>" + data[i] + "</div>"); } }, "json"); setTimeout(askForNew,1000); //之所以能在另一个页面立即显示最新的信息,就是这里一直在查数据库的数据并把它显示到页面上 } }); </script>
<link rel="stylesheet" type="text/css" href="style/css.css" />
</head>
<body>
       <h2>聊天内容</h2>
       <div id="cout"></div>
       <br>
       <h2>输入信息</h2>
       <textarea id="cin"></textarea>
       <script type="text/javascript"></script>
</body>
</html>

②Cin.java 处理输进去的信息的 Servlet

package mycin;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class Cin extends HttpServlet {
       // 代号s1:负责把cin文本框的内容保存到数据库
       public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
              try {
                     String message = request.getParameter("message");  //获取jQuery那个 $.post 里面的~
                     System.out.println(message);
                     Class.forName("com.mysql.jdbc.Driver");
                     Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/car", "root", "123");
                     String sql = "INSERT INTO talk(message) VALUE(?)";
                     PreparedStatement stat = conn.prepareStatement(sql);
                     stat.setString(1, message);
                     int rs = stat.executeUpdate();
                     if (rs == 1) {
                           System.out.println("插入成功");
                     } else {
                           System.out.println("插入失败");
                     }
              } catch (ClassNotFoundException e) {
                     e.printStackTrace();
              } catch (SQLException e) {
                     e.printStackTrace();
              }
       }
}

③Cout.java 处理要显示的信息的 Servlet

package mycin;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.google.gson.Gson;
public class Cout extends HttpServlet {
       // 代号s2:负责包数据库的信息转项cout文本框
       public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
              try {
                     String message = request.getParameter("message");
                     System.out.println(message);
                     Class.forName("com.mysql.jdbc.Driver");
                     Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/car", "root", "123");
                     String sql = "SELECT * FROM talk";
                     Statement stat = conn.createStatement();
            ResultSet rs =stat.executeQuery(sql);
                     List<String> list = new ArrayList<>();
                     while (rs.next()) {
                           String cin = rs.getString("message");
                           System.out.println(cin);
                           list.add(cin);
                     }
                     Gson gson = new Gson();
                     String json = gson.toJson(list); //万能语句~
                     // 4.将JSON字符串作为响应数据返回
                     response.setContentType("text/json;charset=UTF-8");
                     PrintWriter writer = response.getWriter();
                     writer.write(json);
              } catch (ClassNotFoundException e) {
                     e.printStackTrace();
              } catch (SQLException e) {
                     e.printStackTrace();
              }
       }
}

④css 样式,其实也没什么东西,为了清晰显示核心代码,美化方面交给大家,

@CHARSET "UTF-8";
textarea { height: 150px; width: 300px; }
h2{ color: yellowgreen; }
#cout{ overflow: scroll; overflow-x:hiden; height: 200px; width: 300px; }

⑤由于篇幅的原因,web.xml 就省略了,其实使用了 注解都不用 配置了,eclipse和Myclipse都可以直接new一个Servlet,new完之后,已经帮你注解或配置好了。

三、优化方面的
①:下拉框没有到最低,界面不是很美观
②:注册数据库驱动后没有释放资源,容易因为内存问题而是服务器崩溃
③:没有使用数据库连接池,不能很好地提高性能
④:每条聊天记录没有显示时间等,若每条聊天记录包含的内容多了,就要新建一个JavaBean类了。

以上是几点优化建议,但是对于新手而言,徒增阅读的难度,笔者就省略掉了。

希望对大家有启发!!

更多相关文章

  1. pymysql实现从a表过滤出有效信息添加至b表
  2. SQL查出比经理薪水还高的员工信息:
  3. 要查询选修了所有课程的学生信息,怎样用sql实现?
  4. 在线求助.Select语句包含ERP单据内表头与表身信息
  5. 用delphi5修改sql server2000出现“键列信息不足,更因影响太多的
  6. 如何使用来自其他模型的信息来注释查询集,或者在Django Rest Fram
  7. 如果在详细信息表中找到记录,则显示Y / N列
  8. 建站学习(PHP+apache+mysql):2 将日志在页面展示
  9. Android 通过读取本地Arp表获取当前局域网内其他设备信息

随机推荐

  1. [置顶] 关于代码家(干货集中营)共享知识
  2. android 资源列表-史上最有价值的android
  3. android spinner默认样式不支持换行和修
  4. Android消息机制源码分析
  5. 2020新鲜出炉的Android大厂面试题锦集(BA
  6. Android中的几种网络请求方式详解 .
  7. android 回车键事件
  8. 我所理解的Android模块化(三)——模块可插
  9. Android中的AndroidManifest.xml文件
  10. Android的ADB工具使用