J2EE之自定义框架知识(下篇 综合运用增删改查)

2023-11-03

J2EE之自定义框架知识(下篇 综合运用增删改查)

前言

在前面两期博客中我们了解了关于自定义MVC框架对之前代码的一些优化原理,今天我给大家带来的是自定义MVC框架的综合运用(增删改查),

下面由我来给大家分享(跟着我们的思维导图一起了解一下)

在这里插入图片描述

所需文件

链接:https://pan.baidu.com/s/1vHTem1HD1CEdjGTmJuPAFQ
提取码:yx04

该链接将本次分享所需的文件包含在内了,有需要课前往下载

1.将框架打成jar包,然后导入新工程,并且把框架的依赖jar包导入进去

1.1将框架打成jar包

如图所示

在这里插入图片描述

在这里插入图片描述

1.2 导入所需的jar包

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

2.将分页标签相关文件、及相关助手类导入

2.1导入数据工具类文件

(由于代码过多,如图所示)

在这里插入图片描述

2.2 导入分页工具类

在这里插入图片描述

3. 项目环境搭建

3.1 框架的配置文件添加

右击scr新建一个Source Folder文件夹,在此文件夹中新建一个.xml文件

(如图所示)

在这里插入图片描述

mvc.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<config>
	
	<!-- 
		在这里每加一个配置,就相当于actions.put("/goods", new GoodsAction());
		这样就解决了代码灵活性的问题
	 -->
	<action path="/book" type="com.YX.Web.BookAction">
<!-- 	 查询:BookList.jsp		返回值:list -->
<!-- 	 * 增删改确定:book.action?methodName=list		返回值:toList -->
<!-- 	 * 增加修改跳转对应界面:bookEdit.jsp			返回值:toEdit -->
		<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>

3.2 web.xml的配置

web.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
  <display-name>YX_MVC_project</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
  
  <servlet>
  	<servlet-name>mvc</servlet-name>
  	<servlet-class>com.zking.framework.DispatchServlet</servlet-class>
  	<init-param>
  		<param-name>configurationLocation</param-name>
  		<param-value>/mvc.xml</param-value>
  	</init-param>
  </servlet>
  <servlet-mapping>
  	<servlet-name>mvc</servlet-name>
  	<url-pattern>*.action</url-pattern>
  </servlet-mapping>
</web-app>

4. 实体类和Dao方法类的编写

实体类Book类
package com.YX.entity;


/**实体类:书籍类
 * @author 君易--鑨
 * 2023年7月3日下午10:00:37
 * 
 */
public class Book {
//定义属性
	private int bid;
	private String bname;
	private float price;
	
//	获取属性对应的get和set方法
	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;
	}
	
	/**
	 * 无参构造
	 */
	public Book() {
		// TODO Auto-generated constructor stub
	}
	
	/**
	 * 有参构造
	 * @param bid
	 * @param bname
	 * @param price
	 */
	public Book(int bid, String bname, float price) {
		super();
		this.bid = bid;
		this.bname = bname;
		this.price = price;
	}
	@Override
	public String toString() {
		return "Book [bid=" + bid + ", bname=" + bname + ", price=" + price + "]";
	}
}

Dao方法类BookDao类
package com.YX.Dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.List;

import com.YX.entity.Book;
import com.YX.until.BaseDao;
import com.YX.until.DBAccess;
import com.YX.until.PageBean;
import com.YX.until.StringUtils;

/**
 * 数据库方法类
 * 
 * @author 君易--鑨 2023年7月3日下午10:04:40
 * 
 */
public class BookDao extends BaseDao<Book> {

	/**
	 * 查询的方法
	 * 
	 * @param book
	 *            带有查询内容的实体对象
	 * @param pageBean
	 *            分页工具类
	 * @return
	 * @throws Exception
	 */
	public List<Book> list(Book book, PageBean pageBean) throws Exception {
		String sql = "select * from t_mvc_book where 1=1 ";
		// 获取查询的书名
		String bname = book.getBname();
		// 获取书籍id
		int bid = book.getBid();
		if (StringUtils.isNotBlank(bname)) {// 判断查询的书名不为空
			sql += " and bname like '%" + bname + "%'";
		}
		if (bid != 0) {// 判断id不等于0,说明传了id过来
			sql += " and bid = " + bid;
		}
		return super.executeQuery(sql, Book.class, pageBean);
	}

