Servlet 是运行在Web服务器端的Java程序,它使用Java语言编写,与Java程序的区别是Servlet对象主要封装了对HTTP请求的处理,并且它的运行需要Servlet容器的支持,在Java Web应用方面,Servlet的应用占有十分重要的地位,它在Web请求的处理功能也非常强大。
 

Servlet与JSP的区别:

        1.角色不同:JSP页面可以存在HTML代码和Java代码并存的情况,而Servlet需要承担客户请求和业务处
    理的中间角色,只有调用固定的方法才能将动态内容输出为静态的HTML,所以JSP更具有显示层角色;
        2.编译时间不同:Servlet需要在Java编译器编译后才能运行,如果它在编写完成或修改后没有重新编译
    就不能运行在Web容器中。而JSP由JSP Container对其进行管理,JSP Container对JSP进行自动编译,不需
    要手动执行编译就可执行;
        3.速度不同:因为Java Container在每次执行不同内容的动态JSP页面时都要对JSP自编译,而Servlet
    在编译之后可以直接获取和输出动态内容,所以JSP的效率比Servlet低。
 

Servlet API常用的接口和类:

1.Servlet接口

   Servlet的运行需要Servlet容器的支持,Servlet容器通过调用Servlet对象提供了标准的API接口对请求进行处理。

  public void init(ServletConfig config)  初始化工作
  public void service(ServletRequest request, ServletResponse reponse)  处理客户端请求
  public void destroy()  当Servlet对象从Servlet容器移除时,释放资源
  public ServletConfig getServletConfig()  用于获取Servlet对象的配置信息,返回ServletConfig对象
  public String getServletInfo()  返回有关Servlet的信息,如作者版本等
  

2.ServletConfig接口

     ServletConfig接口位于javax.servlet包中,它封装了Servlet的配置信息,在Servlet初始化期间被传递。每一个Servlet对象都有且只有一个ServletConfig对象。
 
   public String getInitParameter(String name)  返回名称为name的初始化参数的值
   public Enumeration getInitParameterNames()  获取所有初始化参数名的枚举集合
   public ServletContext getServletContext()  获取Servlet上下文对象
   public String getServletName()   返回Servlet对象的实例名
 

3.HttpServletRequest接口

     该接口位于javax.servlet.http包中,继承了javax.servlet.ServletRequest接口。
 
   public String getContextPath()  返回请求的上下文路径,以“/”开头
   public Cookie[] getCookies()  返回请求中发送的所有Cookie对象
   public String getMethod()  返回请求所使用的HTTP类型,如“get, post”
   ...

4.HttpServletResponse接口

 
   public void addCookie(Cookie cookie)  向客户端写入Cookie
   ...
 

5.GenericServlet类

    抽象类,分别实现了Servlet和ServletConfig类的接口。但需要实现service()。

6.HttpServlet类

    抽象类,继承了GenericServlet类,实现了service()。最为方便。
 

Servlet创建:

  在Eclipse中新建一个Web项目,在创建项目过程中点击下一步勾选Generate web.xml

之后在src目录下创建包,然后创建Servlet类

  

创建Servlet有两种方法:

    1.创建一个普通的java类,使其继承HttpServlet类,然后再手动配置web.xml文件(位置见上图)注册Servlet对象。

      Servlet配置:

声明Servlet对象:

<servlet>
<servlet-name>MyServlet</servlet-name> //指定Servlet名称,可自定义
<servlet-class>ServletSrc.AddServlet</servlet-class> //指定Servlet对象的完整位置,包含Servlet对象的包名和类名
</servlet>

映射Servlet:

<servlet-mapping>
<servlet-name>MyServlet</servlet-name> //与上面的Servlet name对应,不可随意命名
<url-pattern>/MyServlet</url-pattern> //用于映射访问URL(反映在网页地址栏中)
</servlet-mapping>
    2.直接在Eclipse中右击包创建Servlet类
  它会在类声明之前自动添加注释:@WebServlet(“这里面有众多属性可设置”)   使用该注释就无需对web.xml修改。同样的还有@WebFilter()、@WebListener、@WebInitParam
 
Servlet代码结构:
  通常Servlet是指HttpServlet对象,在声明一个对象为Servlet时,需要继承HttpServlet类。HttpServlet类是Servlet接口的一个实现类,继承该类后,可重写HttpServlet类中的方法对HTTP请求进行处理。
 

Servlet过滤器

  Servlet过滤器具有拦截客户端请求的功能,它可以改变请求中的内容来满足实际需求。如果一个不够用还可以设置多个形成一个过滤链。
  Servlet过滤器对象放在 java.servlet包中,名称为Filter,除此以外还有FilterConfig对象和FilterChain对象。
  

Filter接口:

  每个过滤器对象都要实现该接口。
