JavaWeb三大组件

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过滤器执行特点:

  1. 在多个Filter过滤器中执行顺序由web.xml配置的顺序决定。
  2. 所有Filter和目标资源默认都执行在同一个线程中。
  3. 多个Filter共同执行的时候,它们都使用同一个Request对象。
Filter拦截路径

精确匹配:/b.jsp

目录匹配:/*

后缀名匹配:*.jsp

Filter的生命周期
  1. 构造器方法(在 web工程启动的时候执行)
  2. init初始化方法(在 web工程启动的时候执行)
  3. doFilter过滤方法(每次拦截到请求,就会执行)
  4. destroy销毁(停止 web工程的时候,就会执行。)(停止web工程,也会销毁Filter过滤器)

Listener监听器

监听器的作用是监听某种事物的变化,然后通过回调函数,反馈给客户(程序)去做一些相应的处理。

监听接口
  1. ServletContext
  2. HttpSession
  3. ServletRequest

八大监听器八大监听器

掌握ServletContextListener生命周期监听器。(监听ServletContext的创建和销毁,监听服务器的启动和停止)

ServletContext是一个域对象,一个web项目对应一个ServletContext,它代表当前web项目的信息。

Servlet

Servlet是JavaEE规范之一,规范就是接口,

Servlet是JavaWeb三大组件之一,三大组件分别是:Servlet程序,Filter过滤器,Listener监听器。

Servlet是运行在服务器上的一个java程序,它可以接受客户端发来的请求,并响应数据给客户端。

Servlet的生命周期

  1. 执行Servlet构造器方法
  2. 执行init初始化方法
  3. 执行service方法
  4. 执行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-classServlet程序的全类名-->
        <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的三大作用:

  1. 可以获取ServletConfig程序的别名servlet-name的值
  2. 获取初始化参数init-param
  3. 获取SevletContext对象

解决实现Servlet接口类println输出乱码问题解决实现Servlet接口类println输出乱码问题

ServletContext类

ServletContext是一个接口,它表示Servlet上下文对象

一个文本工程,只能有一个ServletContext对象实例。

ServletContext对象是一个域对象

ServletContext对象是在web工程部署的时候创建,在web工程停止的时候销毁。

什么是域对象?

域对象是可以像Map一样存取数据的对象叫域对象。

这里的域指的是存取数据的操作范围。

域对象存数据setAttribute(),取对象getAttribute(),删除数据removeAttribute()

ServletContext类的四个作用:

  1. 获取web.xml中配置的上下文参数context-param
  2. 获取当前的工程路径,格式:/工程路径 servletContext.getContextPath()
  3. 获取工程部署后在服务器硬盘上的绝对路径 servletContext.getRealPath(“/”)
  4. 像Map一样存取数据
    web绝对地址和相对地址映射web绝对地址和相对地址映射

HTTP协议:客户端和服务器之间通信时,发送的数据都要遵守的规则。HTTP协议中的数据又叫报文

客户端给服务器发送数据叫请求,服务器给客户端回传数据叫相应。

请求分为GET请求和POST请求两种。

常见的响应码:

  1. 200 表示请求成功
  2. 302 表示请求重定向
  3. 404 表示服务器已经收到了,但你要的数据不存在(请求地址错误)
  4. 500 表示服务器已经收到了,但服务器内部错误

HttpServletRequest类

Tomcat服务器会把请求过来的HTTP协议信息解析好封装到Request对象中,然后传递到service方法(doGet和doPost)中给我们使用。我们可以通过HttpServletRequest对象获取到所有请求信息。

请求转发:服务器收到请求后,从一个资源跳到另一个资源的操作。
请求转发的地址没有变化请求转发的地址没有变化

  1. 浏览器地址栏没有变化。
  2. 他们是一次请求。
  3. 他们共享request域中的数据。
  4. 只可以访问工程内的资源(可以转发到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("中文。");

    }
}
![请求头](https://img-blog.csdnimg.cn/29dc63f8c0c0475787f38da3b6eb9b70.png#pic_center)

请求重定向

请求重定向的特点:

  1. 浏览器地址栏会发生变化。
  2. 两次请求。
  3. 不共享request域中数据。
  4. 不能访问WEB-INF目录下的资源。
  5. 可以访问工程外的资源。
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

版权声明:本文为qq_44142628原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。