基于javaweb+mysql的jsp+servlet 小区物业管理系统(java+mysql+jsp+bootstrap)
私信源码获取及调试交流
运行环境
Java≥8、MySQL≥5.7、Tomcat≥8
开发工具
eclipse/idea/myeclipse/sts等均可配置运行
适用
课程设计,大作业,毕业设计,项目练习,学习演示等
功能说明
基于javaweb的JSP+Servlet 小区物业管理系统(java+mysql+jsp+bootstrap)
登录
用户名: admin 密码: 12345
介绍
java-web项目,采用MySQL,Tomcat,JAVA8,Servlet + JSP, 原生JDBC封装 编写
软件架构
JDK 1.8
Servlet
JSP
JDBC 二次封装,连接池
MySQL 5.7
接口代码,工具类封装
登录、注册、用户管理、小区管理、住户管理
/**
* Copyright (C) @2020 fgwang.660@gmail.com
*
* @version 1.0
* @className SystemUserServlets
* @description 用户控制层
*/
@WebServlet ({ "/users", "/login", "/register", "/logout","/forget-password" })
public class SystemUserServlets extends HttpServlet {
private static final long serialVersionUID = 1424562226724234389L;
// 用户Service注入
private final ISystemUserService service = new SystemUserService();
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) {
// 注入的系统属性
SystemProperty property = SystemProperty.getInstance();
// 登录注册相关请求
String servletPath = request.getServletPath();
switch (servletPath) {
// 登录的页面接口代码
case Constant.LOGIN:
// 页面要登录的用户
UserDTO loginUser = UtilTools.paramMap(request, UserDTO.class);
try {
SystemUser user = service.login(loginUser);
// 登录成功
HttpSession session = request.getSession();
session.setAttribute(Constant.USER_MODEL_TOKEN, user);
session.setMaxInactiveInterval(property.getSessionHoldTime());
if (loginUser.getRemember()) {
//用户选择了记住密码
Cookie cookie = new Cookie(Constant.IDENTIFY, String.valueOf(user.getId()));
/**
* 判断一个字符串,是不是全部由字母组成
*
* @param arg
* @return
*/
public static boolean isLetter(String arg) {
return isEmpty(arg) || arg.matches("[a-zA-Z]+");
}
/**
* 将一个单词转换成大驼峰
*
* @param word
* @return
*/
public static String wordToUpperCamel(String word) {
return isEmpty(word) ? word : word.substring(0, 1).toUpperCase() + word.substring(1).toLowerCase();
}
/**
* 将类名转成表名的方法,以大写字母分隔,所有字母小写 _ 拼接
*
* @param clazz bean的类类型 即 XXX.class
* @return 表名
* @description 需要 类和表 名严格遵守开发规范,即,表名,列名使用全小写字母,多个单词使用_连接, 类名是表名的大驼峰格式(去除下划线,每个单词首字母大写) 属性名是列名的小驼峰格式(去除下划线,第一个单词全小写,从第二个单词开始,每个单词首字母大写)
*/
public static String convertBeanToTable(Class<?> clazz) {
if (isEmpty(clazz)) throw new NullPointerException("Parameter object is empty .");
return lowerCamelToColumn(clazz.getSimpleName());
}
/**
* 将类中所有的属性转换成列名。转换方式,以小驼峰命名法为基准,转为每个单词用_拼接的全小写字母
*
* @param clazz bean的类类型 即 XXX.class
* @return 列名组成的List
* @description 需要 类和表 名严格遵守开发规范,即,表名,列名使用全小写字母,多个单词使用_连接, 类名是表名的大驼峰格式(去除下划线,每个单词首字母大写) 属性名是列名的小驼峰格式(去除下划线,第一个单词全小写,从第二个单词开始,每个单词首字母大写)
*/
public static List<String> convertBeanToColumns(Class<?> clazz) {
if (isEmpty(clazz)) throw new NullPointerException("Parameter object is empty .");
Field[] fields = reflectAllField(clazz);
if (isEmpty(fields)) throw new NullPointerException("The object has no attributes defined .");
return Arrays.stream(fields)
.filter(UtilTools::excludeField)
// 注册失败
new BaseResponse(777, e.getMessage()).response(response);
}
return;
default:
// 用户其他请求
switch (request.getParameter(Constant.REQUEST_TYPE)) {
// 更新 信息
case Constant.EDIT:
// 获取更新的数据
SystemUser user = UtilTools.paramMap(request, SystemUser.class);
try {
// 去数据库里更新
service.update(user);
// 更新成功
new BaseResponse(666, Constant.RESPONSE_UPDATE_SUCCESS).response(response);
} catch (BusinessException e) {
// 更新失败
new BaseResponse(777, e.getMessage()).response(response);
}catch (Exception e){
e.printStackTrace();
BaseResponse.error(Constant.RESPONSE_SERVER_ERROR, response);
}
break;
}
break;
}
}
/**
* GET 请求方法
*
* @param request
* @param response
*/
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
String servletPath = request.getServletPath();
switch (servletPath) {
// 退出的页面接口代码
case Constant.LOGOUT:
// 获取注册的用户名和密码
try {
// 获取当前会话
HttpSession session = request.getSession();
// 从会话中移除用户
session.removeAttribute(Constant.USER_MODEL_TOKEN);
// 让会话失效
session.invalidate();
}
public BaseResponse setANIMATE(Integer ANIMATE) {
this.ANIMATE = ANIMATE;
return this;
}
public String getMESSAGE() {
return MESSAGE;
}
public BaseResponse setMESSAGE(String MESSAGE) {
this.MESSAGE = MESSAGE;
return this;
}
public String getHtml() {
return html;
}
public BaseResponse setHtml(String html) {
this.html = html;
return this;
}
public String getScript() {
return script;
}
public void setScript(String script) {
this.script = script;
}
@JSONField(name = "STATUS")
public Integer getSTATUS() {
return STATUS;
}
public BaseResponse setSTATUS(Integer STATUS) {
this.STATUS = STATUS;
return this;
}
@JSONField(name = "DATA")
public Object getDATA() {
return DATA;
}
public BaseResponse setDATA(Object DATA) {
this.DATA = DATA;
return this;
}
// char[] hexDigits = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };
// try {
// byte[] btInput = character.getBytes();
// // 获得MD5摘要算法的 MessageDigest 对象
// MessageDigest mdInst = MessageDigest.getInstance("MD5");
// // 使用指定的字节更新摘要
// mdInst.update(btInput);
// // 获得密文
// byte[] md = mdInst.digest();
// // 把密文转换成十六进制的字符串形式
// int j = md.length;
// char[] str = new char[j * 2];
// int k = 0;
// for (byte byte0 : md) {
// str[k++] = hexDigits[byte0 >>> 4 & 0xf];
// str[k++] = hexDigits[byte0 & 0xf];
// }
// return new String(str);
// } catch (Exception e) {
// e.printStackTrace();
// }
// return "";
}
/**
* 校验是不是不需要的属性
*
* @param field
* @return
*/
private static Boolean excludeField(Field field) {
if (Modifier.isFinal(field.getModifiers())) return false;
if ("serialVersionUID".equals(field.getName())) return false;
return true;
}
/**
* 获取类的所有属性包含父类的属性,排除顶级父类Object的属性
*
* @param clazz
* @return
*/
public static Field[] reflectAllField(Class<?> clazz) {
Set<Field> fields = new HashSet<>();
Collections.addAll(fields, clazz.getDeclaredFields());
Class<?> superclass = clazz.getSuperclass();
while (! "Object".equals(superclass.getSimpleName())) {
Collections.addAll(fields, superclass.getDeclaredFields());
superclass = superclass.getSuperclass();
}
return fields.toArray(new Field[0]);
}
/**
* Copyright (C) @2020 fgwang.660@gmail.com
*
* @version 1.0
* @className UnitServlets
* @description 小区单元Servlet
*/
@WebServlet ("/units")
public class UnitServlets extends HttpServlet {
private static final long serialVersionUID = - 390565335372205827L;
// 接口的引用指向对应的实现类对象 (CommunityUnit)
private final ICommunityUnitService service = new CommunityUnitService();
/**
* GET 请求执行的方法
*
* @param request
* @param response
*/
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) {
// 看看当前是什么状态
String type = UtilTools.isEmpty(request.getParameter(Constant.REQUEST_TYPE)) ? Constant.LIST : request.getParameter(Constant.REQUEST_TYPE);
switch (type) {
// 查看详情页面
case Constant.EDIT:
case Constant.VIEW:
String id = request.getParameter(Constant.ID);
try {
CommunityUnit communityUnit = service.get(Integer.parseInt(id));
request.setAttribute(Constant.DATA_MODEL, communityUnit);
// 跳转页面
BaseResponse.success(Constant.DATA_MODEL, communityUnit, request);
request.getRequestDispatcher("units/detail.jsp").forward(request, response);
} catch (BusinessException e) {
UserDTO loginUser = UtilTools.paramMap(request, UserDTO.class);
try {
SystemUser user = service.login(loginUser);
// 登录成功
HttpSession session = request.getSession();
session.setAttribute(Constant.USER_MODEL_TOKEN, user);
session.setMaxInactiveInterval(property.getSessionHoldTime());
if (loginUser.getRemember()) {
//用户选择了记住密码
Cookie cookie = new Cookie(Constant.IDENTIFY, String.valueOf(user.getId()));
cookie.setMaxAge(property.getCookieTimeOut());
response.addCookie(cookie);
}
// 登录成功
new BaseResponse(666, true).response(response);
} catch (BusinessException e) {
// 登录失败
new BaseResponse(777, e.getMessage()).response(response);
}
return;
// 注册的页面接口代码
case Constant.REGISTER:
// 获取注册的用户名和密码
UserDTO registerUser = UtilTools.paramMap(request, UserDTO.class);
try {
// 注册保存入库
service.register(registerUser);
// 注册成功
new BaseResponse(666, Constant.RESPONSE_REGISTER_SUCCESS).response(response);
} catch (BusinessException e) {
// 注册失败
new BaseResponse(777, e.getMessage()).response(response);
}
return;
default:
// 用户其他请求
switch (request.getParameter(Constant.REQUEST_TYPE)) {
// 更新 信息
case Constant.EDIT:
// 获取更新的数据
SystemUser user = UtilTools.paramMap(request, SystemUser.class);
try {
// 去数据库里更新
service.update(user);
// 更新成功
new BaseResponse(666, Constant.RESPONSE_UPDATE_SUCCESS).response(response);
} catch (BusinessException e) {
// 更新失败
new BaseResponse(777, e.getMessage()).response(response);
}catch (Exception e){
e.printStackTrace();
/**
* GET 请求执行的方法
*
* @param request
* @param response
*/
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) {
// 看看当前是什么状态
String type = UtilTools.isEmpty(request.getParameter(Constant.REQUEST_TYPE)) ? Constant.LIST : request.getParameter(Constant.REQUEST_TYPE);
switch (type) {
// 查看详情页面
case Constant.EDIT:
case Constant.VIEW:
String id = request.getParameter(Constant.ID);
try {
CommunityUnit communityUnit = service.get(Integer.parseInt(id));
request.setAttribute(Constant.DATA_MODEL, communityUnit);
// 跳转页面
BaseResponse.success(Constant.DATA_MODEL, communityUnit, request);
request.getRequestDispatcher("units/detail.jsp").forward(request, response);
} catch (BusinessException e) {
BaseResponse.error(e.getMessage(), response);
} catch (Exception e) {
BaseResponse.error(Constant.RESPONSE_SERVER_ERROR, response);
}
break;
// 删除功能
case Constant.DELETE:
id = request.getParameter(Constant.ID);
try {
service.delete(id);
new BaseResponse(666, Constant.RESPONSE_DELETE_SUCCESS).response(response);
} catch (BusinessException e) {
new BaseResponse(777, e.getMessage()).response(response);
} catch (Exception e) {
BaseResponse.error(Constant.RESPONSE_SERVER_ERROR, response);
}
break;
default: // 默认是查看列表页
try {
List<CommunityUnit> communityUnits = service.get();
BaseResponse.success(Constant.DATA_MODEL, communityUnits, request);
request.getRequestDispatcher("units/unit.jsp").forward(request, response);
} catch (BusinessException e) {
BaseResponse.error("用户列表查询失败", response);
} catch (Exception e) {
BaseResponse.error(Constant.RESPONSE_SERVER_ERROR, response);
}
} catch (BusinessException e) {
new BaseResponse(777, e.getMessage()).response(response);
} catch (Exception e) {
BaseResponse.error(Constant.RESPONSE_SERVER_ERROR, response);
}
break;
// 编辑更新
case Constant.EDIT:
communityUnit = UtilTools.paramMap(request, CommunityUnit.class);
try {
// 调用更新的接口
service.update(communityUnit);
new BaseResponse(666, Constant.RESPONSE_UPDATE_SUCCESS).response(response);
} catch (BusinessException e) {
e.printStackTrace();
new BaseResponse(777, e.getMessage()).response(response);
} catch (Exception e) {
BaseResponse.error(Constant.RESPONSE_SERVER_ERROR, response);
}
break;
// 分页查询
case Constant.PAGE:
break;
default:
break;
}
}
}
* @return
*/
public static Field[] reflectAllField(Class<?> clazz) {
Set<Field> fields = new HashSet<>();
Collections.addAll(fields, clazz.getDeclaredFields());
Class<?> superclass = clazz.getSuperclass();
while (! "Object".equals(superclass.getSimpleName())) {
Collections.addAll(fields, superclass.getDeclaredFields());
superclass = superclass.getSuperclass();
}
return fields.toArray(new Field[0]);
}
/**
* 获取大小写字母加数字的随机字符串
*
* @param length 字符串的长度
* @return 随机字符串
*/
public static String randomString(int length) {
List<String> origin = new ArrayList<>();
// 获取全部的英文大小写字母
for (int i = 65; i < (int) 'Z'; i++) {
origin.add(String.valueOf((char) i));
origin.add(String.valueOf((char) (i + 32)));
}
// 生成0-9数字 跟字母组合在一起
for (int i = 0; i < 10; i++) {
origin.add(String.valueOf(i));
}
StringBuilder result = new StringBuilder(length);
// 循环length次 每次随机拿到一个字母 拼接在结果后面
for (int i = 0; i < length; i++) {
String c = origin.get(new Random().nextInt(origin.size()));
result.append(c);
}
return result.toString();
}
Collections.addAll(fields, clazz.getDeclaredFields());
Class<?> superclass = clazz.getSuperclass();
while (! "Object".equals(superclass.getSimpleName())) {
Collections.addAll(fields, superclass.getDeclaredFields());
superclass = superclass.getSuperclass();
}
return fields.toArray(new Field[0]);
}
/**
* 获取大小写字母加数字的随机字符串
*
* @param length 字符串的长度
* @return 随机字符串
*/
public static String randomString(int length) {
List<String> origin = new ArrayList<>();
// 获取全部的英文大小写字母
for (int i = 65; i < (int) 'Z'; i++) {
origin.add(String.valueOf((char) i));
origin.add(String.valueOf((char) (i + 32)));
}
// 生成0-9数字 跟字母组合在一起
for (int i = 0; i < 10; i++) {
origin.add(String.valueOf(i));
}
StringBuilder result = new StringBuilder(length);
// 循环length次 每次随机拿到一个字母 拼接在结果后面
for (int i = 0; i < length; i++) {
String c = origin.get(new Random().nextInt(origin.size()));
result.append(c);
}
return result.toString();
}
/**
* 分页查询工具
*/
public static class PageQueryTool {
// 当前页
private Integer currentPage;
// 页面数据大小
private Integer pageSize;
// 起始页
private Integer startIndex;
e.printStackTrace();
}
return object;
}
/**
* MD5 加密算法
*
* @param character 要加密的字符串
* @return 加密后的字符串
*/
public static String MD5Encoded(String character) {
return character;
// char[] hexDigits = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };
// try {
// byte[] btInput = character.getBytes();
// // 获得MD5摘要算法的 MessageDigest 对象
// MessageDigest mdInst = MessageDigest.getInstance("MD5");
// // 使用指定的字节更新摘要
// mdInst.update(btInput);
// // 获得密文
// byte[] md = mdInst.digest();
// // 把密文转换成十六进制的字符串形式
// int j = md.length;
// char[] str = new char[j * 2];
// int k = 0;
// for (byte byte0 : md) {
// str[k++] = hexDigits[byte0 >>> 4 & 0xf];
// str[k++] = hexDigits[byte0 & 0xf];
// }
// return new String(str);
// } catch (Exception e) {
// e.printStackTrace();
// }
// return "";
}
/**
* 校验是不是不需要的属性
*
* @param request request对象
* @param clazz 类类型
* @param <T> 类
* @return 类对象
*/
public static <T> T paramMap(HttpServletRequest request, Class<T> clazz) {
T object = null;
try {
// 创建类对象
object = clazz.newInstance();
// 获取类中所有的属性
Field[] fields = reflectAllField(clazz);
// 遍历每一个属性
for (Field field : fields) {
// 排除序列化id等属性
if (! excludeField(field)) continue;
// 设置属性的访问权限
field.setAccessible(true);
// 获取属性名
String key = field.getName();
// 获取属性值
String value = request.getParameter(key);
// 获取属性的类型,根据类型映射值
Class<?> fieldType = field.getType();
if (UtilTools.isNotEmpty(value)) {
// 特殊类型映射处理
if (Boolean.class.isAssignableFrom(fieldType)) {
field.set(object, Integer.parseInt(value) == 1);
} else if (Integer.class.isAssignableFrom(fieldType)) { // int类型处理
field.set(object, Integer.parseInt(value));
} else if (Long.class.isAssignableFrom(fieldType)) { // Long类型处理
field.set(object, Long.parseLong(value));
} else if (Date.class.isAssignableFrom(fieldType)) { // 日期类型处理
try {
value = value.replace("T", " ");
Date date = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(value);
field.set(object, date);
} catch (ParseException e) {
e.printStackTrace();
}
} else { // 默认是字符串
session.invalidate();
// 遍历cookie,让cookie失效
Cookie[] cookies = request.getCookies();
for (Cookie cookie : cookies) {
cookie.setValue("");
cookie.setPath(request.getContextPath());
cookie.setMaxAge(0);
response.addCookie(cookie);
}
// 退出成功后 给个提示 提示完 还得刷新页面(改下状态)
BaseResponse.response(Constant.RESPONSE_LOGOUT_SUCCESS, response);
} catch (BusinessException e) {
BaseResponse.response(e.getMessage(), response);
}
return;
// 忘记密码
case Constant.FORGETPASSWORD:
// 获取用户名
String username = request.getParameter("username");
try {
// 返回密码并且给用户显示
String password = service.resetPassword(username);
new BaseResponse(666, password).response(response);
}catch (BusinessException e){
new BaseResponse(777, e.getMessage()).response(response);
} catch (Exception e) {
e.printStackTrace();
BaseResponse.error(Constant.RESPONSE_SERVER_ERROR, response);
}
return;
default: // 用户的其他请求通道
switch (UtilTools.isEmpty(request.getParameter(Constant.REQUEST_TYPE)) ? Constant.LIST : request.getParameter(Constant.REQUEST_TYPE)) {
case Constant.VIEW: // 查看用户信息
case Constant.EDIT: // 编辑用户信息
// 查询用户信息
String id = request.getParameter(Constant.ID);
try {
// 查询用户详情
SystemUser user = service.get(Integer.parseInt(id));
// 查询所有的住户信息
ITenantsService tenantsService = new TenantsService();
List<Tenants> tenants = tenantsService.get();
// 住户信息返回页面
List<Object> othersDatas = new ArrayList<>();
othersDatas.add(tenants);
// 用户详情返回页面
BaseResponse.success(Constant.DATA_MODEL, user, request);
BaseResponse.success(Constant.DATA_OTHER_MODEL, othersDatas, request);
request.getRequestDispatcher("users/detail.jsp").forward(request, response);
} catch (BusinessException e) {
BaseResponse.error(e.getMessage(), response);
}
break;
this.html = (UtilTools.isEmpty(this.html) ? new StringBuilder() : new StringBuilder(this.html)).append("<script>function ")
.append(this.getFUNCTION())
.append("{fyAlert.msg('")
.append(this.getMESSAGE())
.append("', { icon: ")
.append(this.getICON())
.append(", animateType: ")
.append(this.getANIMATE())
.append(" });} ")
.append(this.getFUNCTION())
.append(";</script>")
.toString();
return this;
}
/**
* 构建响应脚本
* @param script
* @return
*/
public BaseResponse buildScript(String script) {
this.script = (UtilTools.isEmpty(this.script) ? new StringBuilder() : new StringBuilder(this.script))
.append("<script>function ")
.append("response() {")
.append(script)
.append(";} ")
.append("response()")
.append(";</script>")
.toString();
return this;
}
public String getFUNCTION() {
return FUNCTION;
}
public BaseResponse setFUNCTION(String FUNCTION) {
this.FUNCTION = FUNCTION;
return this;
}
public Integer getICON() {
return ICON;
}
public BaseResponse setICON(Integer ICON) {
this.ICON = ICON;
return this;
}
public Integer getANIMATE() {
return ANIMATE;
}
/**
* 判空方法,对象,字符串,数组,List,Map是否为空
*
* @param t
* @param <T>
* @return
*/
public static <T> boolean isEmpty(T t) {
// 如果t是对象
if (t == null) return true;
// 如果t是字符串
if (t instanceof String && ("".equals(t) || ("".equals(((String) t).trim())))) return true;
// 如果t是数组
if (t instanceof Object[] && ((Object[]) t).length == 0) return true;
// 如果t是list或者Set
if (t instanceof Collection && ((Collection) t).size() == 0) return true;
// 如果t是Map
return t instanceof Map && ((Map) t).size() == 0;
}
/**
* 非空判断
*
* @param t
* @param <T>
* @return
*/
public static <T> boolean isNotEmpty(T t) {
return ! isEmpty(t);
}
/**
* 判断一个字符串,是不是全部由字母组成
*
* @param arg
* @return
*/
public static boolean isLetter(String arg) {
return isEmpty(arg) || arg.matches("[a-zA-Z]+");
}
if (whiteList.contains(path)) return true;
// 静态资源放行
return whiteList.contains(path.split("[/]")[1]);
}
}
/**
* Copyright (C) @2020 fgwang.660@gmail.com
*
* @version 1.0
* @className UnitServlets
* @description 小区单元Servlet
*/
@WebServlet ("/units")
public class UnitServlets extends HttpServlet {
private static final long serialVersionUID = - 390565335372205827L;
// 接口的引用指向对应的实现类对象 (CommunityUnit)
private final ICommunityUnitService service = new CommunityUnitService();
/**
* GET 请求执行的方法
*
* @param request
* @param response
*/
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) {