ToB企服应用市场:ToB评测及商务社交产业平台

标题: Javaweb03-servlet&filter [打印本页]

作者: 王國慶    时间: 2022-9-6 03:08
标题: Javaweb03-servlet&filter
1、什么是servlet

第一个servlet应用程序,实现servlet接口
定义:凡是实现了servlet api接口(或者继承servlet api接口的实现类)的类就是servlet应用程序;
命周期:
2、创建Servlet的三种方式

2.1 实现 servlet接口
  1. public class HelloServlet implements Servlet {
  2.         // 空参构造
  3.         public  HelloServlet() {
  4.                 System.out.println("---------HelloServlet 空参构造--------------");
  5.         }
  6.        
  7.         @Override
  8.         public void destroy() {
  9.                 System.out.println("---------HelloServlet destroy--------------");
  10.         }
  11.         @Override
  12.         public ServletConfig getServletConfig() {
  13.                 System.out.println("---------HelloServlet getServletConfig--------------");
  14.                 return null;
  15.         }
  16.         @Override
  17.         public String getServletInfo() {
  18.                 System.out.println("---------HelloServlet getServletInfo--------------");
  19.                 return null;
  20.         }
  21.         @Override
  22.         public void init(ServletConfig config) throws ServletException {
  23.                 System.out.println("---------HelloServlet init--------------");       
  24.         }
  25.         @Override
  26.         public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
  27.                 System.out.println("---------HelloServlet service--------------");
  28.         }
  29. }
复制代码
2.1.1 servlet的生命周期
  1. //第一次访问映射路径:
  2. ---------HelloServlet 空参构造---------
  3. ---------HelloServlet init-----------(//如果配置了load-on-startup 项目启动前面两步就会立刻执行)
  4.    
  5. ---------HelloServlet service--------(//每次访问映射路径都会调用此方法)
  6. ---------HelloServlet destroy--------(//关闭服务才会调用)
复制代码
2.2 继承 GenericServlet
  1. public class HelloServlet2 extends GenericServlet{
  2.     @Override
  3.     public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
  4.     }
  5. }
复制代码
2.3 继承 HttpServlet
  1. public class StudentInfoServlet extends HttpServlet{
  2.     @Override
  3.     protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  4.     }
  5.     @Override
  6.     protected void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
  7.         // 一般直接在get请求处理方法中,直接调用post方法,实现两种请求统一处理
  8.         //doPost(request, response);
  9.     }
  10. }
复制代码
3、Servlet 的注册配置

3.1 注册
  1.   
  2. <servlet>
  3.        
  4.     <servlet-name>helloServlet</servlet-name>
  5.    
  6.     <servlet-class>com.kgc.servlet.HelloServlet</servlet-class>
  7. </servlet>
  8. <servlet-mapping>
  9.         <servlet-name>helloServlet</servlet-name>
  10.         <url-pattern>/hello</url-pattern>
  11. </servlet-mapping>
复制代码
3.2 模糊映射
  1. <servlet-mapping>
  2.         <servlet-name>helloServlet</servlet-name>
  3.        
  4.        
  5.        
  6.        
  7.        
  8. </servlet-mapping>
复制代码
3.3 初始化参数

3.3.1 单个servlet内部初始化参数
  1. <servlet>
  2.     <servlet-name>helloServlet</servlet-name>
  3.     <servlet-class>com.kgc.servlet.HelloServlet</servlet-class>
  4.    
  5.     <init-param>
  6.             <param-name>key</param-name>
  7.             <param-value>value</param-value>
  8.     </init-param>
  9. </servlet>
复制代码
3.3.2 获取单个servlet内部初始化参数
  1. @Override
  2. public void init(ServletConfig config) throws ServletException {
  3.     System.out.println("---------HelloServlet init--------------");
  4.     //获取当前servelt初始化参数
  5.     //通过 config 对象获取
  6.     String encoding = config.getInitParameter("encoding");
  7.     System.out.println("******* servlet内部初始化参数 encoding = "+encoding+"******");
  8. }
复制代码
3.3.3 全局servlet初始化参数
  1. <context-param>
  2.     <param-name> key </param-name>
  3.     <param-value> value </param-value>
  4. </context-param>
复制代码
3.3.4 获取全局servlet初始化参数
  1. //获取全局servelt初始化参数
  2. //通过ServletContext 对象获取
  3. String encodingContext = config.getServletContext().getInitParameter("encoding");
  4. System.out.println("**** servlet全局初始化参数 encodingContext = "+encodingContext+"*****");
复制代码
3.3.5  servlet 的启动优先级

默认情况下,启动是不会创建实例和初始化
配置了load-on-startup,servlet应用程序就会在服务器启动时创建实例并初始化
允许值为正整数(可以为0)负数不可以,一般为1,值的作用是指定servlet应用程序的创建时机,值越小优先级,越高,越早创建实例并初始化
  1. <load-on-startup>1</load-on-startup>
复制代码
3.3.6 欢迎页面
  1. <welcome-file-list>
  2.         <welcome-file>login.html</welcome-file>
  3. </welcome-file-list>
复制代码
3.3.7错误页面
  1. <error-page>
  2.     <error-code>404</error-code>
  3.     <location>/404.jsp</location>
  4. </error-page>
复制代码
4、相对路径和绝对路径

通过servlet的跳转使用相对路径,容易出错,会导致缺少部分路径,而找不到资源
一般使用绝对路径,进行跳转;
  1. //获取项目跟路径
  2. <%=request.getContextPath()%>  //获取跟路径后再根据实际情况进行路径拼接
