J2EE自定义mvc【框架配置及功能】

本文涉及的产品
性能测试 PTS,5000VUM额度
注册配置 MSE Nacos/ZooKeeper,118元/月
可观测可视化 Grafana 版,10个用户账号 1个月
简介: 1、在增删改的方法里面我们这两行代码是一样的、重复的。类里面增加了一个通用的增删改的方法,我们在。我们新建一个web包,在里面新建一个。进行一个搜索,新增、修改、删除。进行一个通用的增删改的方法。BookDaoTest测试。测试我们的数据库能否连接。增加,修改的jsp界面。我们删除ID:16、22。导入之后我们选中所有的。2、代码逻辑是重复的。书籍名:圣墟1234。


一、配置步骤

    1. 将框架打成jar包,然后导入新工程,并且把框架的依赖jar包导入进去
    2. 将分页标签相关文件、及相关助手类导入
    3. 框架的配置文件添加、以及web.xml的配置-以后开源框架的使用从这一步开始
    4. 完成Book实体类及bookDao的编写
    5. 完成通用的增删改方法
    6. 完成BookAction
    7. 完成mvc.xml的配置
    8. 完成前台代码的编写

    二、配置框架前三步

    导入相应的jar

    image.gif编辑

    导入之后我们选中所有的jar包===》右键===》Build Path===》Add to Build Path

    image.gif编辑

    导入相应的Class

    image.gif编辑

    导入xml文件

    <?xml version="1.0" encoding="UTF-8"?>
    <config>
      <action path="/book" type="com.tgq.web.BookAction">
        <forward name="list" path="/bookList.jsp" redirect="false" />
        <forward name="toList" path="/book.action?methodName=list"
          redirect="true" />
        <forward name="toEdit" path="/bookEdit.jsp" redirect="false" />
      </action>
    </config>

    image.gif

    测试我们的数据库能否连接

    image.gif编辑

    三、优化基本操作(增删改)

    1、基础优化

    编写实体类

    package com.tgq.entity;
    /**
     * 实体类
     * 
     * @author tgq
     *
     */
    public class Book {
      private int bid;
      private String bname;
      private float price;
      public int getBid() {
        return bid;
      }
      public void setBid(int bid) {
        this.bid = bid;
      }
      public String getBname() {
        return bname;
      }
      public void setBname(String bname) {
        this.bname = bname;
      }
      public float getPrice() {
        return price;
      }
      public void setPrice(float price) {
        this.price = price;
      }
      @Override
      public String toString() {
        return "Book [bid=" + bid + ", bname=" + bname + ", price=" + price + "]";
      }
      public Book(int bid, String bname, float price) {
        super();
        this.bid = bid;
        this.bname = bname;
        this.price = price;
      }
      public Book() {
        // TODO Auto-generated constructor stub
      }
    }

    image.gif

    编写BookDao类

    编写增删改查的方法

    package com.tgq.dao;
    import java.sql.Connection;
    import java.sql.PreparedStatement;
    import java.util.List;
    import com.tgq.entity.Book;
    import com.tgq.util.BaseDao;
    import com.tgq.util.DBAccess;
    import com.tgq.util.PageBean;
    import com.tgq.util.StringUtils;
    public class BookDao extends 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 + "%'";
        }
        // 判断前台是否传bid
        if (bid != 0) {
          sql += " and bid=" + bid;
        }
        return super.executeQuery(sql, Book.class, pageBean);
      }
      /**
       * 增加Book的方法
       * 
       * @param book
       *            实体类
       * @return
       * @throws Exception
       *             万能异常
       */
      public int addBook(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();
      }
      /**
       * 删除Book的方法 ,根据id删除
       * 
       * @param book
       *            实体类
       * @return
       * @throws Exception
       *             万能异常
       */
      public int delBook(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();
      }
      /**
       * 修改Book的方法
       * 
       * @param book
       *            实体类
       * @return
       * @throws Exception
       *             万能异常
       */
      public int updateBook(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();
      }
    }

    image.gif

    1、在增删改的方法里面我们这两行代码是一样的、重复的

    Connection conn = DBAccess.getConnection();
        PreparedStatement ps = conn.prepareStatement(sql);
    image.gif

    2、代码逻辑是重复的===》sql占位符赋值

    ps.setObject(1, book.getBid());
        ps.setObject(2, book.getBname());
        ps.setObject(3, book.getPrice());
    image.gif

    怎么解决?BaseDao

    进行一个通用的增删改的方法

    /**
       * 通用的增删改方法
       * 
       * @param sql
       *            数据库sql语句
       * @param t
       *            对应表的实体类
       * @param attrs
       *            要修改的属性值
       * @return
       * @throws Exception
       *             万能异常
       */
      public int executeUpdate(String sql, T t, String[] attrs) throws Exception {
        Connection conn = DBAccess.getConnection();
        PreparedStatement ps = conn.prepareStatement(sql);
        //利用fori 下标来进行?的赋值
        for (int i = 0; i < attrs.length; i++) {
          Field field = t.getClass().getDeclaredField(attrs[i]);
          // 打开权限
          field.setAccessible(true);
          ps.setObject(i + 1, field.get(t));
        }
        return ps.executeUpdate();
      }
    image.gif

     

    优化BookDao

    我们在BaseDao类里面增加了一个通用的增删改的方法,我们在BookDao里面利用起来

    /**
       * 增加Book的方法
       * 
       * @param book
       *            实体类
       * @return
       * @throws Exception
       *             万能异常
       */
      public int addBook(Book book) throws Exception {
        String sql = "insert into t_mvc_book values(?,?,?)";
        return super.executeUpdate(sql, book, new String[] { "bid", "bname", "price" });
      }
      /**
       * 删除Book的方法 ,根据id删除
       * 
       * @param book
       *            实体类
       * @return
       * @throws Exception
       *             万能异常
       */
      public int delBook(Book book) throws Exception {
        String sql = "delete from t_mvc_book where bid=?";
        return super.executeUpdate(sql, book, new String[] { "bid" });
      }
      /**
       * 修改Book的方法
       * 
       * @param book
       *            实体类
       * @return
       * @throws Exception
       *             万能异常
       */
      public int updateBook(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" });
      }

    image.gif

    JUnit测试

    选中我们的类名===》ctrl+N===》JUnit Test Case===》选中顶部的New JUnit 4 test===》Next

    image.gif编辑

    勾选BookDao===》Finish

    image.gif编辑

    BookDaoTest测试

    package com.tgq.dao;
    import static org.junit.Assert.*;
    import java.util.List;
    import org.junit.Test;
    import com.tgq.entity.Book;
    import com.tgq.util.PageBean;
    public class BookDaoTest {
      private BookDao bookDao = new BookDao();
      @Test
      public void testList() throws Exception {
        Book book = new Book();
        book.setBname("52");
        PageBean pageBean = new PageBean();
        // pageBean.setPage(2);
        List<Book> list = bookDao.list(book, pageBean);
        for (Book b : list) {
          System.out.println(b);
        }
      }
      @Test
      public void testAddBook() throws Exception {
        Book book = new Book();
        book.setBid(52);
        book.setBname("5252");
        book.setPrice(12f);
        bookDao.addBook(book);
      }
      @Test
      public void testDelBook() throws Exception {
        Book book = new Book();
        book.setBid(52);
        bookDao.delBook(book);
      }
      @Test
      public void testUpdateBook() throws Exception {
        Book book = new Book();
        book.setBid(52);
        book.setBname("5252");
        book.setPrice(19f);
        bookDao.updateBook(book);
      }
    }

    image.gif

    测试结果:

    image.gif编辑

    2、后台优化

    我们新建一个web包,在里面新建一个BookAction类(class),继承ActionSupport,实现

    ModelDriver接口,编写

    image.gif编辑

    package com.tgq.web;
    import java.util.List;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import com.tgq.dao.BookDao;
    import com.tgq.entity.Book;
    import com.tgq.util.PageBean;
    import com.zking.framework.ActionSupport;
    import com.zking.framework.ModelDriver;
    public class BookAction extends ActionSupport implements ModelDriver<Book> {
      private Book book = new Book();
      private BookDao bookDao = new BookDao();
      // 查询 bookList.jsp
      public String list(HttpServletRequest req, HttpServletResponse resp) throws Exception {
        PageBean pageBean = new PageBean();
        pageBean.setRequest(req);
        List<Book> list = bookDao.list(book, pageBean);
        req.setAttribute("list", list);
        req.setAttribute("pageBean", pageBean);
        return "list";
      }
      // 编辑界面跳转 bookEdit.jsp
      public String toEdit(HttpServletRequest req, HttpServletResponse resp) throws Exception {
        // 前提
        if (book.getBid() != 0) {
          List<Book> list = bookDao.list(book, null);// 不需要分页
          req.setAttribute("b", list.get(0));
        }
        return "toEdit";
      }
      // 增加 重定向到book.action?methodName=list
      public String add(HttpServletRequest req, HttpServletResponse resp) throws Exception {
        bookDao.addBook(book);
        return "toEdit";
      }
      // 删除
      public String del(HttpServletRequest req, HttpServletResponse resp) throws Exception {
        bookDao.delBook(book);
        return "toEdit";
      }
      // 修改
      public String update(HttpServletRequest req, HttpServletResponse resp) throws Exception {
        bookDao.updateBook(book);
        return "toEdit";
      }
      @Override
      public Book getModel() {
        return book;
      }
    }

    image.gif

    我们编写jsp界面

    <%@ page language="java" contentType="text/html; charset=UTF-8"
      pageEncoding="UTF-8"%>
    <%@ taglib uri="http://jsp.veryedu.cn" prefix="z"%>
    <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
    <!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="请输入书籍名称">
          <!--      <input name="rows" value="20" type="hidden"> -->
          <!-- 不想分页 -->
          <input name="pagination" value="false" type="hidden">
        </div>
        <button type="submit" class="btn btn-primary mb-2">查询</button>
        <a class="btn btn-primary mb-2"
          href="${pageContext.request.contextPath }/book.action?methodName=toEdit">新增</a>
      </form>
      <table class="table table-striped">
        <thead>
          <tr>
            <th scope="col">书籍ID</th>
            <th scope="col">书籍名</th>
            <th scope="col">价格</th>
            <th scope="col">操作</th>
          </tr>
        </thead>
        <tbody>
          <c:forEach var="b" items="${books }">
            <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=delete&bid=${b.bid}">删除</a>
              </td>
            </tr>
          </c:forEach>
        </tbody>
      </table>
      <!-- 这一行代码就相当于前面分页需求前端的几十行了 -->
      <z:page pageBean="${pageBean }"></z:page>
    </body>
    </html>

    image.gif

    增加,修改的jsp界面。

    判断你点击的是否是增加还是修改

    action="${pageContext.request.contextPath }/book.action?methodName=${empty b ? 'add' : 'edit'}"
    image.gif
    <%@ page language="java" contentType="text/html; charset=UTF-8"
      pageEncoding="UTF-8"%>
    <%@ taglib uri="http://jsp.veryedu.cn" prefix="z"%> 
    <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> 
    <!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>
    </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>

    image.gif

    3、前端优化

    我们运行书籍列表

    进行一个搜索,新增、修改、删除

    image.gif编辑

    我们删除ID:16、22

    image.gif编辑

    新增一个

    ID:12

    书籍名:圣墟12

    价格:123

    image.gif编辑

    修改ID:12

    书籍名:圣墟1234

    价格:12345

    image.gif编辑

    希望对你们有用!!!

    相关实践学习
    Serverless极速搭建Hexo博客
    本场景介绍如何使用阿里云函数计算服务命令行工具快速搭建一个Hexo博客。
    相关文章
    |
    2月前
    |
    前端开发 Java Spring
    关于spring mvc 的 addPathPatterns 拦截配置常见问题
    关于spring mvc 的 addPathPatterns 拦截配置常见问题
    200 1
    |
    27天前
    |
    前端开发 Java 数据库
    springBoot:template engine&自定义一个mvc&后端给前端传数据&增删改查 (三)
    本文介绍了如何自定义一个 MVC 框架,包括后端向前端传递数据、前后端代理配置、实现增删改查功能以及分页查询。详细展示了代码示例,从配置文件到控制器、服务层和数据访问层的实现,帮助开发者快速理解和应用。
    |
    1月前
    |
    前端开发 Java
    【案例+源码】详解MVC框架模式及其应用
    【案例+源码】详解MVC框架模式及其应用
    33 0
    |
    3月前
    |
    设计模式 存储 前端开发
    MVC 框架的主要问题是什么?
    【8月更文挑战第30天】
    59 0
    |
    5月前
    |
    前端开发 Java 关系型数据库
    在Spring3 MVC中五步配置集成注解方式Hibernate3
    在Spring3 MVC中五步配置集成注解方式Hibernate3
    40 3
    |
    5月前
    |
    安全 前端开发 测试技术
    安全开发-PHP应用&模版引用&Smarty渲染&MVC模型&数据联动&RCE安全&TP框架&路由访问&对象操作&内置过滤绕过&核心漏洞
    安全开发-PHP应用&模版引用&Smarty渲染&MVC模型&数据联动&RCE安全&TP框架&路由访问&对象操作&内置过滤绕过&核心漏洞
    |
    6月前
    |
    前端开发 Java Spring
    Java Web ——MVC基础框架讲解及代码演示(下)
    Java Web ——MVC基础框架讲解及代码演示
    57 1
    |
    6月前
    |
    设计模式 前端开发 网络协议
    Java Web ——MVC基础框架讲解及代码演示(上)
    Java Web ——MVC基础框架讲解及代码演示
    48 0
    |
    3月前
    |
    开发框架 前端开发 .NET
    ASP.NET MVC WebApi 接口返回 JOSN 日期格式化 date format
    ASP.NET MVC WebApi 接口返回 JOSN 日期格式化 date format
    46 0
    |
    6月前
    |
    开发框架 前端开发 .NET
    ASP.NET CORE 3.1 MVC“指定的网络名不再可用\企图在不存在的网络连接上进行操作”的问题解决过程
    ASP.NET CORE 3.1 MVC“指定的网络名不再可用\企图在不存在的网络连接上进行操作”的问题解决过程
    187 0