1. 框架
半成品
打jar包
2. 使用自定义mvc框架完成CRUD操作
jsp
action
test
dao
entity
db
3. 增/删/改用重定向,查询用转发
本次目标,完成t_mvc_book表的增删改查
1、通用分页的jar、自定义mvc框架、自定义标签
导入jar、导入之前写好的pageTag、自定义mvc.xml
2、dao层 通用的增删改方法
3、web层
mvc.xml进行配置
4、jsp
导入jar包
导入之前写好的pageTag
package com.tag; import java.io.IOException; import java.util.Map; import java.util.Map.Entry; import java.util.Set; import javax.servlet.jsp.JspException; import javax.servlet.jsp.JspWriter; import javax.servlet.jsp.tagext.BodyTagSupport; import com.util.PageBean; public class PageTag extends BodyTagSupport { private static final long serialVersionUID = -553969530960334073L; private PageBean pageBean; public PageBean getPageBean() { return pageBean; } public void setPageBean(PageBean pageBean) { this.pageBean = pageBean; } @Override public int doStartTag() throws JspException { JspWriter out = pageContext.getOut(); try { out.print(toHTML()); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } return super.doStartTag();
} private String toHTML() { // TODO Auto-generated method stub StringBuilder sb=new StringBuilder(); //拼接下一次发送请求所要提交得隐藏得form表单 sb.append(" <form id='pageBeanForm' action='"+pageBean.getUrl()+"' method='post'> "); sb.append(" <input type='hidden' name='page'> "); Map<String, String[]> paMap = pageBean.getPaMap(); if(paMap!=null&&paMap.size()>0) { Set<Entry<String, String[]>> entrySet = paMap.entrySet(); for (Entry<String, String[]> entry : entrySet) { //上一次请求可能携带页码namepage得参数,但是改参数在前面以及单独赋值 //为什么要单独赋值?因为上一次请求时第一页得数据,下一次可能时第二页,以后这前后请求page对应得值不一样,需要单独赋值 if(!"page".equals(entry.getKey())) { // <input type='hidden' name='hobby' value='1'> // <input type='hidden' name='hobby' value='2'> //[1,2] for(String val:entry.getValue()) { sb.append(" <input type='hidden' name='"+entry.getKey()+"' value='"+val+"'> "); } } } }
sb.append(" </form>"); //拼接分页条 sb.append(" <div style='text-align: right; font-size: 12px;'> "); sb.append(" 每页"+pageBean.getRows()+"条,共"+pageBean.getTotal()+"条,第"+pageBean.getPage()+"页,共"+pageBean.getMaxPage()+"页 <a "); sb.append(" href='javascript:gotoPage(1)'>首页</a> <a"); sb.append(" href='javascript:gotoPage("+pageBean.getpreviousPage()+")'>上一页</a> <a"); sb.append(" href='javascript:gotoPage("+pageBean.getNextPage()+")'>下一页</a> <a"); sb.append(" href='javascript:gotoPage("+pageBean.getMaxPage()+")'>尾页</a> <input type='text'"); sb.append(" id='skipPage'"); sb.append(" style='text-align: center; font-size: 12px; 50px;'> <a"); sb.append(" href='javascript:skipPage()'>Go</a>"); sb.append(" </div>"); //拼接分页所需要得js代码 sb.append(" <script type='text/javascript'> "); sb.append(" function gotoPage(page) {"); sb.append(" document.getElementById('pageBeanForm').page.value = page;"); sb.append(" document.getElementById('pageBeanForm').submit();"); sb.append(" }"); sb.append(" function skipPage() {"); sb.append(" var page = document.getElementById('skipPage').value;"); sb.append(" if(!page || isNaN(page) || parseInt(page)<1 || parseInt(page)>"+pageBean.getMaxPage()+"){"); sb.append(" alert('请输入1~N的数字');"); sb.append(" return;"); sb.append(" }"); sb.append(" gotoPage(page);"); sb.append(" }"); sb.append(" </script>"); return sb.toString(); } }
MVC.XML
<?xml version="1.0" encoding="UTF-8"?> <!-- config标签:可以包含0~N个action标签 --> <config> <!-- action标签:可以饱含0~N个forward标签 path:以/开头的字符串,并且值必须唯一 非空 type:字符串,非空 --> <action path="/Cal" type="com.web.CalAction"> <forward name="res" path="/res.jsp" redirect="false" /> </action> <action path="/book" type="com.web.BookAction"> <forward name="list" path="/bookList.jsp" redirect="false" /> <forward name="edit" path="/bookEdit.jsp" redirect="false" /> <forward name="tolist" path="/book.action?methodName=list" redirect="false" /> </action> </config>
2、dao层 通用的增删改方法
新建book实体类
package com.entity; 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 + "]"; } }
在BookDao类增删改查方法
package com.dao; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.SQLException; import java.util.List; import com.entity.Book; import com.util.BaseDao; import com.util.DBAccess; import com.util.PageBean; import com.util.StringUtils; public class Bookdao extends BaseDao<Book>{ /** * 查询所有 * @param book * @param pageBean * @return * @throws InstantiationException * @throws IllegalAccessException * @throws SQLException */ public List<Book> list(Book book,PageBean pageBean) throws InstantiationException, IllegalAccessException, SQLException{ String sql="select * from t_mvc_book where true "; String bname=book.getBname(); int bid=book.getBid(); if(StringUtils.isNotBlank(bname)) { sql+=" and bname like '%"+bname+"%'"; } if(bid!=0) { sql+=" and bid=" + bid; } return super.executeQuery(sql, Book.class, pageBean); } /** * 修改方法 * @param book * @return * @throws SQLException * @throws NoSuchFieldException * @throws SecurityException * @throws IllegalArgumentException * @throws IllegalAccessException */ public int edit(Book book) throws SQLException, NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException { String sql="update t_mvc_book set bname=?,price=? where bid=?"; return super.executeupdate(sql,new String[] {"bname","price","bid"}, book); } /** * 新增 * @param book * @return * @throws SQLException * @throws NoSuchFieldException * @throws SecurityException * @throws IllegalArgumentException * @throws IllegalAccessException */ public int add(Book book) throws SQLException, NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException { String sql="insert into t_mvc_book values(?,?,?)"; return super.executeupdate(sql,new String[] {"bid","bname","price"}, book); } /** * 删除 * @param book * @return * @throws SQLException * @throws NoSuchFieldException * @throws SecurityException * @throws IllegalArgumentException * @throws IllegalAccessException */ public int del(Book book) throws SQLException, NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException { String sql="delete from t_mvc_book where bid=?"; return super.executeupdate(sql,new String[] {"bid"}, book); } }
3、web层
BookAction
package com.web; import java.sql.SQLException; import java.util.List; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.dao.Bookdao; import com.entity.Book; import com.framework.ActionSupport; import com.framework.ModelDrivern; import com.util.PageBean; public class BookAction extends ActionSupport implements ModelDrivern<Book>{ private Book book=new Book(); private Bookdao bookDao=new Bookdao(); /** * 分页查询 * @param req * @param resp * @return * @throws InstantiationException * @throws IllegalAccessException * @throws SQLException */ public String list(HttpServletRequest req,HttpServletResponse resp) { PageBean pageBean=new PageBean(); pageBean.setRequest(req); List<Book> list; try { list = this.bookDao.list(book, pageBean); System.out.println(list); req.setAttribute("booklist",list); req.setAttribute("pageBean",pageBean); } catch (InstantiationException | IllegalAccessException | SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } return "list"; } /** * 跳转到增加或者修改页面 * @param req * @param resp * @return * @throws InstantiationException * @throws IllegalAccessException * @throws SQLException */ public String preSave(HttpServletRequest req,HttpServletResponse resp){ //bid的类型是int类型,而int类型的默认值是0,如果jsp为传递bid的参数值,那么bid=0; if(book.getBid()==0) { System.out.println("增加逻辑..."); }else { //修改数据回显逻辑 bid=1 book-->list.add(book)-->${book.bname} Book b; try { b = this.bookDao.list(book, null).get(0); req.setAttribute("book", b); } catch (InstantiationException | IllegalAccessException | SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } //新增页面与修改页面是同一个JSP return "edit"; } /** * 新增 * @param req * @param resp * @return * @throws NoSuchFieldException * @throws SecurityException * @throws IllegalArgumentException * @throws IllegalAccessException * @throws SQLException */ public String add(HttpServletRequest req,HttpServletResponse resp) throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException, SQLException { this.bookDao.add(book); //新增完刷新页面 return "tolist"; } /** * 修改 * @param req * @param resp * @return * @throws NoSuchFieldException * @throws SecurityException * @throws IllegalArgumentException * @throws IllegalAccessException * @throws SQLException */ public String edit(HttpServletRequest req,HttpServletResponse resp) throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException, SQLException { this.bookDao.edit(book); return "tolist"; } /** * 删除 * @param req * @param resp * @return * @throws NoSuchFieldException * @throws SecurityException * @throws IllegalArgumentException * @throws IllegalAccessException * @throws SQLException */ public String del(HttpServletRequest req,HttpServletResponse resp) throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException, SQLException { this.bookDao.del(book); return "tolist"; } @Override public Book getModel() { return book; } }
首页:BookList.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%@taglib prefix="z" uri="/jt" %> <!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"> <title>Insert title here</title> </head> <body> <h2>小说目录</h2> <br> <form action="${pageContext.request.contextPath}/book.action?methodName=list" method="post"> 书名:<input type="text" name="bname"> <input type="submit" value="确定"> </form> <a href="${pageContext.request.contextPath}/book.action?methodName=preSave">增加</a> <table border="1" width="100%"> <tr> <td>编号</td> <td>名称</td> <td>价格</td> <td>操作</td> </tr> <c:forEach items="${booklist }" var="b"> <tr> <td>${b.bid }</td> <td>${b.bname }</td> <td>${b.price }</td> <td> <a href="${pageContext.request.contextPath}/book.action?methodName=preSave&&bid=${b.bid}">修改</a> <a href="${pageContext.request.contextPath}/book.action?methodName=del&&bid=${b.bid}">删除</a> </td> </tr> </c:forEach> </table> <z:page pageBean="${pageBean }"></z:page> </body> </html>
修改页面:bookEdit.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!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"> <title>Insert title here</title> </head> <body> <form action="${pageContext.request.contextPath}/book.action" method="post"> <input type="hidden" name="methodName" value="${book.bname == null?'add':'edit' }"> 书籍ID:<input type="text" name="bid" value="${book.bid }"><br> 书籍名称:<input type="text" name="bname" value="${book.bname }"><br> 书籍价格:<input type="text" name="price" value="${book.price }"><br> <input type="submit"> </form> </body> </html>
到这里就写完了!!!