案例:用户信息列表展示
-
需求:用户信息的增删改查操作
-
设计:
-
技术选型:Servlet+JSP+MySQL+JDBCTempleat+Duird+BeanUtilS+tomcat
-
数据库设计:
create database day17; -- 创建数据库 use day17; -- 使用数据库 create table user( -- 创建表 id int primary key auto_increment, name varchar(20) not null, gender varchar(5), age int, address varchar(32), qq varchar(20), email varchar(50) );
-
-
开发:
-
环境搭建
- 创建数据库环境
- 创建项目,导入需要的jar包
-
编码
-
-
测试
-
部署运维
1 登录
首先校验验证码,验证码正确再获取user对象,其中包括用户名和密码,到数据库进行校验,有数据会返回完整的user信息,跳转到用户列表显示。
如果其中一项不符合都会回到登录界面,并且request转发到 jsp 会携带提示信息log_mas。
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1 设置编码
request.setCharacterEncoding("utf-8");
//2 获取数据
//2.1 获取验证码
String verifycode = request.getParameter("verifycode");
//3 验证码校验
HttpSession session = request.getSession();
String checkcode_server = (String) session.getAttribute("CHECKCODE_SERVER");//获取session中保存的验证码
session.removeAttribute("CHECKCODE_SERVER"); //确保验证码一次性
if(!checkcode_server.equalsIgnoreCase(verifycode)){
//将验证码与用户输入比较
//错误 --- 提示信息 -- 跳转登录页面
request.setAttribute("login_msg","验证码错误!");
request.getRequestDispatcher("/login.jsp").forward(request,response);
return;
}
//4 封装user对象
Map<String, String[]> map = request.getParameterMap(); //获取所有数据
User user = new User();
try {
BeanUtils.populate(user,map);
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
//5 调用service查询 -- 验证码正确的情况
UserService service = new UserServiceImpl();
User loginUser = service.login(user);
//6 判断是否登录成功
if(loginUser != null){
//查询到数据,登录成功 -- 跳转index.jsp
//将用户存入session
session.setAttribute("user",loginUser);
//跳转页面
response.sendRedirect(request.getContextPath()+"/index.jsp"); //没有共享数据,使用重定向
}else {
request.setAttribute("login_msg","登录失败!");
request.getRequestDispatcher("/login.jsp").forward(request,response);
return;
}
}
1 显示用户数据
不需要参数,到数据库中查询所有用户信息,回到jsp页面展示,在jsp中使用foreach遍历了返回的list集合,在table中显示信息。
到后面这个显示所有数据的Servlet会弃用,改成分页查询的servlet
@WebServlet("/userListServlet")
public class userListServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
//1 调用UserService完成查询
UserService service = new UserServiceImpl();
List<User> users = service.findAll(); //查询所有用户
//2 将list存入request域
request.setAttribute("users",users);//存储查询到的数据
//3 转发到页面
request.getRequestDispatcher("/list.jsp").forward(request,response); //转发不需要虚拟目录
}
2 添加用户数据
从显示数据的jsp跳转到添加数据的jsp,将获得的数据发给addUserServlet处理,需要注意的是input的name要和数据库的字段对应,添加完数据之后会重新查询所有数据返回显示。
3 删除用户数据
删除单个用户:
点击删除去到delUserServlet,并且携带要删除用户的user.id,数据库根据id删除用户。
删除多个用户(删除选中):
使用表单提交uid携带要删除数据的user.id,只有checked选中的会被提交,数据提交到delSelectedServlet获取所有要删除数据的id,调用service遍历ids数组进行删除。
4 修改用户数据
在页面中选择修改,则这条user数据会携带user.id传到findUserServlet,根据id查询出user,并将完整的user数据返回,跳转到update页面,使用request域里的user将所有user数据回显到修改表单中,因为需要使用id到数据库中查询,所以id也需要提交,使用隐藏域。
修改完毕提交到updateUserServlet,调用service修改后返回数据显示页面。
5 分页查询功能
使用bootstrap中的分页组件,需要写一个分页对象,来存储分页所需要的数据和分页查询的user信息。
重新写一个查询数据的Servlet,需要传入参数即当前页码和每页显示条数
/**
* 分页对象
*/
public class PageBean<T> {
private int totalCount; //总记录数
private int totalPage; //总页码
private List<T> list; //存储数据的集合
private int currentPage; //当前页码
private int rows; //每页显示的记录数
@Override
public String toString() {
return "PageBean{" +
"totalCount=" + totalCount +
", totalPage=" + totalPage +
", list=" + list +
", currentPage=" + currentPage +
", rows=" + rows +
'}';
}
查询数据库中的总条目数totalCount,再根据传递过来的参数计算总页数PageCount,使用sql语句中的limit start,rows,就可以实现每次只查询固定条数而不是查询所有数据,将数据存入PageBean的list集合中,转发到list.jsp显示。
5 条件查询功能
将表格上方的查询使用from表单包裹,数据提交到分页查询的servlet,只是在原有的查询基础上增加条件。
需要注意的数据库sql的编写,因为传递过来的数据可能是空条件,所以需要判断input是否有内容,动态拼接sql查询。
//查询总记录数
@Override
public int findTotalCount(Map<String, String[]> condition) {
//1 定义模板sql
String sql = "select count(*) from user where 1 = 1 ";
//2 遍历map,根据map是否有值,拼接对应的sql
StringBuilder sb = new StringBuilder(sql);
Set<String> keySet = condition.keySet();
//定义参数的集合
List<Object> params = new ArrayList<Object>();
for (String key : keySet) {
//排除分页条件的参数
if("currentPage".equals(key) || "rows".equals(key)){
continue; //结束当前循环,继续下一次循环----寻找其他的key
}
//获取value
String value = condition.get(key)[0];
//判断value是否有值
if(value != null && !"".equals(value)){
//有值 -- 拼接sql
sb.append(" and "+key+" like ? ");
params.add("%"+value+"%"); //?条件的值
}
}
System.out.println(sb.toString());
System.out.println(params);
int count = template.queryForObject(sb.toString(),Integer.class,params.toArray());//返回Integer类型的值,自动拆箱
return count;
}
//分页查询的数据
@Override
public List<User> findByPage(int start, int rows, Map<String, String[]> condition) {
String sql = "select * from user where 1 = 1 ";
//2 遍历map,根据map是否有值,拼接对应的sql
StringBuilder sb = new StringBuilder(sql);
Set<String> keySet = condition.keySet();
//定义参数的集合
List<Object> params = new ArrayList<Object>();
for (String key : keySet) {
//排除分页条件的参数
if("currentPage".equals(key) || "rows".equals(key)){
continue; //结束当前循环,继续下一次循环----寻找其他的key
}
//获取value
String value = condition.get(key)[0];
//判断value是否有值
if(value != null && !"".equals(value)){
//有值 -- 拼接sql
sb.append(" and "+key+" like ? ");
params.add("%"+value+"%"); //?条件的值
}
}
//添加分页查询
sb.append(" limit ?,? ");
//添加查询的参数
params.add(start);
params.add(rows);
sql = sb.toString();
System.out.println(sql);
System.out.println(params);
return template.query(sql,new BeanPropertyRowMapper<User>(User.class),params.toArray());
}