自定义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文件时要跳转的目的类。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值