	/**
	 * 新增的方法
	 * 
	 * @param book
	 *            新增的实体对象
	 * @return
	 * @throws Exception
	 */
	public int add(Book book) throws Exception {
		// 编写sql语句
		String sql = "insert into t_mvc_book values (?,?,?)";
		return super.executeUpdate(sql, book, new String[] { "bid", "bname", "price" });
	}

	/**
	 * 删除的方法
	 * 
	 * @param book
	 *            指定信息
	 * @return
	 * @throws Exception
	 */
	public int del(Book book) throws Exception {
		// 编写sql语句
		String sql = "delete from t_mvc_book where bid = ?";
		return super.executeUpdate(sql, book, new String[] { "bid" });
	}

	public int edit(Book book) throws Exception {
		// 编写sql语句
		String sql = "update t_mvc_book set bname = ?,price = ? where bid = ?";
		return super.executeUpdate(sql, book, new String[] { "bname", "price", "bid" });
	}

}
Dao方法的Junit测试类(BookDaoTest)
package com.YX.Dao;

import static org.junit.Assert.*;

import java.util.List;

import org.junit.Test;

import com.YX.entity.Book;
import com.YX.until.PageBean;


/**junit测试类用于测试方法
 * @author 君易--鑨
 * 2023年7月3日下午10:35:14
 * 
 */
