第一次访问:Filter会自定义response输出缓存html资源
第二次访问:就直接访问静态页面html
创建表t_book
CREATE TABLE t_book( bid CHAR(30) PRIMARY KEY, bname VARCHAR(100), price NUMERIC(10,2), category INT ); INSERT INTO t_book(bid,bname,price,category) VALUES('b1','JAVASE_1',10,1); INSERT INTO t_book(bid,bname,price,category) VALUES('b2','JAVASE_2',15,1); INSERT INTO t_book(bid,bname,price,category) VALUES('b3','JAVASE_3',20,1); INSERT INTO t_book(bid,bname,price,category) VALUES('b4','JAVASE_4',25,1); INSERT INTO t_book(bid,bname,price,category) VALUES('b5','JAVAEE_1',30,2); INSERT INTO t_book(bid,bname,price,category) VALUES('b6','JAVAEE_2',35,2); INSERT INTO t_book(bid,bname,price,category) VALUES('b7','JAVAEE_3',40,2); INSERT INTO t_book(bid,bname,price,category) VALUES('b8','JAVAFRAMEWORD_1',45,3); INSERT INTO t_book(bid,bname,price,category) VALUES('b9','JAVAFRAMEWORD_2',50,3); SELECT * FROM t_book;
Book.java
package zh.response.demo; public class Book { private String bid; private String bname; private double price; private int category; public Book() { } public Book(String bid, String bname, double price, int category) { super(); this.bid = bid; this.bname = bname; this.price = price; this.category = category; } public String getBid() { return bid; } public void setBid(String bid) { this.bid = bid; } public String getBname() { return bname; } public void setBname(String bname) { this.bname = bname; } public double getPrice() { return price; } public void setPrice(double price) { this.price = price; } public int getCategory() { return category; } public void setCategory(int category) { this.category = category; } @Override public String toString() { return "Book [bid=" + bid + ", bname=" + bname + ", price=" + price + ", category=" + category + "]"; } }
BookDao.java
package zh.response.demo; import java.sql.SQLException; import java.util.List; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.BeanListHandler; import com.mchange.v2.c3p0.ComboPooledDataSource; public class BookDao { private QueryRunner queryRunner = new QueryRunner( new ComboPooledDataSource()); public BookDao() { } // 查询所有 public List<Book> findAll() { String sql = "select * from t_book"; try { List<Book> BookList = queryRunner.query(sql, new BeanListHandler<Book>(Book.class)); return BookList; } catch (SQLException cause) { throw new RuntimeException("查询所有图书失败", cause); } } // 按分类号查询 public List<Book> findByCategory(int category) { String sql = "select * from t_book where category = ?"; try { List<Book> bookList = queryRunner.query(sql, new BeanListHandler<Book>(Book.class), category); return bookList; } catch (SQLException cause) { throw new RuntimeException("查询所有图书失败", cause); } } }
bookIndex.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>Book Index</title> </head> <body> <a href="${pageContext.request.contextPath}/BookServlet">全部图书</a><br> <a href="${pageContext.request.contextPath}/BookServlet?category=1">JAVASE图书</a><br> <a href="${pageContext.request.contextPath}/BookServlet?category=2">JAVAEE图书</a><br> <a href="${pageContext.request.contextPath}/BookServlet?category=3">JAVAFRAMEWORK图书</a><br> </body> </html>
BookServlet.java
package zh.response.demo; import java.io.IOException; import java.util.List; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class BookServlet extends HttpServlet { private static final long serialVersionUID = 1L; public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { BookDao bookDao = new BookDao(); List<Book> bookList = null; String category = request.getParameter("category"); if (category == null || category.trim().isEmpty()) { //查询所有 bookList = bookDao.findAll(); } else { // 按分类号查询 bookList = bookDao.findByCategory(Integer.parseInt(category)); } request.setAttribute("bookList", bookList); // 转发 request.getRequestDispatcher("/show.jsp").forward(request, response); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
show.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" import="java.util.*" import="zh.response.demo.Book"%> <%@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"> <title>Book Show</title> </head> <body> <table border="1" cellpadding="1"> <tr> <td>图书名称</td> <td>图书单价</td> <td>图书分类</td> </tr> <c:forEach var="book" items="${requestScope.bookList}"> <tr> <td>${book.bname}</td> <td>${book.price}</td> <td>${book.category}</td> </tr> </c:forEach> </table> </body> </html>
BookFilter.java
package zh.response.demo; import java.io.IOException; import java.util.HashMap; import java.util.Map; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class BookFilter implements Filter { private FilterConfig config; public void init(FilterConfig fConfig) throws ServletException { this.config = fConfig; } public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { // 强转 HttpServletRequest req = (HttpServletRequest) request; HttpServletResponse res = (HttpServletResponse) response; // 获得ServletContext ServletContext context = config.getServletContext(); // Map<静态页面名称(不包含后缀),含后缀> Map<String, String> staticPageMap = (Map<String, String>) context.getAttribute("staticPageMap"); if (staticPageMap == null) { staticPageMap = new HashMap<String, String>(); context.setAttribute("staticPageMap", staticPageMap); } String category = req.getParameter("category"); String key = "book_" + category; // 存在静态页面,就重定向到静态页面 if (staticPageMap.containsKey(key)) { String staticPageName = staticPageMap.get(key); res.sendRedirect(context.getContextPath() + "/staticPages/" + staticPageName); return; } // 不存在静态页面,就创建 String newStaticPageName = key + ".html"; String newStaticPagePath = context.getRealPath("/staticPages/" + newStaticPageName); MyResponse myRes = new MyResponse(res, newStaticPagePath); staticPageMap.put(key, newStaticPageName); chain.doFilter(req, myRes); } public void destroy() { } }
MyResponse.java
扫描二维码关注公众号,回复:
1515901 查看本文章
package zh.response.demo; import java.io.FileNotFoundException; import java.io.IOException; import java.io.PrintWriter; import java.io.UnsupportedEncodingException; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponseWrapper; public class MyResponse extends HttpServletResponseWrapper { private HttpServletResponse res; private PrintWriter writer; public MyResponse(HttpServletResponse response, String path) throws FileNotFoundException, UnsupportedEncodingException{ super(response); this.res = response; writer = new PrintWriter(path, "utf-8"); } @Override public PrintWriter getWriter() throws IOException { return writer; } public void close() { writer.close(); } }
web.xml
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0"> <display-name>Javaweb01</display-name> <servlet> <servlet-name>BookServlet</servlet-name> <servlet-class>zh.response.demo.BookServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>BookServlet</servlet-name> <url-pattern>/BookServlet</url-pattern> </servlet-mapping> <filter> <filter-name>BookFilter</filter-name> <filter-class>zh.response.demo.BookFilter</filter-class> </filter> <filter-mapping> <filter-name>BookFilter</filter-name> <url-pattern>/BookServlet</url-pattern> </filter-mapping> </web-app>