• Javaweb03-servlet&filter


    1、什么是servlet

    第一个servlet应用程序,实现servlet接口
    定义:凡是实现了servlet api接口(或者继承servlet api接口的实现类)的类就是servlet应用程序;

    命周期:

    1. 创建servlet应用程序的实例:只会执行一次,在首次通过url-pattern映射访问时,创建实例;
    2. 初始化init方法:只会执行一次,在创建完servlet应用程序的实例后,立刻调用,一般都是用户初始化servlet应用程序;
    3. 业务处理service方法:执行多次,每当访问请求映射到servlet应用程序时,都会调用service方法,进行请求处理;
    4. 销毁destroy方法:只会执行一次,在web应用程序卸载时,统一调用,多用户释放服务器资源;

    2、创建Servlet的三种方式

    2.1 实现 servlet接口

    public class HelloServlet implements Servlet {
    	// 空参构造
    	public  HelloServlet() {
    		System.out.println("---------HelloServlet 空参构造--------------");
    	}
    	
    	@Override
    	public void destroy() {
    		System.out.println("---------HelloServlet destroy--------------");
    	}
    
    	@Override
    	public ServletConfig getServletConfig() {
    		System.out.println("---------HelloServlet getServletConfig--------------");
    		return null;
    	}
    
    	@Override
    	public String getServletInfo() {
    		System.out.println("---------HelloServlet getServletInfo--------------");
    		return null;
    	}
    
    	@Override
    	public void init(ServletConfig config) throws ServletException {
    		System.out.println("---------HelloServlet init--------------");	
    	}
    
    	@Override
    	public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
    		System.out.println("---------HelloServlet service--------------");
    	}
    
    }
    
    折叠

    2.1.1 servlet的生命周期

    //第一次访问映射路径:
    ---------HelloServlet 空参构造---------
    ---------HelloServlet init-----------(//如果配置了load-on-startup 项目启动前面两步就会立刻执行)
        
    ---------HelloServlet service--------(//每次访问映射路径都会调用此方法)
    
    ---------HelloServlet destroy--------(//关闭服务才会调用)
    

    2.2 继承 GenericServlet

    public class HelloServlet2 extends GenericServlet{
        @Override
        public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
        }
    }
    

    2.3 继承 HttpServlet

    public class StudentInfoServlet extends HttpServlet{
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        }
    
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
            // 一般直接在get请求处理方法中,直接调用post方法,实现两种请求统一处理
            //doPost(request, response);
        }
    }
    
    

    3、Servlet 的注册配置

    3.1 注册

      
     <servlet>
     	
        <servlet-name>helloServletservlet-name>
        
        <servlet-class>com.kgc.servlet.HelloServletservlet-class>
     servlet>
    
     
     <servlet-mapping>
     	<servlet-name>helloServletservlet-name>
     	<url-pattern>/hellourl-pattern>
     servlet-mapping>
    

    3.2 模糊映射

     <servlet-mapping>
     	<servlet-name>helloServletservlet-name>
     	
     	
     	
     	
     	
     servlet-mapping>
    

    3.3 初始化参数

    3.3.1 单个servlet内部初始化参数

     <servlet>
        <servlet-name>helloServletservlet-name>
        <servlet-class>com.kgc.servlet.HelloServletservlet-class>
        
        <init-param>
        	<param-name>keyparam-name>
        	<param-value>valueparam-value>
        init-param>
     servlet>
    

    3.3.2 获取单个servlet内部初始化参数

    @Override
    public void init(ServletConfig config) throws ServletException {
        System.out.println("---------HelloServlet init--------------");
    
        //获取当前servelt初始化参数 
        //通过 config 对象获取
        String encoding = config.getInitParameter("encoding");
        System.out.println("******* servlet内部初始化参数 encoding = "+encoding+"******");
    }
    

    3.3.3 全局servlet初始化参数

    <context-param>
        <param-name> key param-name>
        <param-value> value param-value>
    context-param>
    

    3.3.4 获取全局servlet初始化参数

    //获取全局servelt初始化参数
    //通过ServletContext 对象获取
    String encodingContext = config.getServletContext().getInitParameter("encoding");
    System.out.println("**** servlet全局初始化参数 encodingContext = "+encodingContext+"*****");
    

    3.3.5 servlet 的启动优先级

    默认情况下,启动是不会创建实例和初始化

    配置了load-on-startup,servlet应用程序就会在服务器启动时创建实例并初始化

    允许值为正整数(可以为0)负数不可以,一般为1,值的作用是指定servlet应用程序的创建时机,值越小优先级,越高,越早创建实例并初始化

     <load-on-startup>1load-on-startup>
    

    3.3.6 欢迎页面

    
    <welcome-file-list>
    	<welcome-file>login.htmlwelcome-file>
    welcome-file-list>
    

    3.3.7错误页面

    <error-page>
        <error-code>404error-code>
        <location>/404.jsplocation>
    error-page>
    

    4、相对路径和绝对路径

    通过servlet的跳转使用相对路径,容易出错,会导致缺少部分路径,而找不到资源

    一般使用绝对路径,进行跳转;

    //获取项目跟路径
    <%=request.getContextPath()%>  //获取跟路径后再根据实际情况进行路径拼接
    

    5、filter

    5.1 创建过滤器

    实现Filter的应用就是过滤器;

    public class MyFirstFilter implements Filter{
    	public MyFirstFilter() {
    		System.out.println("-----MyFirstFilter 空参构造 ------");
    	}
    	@Override
    	public void destroy() {
    		System.out.println("-----MyFirstFilter destroy ------");
    	}
    
    	@Override
    	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)throws IOException, ServletException {
    		System.out.println("-----MyFirstFilter doFilter ------");
    		//FilterChain 是决定请i去是否放行的操作对象,如果请求放行,必须要调用FilterChain的请求过滤方法doFilter
    		chain.doFilter(request, response);
    	}
    
    	@Override
    	public void init(FilterConfig filterConfig) throws ServletException {
    		System.out.println("-----MyFirstFilter init ------");
    	}
    }
    

    5.2 filter 注册与映射

    
    <filter>
        <filter-name>myFirstFilterfilter-name>
        <filter-class>com.kgc.filter.MyFirstFilterfilter-class>
    filter>
    
    <filter-mapping>
        <filter-name>myFirstFilterfilter-name>
        <url-pattern>/filter01.jspurl-pattern>
        
    filter-mapping>
    

    5.3 filter 的初始化参数

    <init-param>
        <param-name>encodingparam-name>
        <param-value>utf-8param-value>
    init-param>
    

    获取参数:

    //一些配置的初始化参数可以通过 filterConfig.getInitParameter(key) 获取
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        this.encoding = filterConfig.getInitParameter("encoding");
        System.out.println("获取字符集过滤器中的初始化编码:"+this.encoding);
    }
    

    5.4 filter 的执行顺序

    web.xml中映射顺序,越上面的越先执行;

    MySecondFilter

    public class MySecondFilter implements Filter {
    	@Override
    	public void destroy() {
    	}
    	@Override
    	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)throws IOException, ServletException {
    		System.out.println("-----1.MySecondFilter  doFilter before ------");
    		chain.doFilter(request, response);
    		System.out.println("-----2.MySecondFilter  doFilter after ------");
    	}
    	@Override
    	public void init(FilterConfig filterConfig) throws ServletException {
    	}
    }
    

    MyThridFilter

    public class MyThridFilter implements Filter {
    	@Override
    	public void destroy() {
    	}
    	@Override
    	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)throws IOException, ServletException {
    		System.out.println("-----3.MyThridFilter doFilter before ------");
    		chain.doFilter(request, response);
    		System.out.println("-----4.MyThridFilter doFilter after ------");
    	}
    	@Override
    	public void init(FilterConfig filterConfig) throws ServletException {
    	}
    }
    

    filterTarget.jsp

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    
    
    
    "UTF-8">
    Insert title here
    
    
    	<%
    		System.out.println("-----5.Filter Target Page-----");
    	%>
     	

    Filter Target Page

    web.xml

    
    <filter>
        <filter-name>mySecondFilterfilter-name>
        <filter-class>com.kgc.filter.MySecondFilterfilter-class>
    filter>
    
    <filter-mapping>
        <filter-name>mySecondFilterfilter-name>
        <url-pattern>/web3filter01/filterTarget.jspurl-pattern>
    filter-mapping>
    
    
    <filter>
        <filter-name>myThridFilterfilter-name>
        <filter-class>com.kgc.filter.MyThridFilterfilter-class>
    filter>
    
    <filter-mapping>
        <filter-name>myThridFilterfilter-name>
        <url-pattern>/web3filter01/filterTarget.jspurl-pattern>
    filter-mapping>
    

    运行结果顺序:

    //执行顺序
    -----1.MySecondFilter  doFilter before ----
    -----3.MyThridFilter doFilter before ------
    -----5.Filter Target Page-----
    -----4.MyThridFilter doFilter after -------
    -----2.MySecondFilter  doFilter after ------
    

    5.5 编码过滤器

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
        throws IOException, ServletException {
        //this.encoding 编码名可以存放在过滤器初始化参数中,通过filterConfig.getInitParameter("encoding");获取
        //poet请求乱码处理
        request.setCharacterEncoding(this.encoding);
        //响应编码
        response.setContentType("text/html; charset=UTF-8");
        response.setCharacterEncoding(this.encoding);
    
        //请求放行
        chain.doFilter(request, response);
    }
    
  • 相关阅读:
    小米12sUltra什么时候发布 小米12sUltra配置如何
    kernel 劫持seq_operations && 利用pt_regs
    《十堂课学习 Flink》第九章:Flink Stream 的实战案例一:CPU 平均使用率监控告警案例
    linux上VirtualBox使用
    “MJiangSports“ app Tech Support(URL)
    2022年10月中旬刷题记录
    100套基于Java开发的毕业设计项目,完成项目源码可共分为五季,每季大约20套项目,希望大家多多支持持续关注哦!
    Impossible WHERE noticed after reading const tables
    Python数组基本操作
    同步代码块、同步方法解决数据安全问题、线程安全的类及Lock锁
  • 原文地址:https://www.cnblogs.com/xiaoqigui/p/16542866.html