public class BookDaoTest {

//	实例化Dao方法
	private BookDao bookdao=new BookDao();
	@Test
	public void testList() {
//		实例化实体对象
		Book book =new Book();
		book.setBname("君易");//设置查询的内容
		PageBean pageBean=new PageBean();
//		pageBean.setPage();//设置查询第几页
		pageBean.setPagination(false);//设置分页
		try {
			List<Book> list = bookdao.list(book, pageBean);
			for (Book b : list) {
				System.out.println(b);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
}

	@Test
	public void testAdd() {
//		实例化实体对象
		Book book =new Book();
//		设置要新增的书籍
		book.setBid(52);
		book.setBname("君易--鑨");
		book.setPrice(52);
//		调用方法
		try {
			bookdao.add(book);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	@Test
	public void testDel() {
//		实例化实体对象
		Book book =new Book();
//		设置要删除的书籍
		book.setBid(52);
//		调用方法
		try {
			bookdao.del(book);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	@Test
	public void testEdit() {
//		实例化实体对象
		Book book =new Book(50,"君易--鑨",520);
//		调用方法
		try {
			bookdao.edit(book);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

}

查看测试结果(带模糊查询和分页)

在这里插入图片描述

删除后查询测试结果

在这里插入图片描述

修改后查询结果

在这里插入图片描述

新增后查询结果

在这里插入图片描述

5. 完成BookAction类的代码

在这里插入图片描述

package com.YX.Web;

import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.YX.Dao.BookDao;
import com.YX.entity.Book;
import com.YX.until.PageBean;
import com.zking.framework.ActionSupport;
import com.zking.framework.ModelDriver;

/**
 * 
 * @author 君易--鑨 2023年7月3日下午11:38:40
 *
 */
public class BookAction extends ActionSupport implements ModelDriver<Book> {
	private Book book = new Book();// 实例化实体对象
	private BookDao bookdao = new BookDao();// 实例化dao方法

	// 查询 bookList.jsp
	public String list(HttpServletRequest req, HttpServletResponse resp) {
		PageBean pageBean = new PageBean();// 实例化分页工具类
		pageBean.setRequest(req);// 初始化分页工具
		try {
			List<Book> lst = bookdao.list(book, pageBean);// 调用方法
			// 存储起来回显到界面上
			req.setAttribute("lst", lst);
			req.setAttribute("pageBean", pageBean);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return "list";
	}

	// 编辑页面跳转 bookEdit.jsp
	public String toEdit(HttpServletRequest req, HttpServletResponse resp) {
		try {
			if (book.getBid() != 0) {
				List<Book> lst = bookdao.list(book, null);// 调用方法
				// 存储起来回显到界面上
				req.setAttribute("b", lst.get(0));
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return "toEdit";
	}

	// 增加
	public String add(HttpServletRequest req, HttpServletResponse resp) {
		try {
			bookdao.add(book);// 调用方法
		} catch (Exception e) {
			e.printStackTrace();
		}
		return "toList";
	}

	// 删除
	public String del(HttpServletRequest req, HttpServletResponse resp) {
		try {
			bookdao.del(book);// 调用方法
		} catch (Exception e) {
			e.printStackTrace();
		}
		return "toList";
	}

	// 修改
	public String edit(HttpServletRequest req, HttpServletResponse resp) {
		try {
			bookdao.edit(book);// 调用方法
		} catch (Exception e) {
			e.printStackTrace();
		}
		return "toList";
	}

	@Override
	public Book getModel() {
		// TODO Auto-generated method stub
		return book;
	}

}

6. 前端代码

bookList.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<%@ taglib uri="/YX" prefix="yx"%>	
<%@ 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 bg-success">
		<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="${lst }">
			<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>
	<!-- 这一行代码就相当于前面分页需求前端的几十行了 -->
<yx:page pageBean="${pageBean }"></yx:page>
</body>
</html>
bookEdit.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<%@ taglib uri="/YX" prefix="yx"%>	
<%@ 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 bg-success">
		<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="${lst }">
			<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>
	<!-- 这一行代码就相当于前面分页需求前端的几十行了 -->
<yx:page pageBean="${pageBean }"></yx:page>
</body>
</html>
页面展示

在这里插入图片描述

结束语

这期博客给大家分享到这,希望大家能点击关注,后续会继续分享知识。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

J2EE之自定义框架知识(下篇 综合运用增删改查) 的相关文章

随机推荐

  • 高并发高可用之ElasticSearch

    目录 ES对比MySql数据库 Docker下安装ES和kibana 增删改查操作 高级检索Query DSL 映射 安装中文IK分词器 SpringBoot整合ES 实战应用 ES集群 ES里面的数据怎么保持与mysql实时同步 都存内存
  • 报错: ‘XXXX‘ is declared but its value is never read.Vetur(6133)

    引入的路径本没有问题 结果确报错 解决方法如下 1 在VScode工具的设置中找到设置 2 在搜索栏输入 vetur 并找到Vertur gt Validation Script 在比较靠下多滑动页面哦 3 最后关闭项目重新打开即可 报错消
  • 二叉树前序,中序以及后序的非递归算法实现(外加层序)

    二叉树前序 中序以及后序的非递归算法实现 外加层序 最近在学数据结构里面的二叉树 就把三个遍历的非递归算法以及层序遍历写了一下hhh 感觉就是用栈模拟了一下递归算法 其实三种遍历的方法大体相似 主要就是在访问节点值的时候对代码进行了部分改动
  • 代码质量度量标准_Google研发度量改进实践

    Google改进过程 本文案例源自 Measuring Engineering Productivity 作者 Ciera Jaspen Google 前言 随着敏捷开发 DevOps等方法论在软件行业持续运用 各种用来提升组织研发效率和产
  • Jmeter性能测试3——JMETER-脚本优化

    断言 作用 用于检查检测在测试中得到的响应结果是否符合预期 用以保证性能测试过程中数据交互与预期一致 主要是用来调试 真正执行压力测试时候 断言禁用 目的 在request 请求 返回层面加一层判断机制 实现的过程 在请求下添加断言 请求不
  • 如何解决python安装模块是出现的 error: Unable to find vcvarsall.bat

    看了一圈网上的 觉得知乎里面的答案是最好的 我觉得大部分问题在于python版本和vs版本不配对的问题 例如 python2 7会默认配对msvs2008 python3 4 和3 5是默认配对msvs2010 所以我电脑上python3
  • 【软件测试常见Bug清单】

    软件测试中 bug的类型有很多种 比如 代码错误 界面优化 设计缺陷 需求补充和用户体验等 一般情况下 需求补充和设计缺陷比较好区分 但是代码错误 界面优化和用户体验区分不是很明显 下面我们就来说说这三者 顺带整理一些常见的这些类型的bug
  • 【操作系统】王道考研 p22-26 生产者消费者问题、多生产者多消费者问题、吸烟者问题、读者写者问题、哲学家进餐问题

    生产者消费者问题 多生产者多消费者问题 吸烟者问题 读者写者问题 哲学家进餐问题 生产者消费者问题 有同步和互斥 同步 缓冲区没满才能放产品 缓冲区不空才能取产品 互斥 各进程互斥访问 关于PV P是消耗 V是释放 或理解为P是进 V是出
  • PCB相关知识总结-(1)PCB工艺

    开关电源PCB相关知识总结 PCB工艺 1 前言 2 基础概念 2 1 基本介绍 2 1 1 PCB的基板 2 1 2 相关术语 2 2 分类 2 3 正片和负片 2 4 过孔工艺 2 5 PCB阻焊颜色 2 6 PCB验收标准 1 前言
  • 纳秒是10^(-9),代码写法是1.0e-9不是10.0e-9

    纳秒是10 9 代码写法是1 0e 9不是10 0e 9 参考System nanoTime 简书
  • API 自动化测试难点总结与分享

    API自动化测试的难点包括 接口的参数组合较多 需要覆盖各种可能的情况 接口的状态和数据关联较多 需要验证返回结果是否符合预期 接口的并发访问和性能测试较为复杂 需要合理规划和调度测试策略 接口的安全性和权限控制较为重要 需要针对不同的用户
  • qt中的frame设置边框和颜色,里面控件不变

    需要指定样式对象 比如我的QFrame的名称是frame 2output 那么在设置样式的时候 其代码就如下 frame 2output border radius 10px border 1px solid rgb 100 100 189
  • Mvc项目实例 MvcMusicStore

    原文链接 http www cnblogs com wenming205 archive 2010 08 08 1795341 html 文章不错 看完之后搭建项目就没什么问题了 其他很多就是经验问题了 做过webform的 其实也就需要知
  • Unity关键概念

    Unity是一款跨平台的游戏引擎和开发工具 用于创建2D和3D游戏 交互式内容和应用程序 它提供了一个强大的开发环境 使开发者能够轻松地设计 开发和部署高质量的游戏和应用程序 以下是Unity的几个关键概念 游戏对象 Game Object
  • ubuntu盒盖不睡眠

    修改配置文件里对应的参数即可 需要root权限 需要重启 1 打开文件 etc systemd logind conf 能看到三个控制盒盖后动作的选项 HandleLidSwitch suspend HandleLidSwitchExter
  • 公司现有一个工作组workgroup,需要添加samba服务器作为文件服务器,并发布共享目录

    需求 公司现有一个工作组workgroup 需要添加samba服务器作为文件服务器 并发布共享目录 share 共享名为public 此共享目录允许所有员工访问 samba服务器配置流程 强调 先关闭selinux和防火墙 1 安装samb
  • 【stm32疑难杂症】:Error: L6218E: Undefined symbol TIM_Cmd (referred from timer.o).

    项目场景 在使用工程是发现问题 OBJ OLED axf Error L6218E Undefined symbol TIM Cmd referred from timer o OBJ OLED axf Error L6218E Undef
  • Windows一键清空回收站

    作为一个重度整洁患者 虽然生活较为邋遢 但是 桌面一定是整理的干干净净 桌面上的快捷方式没有几个 甚至打开计算机用的也是快捷键 那么就碰到了一个问题 回收站 它既不美观 又放在桌面上 甚至连快捷键都没有 那我删除的文件那该怎么清理 大家可能
  • KCF目标跟踪方法分析与总结

    KCF目标跟踪方法分析与总结 两个竖杠是什么数学符号 就是这个 这个符号叫做范数 它事实上是由线性赋范空间到非负实数的映射 在线性赋范空间中 它可以表示空间中的点与原点间的距离 两点间的距离也是用两点之差的范数来表示的 范数所满足的条件有
  • J2EE之自定义框架知识(下篇 综合运用增删改查)

    J2EE之自定义框架知识 下篇 综合运用增删改查 文章目录 J2EE之自定义框架知识 下篇 综合运用增删改查 前言 所需文件 1 将框架打成jar包 然后导入新工程 并且把框架的依赖jar包导入进去 1 1将框架打成jar包 1 2 导入所