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 注册

  
 
 	
    helloServlet
    
    com.kgc.servlet.HelloServlet
 

 
 
 	helloServlet
 	/hello
 

3.2 模糊映射

 
 	helloServlet
 	
 	
 	
 	
 	
 

3.3 初始化参数

3.3.1 单个servlet内部初始化参数

 
    helloServlet
    com.kgc.servlet.HelloServlet
    
    
    	key
    	value
    
 

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初始化参数


     key 
     value 

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应用程序的创建时机,值越小优先级,越高,越早创建实例并初始化

 1

3.3.6 欢迎页面



	login.html

3.3.7错误页面


    404
    /404.jsp

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 注册与映射



    myFirstFilter
    com.kgc.filter.MyFirstFilter



    myFirstFilter
    /filter01.jsp
    

5.3 filter 的初始化参数


    encoding
    utf-8

获取参数:

//一些配置的初始化参数可以通过 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"%>




Insert title here


	<%
		System.out.println("-----5.Filter Target Page-----");
	%>
 	

Filter Target Page

web.xml



    mySecondFilter
    com.kgc.filter.MySecondFilter



    mySecondFilter
    /web3filter01/filterTarget.jsp




    myThridFilter
    com.kgc.filter.MyThridFilter



    myThridFilter
    /web3filter01/filterTarget.jsp

运行结果顺序:

//执行顺序
-----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);
}