完成一个用户信息管理系统(基于 BS 架构),功能如下:
效果图如下:
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(20) NOT NULL,
`gender` varchar(5) DEFAULT NULL,
`age` int(11) DEFAULT NULL,
`address` varchar(32) DEFAULT NULL,
`qq` varchar(20) DEFAULT NULL,
`email` varchar(50) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
创建数据库环境
创建项目
打开 IDEA,创建一个 Java EE 项目,Java EE version 为 Java EE 7,勾选 Web Application,不勾选 Create web.xml,项目名称为 day17_2
导入需要的 jar 包
导入需要的 jar 包到 web/WEB-INF/lib 中,右键 Add as Library
创建配置文件
在 src 下创建 Druid 配置文件 druid.properties
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://127.0.0.1:3306/day17
username=root
password=123456
initialSize=5
maxActive=10
maxWait=3000
修改 Tomcat 配置
将 Bootstrap 相关的 css,fonts,js 三个文件夹复制到 web 目录下
首页 index.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
首页
用户信息列表页面 list.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
用户信息管理系统
添加用户页面 add.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
添加用户
添加用户
修改用户页面 update.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
修改用户
修改用户
在 src 中创建 com.zt 包,在其中创建以下包:
utils 包
JDBCUtils
package com.zt.utils;
import com.alibaba.druid.pool.DruidDataSourceFactory;
import javax.sql.DataSource;
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.util.Properties;
public class JDBCUtils {
// 1.定义静态变量 dataSource
private static DataSource dataSource;
static {
try {
// 2.加载配置文件
Properties properties = new Properties();
InputStream resourceAsStream = JDBCUtils.class.getClassLoader().getResourceAsStream("druid.properties");
properties.load(resourceAsStream);
// 3.创建数据库连接池对象,并赋值给 dataSource
dataSource = DruidDataSourceFactory.createDataSource(properties);
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 获取连接池方法
*/
public static DataSource getDataSource() {
return dataSource;
}
/**
* 通过数据库连接池获取连接对象
*/
public static Connection getConnection() throws SQLException {
return dataSource.getConnection();
}
/**
* 释放资源
*/
public static void close(ResultSet resultSet, Statement statement, Connection connection) {
if (resultSet != null) {
try {
resultSet.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (statement != null) {
try {
statement.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (connection != null) {
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
public static void close(Statement statement, Connection connection) {
close(null, statement, connection);
}
}
domain 包
User
package com.zt.domain;
/**
* 用户对象
*/
public class User {
private int id;
private String name;
private String gender;
private int age;
private String address;
private String qq;
private String email;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String getQq() {
return qq;
}
public void setQq(String qq) {
this.qq = qq;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", gender='" + gender + '\'' +
", age=" + age +
", address='" + address + '\'' +
", qq='" + qq + '\'' +
", email='" + email + '\'' +
'}';
}
}
PageBean
package com.zt.domain;
import java.util.List;
/**
* 分页对象
*/
public class PageBean<T> {
private int totalCount; // 总记录数
private int totalPage; // 总页码数
private int currentPage; // 当前页码
private int rows; // 每页显示的条数
private List<T> list; // 每页的数据
public int getTotalCount() {
return totalCount;
}
public void setTotalCount(int totalCount) {
this.totalCount = totalCount;
}
public int getTotalPage() {
return totalPage;
}
public void setTotalPage(int totalPage) {
this.totalPage = totalPage;
}
public int getCurrentPage() {
return currentPage;
}
public void setCurrentPage(int currentPage) {
this.currentPage = currentPage;
}
public int getRows() {
return rows;
}
public void setRows(int rows) {
this.rows = rows;
}
public List<T> getList() {
return list;
}
public void setList(List<T> list) {
this.list = list;
}
@Override
public String toString() {
return "PageBean{" +
"totalCount=" + totalCount +
", totalPage=" + totalPage +
", currentPage=" + currentPage +
", rows=" + rows +
", list=" + list +
'}';
}
}
dao 包
UserDao
package com.zt.dao;
import com.zt.domain.User;
import java.util.List;
import java.util.Map;
public interface UserDao {
/**
* 添加用户信息
* @param user
*/
public void add(User user);
/**
* 删除用户信息
* @param id
*/
public void delete(int id);
/**
* 查询用户信息
* @param id
* @return
*/
public User find(int id);
/**
* 更新用户信息
* @param user
*/
public void update(User user);
/**
* 查询总记录数
* @return
* @param condition
*/
public int findTotalCount(Map<String, String[]> condition);
/**
* 分页条件查询用户信息
* @param start
* @param rows
* @param condition
* @return
*/
public List<User> findByPage(int start, int rows, Map<String, String[]> condition);
}
UserDaoImpl
package com.zt.dao.impl;
import com.zt.dao.UserDao;
import com.zt.domain.User;
import com.zt.utils.JDBCUtils;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set;
public class UserDaoImpl implements UserDao {
// 使用 Spring JDBC 操作数据库
private JdbcTemplate jdbcTemplate = new JdbcTemplate(JDBCUtils.getDataSource());
@Override
public void add(User user) {
String sql = "insert into user values(null,?,?,?,?,?,?)";
jdbcTemplate.update(sql,user.getName(),user.getGender(),user.getAge(),user.getAddress(),user.getQq(),user.getEmail());
}
@Override
public void delete(int id) {
String sql = "delete from user where id = ?";
jdbcTemplate.update(sql,id);
}
@Override
public User find(int id) {
String sql = "select * from user where id = ?";
User user = jdbcTemplate.queryForObject(sql, new BeanPropertyRowMapper<User>(User.class), id);
return user;
}
@Override
public void update(User user) {
String sql = "update user set name = ?, gender = ?, age = ?, address = ?, qq = ?, email = ? where id = ?";
jdbcTemplate.update(sql,user.getName(),user.getGender(),user.getAge(),user.getAddress(),user.getQq(),user.getEmail(),user.getId());
}
@Override
public int findTotalCount(Map<String, String[]> condition) {
// 1.定义初始化 sql,注意 sql语句后加空格
String sql = "select count(*) from user where 1 = 1 ";
StringBuilder stringBuilder = new StringBuilder(sql);
// 2.定义参数的集合 params
List<Object> params = new ArrayList<Object>();
// 3.遍历 condition
Set<String> keySet = condition.keySet();
for (String key : keySet) {
// 排除分页条件参数
if("currentPage".equals(key) || "rows".equals(key)){
continue;
}
// 获取 value
String value = condition.get(key)[0];
// 判断 value 是否有值
if(value != null || !"".equals(value)){
// 给 sql 附加条件语句,注意 sql语句前后加空格
stringBuilder.append(" And " + key +" like ? ");
// 将 value 放入 params 集合
params.add("%"+value+"%");
}
}
return jdbcTemplate.queryForObject(stringBuilder.toString(), Integer.class, params.toArray());
}
@Override
public List<User> findByPage(int start, int rows, Map<String, String[]> condition) {
// 1.定义初始化 sql,注意 sql语句后加空格
String sql = "select * from user where 1 = 1 ";
StringBuilder stringBuilder = new StringBuilder(sql);
// 2.定义参数的集合 params
List<Object> params = new ArrayList<Object>();
// 3.遍历 condition
Set<String> keySet = condition.keySet();
for (String key : keySet) {
// 排除分页条件参数
if("currentPage".equals(key) || "rows".equals(key)){
continue;
}
// 获取 value
String value = condition.get(key)[0];
// 判断 value 是否有值
if(value != null || !"".equals(value)){
// 给 sql 附加条件语句,注意 sql语句前后加空格
stringBuilder.append(" And " + key +" like ? ");
// 将 value 放入 params 集合
params.add("%"+value+"%");
}
}
// 4.添加分页条件
stringBuilder.append(" limit ?,? ");
// 5.添加分页条件参数值
params.add(start);
params.add(rows);
return jdbcTemplate.query(stringBuilder.toString(), new BeanPropertyRowMapper<User>(User.class), params.toArray());
}
}
service 包
UserService
package com.zt.service;
import com.zt.domain.PageBean;
import com.zt.domain.User;
import java.util.Map;
public interface UserService {
/**
* 添加用户信息
* @param user
*/
public void addUser(User user);
/**
* 删除用户信息
* @param id
*/
public void deleteUser(String id);
/**
* 查询用户信息
* @param id
*/
public User findUser(String id);
/**
* 更新用户信息
* @param user
*/
public void updateUser(User user);
/**
* 分页条件查询用户信息
* @param currentPage
* @param rows
* @param condition
* @return
*/
public PageBean<User> findUserByPage(String currentPage, String rows, Map<String, String[]> condition);
}
UserServiceImpl
package com.zt.service.impl;
import com.zt.dao.UserDao;
import com.zt.dao.impl.UserDaoImpl;
import com.zt.domain.PageBean;
import com.zt.domain.User;
import com.zt.service.UserService;
import java.util.List;
import java.util.Map;
public class UserServiceImpl implements UserService {
// 调用 UserDaoImpl 来实现业务逻辑
private UserDao userDao = new UserDaoImpl();
@Override
public void addUser(User user) {
userDao.add(user);
}
@Override
public void deleteUser(String id) {
userDao.delete(Integer.parseInt(id));
}
@Override
public User findUser(String id) {
return userDao.find(Integer.parseInt(id));
}
@Override
public void updateUser(User user) {
userDao.update(user);
}
@Override
public PageBean<User> findUserByPage(String currentPage, String rows, Map<String, String[]> condition) {
int currentPage1 = Integer.parseInt(currentPage);
int rows1 = Integer.parseInt(rows);
// 1.创建一个空的 PageBean 对象
PageBean<User> userPageBean = new PageBean<>();
// 2.设置属性
userPageBean.setCurrentPage(currentPage1);
userPageBean.setRows(rows1);
// 3.调用 dao 查询总记录数
int totalCount = userDao.findTotalCount(condition);
userPageBean.setTotalCount(totalCount);
// 4.调用 dao 查询 list 集合
// 计算开始的记录索引
int start = (currentPage1 - 1) * rows1;
List<User> byPage = userDao.findByPage(start, rows1, condition);
userPageBean.setList(byPage);
// 5.计算总页码数
int totalPage = totalCount % rows1 == 0 ? totalCount/rows1 : totalCount/rows1 + 1;
userPageBean.setTotalPage(totalPage);
return userPageBean;
}
}
servlet 包
FindUserByPageServlet
package com.zt.web.servlet;
import com.zt.domain.PageBean;
import com.zt.domain.User;
import com.zt.service.UserService;
import com.zt.service.impl.UserServiceImpl;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Map;
@WebServlet("/FindUserByPageServlet")
public class FindUserByPageServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 1.设置编码
request.setCharacterEncoding("utf-8");
// 2.获取参数
String currentPage = request.getParameter("currentPage"); // 当前页码
String rows = request.getParameter("rows"); // 每页显示条数
Map<String, String[]> condition = request.getParameterMap();
// 3.参数为空的情况
if(currentPage == null || "".equals(currentPage)) {
currentPage = "1";
}
if(rows == null || "".equals(rows)) {
rows = "5";
}
// 4.调用 UserService 完成查询
UserService userService = new UserServiceImpl();
PageBean<User> userByPage = userService.findUserByPage(currentPage, rows, condition);
// 5.将 userByPage 存入 request
request.setAttribute("userByPage",userByPage);
// 6.将 condition 存入 request
request.setAttribute("condition",condition);
// 7.转发到 list.jsp
request.getRequestDispatcher("/list.jsp").forward(request,response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
AddUserServlet
package com.zt.web.servlet;
import com.zt.domain.User;
import com.zt.service.UserService;
import com.zt.service.impl.UserServiceImpl;
import org.apache.commons.beanutils.BeanUtils;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.util.List;
import java.util.Map;
@WebServlet("/AddUserServlet")
public class AddUserServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 1.设置编码
request.setCharacterEncoding("utf-8");
// 2.获取参数
Map<String, String[]> parameterMap = request.getParameterMap();
// 3.封装对象
User user = new User();
try {
BeanUtils.populate(user,parameterMap);
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
// 4.调用 UserService 完成添加
UserService userService = new UserServiceImpl();
userService.addUser(user);
//5.重定向到 FindUserByPageServlet
response.sendRedirect(request.getContextPath()+"/FindUserByPageServlet");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
DelUserServlet
package com.zt.web.servlet;
import com.zt.service.UserService;
import com.zt.service.impl.UserServiceImpl;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/DelUserServlet")
public class DelUserServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 1.获取参数
String id = request.getParameter("id");
// 2.调用 UserService 完成删除
UserService userService = new UserServiceImpl();
userService.deleteUser(id);
// 3.重定向到 FindUserByPageServlet
response.sendRedirect(request.getContextPath()+"/FindUserByPageServlet");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
DelSelectedServlet
package com.zt.web.servlet;
import com.zt.service.UserService;
import com.zt.service.impl.UserServiceImpl;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/DelSelectedServlet")
public class DelSelectedServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 1.获取参数
String[] ids = request.getParameterValues("id");
// 2.调用 UserService 完成删除
UserService userService = new UserServiceImpl();
for (String id : ids) {
userService.deleteUser(id);
}
// 3.重定向到 FindUserByPageServlet
response.sendRedirect(request.getContextPath()+"/FindUserByPageServlet");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
FindUserServlet
package com.zt.web.servlet;
import com.zt.domain.User;
import com.zt.service.UserService;
import com.zt.service.impl.UserServiceImpl;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/FindUserServlet")
public class FindUserServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 1.获取参数
String id = request.getParameter("id");
// 2.调用 UserService 完成查询
UserService userService = new UserServiceImpl();
User user = userService.findUser(id);
// 3.将 user 存入 request
request.setAttribute("user",user);
// 4.转发到 update.jsp
request.getRequestDispatcher("/update.jsp").forward(request,response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
UpdateUserServlet
package com.zt.web.servlet;
import com.zt.domain.User;
import com.zt.service.UserService;
import com.zt.service.impl.UserServiceImpl;
import org.apache.commons.beanutils.BeanUtils;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.util.Map;
@WebServlet("/UpdateUserServlet")
public class UpdateUserServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 1.设置编码
request.setCharacterEncoding("utf-8");
// 2.获取参数
Map<String, String[]> parameterMap = request.getParameterMap();
// 3.封装对象
User user = new User();
try {
BeanUtils.populate(user,parameterMap);
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
// 4.调用 UserService 完成修改
UserService userService = new UserServiceImpl();
userService.updateUser(user);
//5.重定向到 FindUserByPageServlet
response.sendRedirect(request.getContextPath()+"/FindUserByPageServlet");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}