Web在线聊天室 --- 异常类+工具类+实体类
Posted 满眼*星辰
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Web在线聊天室 --- 异常类+工具类+实体类相关的知识,希望对你有一定的参考价值。
自定义异常类
因为我们要把错误信息在前端上显示出来,所以我们自定义一个异常类AppException
package org.example.exception;
/**
* Created with IntelliJ IDEA.
* Description:自定义异常类
* User: starry
* Date: 2021 -05 -22
* Time: 18:44
*/
public class AppException extends RuntimeException{
public AppException(String message) {
super(message);
}
public AppException(String message, Throwable cause) {
super(message, cause);
}
}
通用工具类代码
(一)序列化和反序列化
网络传输数据,发送方要封装数据格式,接收方要使用相同数据格式解析协议是大家都公认的,用途非常广泛的数据格式。
序列化和反序列化也是类似与网络传输数据,不同设备间传输数据使用
序列化:某个语言中特定的数据保存方式(如java就是对象),发送给其他主机(网络数据传输),或者其他设备(比如内存),转化为其他设备的数据格式(json字符串)
反序列化:接收数据的格式(json字符串),转变为自己程序的数据方式(java对象)
(二)数据库连接
封装 连接(Connection)、SQL语句(Statement)和结果集(ResultSet)
完整工具类代码
package org.example.util;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;
import org.example.exception.AppException;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
/**
* Created with IntelliJ IDEA.
* Description: 通用工具类
* User: starry
* Date: 2021 -05 -21
* Time: 20:42
*/
public class Util {
// ObjectMapper为该对象做json的序列化
private static final ObjectMapper mapper = new ObjectMapper();
// 获取数据库的连接用
private static final MysqlDataSource dataSource = new MysqlDataSource();
//设置初始化的属性值
static {
// 设置json序列化/反序列化的日期格式
DateFormat dataFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
mapper.setDateFormat(dataFormat); //日期格式化
// 设置连接数据库的基本属性
dataSource.setURL("jdbc:mysql://localhost:3306/java_chatroom");
dataSource.setUser("root");
dataSource.setPassword("111111");
dataSource.setUseSSL(false);
dataSource.setCharacterEncoding("UTF-8"); //解决插入中文数据乱码问题
}
/**
* json序列化:java对象转化为json字符串
*/
public static String serialize(Object o) {
try {
return mapper.writeValueAsString(o);
} catch (JsonProcessingException e) {
// e.printStackTrace();
//把编译时异常转换为运行时异常,这样外面调用此方法不需要管编译时异常
throw new AppException("json序列化失败"+o, e);
}
}
/**
* 反序列化json:把json字符串转化为java对象
*/
public static <T> T deserialize(String s, Class<T> c) {
try {
return mapper.readValue(s, c);
} catch (JsonProcessingException e) {
// e.printStackTrace();
// 如果出现这个异常,一般都是json字符串中的键,在calss中没有找到对应的属性
throw new AppException("json反序列化失败", e);
}
}
/**
* 反序列化json重载方法:把json输入流转化为java对象
*/
public static <T> T deserialize(InputStream is, Class<T> c) {
try {
return mapper.readValue(is, c);
} catch (IOException e) {
// e.printStackTrace();
// 如果出现这个异常,一般都是json字符串中的键,在calss中没有找到对应的属性
throw new AppException("json反序列化失败", e);
}
}
/**
* 获取数据库连接
*/
//导入java.sql.Connection包(很可能自己导错)
public static Connection getConnection() {
try {
return dataSource.getConnection();
} catch (SQLException e) {
// e.printStackTrace();
throw new AppException("获取数据库连接失败", e);
}
}
/**
* 释放jdbc资源
*/
public static void close(Connection connection, Statement statement, ResultSet resultSet) {
try {
if (resultSet != null) resultSet.close();
if (statement != null) statement.close();
if (connection != null) connection.close();
} catch (SQLException e) {
// e.printStackTrace();
throw new AppException("释放数据库资源出错", e);
}
}
/**
* 释放jdbc连接重载方法
*/
public static void close(Connection connection, Statement statement) {
close(connection,statement,null);
}
/**
* 测试工具类方法
*/
public static void main(String[] args) {
//测试json序列化
Map<String, Object> map = new HashMap<>();
map.put("ok", true);
map.put("lala", new Date());
System.out.println(serialize(map));
//测试数据库连接
System.out.println(getConnection());
}
}
实体类
把我们数据库设计的字段转变为代码的实体类
jdbc 操作
- 占位符替换:使用变量,对象中的属性
- 查询操作:返回的结果集
多行数据,转换为List<类型>多个对象
一行数据,转换为一个对象
这里我们使用到 idea 的Lombok 这个工具,可以简化代码
@Getter
@Setter
@ToString
用这三行注解代码,就可以省去所有的getter、setter、tostring方法,非常高效方便
接口统一字段
为了方便期间,我们把设计前后端接口时需要的公共字段,封装在实体类Respone当中。
package org.example.model;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
/**
* Created with IntelliJ IDEA.
* Description:点后端接口需要的统一字段
* User: starry
* Date: 2021 -05 -22
* Time: 17:42
*/
@Getter
@Setter
@ToString
public class Response {
//当前接口响应是否操作成功
private boolean ok;
//操作失败,前端要展示的错误信息
private String reason;
}
用户类
由于用户类是需要参与session数据的传输(json字符串转换成用户对象)所以:
- 继承刚才创建的Response(接口统一字段)类
- 实现序列化字符串的Serializable接口
package org.example.model;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import java.io.Serializable;
/**
* Created with IntelliJ IDEA.
* Description:用户实体类
* User: starry
* Date: 2021 -05 -22
* Time: 15:56
*/
@Getter
@Setter
@ToString
//implements Serializable:
//1.数据库使用
//2.前后端Ajax使用
//3.session保存时基于对象和二进制数据转换(这里要实现串行化接口)
public class User extends Response implements Serializable {
private static final Long serialVersionUID = 1L;
private Integer userId;
private String name;
private String password;
private String nickName;
private String iconPath;
private String signature;
private java.util.Date lastLogout;
}
频道类
package org.example.model;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
/**
* Created with IntelliJ IDEA.
* Description:频道类
* User: starry
* Date: 2021 -05 -22
* Time: 16:11
*/
@Getter
@Setter
@ToString
public class Channel {
private Integer channelId;
private String channelName;
}
消息类
package org.example.model;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
/**
* Created with IntelliJ IDEA.
* Description:消息类
* User: starry
* Date: 2021 -05 -22
* Time: 16:13
*/
@Getter
@Setter
@ToString
public class Message {
private Integer messageId;
private Integer userId;
private Integer channelId;
private String content;
private java.util.Date sendTime;
//接收客户端发送的消息,转发到所有客户端的消息,需要昵称
private String nickName;
}
以上是关于Web在线聊天室 --- 异常类+工具类+实体类的主要内容,如果未能解决你的问题,请参考以下文章