Web后端—Servlet

01-简单认识

  • Servlet 是基于 Java 技术的 web 组件,是连接 web 服务器和服务端Java 程序的协议,是一种通信规范。

    Servlet 用于生成动态内容,根据客户端提交的请求,调用服务器端相关 Java 代码来完成对请求的处理和运算。

    客户端通过 Servlet 容器实现请求/应答模型与 Servlet 交互。

    像其他基于 Java 的组件一样,Servlet也是基于平台无关的Java类格式,被编译为与平台无关的字节码

    Servlet是 Java EE 平台的一部分。

    Servlet的设计模式是单例模式

  • Servlet接口:Java Servlet API的核心抽象。目前有 GenericServlet 和 HttpServlet 这两个类实现了该接口,大多数情况下,开发者只需要继承 HttpServlet 去实现自己的Servlet。

  • Servlet容器:web server 或 application server 的一部分,提供基于请求/响应模型的网络服务,解码基于MIME请求,格式化基于MIME的响应,也包含管理Servlet生命周期。

  • Servlet生命周期:三个阶段–Init、Service、Destroy

    Servlet对象的创建:执行无参构造器,首次请求时执行,只能执行一次。

    1. Servlet对象的初始化:执行init(),首次请求时执行,只能执行一次。
    2. Servlet对象的服务执行:执行service(),每次请求时执行,可以执行多次。
    3. Servlet对象的销毁:执行destroy(),应用停止时执行,只能执行一次。
  • 如何创建一个Servlet类(就eclipse而言)

    1. 创建一个Dynamic Web Project,勾选Generate web.xml…
    2. 项目必须加入ServerRuntime,并配置好Servlet容器,build path
    3. 写一个类继承HttpServlet,并实现doGet或doPost方法
    4. 在项目的web.xml中配置Servlet映射

02-Servlet核心

  • 接收请求参数

    1. 请求参数是以Map集合的形式接受的,该Map集合为Map<String,String[]>

    2. 相关方法:

      方法名作用
      getParameter(String name)获取指定参数name的
      getParameterValues(String name)获取指定参数name的所有值
      getParameterMap()获取存放请求参数的Map
      getParameterNames()获取所有请求参数的名称
  • 域属性空间

    1. 一次请求对应一个请求对象

    2. 一个请求对象对应一个域属性空间(域属性空间不共享)

    3. 域属性(成员属性)空间范围的对比:

      域属性空间名空间范围
      HttpServletRequest请求范围,可完成跨Servlet共享数据(Servlet必须在同一请求中)
      HttpSession会话范围,可完成跨请求共享数据
      ServletContext/Application应用范围,可完成跨会话共享数据
    4. 域属性空间的使用原则:在不影响功能的基础上优先使用小范围的域属性空间。

    5. 域属性空间的相关方法

      方法名作用
      getAttribute(String name)获取请求中指定的域属性
      getAttributeNames()获取请求中所有的域属性名称
      setAttribute(String name,String value)设置请求中指定的域属性
      removeAttribute(String name,String value)删除请求中指定的域属性
    6. 其他方法整理:

      方法名作用
      getRequestURL()返回StringBuffer,获取请求的URL,即绝对路径(从请求协议开始)
      getRequestURI()返回String,获取请求的URI,即相对路径(从项目名称开始)
      getContextPath()返回String,获取当前web应用的根路径
      getServletPath()返回String,获取请求路径与匹配路径的精确部分
      getPathInfo()返回String,获取请求路径与匹配路径的非精确部分
      getMethod()返回String,获取请求的提交方式
      getRemoteAddr()返回String,获取客户端IP

03-doGet和doPost方法

  • Get方式:

    1. 获取请求参数:

      request.getParameter(parameterName);

    2. 响应请求:向客户端返回内容

      response.getWriter().write(parameterValue);

  • Post方式:

    1. request.getParameter(parameterName);
    2. request.getAttribute(parameterName, parameterValue);

04-前后端分离

利用AJAX与Servlet 进行JSON格式数据交互,实现前后端分离。前端使用 HTML ,其中大部分使用 JavaScript 、AJAX,后端使用 Servlet 。

Servlet 就是用 Java 编写服务器端程序,主要功能在于交互式地浏览和修改数据,生成动态地Web内容。

