前言:上一次与大家分享了自定义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文件时要跳转的目的类。
|