使用java基于pushlet和bootstrap实现的简单聊天室

这是一个简单的不能再简单的聊天室,本代码包含以下功能

1.用户注册。
2.用户登录。
3.当然还可以聊天。

DBUtil.java

代码如下:

package com.hongyuan.core;
 
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.Types;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
 
import javax.sql.DataSource;
 
import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;
 
public class DBUtil {
    
    private static DataSource dataSource = null;
    static{
        /**
         * 初始化数据源,不同的数据库获取数据源的方式不同,可参考相应数据库的说明文档。
         */
        MysqlDataSource mds=new MysqlDataSource();
        mds.setURL("jdbc:mysql://localhost:3306/test");
        mds.setUser("test");
        mds.setPassword("123456");
        mds.setCharacterEncoding("utf8");
        dataSource=mds;
    }
    
    /**
     * 获取数据库连接
     * @return
     * @throws SQLException
     */
    public static Connection getConnection() throws SQLException {
        return dataSource.getConnection();
    }
 
    /**
     * 关闭数据库连接资源
     * @param conn 
     * @param s
     * @param rs
     * @throws SQLException
     */
    public static void close(Connection conn, Statement s, ResultSet rs){
        try {
            if (rs != null) rs.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        try {
            if (s != null) s.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        try {
            if (conn != null) conn.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
    
    /**
     * 执行数据库查询语句
     * @param sql       查询sql,匿名参数用?表示,命名参数使用“:参数名”表示
     * @param params    查询参数
     * @return
     * @throws SQLException
     */
    @SuppressWarnings("unchecked")
    public static List<Map<String,Object>> select(Object sql,Object... params) throws SQLException{
        Object result=DBUtil.executeSql(sql,params);
        if(result==null){
            return null;
        }else{
            return (List<Map<String,Object>>)result;
        }
    }
    
    /**
     * 执行插入
     * @param sql
     * @param params
     * @return
     * @throws SQLException
     */
    public static int insert(Object sql,Object... params) throws SQLException{
        return DBUtil.update(sql, params);
    }
    
    /**
     * 执行数据库记录变更语句(增,删,改)
     * @param sql       查询sql,匿名参数用?表示,命名参数使用“:参数名”表示
     * @param params    查询参数
     * @return
     * @throws SQLException
     */
    public static int update(Object sql,Object... params) throws SQLException{
        Object result=DBUtil.executeSql(sql,params);
        if(result==null){
            return 0;
        }else{
            return (Integer)result;
        }
    }
    
    /**
     * 执行删除
     * @param sql
     * @param params
     * @return
     * @throws SQLException
     */
    public static int delete(Object sql,Object... params) throws SQLException{
        return DBUtil.update(sql, params);
    }
    
    /**
     * 通用Sql执行方法
     * @param sql       查询sql,匿名参数用?表示,命名参数使用“:参数名”表示
     * @param params    命名参数
     * @return
     * @throws SQLException
     */
    public static Object executeSql(Object sql, Object... params) throws SQLException {
 
        if(sql==null||"".equals(sql.toString().trim())) throw new SQLException("sql语句为空!");
        
        //获取sql语句
        String sqlStr=sql.toString().trim();
        
        //处理命名参数
        if(params!=null&&params.length==1&&params[0] instanceof Map){
            List<Object> pList=new ArrayList<Object>();
            Map<String,Object> pMap=(Map<String, Object>)params[0];
            Matcher pMatcher = Pattern.compile(":(\\w+)").matcher(sqlStr);
            while(pMatcher.find()){
                String pName=pMatcher.group(1);
                pList.add(pMap.get(pName));
            }
            
            sqlStr=pMatcher.replaceAll("?");
            params=pList.toArray();
        }
        
        Connection conn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        try {
            conn = DBUtil.getConnection();
            ps = conn.prepareStatement(sqlStr);
             
            if (null != params) {
                //初始化查询参数
                for(int i=0;i<params.length;i++){
                    Object param = params[i];
                    if(param!=null){
                        ps.setObject(i+1,param);
                    }else{
                        ps.setNull(i+1,Types.NULL);
                    }
                    
                }
            }
            
            //处理结果集
            boolean isResultSet = ps.execute();
            List<Object> result = new ArrayList<Object>();
            do {
                if (isResultSet) {
                    List<Map<String,Object>> tableData=new ArrayList<Map<String,Object>>();
                    ResultSet resultSet=ps.getResultSet();
                    while(resultSet.next()){
                        Map<String,Object> rowData=new HashMap<String,Object>();
                        for(int i=1;i<=resultSet.getMetaData().getColumnCount();i++){
                            rowData.put(resultSet.getMetaData().getColumnName(i),resultSet.getObject(i));
                        }
                        tableData.add(rowData);
                    }
                    result.add(tableData);
                } else {
                    result.add(new Integer(ps.getUpdateCount()));
                }
            } while ((isResultSet = ps.getMoreResults()) == true || ps.getUpdateCount() != -1);
 
            //处理返回结果
            if (result.size() == 0) {
                return null;
            } else if (result.size() == 1) {
                return result.get(0);
            } else {
                return result;
            }
        } catch (SQLException e) {
            throw new SQLException("无效sql!-->"+sql);
        } finally {
            DBUtil.close(conn, ps, rs);
        }
    }
}

WebServlet.java

代码如下:

package com.hongyuan.core;
 
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;
 
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
@SuppressWarnings("serial")
public class WebServlet extends HttpServlet {
 
    protected HttpServletRequest request=null;
    protected HttpServletResponse response=null;
    protected Map<String,String> cfgParams=new HashMap<String,String>();
    
    /**
     * 默认访问方法
     * @throws Exception
     */
    public void initPage() throws Exception{}
    
    @Override
    public final void init(ServletConfig config) throws ServletException {
        @SuppressWarnings("unchecked")
        Enumeration<String> names = config.getInitParameterNames();
        while(names.hasMoreElements()){
            String name=names.nextElement();
            if(name.startsWith("Bean_")){
                //为servlet注入Bean对象
                String beanName=name.substring("Bean_".length());
                String beanClass=config.getInitParameter(name);
                
                    try {
                        if(beanClass==null||"".equals(beanClass.trim())) throw new Exception("未配置类名!-->"+beanName);
                        
                        Object bean = Class.forName(beanClass).newInstance();
                        this.getClass().getField(beanName).set(this,bean);
                    } catch (InstantiationException e) {
                        try {
                            throw new InstantiationException("无法实例化("+beanClass+")!");
                        } catch (InstantiationException e1) {
                            e1.printStackTrace();
                        }
                    } catch (ClassNotFoundException e) {
                        try {
                            throw new ClassNotFoundException("未找到类-->"+beanClass);
                        } catch (ClassNotFoundException e1) {
                            e1.printStackTrace();
                        }
                    } catch (NoSuchFieldException e) {
                        try {
                            throw new NoSuchFieldException("未找到Bean声明字段("+beanName+")");
                        } catch (NoSuchFieldException e1) {
                            e1.printStackTrace();
                        }
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                
            }else{
                cfgParams.put(name,config.getInitParameter(name));
            }
        }
    }
    
    @Override
    public final void service(HttpServletRequest request, HttpServletResponse response){
        
        this.request=request;
        this.response=response;
        
        String encoding=null;
        try {
            encoding=cfgParams.get("encoding");
            if(encoding==null||"".equals(encoding.trim())) encoding="utf-8";
            request.setCharacterEncoding(encoding);
            response.setCharacterEncoding(encoding);
        } catch (UnsupportedEncodingException e2) {
            try {
                throw new UnsupportedEncodingException("不支持的字符集("+encoding+")");
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }
        }
        
        String action=null;
        try {
            //根据路由参数将请求转交到指定方法执行
            String routeParam=cfgParams.get("routeParam");
            action=this.get((routeParam==null||"".equals(routeParam))?"action":routeParam,"initPage");
            this.getClass().getMethod(action).invoke(this);
        } catch (IllegalAccessException e) {
            try {
                throw new IllegalAccessException("方法("+action+")拒绝访问!");
            } catch (IllegalAccessException e1) {
                e1.printStackTrace();
            }
        } catch (NoSuchMethodException e) {
            try {
                throw new NoSuchMethodException("未找到方法("+action+")!");
            } catch (NoSuchMethodException e1) {
                e1.printStackTrace();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    
    /**
     * 展示指定页面
     * @param page
     * @throws IOException
     * @throws ServletException
     */
    protected void show(String page){
        String pagePath=cfgParams.get("pagePath");
        try {
            request.getRequestDispatcher(((pagePath==null||"".equals(pagePath))?"/WEB-INF/pages/":pagePath)+page).forward(request,response);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    
    /**
     * 打印指定字符串
     * @param str
     * @throws IOException
     */
    protected void print(String str){
        try {
            response.getWriter().print(str);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    
    /**
     * 获取指定名称的请求参数
     * @param name
     * @param def
     * @return
     */
    protected String get(String name,String def){
        String value=request.getParameter(name);
        if(value!=null&&!"".equals(value.trim())){
            return value;
        }else{
            return def;
        }
    }
    
    /**
     * 向页面输出指定参数
     * @param name
     * @param value
     */
    protected void put(String name,Object value){
        request.setAttribute(name,value);
    }
    
}

Sql.java

代码如下:

package com.hongyuan.talk.cfg;
 
public enum Sql {
    //提取用户信息SQL语句
    GET_USERINFO("select id,user_name,password from user where user_name=:userName and password=md5(:password)"),
    
    //保存用户信息SQL语句
    SAVE_USER("insert into user(user_name,password) values(:userName,md5(:password))");
    
    private final String value;
    private Sql(String value){
        this.value=value;
    }
    
    public String getValue(){
        return this.value;
    }
    
    @Override
    public String toString() {
        return this.value;
    }
}

TalkBean.java

代码如下:

package com.hongyuan.talk;
 
import java.sql.SQLException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
 
import com.hongyuan.core.DBUtil;
import com.hongyuan.talk.cfg.Sql;
 
public class TalkBean{
 
    /**
     * 提取用户信息
     * @param userName
     * @param password
     * @return
     */
    public Map<String,Object> getUserInfo(final String userName,final String password) {
 
        try {
            List<Map<String,Object>> userInfo=DBUtil.select(Sql.GET_USERINFO,new HashMap<String,Object>(){{
                put("userName",userName);
                put("password",password);
            }});
            if(userInfo!=null&&userInfo.size()==1){
                return userInfo.get(0);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return null;
    }
 
    /**
     * 保存用户信息
     * @param userName
     * @param password
     * @return
     */
    public boolean saveUser(final String userName,final String password){
        try {
            int count=DBUtil.insert(Sql.SAVE_USER,new HashMap<String,Object>(){{
                put("userName",userName);
                put("password",password);
            }});
            if(count==1){
                return true;
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return false;
    }
}

TalkServlet.java

代码如下:

package com.hongyuan.talk;
 
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.Map;
 
import nl.justobjects.pushlet.core.Dispatcher;
import nl.justobjects.pushlet.core.Event;
 
import com.hongyuan.core.WebServlet;
 
public class TalkServlet extends WebServlet {
 
    public TalkBean talkBean;
            
    @Override
    public void initPage(){
        Object userInfo = request.getSession().getAttribute("userInfo");
        if(userInfo!=null){
            talkPage();
        }else{
            loginPage();
        }
    }
    
    //进入登陆页面
    public void loginPage(){
        show("login.jsp");
    }
    
    //进入注册页面
    public void regPage(){
        show("reg.jsp");
    }
    
    //登录
    public void login() throws IOException{
        String userName=this.get("userName","");
        String password=this.get("password","");
        if(!"".equals(userName)&&!"".equals(password)){
            //提取用户信息
            Map<String,Object> userInfo=talkBean.getUserInfo(userName, password);
            if(userInfo!=null){
                //将用户信息存入session
                request.getSession().setAttribute("userInfo",userInfo);
                response.sendRedirect("./talkService.srv?action=talkPage");
                return;
            }
        }
        show("login.jsp");
    }
    
    //注册
    public void reg() throws IOException{
        String userName=this.get("userName","");
        String password=this.get("password","");
        String passConfirm=this.get("passConfirm","");
        if(!"".equals(userName)&&!"".equals(password)&&password.equals(passConfirm)){
            if(talkBean.saveUser(userName, password)){
                response.sendRedirect("./talkService.srv?action=loginPage");
                return;
            }
        }
        show("reg.jsp");
    }
    
    //进入聊天页面
    public void talkPage(){
        Object userInfo = request.getSession().getAttribute("userInfo");
        if(userInfo!=null){
            Map<String,Object> info=(Map<String,Object>)userInfo;
            this.put("userName",info.get("user_name"));
            show("talk.jsp");
            return;
        }
        show("login.jsp");
    }
    
    //发送消息
    public void sendMsg() throws UnsupportedEncodingException{
        String msg=this.get("message","");
        if(!"".equals(msg)){
            Event event=Event.createDataEvent("/message/world");
            
            Object userInfo = request.getSession().getAttribute("userInfo");
            if(userInfo!=null){
                Map<String,Object> info=(Map<String,Object>)userInfo;
                event.setField("userName",new String(info.get("user_name").toString().getBytes("utf-8"),"iso-8859-1"));
            }
            event.setField("message",new String(msg.getBytes("utf-8"),"iso-8859-1"));
            
            Dispatcher.getInstance().multicast(event);
        }
    }
}

注:以下仅包含主要代码,完整工程代码见:http://pan.baidu.com/s/1dDIo085

以上就是本文的全部内容了,希望大家能够喜欢。

(0)

相关推荐

  • java实现一个简单TCPSocket聊天室功能分享

    本文实例为大家分享了java实现TCPSocket聊天室功能的相关代码,供大家参考,具体内容如下 1.TCPserver.java import java.net.*; import java.io.*; import java.util.*; import java.util.concurrent.*; public class TCPserver{ private static final int SERVERPORT = 8888; private ServerSocket MyServe

  • 基于java编写局域网多人聊天室

    由于需要制作网络计算机网络课程设计,并且不想搞网络布线或者局域网路由器配置等等这种完全搞不懂的东西,最后决定使用socket基于java编写一个局域网聊天室: 关于socket以及网络编程的相关知识详见我另一篇文章:Java基于socket编程 程序基于C/S结构,即客户端服务器模式. 服务器: 默认ip为本机ip 需要双方确定一个端口号 可设置最大连接人数 可启动与关闭 界面显示在线用户人以及姓名(本机不在此显示) 客户端: 需要手动设置服务器ip地址(局域网) 手动设置端口号 输入姓名 可连

  • Java Socket聊天室编程(二)之利用socket实现单聊聊天室

    在上篇文章Java Socket聊天室编程(一)之利用socket实现聊天之消息推送中我们讲到如何使用socket让服务器和客户端之间传递消息,达到推送消息的目的,接下来我将写出如何让服务器建立客户端与客户端之间的通讯. 其实就是建立一个一对一的聊天通讯. 与上一篇实现消息推送的代码有些不同,在它上面加以修改的. 如果没有提到的方法或者类则和上一篇一模一样. 1,修改实体类(服务器端和客户端的实体类是一样的) 1,UserInfoBean 用户信息表 public class UserInfoB

  • Java continue break制作简单聊天室程序

    Java continue break 制作简单聊天室程序,屏蔽不文明语言,显示每句话聊天时间 package com.swift; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Scanner; public class ChatWithBreakContinue { public static void main(String[] args) { Scanner scan = new Sc

  • 基于Tomcat7、Java、WebSocket的服务器推送聊天室实例

    前言 HTML5 WebSocket实现了服务器与浏览器的双向通讯,双向通讯使服务器消息推送开发更加简单,最常见的就是即时通讯和对信息实时性要求比较高的应用.以前的服务器消息推送大部分采用的都是"轮询"和"长连接"技术,这两中技术都会对服务器产生相当大的开销,而且实时性不是特别高.WebSocket技术对只会产生很小的开销,并且实时性特别高.下面就开始讲解如何利用WebSocket技术开发聊天室.在这个实例中,采用的是Tomcat7服务器,每个服务器对于WebSoc

  • 用java WebSocket做一个聊天室

    最近一个项目中,需要用到Java的websocket新特性,于是就学了一下,感觉这技术还挺好玩的,瞬间知道网页上面的那些在线客服是怎么做的了. 先看图: 实现了多客户机进行实时通讯. 下面看代码项目结构图:很简单,就1个类,1个页面 然后看具体代码 先看后端代码 package com.main; import java.io.IOException; import java.util.concurrent.CopyOnWriteArraySet; import javax.websocket.

  • Java Socket聊天室编程(一)之利用socket实现聊天之消息推送

    相关阅读:Java Socket聊天室编程(二)之利用socket实现单聊聊天室 网上已经有很多利用socket实现聊天的例子了,但是我看过很多,多多少有一些问题存在. 这里我将实现一个比较完整的聊天例子,并解释其中的逻辑. 由于socket这一块比较大,所以我将分出几篇来写一个比较完整的socket例子. 这里我们先来实现一个最简单的,服务器与客户端通讯,实现消息推送的功能. 目的:服务器与客户端建立连接,客户端可以向服务器发送消息,服务器可以向客户端推送消息. 1,使用java建立socke

  • 使用Java和WebSocket实现网页聊天室实例代码

    在没介绍正文之前,先给大家介绍下websocket的背景和原理: 背景 在浏览器中通过http仅能实现单向的通信,comet可以一定程度上模拟双向通信,但效率较低,并需要服务器有较好的支持; flash中的socket和xmlsocket可以实现真正的双向通信,通过 flex ajax bridge,可以在javascript中使用这两项功能. 可以预见,如果websocket一旦在浏览器中得到实现,将会替代上面两项技术,得到广泛的使用.面对这种状况,HTML5定义了WebSocket协议,能更

  • Java基于socket实现简易聊天室实例

    本文实例讲述了Java基于socket实现简易聊天室的方法.分享给大家供大家参考.具体实现方法如下: chatroomdemo.java package com.socket.demo; import java.io.IOException; import java.net.DatagramSocket; public class ChatRoomDemo { /** * @param args * @throws IOException */ public static void main(S

  • Java基于UDP协议实现简单的聊天室程序

    最近比较闲,一直在抽空回顾一些Java方面的技术应用. 今天没什么事做,基于UDP协议,写了一个非常简单的聊天室程序. 现在的工作,很少用到socket,也算是对Java网络编程方面的一个简单回忆. 先看一下效果: 实现的效果可以说是非常非常简单,但还是可以简单的看到一个实现原理.  "聊天室001"的用户,小红和小绿相互聊了两句,"聊天室002"的小黑无人理会,在一旁寂寞着. 看一下代码实现: 1.首先是消息服务器的实现,功能很简单: •将客户端的信息(进入了哪一

随机推荐