一.前节回顾
在前一节中,我们了解了:
1.将中央控制器中的Action容器,变成可控制!
2.针对于反射调用业务代码,最终页面跳转
3.jsp页面参数传递后台的代码优化字段太多有影响!
二.项目部署前期准备工作
1.项目运行环境配置
1.1.首先新建一个web项目,完成xml构建
然后命名,点击next点到底直到这个出现
将其勾选,next!
1.2加载jar
将我们的jar放在web项目的安全目录下
然后在进行 add buth将我们的jar加入项目
1.3准备工作结束
新建一个utils包,将我们的数据连接驱动,以及过滤器,连接保护文件,分页代码,以及通用的方法basedao加入进utils包中
三.正式启动项目
1.创建实体包
定义需要的属性,提供get,set方法;tostring,,有参,无参数方法
2.建立通用查询方法
2.1.继承BaseDao<Book>实现通用查询
public List<Book> list(Book book, PageBean pageBean) throws Exception { String sql = "select *from t_mvc_book where 1=1 "; String bname = book.getBname(); int bid = book.getBid(); if (StringUtils.isNotBlank(bname)) { sql += " and bname like '%" + bname + "%' "; } if (bid != 0) { sql += " and bid=" + bid; } return super.executeQuery(sql, Book.class, pageBean); }
3.老版本增删改,和新增删改
3.1老版本增删改
// 增加 public int add(Book book) throws Exception { String sql = "insert into t_mvc_book values(?,?,?)"; Connection conn = DBAccess.getConnection(); PreparedStatement ps = conn.prepareStatement(sql); ps.setObject(1, book.getBid()); ps.setObject(2, book.getBname()); ps.setObject(3, book.getPrice()); return ps.executeUpdate(); } //删除 public int del(Book book) throws Exception { String sql = "delete from t_mvc_book where bid=? "; Connection conn = DBAccess.getConnection(); PreparedStatement ps = conn.prepareStatement(sql); ps.setObject(1, book.getBid()); return ps.executeUpdate(); } public int edit(Book book) throws Exception { String sql = " update t_mvc_book set bname=?,price=? where bid=?"; Connection conn = DBAccess.getConnection(); PreparedStatement ps = conn.prepareStatement(sql); ps.setObject(1, book.getBname()); ps.setObject(2, book.getPrice()); ps.setObject(3, book.getBid()); return ps.executeUpdate(); }
缺点:
重复代码:
Connection conn = DBAccess.getConnection();
PreparedStatement ps =conn.prepareStatement(sql);
重复流程:
ps.setObject(1, book.getBid());
ps.setObject(2, book.getBname());ps.setObject(3, book.getPrice());
3.2新版本增删改
3.2.1在basedao对于重复代码进行封装
通过一个对象集合来存储实体的属性,然后再通过一个for循环其下标其目的是:根据操作来遍历出来所需要的属性,然后通过反射来操作,最后加入设置值
* 通用的增删改方法 * @param book * @throws Exception * sql:sql语句 * T:实体 * attrs:实体属性 */ public int executeUpdate(String sql, T t, String[] attrs) throws Exception { Connection con = DBAccess.getConnection(); PreparedStatement pst = con.prepareStatement(sql); for (int i = 0; i < attrs.length; i++) { Field f = t.getClass().getDeclaredField(attrs[i]); f.setAccessible(true); pst.setObject(i+1, f.get(t)); } return pst.executeUpdate(); }
3.2.2新版本
只需要调用那个方法,根据需求编写sql语句,然后在通过return返回,sql语句,实体,集中中的元素
/** * 通用增删改 */ //增加 public int add(Book book) throws Exception { String sql = "insert into t_mvc_book values(?,?,?)"; return super.executeUpdate(sql, book, new String[] {"bid","bname","price"}); } //删除 public int del(Book book) throws Exception { String sql = "delete from t_mvc_book where bid=? "; return super.executeUpdate(sql, book, new String[] {"bid"}); } //修改 public int edit(Book book) throws Exception { String sql = "update t_mvc_book set bname=?,price=? where bid=? "; return super.executeUpdate(sql, book, new String[] {"bname","price","bid"}); }
4.juin测试
选择类目,crtl+n 建立一个类Juint test case给代码进行测试
4.1方法测试
实现思路:
1.首先在最外层:调用私有化的dao方法
2.在方法内部实例化实体
3.然后在通过dao.方法名
4.当然具体情况具体分析
package com.lz.dao; import static org.junit.Assert.*; import java.util.List; import org.junit.Test; import com.lz.entity.Book; import com.lz.utils.PageBean; public class BookDaoTest { private BookDao bk=new BookDao(); @Test public void testList() throws Exception { Book book=new Book(); book.setBname("圣墟"); PageBean pageBean=new PageBean(); //pageBean.setPage(3); pageBean.setPagination(false); List<Book> list = bk.list(book, pageBean); for (Book b : list) { System.out.println(b); } } @Test public void testAdd() throws Exception { Book book=new Book(16,"圣墟嘿嘿嘿",12f); bk.add(book); } @Test public void testDel() throws Exception { Book book=new Book(); book.setBid(16); bk.del(book); } @Test public void testEdit() throws Exception { Book book=new Book(16,"圣墟嘿嘿嘿",12f); bk.edit(book); } }
4.2方法调用
选择方法
当出现绿色时就代表方法没有问题
5.配置xml文件,通过反射来实现一些方法
5.1.配置mvc.xml
name属性为:我们在Bookaction中 return方法的返回值
path为:跳转路径
5.2配置tid文件
tag-class属性为:我们配置的分页代码路径
6.实现web界面
6.1数据显示界面
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@taglib prefix="z" uri="http://jsp.veryedu.cn" %> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <link href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/4.5.0/css/bootstrap.css" rel="stylesheet"> <script src="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/4.5.0/js/bootstrap.js"></script> <title>书籍列表</title> <style type="text/css"> .page-item input { padding: 0; width: 40px; height: 100%; text-align: center; margin: 0 6px; } .page-item input, .page-item b { line-height: 38px; float: left; font-weight: 400; } .page-item.go-input { margin: 0 10px; } </style> </head> <body> <form class="form-inline" action="${pageContext.request.contextPath }/book.action?methodName=list" method="post"> <div class="form-group mb-2"> <input type="text" class="form-control-plaintext" name="bname" placeholder="请输入书籍名称"> <a href="${pageContext.request.contextPath }/book.action?methodName=toEdit&bid=${b.bid }">增加</a> </div> <button type="submit" class="btn btn-primary mb-2">查询</button> </form> <table class="table table-striped "> <thead> <tr> <th scope="col">书籍ID</th> <th scope="col">书籍名</th> <th scope="col">价格</th> </tr> </thead> <tbody> <c:forEach items="${list }" var="b"> <tr> <td>${b.bid }</td> <td>${b.bname }</td> <td>${b.price }</td> <td> <a href="${pageContext.request.contextPath }/book.action?methodName=toEdit&bid=${b.bid }">修改</a> <a href="${pageContext.request.contextPath }/book.action?methodName=tdel&bid=${b.bid }">删除</a> </td> </tr> </c:forEach> </tbody> </table> <z:page pageBean="${pageBean }"></z:page> </body> </html>
6.1.2效果图
6.2增加,修改
6.2.1代码
由于增加,修改共用一个jsp界面,当我们传参数时要对于参数进行一个判断,使用三元运算符,如果b为就是增加操作,不然就是修改操作
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@taglib prefix="z" uri="http://jsp.veryedu.cn"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>书籍编辑界面</title> </head> <body> <form class="form-inline" action="${pageContext.request.contextPath }/book.action?methodName=${empty b ? 'add' : 'edit'}" method="post"> 书籍ID:<input type="text" name="bid" value="${b.bid }"><br> 书籍名称:<input type="text" name="bname" value="${b.bname }"><br> 书籍价格:<input type="text" name="price" value="${b.price }"><br> <input type="submit"> </form> </body> </html>
6.2.2效果图