public void init(FilterConfig filterConfig) throws ServletException  初始化方法
public void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws IOEException,ServletException 对请求进行过滤操作
public void destroy()  销毁方法,释放资源
  

FilterConfig接口:

  由Servlet容器实现,主要用于获取过滤器的配置信息。
public String getFilterName()  用于获取过滤器的名字
public ServletContext getServletContext()  获取Servlet上下文
public String getInitParameter(String name)  获取过滤器的初始化参数值
public Enumeration getInitParameterNames()  获取过滤器的所有初始化参数
 

FilterChain接口:

  也有Servlet容器实现。
public void doFilter(ServletRequest request, ServletResponse response) throws IOException,ServletException
  该方法用于将过滤后的请求传递给下一个过滤器,如果此过滤器是最后一个,则将请求传递给目标资源
 

Filter创建

  和Servlet一样,如果手动配置需要在web.xml中配置过滤器:
<filter>  //规则和Servlet一致
<filter-name>MyFilter</filter-name>
<filter-class>FilterSrc.CharactorFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>MyFilter</filter-name>
<url-pattern>/MyFilter</url-pattern>
</filter-mapping>

  也可以使用自动生成的@WebFilter().

Filter实例:

1.过滤敏感字符

  WordFilter.java

package com;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.annotation.WebInitParam;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper; @WebFilter(filterName="/CharactorFilter",value = {"/*"},initParams= {@WebInitParam(name="encoding",value="UTF-8")} )
public class WordFilter implements Filter {
// 非法字符数组
private String words[];
// 字符编码
private String encoding;
// 实现Filter接口init()方法
@Override
public void init(FilterConfig filterConfig) throws ServletException {
// 获取字符编码
encoding = filterConfig.getInitParameter("encoding");
// 初始化非法字符数组
words = new String[]{"糟糕","混蛋"};
}
// 实现Filter接口doFilter()方法
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
// 判断字符编码是否有效
if (encoding != null) {
// 设置request字符编码
request.setCharacterEncoding(encoding);
// 将request转换为重写后的Request对象
request = new Request((HttpServletRequest) request);
// 设置response字符编码
response.setContentType("text/html; charset="+encoding);
}
chain.doFilter(request, response);
}
// 实现Filter接口destroy()方法
@Override
public void destroy() {
this.words = null;
this.encoding = null;
}
/**
* 内部类重写HttpServletRequestWrapper*/
class Request extends HttpServletRequestWrapper{
// 构造方法
public Request(HttpServletRequest request) {
super(request);
}
// 重写getParameter()方法
@Override
public String getParameter(String name) {
// 返回过滤后的参数值
return filter(super.getRequest().getParameter(name));
}
// 重写getParameterValues()方法
@Override
public String[] getParameterValues(String name) {
// 获取所有参数值
String[] values = super.getRequest().getParameterValues(name);
// 通过循环对所有参数值进行过滤
for (int i = 0; i < values.length; i++) {
values[i] = filter(values[i]);
}
// 返回过滤后的参数值
return values;
}
}
/**
* 过滤非法字符
* @param param 参数值
* @return 过滤后的参数值
*/
public String filter(String param){
try {
// 判断非法字符是否被初始化
if(words != null && words.length > 0){
// 循环替换非法字符
for (int i = 0; i < words.length; i++) {
// 判断是否包含非法字符
if(param.indexOf(words[i]) != -1){
// 将非法字符替换为"****"
param = param.replaceAll(words[i], "****");
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
return param;
}
}

  AddServlet.java  

package com;

import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; /**
* Servlet implementation class AddServlet
*/
@WebServlet("/AddServlet")
public class AddServlet extends HttpServlet {
private static final long serialVersionUID = 1L; /**
* @see HttpServlet#HttpServlet()
*/
public AddServlet() {
super();
// TODO Auto-generated constructor stub
} /**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
response.getWriter().append("Served at: ").append(request.getContextPath());
} /**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
PrintWriter out = response.getWriter();
String string = request.getParameter("string");
out.print("输入成功123<br>"+string);
out.flush();
out.close();
doGet(request, response);
} }

  index.html

<!DOCTYPE html>
<html>
<head>
<meta charset="GB2312">
<title>非法字符过滤</title>
</head>
<body>
<h2>非法字符过滤</h2>
<form action="AddServlet" method="post">
<input type="text" name="string">
<input type="submit" value="提交">
</form>
</body>
</html>

  效果:

                         

Servlet监听器

  监听器的作用是监听web容器的有效时间,利用Listener接口监听在容器中的某个执行程序,并且根据其应用程序的需求做出适当的响应。

1.Servlet上下文监听

1.ServletContextListener接口

2.ServletAttributeListener接口

2.HTTP会话监听

1.HttpSessionListener接口

2.HttpSessionActivactionListener接口

3.HttpBindingListener接口

4.HttpSessionAttributeListener接口

3.Servlet请求监听

1.ServletRequestListener接口

2.ServletRequestAttributeListener接口

  

文件上传

 
 
 
 
 

6.Servlet、Filter过滤器以及监听器的更多相关文章

  1. 面试之servlet、过滤器、监听器

    servlet.过滤器.监听器servlet是Java中WEB请求和响应的容器servlet的运行需要在类似tomcat容器中,一个 Web 应用对应一个 Context 容器,也就是 Servlet ...

  2. 动手学servlet(六) 过滤器和监听器

     过滤器(Filter) 过滤器是在客户端和请求资源之间,起一个过滤的作用,举个例子,比如我们要请求admin文件夹下的index.jsp这个页面,那么我们可以用一个过滤器,判断登录用户是不是管理员 ...

  3. servlet,过滤器,监听器,拦截器的区别

    一.目录 1.概念 2.生命周期 3.职责 4.执行过程 二.内容 概念 1.servlet:servlet是一种运行服务器端的java应用程序,具有独立于平台和协议的特性, 可以动态生成web页面它 ...

  4. 面试题:filter过滤器 listener 监听器 案例有点用

    1.Filter工作原理(执行流程) 当客户端发出Web资源的请求时,Web服务器根据应用程序配置文件设置的过滤规则进行检查,若客户请求满足过滤规则,则对客户请求/响应进行拦截,对请求头和请求数据进行 ...

  5. SpringBoot09 自定义servlet、注册自定义的servlet、过滤器、监听器、拦截器、切面、webmvcconfigureradapter过时问题

    1 servlet简介 servlet是一种用于开发动态web资源的技术 参考博客:servlet基础知识     httpservlet详解 2 在springboot应用中添加servlet sp ...

  6. Servlet,过滤器和监听器的配置和使用

    一.什么是Servlet Servlet使用Java语言实现的程序,运行于支持Java语言的Web服务器或者应用服务器中.Servlet先于JSP出现,提供和客户端动态交互的功能.Servlet可以处 ...

  7. SpringBoot自定义servlet、注册自定义的servlet、过滤器、监听器、拦截器、切面、webmvcconfigureradapter过时问题

    [转]https://www.cnblogs.com/NeverCtrl-C/p/8191920.html 1 servlet简介 servlet是一种用于开发动态web资源的技术 参考博客:serv ...

  8. servlet、过滤器、监听器、拦截器之间的关系和区别

    一.概念 1.什么是servlet servlet是一个接口.定义了一套处理网络请求的规范,所有实现servlet的类,都需要实现它那五个方法,其中最主要的是两个生命周期方法 init()和destr ...

  9. Servlet Filter 过滤器

    Filter也称之为过滤器,它是Servlet技术中最激动人心的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源: 例如Jsp, Servlet, 静态图片文件或静态 ht ...

随机推荐

  1. python内置函数0-1

    # a=bool(None)# print(a) class Foo: def __repr__(self): return 'bbbbbbb'f = Foo()ret = ascii(f)print ...

  2. java线程的方便调用方式

    一直用java的线程,总感觉写起来阅读或书写起来不是方便,改进之. 实现类: public class Task<R> { private ExecutorService executor ...

  3. jvm GC:垃圾回收的测试与分析

    实验环境: (1)Java版本以及模式: java version "1.8.0_171" Java(TM) SE Runtime Environment (build 1.8.0 ...

  4. JS基础_关系运算符

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  5. STM32F10xxx_Keil中添加的预定义宏

    目录 STM32F10xxx_Keil中添加的预定义宏 更新记录 STM32F10xxx_Keil中添加的预定义宏 更新记录 version status description date autho ...

  6. RedisCluster 添加/删除节点

    一,redis cluster命令行 //集群(cluster) CLUSTER INFO 打印集群的信息 CLUSTER NODES 列出集群当前已知的所有节点(node),以及这些节点的相关信息. ...

  7. StringUtils类API及使用方法详解

    StringUtils类API及使用方法详解 StringUtils方法概览 判空函数 1)StringUtils.isEmpty(String str) 2)StringUtils.isNotEmp ...

  8. 什么是NoSQL,为什么要使用NoSQL?

    详见: https://blog.csdn.net/a909301740/article/details/80149552 https://baike.so.com/doc/5569749-57849 ...

  9. Redis+Sentinel安装与配置

    在这里我们搭建的是一个1主3从的redis+3个哨兵集群的环境,由于是在一台物理机上,所有我们用端口区分. 物理机IP:192.168.0.12 主节点master端口:6301 从节点slave1端 ...

  10. 【异常】postman能够请求成功获取到参数,前端请求的却请求不到

    1 前端联调的时候,反馈自己的参数没有生效,无论传递任何参数都是一样的结果 盯了一下日志发现 postman请求的是   :{"getParameter":{"provi ...