使用tomcat发布一个可以定时更新数据库并且可以前端点击更新的servlet项目

目录

在idea用maven建立servlet项目

读取sql文件连接pg数据库并执行

获取文件路径

读取sql文件

切割出sql语句

连接数据库并执行sql语句

用计时器做定时更新

在对数据库操作的类中添加run函数

用监听器监听tomcat服务开启并开始定时更新操作

在web.xml中添加监听器

前端点击响应

前端使用ajax发送get请求

后端响应前端的get请求

打包成war包部署到tomcat

将生成的war包放至tomcat中webapps文件夹中

 在tomcat中的bin文件夹中用cmd窗口运行startup.bat或者直接点击

 浏览器中访问


数据库:PostgreSQL

在idea用maven建立servlet项目

链接:快速搭建一个servlet项目_阿 吹的博客-CSDN博客

读取sql文件连接pg数据库并执行

获取文件路径

 在本地运行的时候可以直接用文件(File)方式读取:

File file = new File("src/main/resources/sys_oper_log.sql");
InputStream in = new FileInputStream(file);

 当工程部署到tomcat之后上述方式就不可行了,Java工程打包部署到Tomcat中时,properties的路径变到顶层(classes下),这是由Maven工程结构决定的。由Maven构建的web工程,主代码放在src/main/java路径下,资源放在src/main/resources路径下,当构建jar包 或 war包时,JVM虚拟机会自动编译java文件为class文件存放在 target/classes目录下,resource资源下的文件会原封不动的拷贝一份到 target/classes 目录下。所以采用 ClassLoader 对象去加载资源文件:

URL resource = PostgreSQLJDBC.class.getClassLoader().getResource("sys_oper_log.sql");
String path = resource.getPath();          //文件所在位置

读取sql文件

因为要从前端点击读取数据,所以设置成UTF-8(不然会存在乱码)

BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(path),"UTF-8"));   //前端点击读取时可能乱码,设置成UTF-8

切割出sql语句

 //将sql语句切割出来
    protected static ArrayList<String> SplitSql(String txtsql){
        ArrayList<String> ans = new ArrayList<>();
        // Windows 下换行是 \r\n, Linux 下是 \n
        String[] sqlArr = txtsql.split("(;\\s*\\r\\n)|(;\\s*\\n)");
        for (int i = 0; i < sqlArr.length; i++) {
            String sql = sqlArr[i].replaceAll("--.*", "").trim();
            if (!sql.equals("")) {
                ans.add(sql);
            }
        }
        return ans;
    }

连接数据库并执行sql语句

在pom.xml中添加相关依赖

    <dependency>
      <groupId>postgresql</groupId>
      <artifactId>postgresql</artifactId>
      <version>8.2-504.jdbc3</version>
    </dependency>

 连接操作代码

            //      建立连接
            Class.forName("org.postgresql.Driver");
            connection = DriverManager.getConnection("jdbc:postgresql://192.168.1.246:5432/ruoyipg","postgres", "******");
            connection.setAutoCommit(false);
            System.out.println("Opened database successfully");
            state = connection.createStatement();
            String txtsql = ReadSql(path);
            ArrayList<String> sqlList = SplitSql(txtsql);
            //将sql语句执行
            for(String sql : sqlList){
                state.executeUpdate(sql);
            }
            state.close();
            connection.commit();
            connection.close();

用计时器做定时更新

在对数据库操作的类中添加run函数

    //run方法就是具体需要定时执行的任务
    @Override
    public void run() {
        try {
            LinkSql();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

用监听器监听tomcat服务开启并开始定时更新操作

需要注意的是设置的时间在执行时间之前的话,定时器会立马执行一次操作,并且会从执行的时间开始进行计时(比如我设置的开始时间是2022.02.16 05:00:00,间隔是24小时 但是我2022.02.16 08:00:00才运行程序,那么计时器会立即执行一次PostgreSQLJDBC类中的run函数,并且从2022.02.16 08:00:00开始计时,即下次执行时间为2022.02.17 08:00:00)。

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import java.util.*;

public class TimerDemo implements ServletContextListener {
    public void contextInitialized(ServletContextEvent sce){
        //开启定时插入数据
        Timer timer = new Timer();
        timer.schedule(new PostgreSQLJDBC(),new Date("February 16,2022 05:00:00"),86400000L);
    }

    public void contextDestroyed(ServletContextEvent sce){
        //关闭时操作
    }
}

--------------------------------------------------------------------------------------------------------------------------------

由于项目有时候需要重启,将时间修改成当前时间第二天的五点

    public void contextInitialized(ServletContextEvent sce){
        //开启定时插入数据
        Timer timer = new Timer();
        Calendar c = Calendar.getInstance();
        Date now = c.getTime();
        int year = now.getYear();
        int month = now.getMonth();
        int date = now.getDate();
        int hour = 5;
        int minute = 0;
        int second = 0;
        c.setTime(new Date(year,month,date,hour,minute,second));
        c.add(Calendar.DAY_OF_MONTH,1);
        System.out.println("Start time :" + c.getTime());
        timer.schedule(new PostgreSQLJDBC(),c.getTime(),86400000L);
    }

 

在web.xml中添加监听器

  <listener>
    <listener-class>com.kxyt.PostgreSQL.TimerDemo</listener-class>
  </listener>

前端点击响应

前端使用ajax发送get请求

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
<h1>存储数据</h1>
<input type = "button" value = "发送get_ajax请求" id='btnAjax'>

<script type="text/javascript">
    // 绑定点击事件
    document.querySelector('#btnAjax').onclick = function () {
        // 发送ajax 请求 需要 五步
        // (1)创建异步对象
        var ajaxObj = new XMLHttpRequest();

        // (2)设置请求的参数 包括:请求的方法、请求的url
        ajaxObj.open('get',"myServlet");

        // (3)发送请求
        ajaxObj.send();
    }
</script>
</body>
</html>

后端响应前端的get请求

在doGet函数中调用对数据库操作函数

import com.kxyt.PostgreSQL.PostgreSQLJDBC;
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;

@WebServlet(name = "MyServlet",urlPatterns = {"/myServlet"})
public class MyServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //System.out.println("1111");
        PostgreSQLJDBC.LinkSql();
    }
}

打包成war包部署到tomcat

右边maven项目点击package打包项目(已经存在打包项目的先点击clean)

生成的war包在target文件夹中

将生成的war包放至tomcat中webapps文件夹中

 在tomcat中的bin文件夹中用cmd窗口运行startup.bat或者直接点击

 浏览器中访问

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值