页面静态化

页面静态化

第一步
写一个小项目,图书管理
*jsp:link.jsp
链接页面,四个超链接
>查看所有
>查看SE分类
>查看EE分类
>查看框架分类
*show.jsp
显示查询结果

Servlet:
BookServlet
*findAll()-->查看所有图书
*findByCateGory-->按分类进行查询

BookService:略

BookDao:
*List<Book> findAll()
*List<Book> findByCategory(int category)

domain:Book类

第二步:什么是页面静态化!
首次访问去数据库获取数据,然后将数据保存到一个html页面中
二次访问,就不再去数据库获取了,而是直接显示html

---------------------------
图书管理

页面静态化

1、目标:
给出一个过滤器,把摄入略有请求的资源所做输出保存到html中,重定向到html
二次访问时,这个html已经存在,那么直接重定向,不用再去访问servlet

 

代码:

CREATE TABLE t_book(
  bid CHAR(32) PRIMARY KEY,
  bname VARCHAR(100),
  price NUMERIC(10,2),
  category INT
);

INSERT INTO t_book VALUES('b1', 'JavaSE_1', 10, 1);
INSERT INTO t_book VALUES('b2', 'JavaSE_2', 15, 1);
INSERT INTO t_book VALUES('b3', 'JavaSE_3', 20, 1);
INSERT INTO t_book VALUES('b4', 'JavaSE_4', 25, 1);

INSERT INTO t_book VALUES('b5', 'JavaEE_1', 30, 2);
INSERT INTO t_book VALUES('b6', 'JavaEE_2', 35, 2);
INSERT INTO t_book VALUES('b7', 'JavaEE_3', 40, 2);

INSERT INTO t_book VALUES('b8', 'Java_framework_1', 45, 3);
INSERT INTO t_book VALUES('b9', 'Java_framework_2', 50, 3);

SELECT * FROM t_book;

package cn.itcast.domain;

public class Book {
    private String bid;
    private String bname;
    private double price;
    private int category;
    @Override
    public String toString() {
        return "Book [bid=" + bid + ", bname=" + bname + ", price=" + price
                + ", 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;
    }
    public Book(String bid, String bname, double price, int category) {
        super();
        this.bid = bid;
        this.bname = bname;
        this.price = price;
        this.category = category;
    }
    public Book() {
        super();
        // TODO Auto-generated constructor stub
    }

    
}

package cn.itcast.dao;

import java.sql.SQLException;
import java.util.List;

import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;

import cn.itcast.domain.Book;
import cn.itcast.jdbc.TxQueryRunner;

public class BookDao {
    private QueryRunner qr=new TxQueryRunner();
    
