用ServletContext当缓存--案例

ServletContext

ServletContext的功能是缓存数据

ServletContext是servlet的公有容器,所有的Servlet都注册保存在这个对象中。

所有的Servlet都可以访问这个容器。ServletContext是由url和实例化的Servlet代码组成,实际上是Map集合,属于键值队.
用ServletContext作为离线数据缓存,打印的表单代码:

1.连接库

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class Db {
    public static Connection getConnect(){
        Connection conn = null;
        try {
            //mysql驱动类
            String diverClass = "com.mysql.jdbc.Driver";
            //加载驱动类到虚拟机
            String url = "jdbc:mysql://192.168.93.88:3306/mydb";
            String username = "root";
            String password = "";
            Class.forName ( diverClass );
            //连接数据库
            conn = DriverManager.getConnection ( url,username,password );
        } catch (Exception e) {
            e.printStackTrace ();
        }
        return  conn;
    }

    //关闭数据库连接
    public static void close(Connection conn){
        try {
            if (conn != null) conn.close ();
        } catch (SQLException e) {
            e.printStackTrace ();
        }
    }
}

2.采用Servlet的GET方法实现:
要点:线程(因为init ()方法只能执行一次,所以采用循环),内部类,泛型

import edu.db.Db;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.sql.*;
import java.util.ArrayList;
import java.util.Arrays;

//@WebServlet(name = "GateServlet",loadOnStartup = 1)//loadOnStartup = 1表示服务器一启动就启动
public class GateServlet extends HttpServlet {
    class CacheThread extends Thread {
        private ServletContext context;//关联

        public CacheThread (ServletContext context) {
            this.context = context;
        }

        public void run () {
            while (true) {
                Connection conn = null;
                //执行SQL的语句接口
                PreparedStatement prst = null;
                //操作数据库返回的查询结果的接口
                ResultSet rs = null;
                ResultSetMetaData meta = null;
                //连接到Db类中的getConnect()方法,即得到conn
                conn = Db.getConnect ();
                String sql = "select * from emp";
                try {
                    prst = conn.prepareStatement ( sql );
                    rs = prst.executeQuery ();
                    meta = rs.getMetaData ();//获得结果的元数据对象(可以通过它的到结果集的列数,数据的字段名称,类型等信息)
                    //把连线集合转换为离线集合
                    ArrayList <ArrayList <String>> table = new ArrayList <> ();//创建存储表结构的集合
                    while (rs.next ()) {//判断结果集有无下一行数据
                        ArrayList <String> row = new ArrayList <> ();//创建行数据结果集
                        for (int i = 1; i <= meta.getColumnCount (); i++) {
                            row.add ( rs.getString ( i ) );
                        }
                        table.add ( row );
                    }
                    //缓存离线数据到ServletContext中
                    context.setAttribute ( "table", table );
                    //休息
                    Thread.sleep ( 60000 );
                } catch (Exception e) {
                    e.printStackTrace ();
                }
                Db.close ( conn );
            }
        }
    }
    @Override
    public void init () throws ServletException {
        new CacheThread ( this.getServletContext () ).start ();
    }

}

3.设置表单展示:
要点:html制作表单形式输出数据,泛型

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;

//@WebServlet(name = "ViewServlet",urlPatterns = "/view")
public class ViewServlet extends HttpServlet {

    @Override
    protected void doGet (HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //先拿到ServletContext
        ServletContext servletContext = request.getServletContext ();
        //再取出离线集
        ArrayList<ArrayList<String>> table = (ArrayList <ArrayList <String>>) servletContext.getAttribute ( "table" );
        //渲染成表格输出
        //取出输出字符流
        PrintWriter pw = response.getWriter ();
        pw.println ( "<table border='1'>" );
        pw.println ( "<th>" );
        pw.println ( "empno" );
        pw.println ( "</th>" );
        pw.println ( "<th>" );
        pw.println ( "ename" );
        pw.println ( "</th>" );
        pw.println ( "<th>" );
        pw.println ( "job" );
        pw.println ( "</th>" );
        pw.println ( "<th>" );
        pw.println ( "mgr" );
        pw.println ( "</th>" );
        pw.println ( "<th>" );
        pw.println ( "hiredate" );
        pw.println ( "</th>" );
        pw.println ( "<th>" );
        pw.println ( "salary" );
        pw.println ( "</th>" );
        pw.println ( "<th>" );
        pw.println ( "comm" );
        pw.println ( "</th>" );
        pw.println ( "<th>" );
        pw.println ( "deptno" );
        pw.println ( "</th>" );
        for (int i=0; i<table.size (); i++){
            pw.println ( "<tr>" );
            ArrayList<String> row = table.get ( i );
            for (int j=0; j<row.size (); j++){
                pw.println ( "<td>" );
                pw.println ( row.get ( j ));
                pw.println ( "</td>" );
            }
            pw.println ( "</tr>" );
        }
        pw.println ( "</table>" );
    }
}

4.结果如下所示:
在这里插入图片描述
以下是数据库对应的表单:
在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值