Servlet运行在支持 Java 语言地应用服务器(Tomcat)中,理论上讲 Servlet 可以响应任何类型的请求,但是绝大部分情况下 Servlet 只用来扩展基于 HTML 协议的 Web 服务器。

在 Java 中新建 Servlet 类,继承自 HttpServlet ,并且重写 doGet 方法处理 get 请求,重写 doPost 方法处理 post 请求。

Servlet 中通过 write 方法:

PrintWriter out = response.getWriter();

out.write();

输出数据到前端, 前端使用 responseText 接收数据。

通过 println 方法

out.println() ;

输出页面。

05-Filter过滤器的使用

  • Filter是Java的组件,允许运行过程中改变进入资源的请求和资源返回的响应中的有效负载和header信息。

    Filter是一种代码重用的技术,通常不产生响应,不像Servlet一样对请求做出响应,而是修改或调整到资源的请求,或者修改调整来自资源的响应。

    Filter可以作用于动态或静态内容。

  • 供开发者使用的Filter功能:

    1. 在执行请求前访问资源
    2. 在执行请求前处理资源的请求
    3. 用请求对象的自定义版本包装请求,对请求的header和数据进行修改
    4. 用响应对象的自定义版本包装响应,对响应的header和数据进行修改
    5. 拦截资源调用之后的再调用
    6. 作用在Servlet,一组Servlet或静态内容上的0个、1个或多个拦截器按指定顺序执行
  • Filter用处:常用功能是拦截非法访问和进行编码转换(一般使用UTF-8)

    1. 验证
    2. 日志记录和审计
    3. 图像转换
    4. 数据压缩
    5. 加密
    6. 词法(Tokenizing)
    7. 触发资源访问时间
    8. 缓存

06-Listener监听器的使用

  • 应用事件监听器是实现一个或多个Servlet时间监听器接口的类,更好地控制servletContext、HttpSession、ServletRequest地生命周期。
  • 常用Listener:
    1. l Servlet事件监听器支持在ServletContext、HttpSession和ServletRequest状态改变时进行事件通知。
    2. ServletContextListener:用来管理应用的资源或 JVM 级别持有的状态。
    3. HttpSessionListener:用来管理从相同客户端或用户进入web应用的一系列请求关联的状态或资源。
    4. ServletRequestListener:用来管理整个Servlet请求的生命周期状态。
    5. AsyncListener:用来管理异步事件,例如超时和完成异步处理。

07-请求转发(分派请求)—RequestDispatcher接口

  • 请求转发与重定向不同,它会把请求直接转发给另一个Servlet处理,或者在 response 中包含另一个 servlet 的输出。RequestDispatcher接口提供了一种机制来实现这种功能。

  • 获取:ServletContext中包含了两个方法获取RequestDispatcher:

    1. getRequestDispatcher
    2. getNameDispatcher

    如:RequestDispatcher disp=getServletContext().getRequestDispatcher(“contextpath”);

    同样,对于request对象也能获取RequestDispatcher对象:

    RequestDispatcher disp=request.getRequestDispatcher(“contextpath”);

  • RequestDispatcher的两个方法

    1. include():用于引用另外一个servlet或其他资源一起输出到客户端,表示当前请求已经结束,对客户端进行响应,标准输出流已经开启。

      使用include()的Servlet可以提供对客户端的响应。

    2. forward():将当前的请求转交给另一个servlet或 jsp 来处理,本身的输出被覆盖,表示当前请求尚未结束,标准输出流尚未开启。

      1. 使用include()的Servlet不可以提供对客户端的响应。
  • RequestDispatcher.forward() VS Response.sendRedirect():

    1. forward是由跳转页面直接在服务器端将上下文交付给目标页面,有目标页面来显示内容。
    2. sendRedirect是将页面的地址发给客户端,然后由客户端通过跳转指令重新请求目标页面。
  • 请求转发和重定向都是请求跳转的两种方式

请求转发重定向
服务器内跳转服务器外跳转
一次请求一次相应多次请求多次响应
直接获取数据通过重定向的路径获取数据
地址栏显示用户提交的请求路径重定向的路径(防止表单重复提交)
请求的跳转范围限定于本应用请求的跳转范围不限定于本应用
  • 当出现以下几种情况时,优先选择使用重定向:
    1. 需要跳转到其他应用
    2. 处理表单数据的Servlet需要跳转到其他Servlet
    3. Servlet消耗大量服务器资源
Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