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>
<!-- servlet应用程序的别名 -->
<servlet-name>helloServlet</servlet-name>
<!-- servlet应用程序的全类名 -->
<servlet-class>com.kgc.servlet.HelloServlet</servlet-class>
</servlet> <!-- 映射第一个servlet应用程序 -->
<servlet-mapping>
<servlet-name>helloServlet</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>

3.2 模糊映射

 <servlet-mapping>
<servlet-name>helloServlet</servlet-name>
<!-- 匹配方法 前匹配 /user/* 等等 -->
<!-- <url-pattern>/*</url-pattern> -->
<!-- 匹配方法 后匹配 -->
<!--<url-pattern>*.do</url-pattern>-->
<!-- 不能 /*.xx 两种一起使用 -->
</servlet-mapping>

3.3 初始化参数

3.3.1 单个servlet内部初始化参数

 <servlet>
<servlet-name>helloServlet</servlet-name>
<servlet-class>com.kgc.servlet.HelloServlet</servlet-class>
<!-- 指定servlet内部初始化参数,必须在load-on-startup之前 -->
<init-param>
<param-name>key</param-name>
<param-value>value</param-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>1</load-on-startup>

3.3.6 欢迎页面

<!-- 欢迎页面可以设计多个,在web.xml中越靠上优先级越高 -->
<welcome-file-list>
<welcome-file>login.html</welcome-file>
</welcome-file-list>

3.3.7错误页面

<error-page>
<error-code>404</error-code>
<location>/404.jsp</location>
</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 注册与映射

<!-- 注册过滤器first:配置内容和servlet基本一样,就是标签不一样 -->
<filter>
<filter-name>myFirstFilter</filter-name>
<filter-class>com.kgc.filter.MyFirstFilter</filter-class>
</filter>
<!-- 过滤器first映射 -->
<filter-mapping>
<filter-name>myFirstFilter</filter-name>
<url-pattern>/filter01.jsp</url-pattern>
<!-- filter的映射也可以模糊匹配 /* 等等 -->
</filter-mapping>

5.3 filter 的初始化参数

<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-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"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
System.out.println("-----5.Filter Target Page-----");
%>
<h2>Filter Target Page</h2>
</body>
</html>

web.xml

<!-- second -->
<filter>
<filter-name>mySecondFilter</filter-name>
<filter-class>com.kgc.filter.MySecondFilter</filter-class>
</filter> <filter-mapping>
<filter-name>mySecondFilter</filter-name>
<url-pattern>/web3filter01/filterTarget.jsp</url-pattern>
</filter-mapping> <!-- third -->
<filter>
<filter-name>myThridFilter</filter-name>
<filter-class>com.kgc.filter.MyThridFilter</filter-class>
</filter> <filter-mapping>
<filter-name>myThridFilter</filter-name>
<url-pattern>/web3filter01/filterTarget.jsp</url-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);
}

Javaweb03-servlet&filter的更多相关文章

  1. servlet/filter/listener/interceptor区别与联系

    转自:http://www.cnblogs.com/doit8791/p/4209442.html servlet.filter.listener是配置到web.xml中(web.xml 的加载顺序是 ...

  2. java Servlet Filter 拦截Ajax请求

    /** * 版权:Copyright 2016-2016 AudaqueTech. Co. Ltd. All Rights Reserved. * 描述: * 创建人:赵巍 * 创建时间:2016年1 ...

  3. Java-maven异常-cannot be cast to javax.servlet.Filter 报错, 原因servlet-api.jar冲突

    使用maven开发web应用程序, 启动的时候报错: jar not loaded. See Servlet Spec . Offending class: javax/servlet/Servlet ...

  4. 理解Servlet过滤器 (javax.servlet.Filter)

    过滤器(Filter)的概念 过滤器位于客户端和web应用程序之间,用于检查和修改两者之间流过的请求和响应. 在请求到达Servlet/JSP之前,过滤器截获请求. 在响应送给客户端之前,过滤器截获响 ...

  5. 使用Servlet Filter做Login checking

    1) 建一个Login Servlet: Login.java package com.my; import java.io.*; import javax.servlet.*; import jav ...

  6. Servlet Filter 2

    10.Filter常见应用 )统一全站字符编码的过滤器 通过配置参数encoding指明使用何种字符编码,以处理Html Form请求参数的中文问题 案例:编写jsp 输入用户名,在Servlet中获 ...

  7. Servlet Filter 1

    1.Filter简介 )Filter也称之为过滤器,它是Servlet技术中最实用的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图 ...

  8. Java Servlet Filter(转)

    做web开发的人对于Filter应该不会陌生,一直在很简单的使用,但是一直没有系统的总结一下,随着年纪的慢慢长大,喜欢总结一些事情,下面说说我对Filter的理解,官方给出的Filter的定义是在请求 ...

  9. JavaWeb三大组件(Servlet,Filter,Listener 自己整理,初学者可以借鉴一下)

    JavaWeb三大组件(Servlet,Filter,Listener 自己整理,初学者可以借鉴一下) Reference

  10. java.lang.ClassCastException: org.springframework.web.filter.CharacterEncodingFilter cannot be cast to javax.servlet.Filter

    java.lang.ClassCastException: org.springframework.web.filter.CharacterEncodingFilter cannot be cast ...

随机推荐

  1. linux篇-linux mysql5.6.27源码安装和错误解决

    centos mysql5.6.27 1编译安装 先进入到文件放置的路径下 创建一个个文件 #mkdir–p /data/mysql/mysql #mkdir–p /data/mysql/mysqld ...

  2. 安装Tomcat到Linux(源码)

    运行环境 系统版本:CentOS Linux release 7.3.1611 软件版本:Tomcat-9.0.11 硬件要求:无 安装过程 1.安装YUM-EPEL存储库 YUM-EPEL存储库由E ...

  3. linux系统下文件误删除该如何恢复?

    一.linux误删除数据的场景 在实际的工作中,朋友们可能会将linux服务器上的文件不小心误删除掉了.而且越是资历老的工程师越容易犯这样的错误,敲代码的速度也是够快,啪啪rm -rf一个回车,然后就 ...

  4. vue大型电商项目尚品汇(前台篇)day04

    这几天一直都在做项目,只是没有上传上来,即将把前台项目完结了.现在开始更新整个前台的部分 一.面包屑处理 1.分类操作 点击三级联动进入搜索产生面包屑,直接取参数中的name即可 点击x怎么干掉这个面 ...

  5. 基于PYQT5的截图翻译工具

    基于PYQT5的截图翻译工具 功能介绍 翻译功能 截图功能(快捷键 + 截图存储到剪切板中) 文字识别OCR(基于百度API的文字识别) UI 界面 截图 截图可以使用第三方截图 或 使用PyQt5截 ...

  6. Eclipse For Java开发环境部署

    Eclipse For Java开发环境部署 1.准备工作 jdk安装包 jdk官网下载 Eclipse安装包 Eclipse官网下载 Eclipse下载时选择图中所示的国内镜像地址下载 下载后的文件 ...

  7. Java-SpringBoot-使用多态给项目解耦

    Java-SpringBoot-使用多态给项目解耦 提及 今天在打算维护一下智慧社区这个项目的时候,想到项目是使用Satoken这个开箱即用的授权和认证的组件,因为在项目开启的时候对SpringSec ...

  8. 基于开源流程引擎开发BPM或OA有哪些难点

    前言     如何基于开源流程引擎开发OA系统?开源流程引擎哪个好?把它整合到自己的产品里难不难,有没有啥风险?这是大家经常遇到的问题.笔者从2006年开始参与流程引擎开发,经历了三代流程引擎研发,支 ...

  9. 《原CSharp》第二回 巧习得元素分类 子不知怀璧其罪

    第二回 巧习得元素分类 子不知怀璧其罪 ===================================================================== 云溪父亲见状看了看云 ...

  10. java中的方法重载(overload)

    什么时候方法重载:当两个方法的功能是相似的,可以考虑使用方法重载.若两个方法根本没有关系,无必要使用方法重载. 什么时候代码会发生方法重载:三个条件:1,在同一个类中.2,方法名相同.3,参数列表相同 ...