复制代码
5、filter

5.1 创建过滤器

实现Filter的应用就是过滤器;
  1. public class MyFirstFilter implements Filter{
  2.         public MyFirstFilter() {
  3.                 System.out.println("-----MyFirstFilter 空参构造 ------");
  4.         }
  5.         @Override
  6.         public void destroy() {
  7.                 System.out.println("-----MyFirstFilter destroy ------");
  8.         }
  9.         @Override
  10.         public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)throws IOException, ServletException {
  11.                 System.out.println("-----MyFirstFilter doFilter ------");
  12.                 //FilterChain 是决定请i去是否放行的操作对象,如果请求放行,必须要调用FilterChain的请求过滤方法doFilter
  13.                 chain.doFilter(request, response);
  14.         }
  15.         @Override
  16.         public void init(FilterConfig filterConfig) throws ServletException {
  17.                 System.out.println("-----MyFirstFilter init ------");
  18.         }
  19. }
复制代码
5.2 filter 注册与映射
  1. <filter>
  2.     <filter-name>myFirstFilter</filter-name>
  3.     <filter-class>com.kgc.filter.MyFirstFilter</filter-class>
  4. </filter>
  5. <filter-mapping>
  6.     <filter-name>myFirstFilter</filter-name>
  7.     <url-pattern>/filter01.jsp</url-pattern>
  8.    
  9. </filter-mapping>
复制代码
5.3 filter 的初始化参数
  1. <init-param>
  2.     <param-name>encoding</param-name>
  3.     <param-value>utf-8</param-value>
  4. </init-param>
复制代码
获取参数:
  1. //一些配置的初始化参数可以通过 filterConfig.getInitParameter(key) 获取
  2. @Override
  3. public void init(FilterConfig filterConfig) throws ServletException {
  4.     this.encoding = filterConfig.getInitParameter("encoding");
  5.     System.out.println("获取字符集过滤器中的初始化编码:"+this.encoding);
  6. }
复制代码
5.4 filter 的执行顺序

web.xml中映射顺序,越上面的越先执行;
MySecondFilter
  1. public class MySecondFilter implements Filter {
  2.         @Override
  3.         public void destroy() {
  4.         }
  5.         @Override
  6.         public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)throws IOException, ServletException {
  7.                 System.out.println("-----1.MySecondFilter  doFilter before ------");
  8.                 chain.doFilter(request, response);
  9.                 System.out.println("-----2.MySecondFilter  doFilter after ------");
  10.         }
  11.         @Override
  12.         public void init(FilterConfig filterConfig) throws ServletException {
  13.         }
  14. }
复制代码
MyThridFilter
  1. public class MyThridFilter implements Filter {
  2.         @Override
  3.         public void destroy() {
  4.         }
  5.         @Override
  6.         public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)throws IOException, ServletException {
  7.                 System.out.println("-----3.MyThridFilter doFilter before ------");
  8.                 chain.doFilter(request, response);
  9.                 System.out.println("-----4.MyThridFilter doFilter after ------");
  10.         }
  11.         @Override
  12.         public void init(FilterConfig filterConfig) throws ServletException {
  13.         }
  14. }
复制代码
filterTarget.jsp
  1. <%@ page language="java" contentType="text/html; charset=UTF-8"
  2.     pageEncoding="UTF-8"%>
  3. <!DOCTYPE html>
  4. <html>
  5. <head>
  6. <meta charset="UTF-8">
  7. <title>Insert title here</title>
  8. </head>
  9. <body>
  10.         <%
  11.                 System.out.println("-----5.Filter Target Page-----");
  12.         %>
  13.         <h2>Filter Target Page</h2>
  14. </body>
  15. </html>
复制代码
web.xml
  1. <filter>
  2.     <filter-name>mySecondFilter</filter-name>
  3.     <filter-class>com.kgc.filter.MySecondFilter</filter-class>
  4. </filter>
  5. <filter-mapping>
  6.     <filter-name>mySecondFilter</filter-name>
  7.     <url-pattern>/web3filter01/filterTarget.jsp</url-pattern>
  8. </filter-mapping>
  9. <filter>
  10.     <filter-name>myThridFilter</filter-name>
  11.     <filter-class>com.kgc.filter.MyThridFilter</filter-class>
  12. </filter>
  13. <filter-mapping>
  14.     <filter-name>myThridFilter</filter-name>
  15.     <url-pattern>/web3filter01/filterTarget.jsp</url-pattern>
  16. </filter-mapping>
复制代码
运行结果顺序:
  1. //执行顺序
  2. -----1.MySecondFilter  doFilter before ----
  3. -----3.MyThridFilter doFilter before ------
  4. -----5.Filter Target Page-----
  5. -----4.MyThridFilter doFilter after -------
  6. -----2.MySecondFilter  doFilter after ------
复制代码
5.5 编码过滤器
  1. @Override
  2. public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
  3.     throws IOException, ServletException {
  4.     //this.encoding 编码名可以存放在过滤器初始化参数中,通过filterConfig.getInitParameter("encoding");获取
  5.     //poet请求乱码处理
  6.     request.setCharacterEncoding(this.encoding);
  7.     //响应编码
  8.     response.setContentType("text/html; charset=UTF-8");
  9.     response.setCharacterEncoding(this.encoding);
  10.     //请求放行
  11.     chain.doFilter(request, response);
  12. }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4