Filter过滤器
Filter的作用是拦截请求,过滤响应。
拦截请求的应用场景有:权限检查,日记操作,事务管理。
创建filter
package cn;/*@Time:2022/5/3-11:23*/
import org.springframework.util.ObjectUtils;
import org.springframework.util.StringUtils;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.io.IOException;
public class AdminFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
/**
* 专门用于拦截请求。可以做权限检查
* @param servletRequest
* @param servletResponse
* @param filterChain
* @throws IOException
* @throws ServletException
*/
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest httpServletRequest = (HttpServletRequest)servletRequest;
HttpSession session = httpServletRequest.getSession();
Object user = session.getAttribute("user");
if(ObjectUtils.isEmpty(user)){
servletRequest.getRequestDispatcher("/").forward(servletRequest, servletResponse);
return ;
}else {
//让程序继续往下访问资源
filterChain.doFilter(servletRequest, servletResponse);
}
}
@Override
public void destroy() {
}
}
配置web.xml
<filter>
<filter-name>AdminFilter</filter-name>
<filter-class>cn.AdminFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>AdminFilter</filter-name>
<!--
配置拦截路径
http://ip:port/工程路径/
-->
<url-pattern>/*</url-pattern>
</filter-mapping>
FilterChain 过滤器链
多个Filter过滤器执行特点:
- 在多个Filter过滤器中执行顺序由web.xml配置的顺序决定。
- 所有Filter和目标资源默认都执行在同一个线程中。
- 多个Filter共同执行的时候,它们都使用同一个Request对象。
Filter拦截路径
精确匹配:/b.jsp
目录匹配:/*
后缀名匹配:*.jsp
Filter的生命周期
- 构造器方法(在 web工程启动的时候执行)
- init初始化方法(在 web工程启动的时候执行)
- doFilter过滤方法(每次拦截到请求,就会执行)
- destroy销毁(停止 web工程的时候,就会执行。)(停止web工程,也会销毁Filter过滤器)
Listener监听器
监听器的作用是监听某种事物的变化,然后通过回调函数,反馈给客户(程序)去做一些相应的处理。
监听接口
- ServletContext
- HttpSession
- ServletRequest
八大监听器
掌握ServletContextListener生命周期监听器。(监听ServletContext的创建和销毁,监听服务器的启动和停止)
ServletContext是一个域对象,一个web项目对应一个ServletContext,它代表当前web项目的信息。
Servlet
Servlet是JavaEE规范之一,规范就是接口,
Servlet是JavaWeb三大组件之一,三大组件分别是:Servlet程序,Filter过滤器,Listener监听器。
Servlet是运行在服务器上的一个java程序,它可以接受客户端发来的请求,并响应数据给客户端。
Servlet的生命周期
- 执行Servlet构造器方法
- 执行init初始化方法
- 执行service方法
- 执行destroy方法
<?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">
<!--servlet标签给Tomcat配置Servlet程序-->
<servlet>
<!--servlet-name标签给Servlet程序起一个别名-->
<servlet-name>HelloServlet</servlet-name>
<!--servlet-class是Servlet程序的全类名-->
<servlet-class>com.HelloServlet</servlet-class>
<init-param>
<param-name>userName</param-name>
<param-value>张三</param-value>
</init-param>
</servlet>
<!--servlet-mapping标签给Servlet程序配置访问地址-->
<servlet-mapping>
<!--servlet-name标签的作用是告诉服务器我当前配置的地址给哪个Servlet程序使用-->
<servlet-name>HelloServlet</servlet-name>
<!--url-pattern标签配置访问地址
/ 斜杠在服务器解析的时候,表示地址为http://ip:port/工程路径
/hello 表示地址为http://ip:port/工程路径/hello
-->
<url-pattern>/hello</url-pattern>
</servlet-mapping>
</web-app>
public class HelloServlet2 extends HttpServlet {
@Override
public void init() throws ServletException {
super.init();
}
/**
* doGet
* @param req
* @param resp
* @throws ServletException
* @throws IOException
*/
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletConfig servletConfig=getServletConfig();
System.out.println("HelloServlet程序的别名是:"+servletConfig.getServletName());
System.out.println("HelloServlet程序的初始化参数是:"+servletConfig.getInitParameter("userName"));
System.out.println("HelloServlet程序的SevletContext对象是:"+servletConfig.getServletContext());
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("POST");
}
}
public class HelloServlet implements Servlet {
private transient ServletConfig config;
public HelloServlet(){
System.out.println("1-构造器方法");
}
@Override
public void init(ServletConfig servletConfig) throws ServletException {
this.config=servletConfig;
System.out.println("2-初始化方法");
System.out.println("HelloServlet程序的别名是:"+servletConfig.getServletName());
System.out.println("HelloServlet程序的初始化参数是:"+servletConfig.getInitParameter("userName"));
System.out.println("HelloServlet程序的SevletContext对象是:"+servletConfig.getServletContext());
System.out.println("重写init方法");
}
@Override
public ServletConfig getServletConfig() {
return config;
}
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
HttpServletRequest httpServletRequest=(HttpServletRequest)servletRequest;
String method = httpServletRequest.getMethod();
System.out.println(method);
ServletConfig servletConfig=getServletConfig();
System.out.println("HelloServlet程序的别名是:"+servletConfig.getServletName());
System.out.println("HelloServlet程序的初始化参数是:"+servletConfig.getInitParameter("userName"));
System.out.println("HelloServlet程序的SevletContext对象是:"+servletConfig.getServletContext());
System.out.println("3-service方法");
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
System.out.println("4-destroy方法");
}
}
ServletConfig类
ServletConfig获取Servlet程序的配置信息类
ServletConfig的三大作用:
- 可以获取ServletConfig程序的别名servlet-name的值
- 获取初始化参数init-param
- 获取SevletContext对象
解决实现Servlet接口类println输出乱码问题
ServletContext类
ServletContext是一个接口,它表示Servlet上下文对象
一个文本工程,只能有一个ServletContext对象实例。
ServletContext对象是一个域对象
ServletContext对象是在web工程部署的时候创建,在web工程停止的时候销毁。
什么是域对象?
域对象是可以像Map一样存取数据的对象叫域对象。
这里的域指的是存取数据的操作范围。
域对象存数据setAttribute(),取对象getAttribute(),删除数据removeAttribute()
ServletContext类的四个作用:
- 获取web.xml中配置的上下文参数context-param
- 获取当前的工程路径,格式:/工程路径 servletContext.getContextPath()
- 获取工程部署后在服务器硬盘上的绝对路径 servletContext.getRealPath(“/”)
- 像Map一样存取数据
web绝对地址和相对地址映射
HTTP协议:客户端和服务器之间通信时,发送的数据都要遵守的规则。HTTP协议中的数据又叫报文
客户端给服务器发送数据叫请求,服务器给客户端回传数据叫相应。
请求分为GET请求和POST请求两种。
常见的响应码:
- 200 表示请求成功
- 302 表示请求重定向
- 404 表示服务器已经收到了,但你要的数据不存在(请求地址错误)
- 500 表示服务器已经收到了,但服务器内部错误
HttpServletRequest类
Tomcat服务器会把请求过来的HTTP协议信息解析好封装到Request对象中,然后传递到service方法(doGet和doPost)中给我们使用。我们可以通过HttpServletRequest对象获取到所有请求信息。
请求转发:服务器收到请求后,从一个资源跳到另一个资源的操作。
请求转发的地址没有变化
- 浏览器地址栏没有变化。
- 他们是一次请求。
- 他们共享request域中的数据。
- 只可以访问工程内的资源(可以转发到web路径下的资源)。
base标签可以设置当前页面中所有相对路径工作时,参照哪个路径来进行跳转。
<base href="http://localhost:8080/JavaWebTest/a/b/c.html">
/表示绝对路径。
浏览器解析为:http://ip:port/
服务器解析为:http://ip:port/工程路径
<url-pattern>/forwardC</url-pattern>
req.getRequestDispatcher("/a/b/c.html")
servletContext.getRealPath("/")
response.sendRediect(“/”) 把斜杠发送给浏览器解析,得到 http://ip:port/
HttpServletResponse类
HttpServletResponse类表示所有响应的信息。
字节流 getOutputStream() 常用于下载(传递二进制数据)
字符流 getWriter() 常用于回传字符串(常用)
public class ResponseIOServlet 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(response.getCharacterEncoding());
//设置服务器字符集为UTF-8
response.setCharacterEncoding("UTF-8");
//设置浏览器也使用UTF-8
response.setHeader("Content-type","text/html;charset=UTF-8");*/
//同时设置服务器和客户端都使用UTF-8字符集,还设置了响应头
//此方法一定要在获取流对象之前调用才有效
response.setContentType("text/html;charset=UTF-8");
PrintWriter writer = response.getWriter();
writer.write("response's content!!!");
writer.write("中文。");
}
}

请求重定向
请求重定向的特点:
- 浏览器地址栏会发生变化。
- 两次请求。
- 不共享request域中数据。
- 不能访问WEB-INF目录下的资源。
- 可以访问工程外的资源。
public class Response1 extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("response1");
/*//设置响应状态码302,表示重定向
response.setStatus(302);
//设置响应头
response.setHeader("Location","http://baidu.com");*/
response.sendRedirect("http://localhost:8080/JavaWebTest/response2");
}
}
与数据库建立连接
public class JdbcUtils {
private static DruidDataSource dataSource;
static {
try {
Properties properties=new Properties();
//读取jdbc.properties属性
InputStream inputStream = JdbcUtils.class.getClassLoader().getResourceAsStream("jdbc.properties");
//从流中加载数据
properties.load(inputStream);
//创建连接池
dataSource= (DruidDataSource)DruidDataSourceFactory.createDataSource(properties);
System.out.println(dataSource.getConnection());
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
}
}
username=root
password=root
url=jdbc:mysql://localhost:3306/myschool
driverClassName=com.mysql.jdbc.Driver
initialSize=5
maxActive=10