当线程出现异常,过滤器会自动拦截 ,并抛出异常且进行事务回滚,当程序检查到异常被抛出,则自动跳转到提示页面
Servlet类:
package servlet;
import service.test_jdbcutils;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class LoginServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
new test_jdbcutils.test_1().run();
}
}
线程类 :
package service;
import jdbcUtils1.JDBCUtils_druid;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class test_jdbcutils {
static ThreadLocal<Object> threadLocal = new ThreadLocal<Object>();
public static class test_1 implements Runnable{
@Override
public void run() {
try {
Connection getconnection = JDBCUtils_druid.getconnection();
String sql = "select * from user";
PreparedStatement preparedStatement = getconnection.prepareStatement(sql);
ResultSet resultSet = preparedStatement.executeQuery();
while (resultSet.next()){
String username = resultSet.getString("username");
threadLocal.set(username);
}
} catch (SQLException throwables) {
throwables.printStackTrace();
throw new RuntimeException(throwables); //抛出线程异常
}
}
}
}
过滤器类:
package Filter_2;
import jdbcUtils1.JDBCUtils_druid;
import javax.servlet.*;
import java.io.IOException;
public class TransactionFilter1 implements Filter {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
try {
filterChain.doFilter(servletRequest,servletResponse);
JDBCUtils_druid.commitAndClose(); //提交事务
}catch (Exception e){
JDBCUtils_druid.rollaAndClose(); //回滚事务
e.printStackTrace();
throw new RuntimeException(e); //抛出异常
}
}
}
web.xml文件:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<filter>
<!-- 给filter起别名-->
<filter-name>AdminFilter</filter-name>
<!-- 配置filter的全类名-->
<filter-class>Filter_1.AdminFilter</filter-class>
<init-param>
<param-name>username</param-name>
<param-value>root</param-value>
</init-param>
<init-param>
<param-name>url</param-name>
<param-value>jdbc:mysql://localhost3306/users</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>AdminFilter</filter-name>
<!-- 表示当前的拦截路径给哪个filter使用-->
<url-pattern>/admin/*</url-pattern>
<!-- 拦截admin目录下的所有文件-->
</filter-mapping>
<servlet>
<servlet-name>LoginServlet</servlet-name>
<servlet-class>servlet.LoginServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>LoginServlet</servlet-name>
<url-pattern>/loginservlet</url-pattern>
<!-- 访问路径名-->
</servlet-mapping>
<filter>
<!-- 给filter起别名-->
<filter-name>TransactionFilter1</filter-name>
<!-- 配置filter的全类名-->
<filter-class>Filter_2.TransactionFilter1</filter-class>
</filter>
<filter-mapping>
<filter-name>TransactionFilter1</filter-name>
<!-- 表示当前的拦截路径给哪个filter使用-->
<url-pattern>/*</url-pattern>
<!-- 拦截所有对象-->
</filter-mapping>
<!-- 当程序出现500错误时,自动执行下列配置-->
<error-page>
<error-code>500</error-code>
<!-- 错误类型-->
<location>/error/error.jsp</location>
<!-- 要跳转去的页面路径-->
</error-page>
</web-app>