欢迎光临散文网 会员登陆 & 注册

Java三十四篇: 回顾Servlet

2023-03-08 23:00 作者:小刘Java之路  | 我要投稿

什么是Servlet?

  • Servlet 是 JavaWeb 的三大组件之一,它属于动态资源,Servlet 的作用是处理请求,服务器会把接收到的请求给 Servlet 处理,在 Servlet 中需要

    • 接收请求数据

    • 处理请求

    • 完成响应

每个 Servlet 是唯一的,它们处理的请求时不同的。

二、Servlet接口介绍

  • 概念:javaweb程序开发,项目就是一个java应用程序,用sun公司提供的接口Servlet,只要实现里面的一些接口,并按照规则把接口中的代码写完,就是一个javaweb项目。

  • 如果要完成一个javaweb项目的开发

    • 编写一个Java类,让这个java类实现Servlet接口。

    • 将编写好的javaweb项目放置到web服务器中

实现Servlet的方式

实现 Servlet 有三种方式:

  • 实现 java.servlet.Servlet 接口

  • 继承 javax.servlet.GenericServlet 类

  • 继承 javax.servletHttpServlet 类

查看源码

img

spring家族底层都是封装了大量的servlet

package com.zhsj;

import javax.servlet.*;
import java.io.IOException;

/**
* @program: test
* @description: Servlet 中的方法大多由 Tomcat 调用,Servlet 的对象也是有 Tomcat 生成
*  导入了依赖:tomcat-embed-core:9.0.56
* @author: liulq
*
*/
publicclass Test2 implements Servlet {

       /**
        * 它是生命周期方法
        * 它会在 Servlet 对象创建之后马上执行,并执行一次(出生之后)
        * */
       @Override
       public void init(ServletConfig servletConfig) throws ServletException {
           System.out.println("init");
       }

       /**
        * 可以获取 Servlet 的配置信息
        * */
       @Override
       public ServletConfig getServletConfig() {
           System.out.println("getServletConfig");
           returnnull;
       }

       /**
        * 它是声明周期方法
        * 它会被调用多次,每次请求都是调用这个方法
        * */
       @Override
       public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
           System.out.println("service");
       }

       /**
        * 获取 Servlet 的信息
        * */
       @Override
       public String getServletInfo() {
           System.out.println("getServletInfo");
           return"Hello  World";
       }

       /**
        * 它是声明周期方法
        * 它会在 Servlet 被销毁之前调用,并且只会调用一次
        * */
       @Override
       public void destroy() {
           System.out.println("destroy");

       }
}

说明:

  • 编写一个Servlet实现类必须去实现Servlet的实现

    • Servlet接口,根据Servlet的API知道,Servlet存在3个生命周期的方法

    • init():用于初始化的方法,没有特殊代码处理的时候,发送请求的时候执行该方法

    • service():用于处理请求和响应的方法,程序员编写代码的部分。

    • destroy():销毁的方法,如果没有特殊代码处理,关闭服务器的时候销毁。

    • Servlet接口中,也提供了获取Servlet初始化信息的方法

    • getServletConfig();重点,该方法主要能够得到一个ServletConfig对象。

    • getServletInfo():只能获取Servlet版本号等信息。一般不用。

    • Servlet的API中,提到了在程序员编写Servlet的时候,实际上不需要实现Servlet接口,可以选择继承genericServlet或者HttpServlet

    • 说明:虽然这两个类都是可以实现一个Servlet程序开发的,但是从API上可以看到,实际HttpServlet是GenericServlet的子类,因此,推荐使用HttpServlet

例子:

1、创建一个javaweb 的项目

目录结构:

img
img

2、编程servlet代码

package com.woniuxy.demo;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.OutputStream;

/**
* @program: test
* @description:
* @author: liulq
* @create:
*/
publicclass ServletDemo2 extends HttpServlet {

   @Override
   protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
       doPost(request,response);
   }

   /*
    *
    * <p>Title: doPost</p>
    * <p>Description: </p>
    * @param request 请求对象 获取浏览器向服务器发送的数据
    * @param response 响应对象 将服务器的数据发送给浏览器
    * @throws ServletException
    * @throws IOException
    * @see javax.servlet.http.HttpServlet#doPost(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
    */
   @Override
   protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
       System.out.println("请求成功");

       //由服务器给浏览器写出数据
       OutputStream out = response.getOutputStream();
       out.write("abc".getBytes());
       //关闭资源
       out.close();
   }
}

