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.结果如下所示:
以下是数据库对应的表单: