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. Codeforces1263D-Secret Passwords

    题意 给n个字符串,两个字符串之间如果有相同的字符,那么两个就等价,等价关系可以传递,问最后有多少个等价类. 分析 考虑并查集或者dfs联通块,如果是并查集的话,对于当前字符串的某个字符,肯定要和这个 ...

  2. 怎样在 Vue 中使用 v-model 处理表单?

    主要是通过 v-model 对表单元素做数据的 双向绑定. 用法其实也很简单, 只是因为表单元素有不同类型, 处理方式有些许不同, 这点需要注意. 1. 如果是 输入框 , 可以直接使用 v-mode ...

  3. stuff拼接字符串

    stuff stuff(param1,startIndex,length,param2) 说明:将param1中自startIndex(SQL中都是从1开始,而非0)起,删除length个字符,然后用 ...

  4. 如何为 esp32 编译和配置及烧写 MicroPython 固件。

    MicroPython 在 esp-idf (esp32) 上编译固件 esp32 编译 micropython 的固件相关的资料应该很多吧,我也会出一篇,但会额外讲一些 linux 的东西的. 资料 ...

  5. work mark

    <detection name="tracking" open="1" shape="rect" rect="(608,16 ...

  6. Java 实现 海康摄像头抓拍图像 Windows、Linux

    先抱怨一下,打死都想不到,海康的摄像头SDK居然是一个Java类,还有必须的两个jar包(jna.jar,examples.jar).鬼能想得到会这么命名. 下面开始吧. Windows 把从官网下载 ...

  7. day10 mysql常用操作

    一. 目录 1.mysql的简介 2.增删改查操作 3.单表查询 4.多表查询常见的三种方式 5.pymysql模块操作数据库 二. 内容 一.mysql的简介  概述:mysql是一个关系型数据库, ...

  8. 创建LEANGOO项目

    转自:https://www.leangoo.com/leangoo_guide/leangoo_guide_create_project.html#toggle-id-3 一个项目包括多个看板和多名 ...

  9. Asp.Net Server.MapPath()用法

    做了一个上传文件的功能 本地测试没问题 部署到服务器之后 一直报错 由于 某些历史原因 看不到错误信息 最后发现是路径的问题 其实这么简单的问题 最早该想到的 ...... Server.MapPat ...

  10. 第十章、typing模块

    目录 第十章.typing模块 一.说明 二.typing模块的作用 三.使用typing模块 四.typing常用类型 第十章.typing模块 一.说明 二.typing模块的作用 类型检查,防止 ...