3、编写web.xml映射的代码

 <!-- 配置ServletDemo2的映射 -->
 <servlet>
   <servlet-name>ServletDemo2</servlet-name>
   <servlet-class>com.woniuxy.demo.ServletDemo2</servlet-class>
 </servlet>
 <!-- 映射配置 -->
 <servlet-mapping>
   <servlet-name>ServletDemo2</servlet-name>
   <url-pattern>/demo2</url-pattern>
 </servlet-mapping>

4、启动tomcat,测试请求demo

img

Servlet流程及原理

浏览器请求之后解析的步骤:

  • 浏览器发出请求,链接服务器

  • 发送http请求:http://localhost:8080/WebDemo2/demo2;

  • 解析出来IP地址

  • 解析出来端口号

  • 解析出来web应用程序

  • 解析出来请求访问的资源文件

  • 创建Servlet对象,并用init初始化Servlet对象

  • 调用Service方法或者别拆分出来的doxxx()方法。

  • 关闭服务器的时候,销毁Servlet对象,调用destroy方法

Servlet对象的生命周期

  • 实现Servlet接口或者继承HttpServlet,该类所在的工程为一个web应用程序,该程序需要放到服务器里面,当服务器一旦开启,那么服务器会自动的在容器中创建一个Servlet对象。

  • 当发送第一条请求的时候,会调用init方法进行初始化Servlet对象。后续请求将不再初始化

  • 每一次调用service方法或者doGet方法或者doPost方法之前,都需要使用Servlet对象创建独立的HttpServletRequest对象和HttpServletResponse对象。

  • 调用service方法或者对应的doXXX()方法处理请求响应。

  • 当服务器关闭的时候,销毁Servlet对象。

web中的其他重要的对象

ServletConfig对象

  • 作用:获取配置文件(web.xml)中的参数,一些数据可以先配置在web.xml文件中,由ServletConfig对象进行获取,在servlet接口中提供了有参的init方法,参数为ServletConfig对象,在初始化Servlet对象的时候,会调用init方法,在这个时候,web服务器会自动将web.xml里面的参数加载到ServletConfig对象。并且同时将ServletConfig对象交给Servlet对象。

ServletContext对象

  • 一个web容器里面,只有一个ServletContext对象,获取ServletContext对象有两种方式

    • 方式1:通过ServletConfig对象中的getServeltContext()方法来获取ServletContext对象

ServletContext context = this.getServletConfig().getServletContext();

  • 方式2:可以直接通过Servlet对象中的getServletContext()方法来获取ServletConext对象,推荐方式。

ServletContext context = this.getServletContext();

Servlet的第一个作用:实现各个Servlet类中的数据共享

  • 获取全局的配置文件值

  • 读取配置文件

Response对象(相应)

  • 当服务器接收到了请求之后,会执行doPost或者doGet方法,执行完之后会给浏览器反馈数据,完成反馈数据的对象就是response,该对象不需要程序员自己创建。

Request对象 (请求)

  • 当浏览器向服务器发送请求之后,服务器会接受到来自浏览器的数据(用户填写的数据、请求头数据和请求的数据),request是完成前端数据交给服务器的对象

总结:

  • 1.servlet是Javaweb 的三大组件之一,是很多框架的底层,如果需要知道底层怎么实现的那必须知道servlet

  • 2.实现 Servlet 有三种方式:

    • 实现 java.servlet.Servlet 接口

    • 继承 javax.servlet.GenericServlet 类

    • 继承 javax.servletHttpServlet 类

  • 3.servletContext对象、ServletCofig对象、Reponse对象、Request对象还是很重要的,要有一定的认识


                           


Java三十四篇: 回顾Servlet的评论 (共 条)

分享到微博请遵守国家法律