IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> PHP知识库 -> 自定义MVC应用(通用增删改查) -> 正文阅读

[PHP知识库]自定义MVC应用(通用增删改查)

前言:上一次与大家分享了自定义MVC框架的创造过程,今天紧接要对自己创造的自定义MVC应用。

一、优化web.xml文件:

? ? ? ? ? 1、我们自己创造的自定义MVC框架最终目的归根结底是要导出变成jar包,以后自己使用,方便代码,节约时间。那么将自己创造的自定义MVC框架导出后,其中的.xml文件内容就看不到了,而在这里就要对.xml文件进行优化。

? ? ? ? ? 2、思路:

? ? ? ? ? ? ? ? ? ? ? ? 2.1、在中央控制器中注释与浏览器联系的语句。

? ? ? ? ? ? ? ? ? ? ? ? 2.2、新建一个source folder文件夹(注意此文件与src资源文件夹是并列关系,其中千万要注意不要建成package包,如下图所示,如果不按上述建并列资源文件夹,就会报空指针异常)图中整个web项目报错是因为我把其中一个没用的jar包给删除了,所以报错,但是对整个项目毫无影响,可以运行出结果。

? ? ? ? ? ? ? ? ? ? ? ? ?2.3、新建资源文件夹ZJ.xml中写好之前config.xml文件中内容,

? ? ? ? ? ? ? ? ? ? ? ? ? 2.4、在中央控制器中写好建模的代码:

public void init() throws ServletException {
		// actions.put("/book", new BookAction());
		// actions.put("/goods", new GoodsAction());
		try {
			String configurationLocation = this.getInitParameter("configurationLocation");
			if (StringUtils.isNotBlank(configurationLocation)) {
				configModel = ConfigModelFactory.build(configurationLocation);
			} else {
				configModel = ConfigModelFactory.build();
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		
	}

? ? ? 运行效果(隐藏之前的config.xml文件之后的运行效果):其中book中的属性为null值,是因为没有在视图层加数据?

由上述结果得出:优化.xml文件配置成功。

二:通用的增删改查:

? ? ? ? ?思路:1、首先在basedao中写好增删改的通用方法(查询要进行分页)

public void excuteUpdate(String sql, T t,String[] attrs) throws Exception {
		Connection con = DBAccess.getConnection();
		PreparedStatement ps = con.prepareStatement(sql);
		for (int i = 0; i < attrs.length; i++) {
			Field f = t.getClass().getDeclaredField(attrs[i]);
			f.setAccessible(true);
			ps.setObject(i+1, f.get(t));
		}
		ps.executeUpdate();
	}

? ? ? ? ? ? ? ? ? ? 2、之后在bookdao继承了basedao包,写好增删改查的方法。

public class BookDao extends BaseDao<Book> {

	// 增加方法
	public void add(Book book) throws Exception {
		String sql = "insert into t_mvc_book values(?,?,?)";
		super.excuteUpdate(sql, book, new String[] {"bid", "bname", "price"});
	}
	
//	public void add(Book book) throws Exception {
//		String sql = "insert into t_mvc_book values(3333,'xxx',121)";
//		super.excuteUpdate(sql, book, new String[] { });
//	}

	// 删除方法
	public void delete(Book book) throws Exception {
		String sql = "delete from t_mvc_book where bid=?";
		super.excuteUpdate(sql, book, new String[] { "bid" });
	}

	// 修改方法
	public void edit(Book book) throws Exception {
		String sql = "update t_mvc_book set bname=?,price=? where bid=? ";
		super.excuteUpdate(sql, book, new String[] { "bname", "price", "bid", });
	}

	// 查询方法
	public List<Book> list(Book book, PageBean pagebean) throws Exception {
		String sql = "select * from t_mvc_book where 1=1";
		String bname = book.getBname();
		if (StringUtils.isNotBlank(bname)) {
			sql += "and bname like '%" + bname + "%'";
		}
		return super.excuteQuery(sql, Book.class, pagebean);
	}

? ? ? ? ? ? ?3、然后在bookaction中写好对应的方法:

public class BookAction extends ActionSupport implements ModelDriver<Book>{
	Book book=new Book();
	BookDao bd=new BookDao();
	
	@Override
	public Book getModel() {
		// TODO Auto-generated method stub
		return book;
	}
	
	
	
	
	/**
	 * 增删改查最终都要跳回查询界面
	 * 查询:bookList.jsp  返回值:list
	 * 增删改确定:book.action?methodName=list  返回值:toList
	 * 增加修改跳转对应的界面:bookEdit.jsp  返回值是toEdit
	 * @throws Exception 
	 */
	public String add(HttpServletRequest req,HttpServletResponse resp)  {
		try {
			bd.add(book);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return "toList";
	}
	
	public String delete(HttpServletRequest req,HttpServletResponse resp)  {
		try {
			bd.delete(book);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return "toList";
	}
	
	
	public String edit(HttpServletRequest req,HttpServletResponse resp)  {
		try {
			bd.edit(book);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return "toList";
	}
	
	
	public String list(HttpServletRequest req,HttpServletResponse resp)  {
		try {
			PageBean pageBean=new PageBean();
			pageBean.setRequest(req);
			List<Book> list=bd.list(book, pageBean);
			req.setAttribute("books", list);
			req.setAttribute("pageBean", pageBean);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return "list";
	}
	
	public String toEdit(HttpServletRequest req,HttpServletResponse resp)  {
		try {
			if(book.getBid()!=0) {
				List<Book> list=bd.list(book, null);
				req.setAttribute("b", list.get(0));
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return "toEdit";
	}
	

? ? ? ? ? ? ? ? 4、 测试代码:

public static void main(String[] args) throws Exception {
		Book b = new Book();
		b.setBid(5555);
		b.setBname("test");
		b.setPrice(111f);
		BookDao bd = new BookDao();
		bd.add(b);
	}

? ? ? ? ? ? ? ? 5、测试结果:(有数据说明增删改查方法正确)

? ? ? ? ? ? ? ? ? ? ? ? ? ? ?增加:?

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 修改:?

	public static void main(String[] args) throws Exception {
		Book b = new Book();
		b.setBid(5555);
		b.setBname("test222");
		b.setPrice(111f);
		BookDao bd = new BookDao();
		bd.edit(b);
	}

? ? ? ? ? ? ? ? ? ? ? ? ? ?运行结果:

?三:自定义MVC框架具体体现:

? ? ? ? ? 1、使用自定义MVC的步骤:

? ? ? ? ? ? ? ? ?1.1、导入自己导出的自定义MVC.jar包

? ? ? ? ? ? ? ? ?1.2、做好框架的相应配置(导入之前MVC.jar包依赖的jar包)

? ? ? ? ? ? ? ? ?1.3?、一切照旧?(jsp界面,bookaction、dao层、entity)

? ? ? ? ? 2、通用增删改查的区别与相同:
? ? ? ? ? ? ? ? ?2.1共同点:增删改查最终都要跳回查询界面
?? ?? ? ? ? ? ? ?2.2不同点:2.2.1:查询:bookList.jsp ?返回值:list
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 2.2.2:增删改确定:book.action?methodName=list ?返回值:toList
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 2.2.3增加修改跳转对应的界面:bookEdit.jsp ?返回值是toEdit

? ? ? ? ? 3、展示效果:

? ? ? ? ? ? ? ?整体项目包展览:?

? ? ? ? ? 3.1界面展示: jsp界面:

? ? ? ? ? ? ? ? ? ?1、bookList界面:

<%@ 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 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="${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>

? ? ? ? ? ? ? ? ? ?效果展示:?

? ? ? ? ? ? ? ? ? bookEdit界面(增加和修改界面):

<%@ 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>

? ? ? ? ? ? ? ? ? ?效果展示:

? ? ? ? 3.2方法展示效果:

? ? ? ? ? ? ?? ? ?3.2.1:增加:

? ? ? ? ? ? ? ? ? ??效果展示:

? ? ? ? ? ? ? ? ??3.2.2:删除:(删除了书籍id为28的书)

? ? ? ? ? ? ? ? ? ? ?效果展示:?

? ? ? ? ? ? ? ? ? ? ?3.3.3修改:

? ? ? ? ? ? ? ? ? ? ? ? ? ? ?没修改之前的效果:?

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?修改时的操作:

?

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 修改之后的效果:

? ? ? ? ? ? ? ? ? ? ? 3.3.4:查询和分页:

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?之前效果:

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?之后效果:在分页栏中,写好要查询的数字,之后按下确定就直接跳转到输入框中的数字的页数。

四:在实践中遇到的两个问题:

? ? ? ? ?1、第一个是运行项目时没有出现界面,问题出于在编码过滤器中:当时是写了第二行代码(应该只要在编码过滤器写第一行代码),报错,显示不了界面。

@WebFilter("*.action")
@WebServlet("*.action")

? ? ? ? 2、跳转时出现问题:当时引用了之前项目的.xml文件,后来在新项目中,新建了一个包,直接显示找不到此类的问题:

五:思维导图:

总结: 自定义MVC框架应用中最为关键的是要把自定义MVC框架打造好,其中在应用是也要注意细节,比如:改造.xml文件时要跳转的目的类。

  PHP知识库 最新文章
Laravel 下实现 Google 2fa 验证
UUCTF WP
DASCTF10月 web
XAMPP任意命令执行提升权限漏洞(CVE-2020-
[GYCTF2020]Easyphp
iwebsec靶场 代码执行关卡通关笔记
多个线程同步执行,多个线程依次执行,多个
php 没事记录下常用方法 (TP5.1)
php之jwt
2021-09-18
上一篇文章      下一篇文章      查看所有文章
加:2021-09-03 11:40:27  更:2021-09-03 11:41:50 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 10:25:10-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码