    public List<Book> findAll(){
        
        try {
            String sql="SELECT * FROM t_book";
            return qr.query(sql, new BeanListHandler<Book>(Book.class));
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }
    
    public List<Book> findByCategory(int category){
        
        try {
            String sql="SELECT * FROM t_book where category=?";
            Object[] params={category};
            return  qr.query(sql,new BeanListHandler<Book>(Book.class),params);
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }

}

<?xml version="1.0" encoding="UTF-8" ?>
<c3p0-config>
    <!-- 默认连接配置 -->
    <default-config> 
        <!-- 连接四大参数配置  -->
        <property name="jdbcUrl">jdbc:mysql://127.0.0.1:3306/demo</property>
        <property name="driverClass">com.mysql.jdbc.Driver</property>
        <property name="user">guodaxia</property>
        <property name="password">961012gz</property>
            <!-- 池参数配置 -->
        <property name="acquireIncrement">3</property>
        <property name="initialPoolSize">10</property>
        <property name="minPoolSize">2</property>
        <property name="maxPoolSize">10</property>
    </default-config>
    
    <named-config name="oracle-config">
        <!-- 连接四大参数配置  -->
        <property name="jdbcUrl">jdbc:oracle:thin:@localhost:1521:db</property>
        <property name="driverClass">oracle.jdbc.driver.OracleDriver</property>
        <property name="user">scott</property>
        <property name="password">961012gz</property>        
        <property name="acquireIncrement">3</property>
        <property name="initialPoolSize">10</property>
        <property name="minPoolSize">2</property>
        <property name="maxPoolSize">10</property>
    </named-config>
    
</c3p0-config>

package cn.itcast.web.servlet;


import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import cn.itcast.dao.BookDao;
import cn.itcast.servlet.BaseServlet;

public class BookServlet extends BaseServlet {
    private BookDao bookDao=new BookDao();
    
    public String findAll(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        request.setAttribute("bookList", bookDao.findAll());
        return "/show.jsp";
    }
    
    public String findByCategory(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        String value=request.getParameter("category");
        int category=Integer.valueOf(value);
        request.setAttribute("bookList", bookDao.findByCategory(category));
        return "/show.jsp";
    }
}

package cn.itcast.web.filter;

import java.io.FileNotFoundException;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;

import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletResponseWrapper;

public class StaticResponse extends HttpServletResponseWrapper{

    private HttpServletResponse response;
    private PrintWriter pw;
    public StaticResponse(HttpServletResponse response,String path) throws FileNotFoundException, UnsupportedEncodingException {
        super(response);
        this.response=response;
        //创建一个与html文件路径和在一起的流对象
        pw=new PrintWriter(path, "utf-8");
    }
    
    public PrintWriter getWriter(){
        //返回一个域html绑定在一起的printWriter对象
        //jsp会使用它进行输出,这样数据都输出到html文件中了、
        return pw;
    }

}

package cn.itcast.web.filter;

import java.io.File;
import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class StaticFilter implements  Filter{
    
    FilterConfig fconfig;
    public void destroy() {
        
    }

    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) throws IOException, ServletException {
        HttpServletRequest req=(HttpServletRequest) request;
        HttpServletResponse resp=(HttpServletResponse) response;
        /*
         * 1.第一次访问时,查找请求对应的html页面是否存在,如果存在重定向到html
         * 2.如果不存在,放行!把Servlet访问数据库后,输出给客户端的数据保存到一个html文件中,再重定向到html!
         */
        /*
         * 一、获取category参数!
         * category有四种可能:
         *  * null-->null.html
         *  *1-->1.html
         *  *2-->2.html
         *  *3-->3.html
         *  
         *  html页面的保存路径,htmls目录下
         *  
         *  判断对应的html文件是否存在,如果存在,直接重定向!
         */
        String category=request.getParameter("category");
        String htmlPage=category+".html";
        String htmlPath=fconfig.getServletContext().getRealPath("/htmls");//得到文件的存放目录
        File destFile=new File(htmlPath,htmlPage);
        
        if(destFile.exists()){//如果文件存在
            //重定向到这个文件
            resp.sendRedirect(req.getContextPath()+"/htmls/"+htmlPage);
            return;
        }
        /*
         * 二、如果html文件不存在,我们要生成html
         * 1、放行,show.jsp会做出很多的输出,我们要让它别再输出给客户端,而是输出到我们指定到的一个html文件中
         * 完成:
         *  *掉包response,让他的getWriter()与一个html文件绑定,那么show.jsp的输出就到了一个html文件
         */
        StaticResponse sr=new StaticResponse(resp,destFile.getAbsolutePath());
        
        chain.doFilter(request, sr);//放行,即生成了html文件.这里servlet的内容相当于执行完了jsp,但是jsp中out已经被调班了,写的内容全部到了html页面,show.jsp就是一个模板了
        
        //这时页面已经存在,重定向到html文件
        resp.sendRedirect(req.getContextPath()+"/htmls/"+htmlPage);
    }

    public void init(FilterConfig arg0) throws ServletException {
        fconfig=arg0;
    }

}

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    
    <title>My JSP 'link.jsp' starting page</title>
    
    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="expires" content="0">    
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    <meta http-equiv="description" content="This is my page">
    <!--
    <link rel="stylesheet" type="text/css" href="styles.css">
    -->

  </head>
  
  <body>
    <h1>链接页面</h1>
    <a href="<c:url value='BookServlet?method=findAll' />">查看所有</a><br/>
    <a href="<c:url value='BookServlet?method=findByCategory&category=1' />">查看SE</a><br/>
    <a href="<c:url value='BookServlet?method=findByCategory&category=2' />">查看EE</a><br/>
    <a href="<c:url value='BookServlet?method=findByCategory&category=3' />">查看frameWork</a><br/>
  </body>
</html>

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    
    <title>My JSP 'show.jsp' starting page</title>
    
    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="expires" content="0">    
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    <meta http-equiv="description" content="This is my page">
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <!--
    <link rel="stylesheet" type="text/css" href="styles.css">
    -->

  </head>
  
  <body>
  <center> <h1>图书列表</h1> </center>
   <table border="1" align="center">
       <tr>
           <th>书名</th>
           <th>单价</th>
           <th>分类</th>
       </tr>
       <c:forEach items="${requestScope.bookList }" var="book">
           <tr>
               <td>${book.bname }</td>
               <td>${book.price }</td>
               <c:choose>
                   <c:when test="${book.category eq 1}"><td style="color:red;">javaSE</td></c:when>
                   <c:when test="${book.category eq 2}"><td style="color:yellow;">javaEE</td></c:when>
                   <c:when test="${book.category eq 3}"><td style="color:blue;">javaFramework</td></c:when>
               </c:choose>
               <td></td>
           </tr>
       </c:forEach>
   
   </table>
  </body>
</html>

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" 
    xmlns="http://java.sun.com/xml/ns/javaee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
    http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
  <display-name></display-name>
  <servlet>
    <description>This is the description of my J2EE component</description>
    <display-name>This is the display name of my J2EE component</display-name>
    <servlet-name>BookServlet</servlet-name>
    <servlet-class>cn.itcast.web.servlet.BookServlet</servlet-class>
  </servlet>

  <servlet-mapping>
    <servlet-name>BookServlet</servlet-name>
    <url-pattern>/BookServlet</url-pattern>
  </servlet-mapping>    
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
  
  <filter>
      <filter-name>StaticFilter</filter-name>
      <filter-class>cn.itcast.web.filter.StaticFilter</filter-class>
  </filter>
  
  <filter-mapping>
      <filter-name>StaticFilter</filter-name>
      <servlet-name>BookServlet</servlet-name>
  </filter-mapping>
</web-app>
View Code

 

posted @ 2016-08-05 11:45  guodaxia  阅读(595)  评论(0编辑  收藏  举报