Servlet原理及用法解析

本文详细探讨了Servlet的原理,包括Servlet处理浏览器请求的三步过程、Tomcat与Servlet的关系,以及Servlet的生命周期。同时,解释了为什么GenericServlet类中有两个init方法,并介绍了ServletConfig、ServletContext、request和response四个关键对象的功能。最后,文章还涵盖了Servlet的实际应用,如HTTP、Servlet和XML部分。
摘要由CSDN通过智能技术生成

1.Servlet原理

不管servlet和http怎么交互,实际上我们要知道sevlet只是java中的一个接口,和普通的java接口没什么区别,他只是规定了处理http请求和响应的规范。

狭义的Servlet是指Java语言实现的一个接口,广义的Servlet是指任何实现了这个Servlet接口的类

1.1 Servlet处理浏览器请求过程

在这里插入图片描述
完整过程包括以下三个步骤

  1. 客户端发送请求至服务器
  2. 服务器启动并调用Servlet,Servlet根据客户端请求生成响应内容并将其传给服务器
  3. 服务器将响应返回客户端

1.2 tomcat和servlet关系

Tomcat 是Web应用服务器,是一个Servlet/JSP容器. Tomcat 作为Servlet容器,负责处理客户请求,把请求传送给Servlet,并将Servlet的响应传送回给客户。
在这里插入图片描述

  1. Tomcat将http请求文本接收并解析,然后封装成HttpServletRequest类型的request对象,所有的HTTP头数据读可以通过request对象调用对应的方法查询到。

  2. Tomcat同时会要响应的信息封装为HttpServletResponse类型的response对象,通过设置response属性就可以控制要输出到浏览器的内容,然后将response交给tomcat,tomcat就会将其变成响应文本的格式发送给浏览器

1.3 详解创建servlet的原理

1.3.1 servlet的生命周期是什么?

  1. init( ),当Servlet第一次被请求时,Servlet容器就会开始调用这个方法来初始化一个Servlet对象出来,Servlet容器会传入一个ServletConfig对象进来从而对Servlet对象进行初始化(web.xml中配置load-on-startup=1,默认为0)。

  2. service( )方法,每当请求Servlet时,Servlet容器就会调用这个方法。第一次请求时,Servlet容器会先调用init( )方法初始化一个Servlet对象出来,然后会调用它的service( )方法进行工作,但在后续的请求中,Servlet容器只会调用service方法了。

  3. destory,当要销毁Servlet时,Servlet容器就会调用这个方法.在卸载应用程序或者关闭Servlet容器时,就会发生这种情况,一般在这个方法中会写一些清除代码。

1.3.2 为什么GenericServlet类中init方法有两个,一个是带有参数ServletConfig的,一个有无参的方法?

当我们需要在init方法中做一点别的事情时,通常需要继承GenericServlet并且重写了init(ServletConfig config)方法。但这样会就破坏了原本在GenericServlet类中init(ServletConfig config)写的代码,也就是在GenericServlet类中的成员变量config会一直是null,无法得到赋值,要想赋值,就必须在重写的init(ServletConfig config)方法中调用父类的init(ServletConfig config)方法,也就是super.init(ServletConfig config),非常不方便。

设计者怕程序员会忘了写这句代码,所以在GenericServlet类中增加一个init()方法,以后需要在init方法中需要初始化别的数据,只需要重写init()这个方法,而不需要去覆盖init(ServletConfig config)这个方法。

1.3.3 四个重点对象:ServletConfig、ServletContext,request、response

  1. ServletConfig对象
    包括四个内容
    在这里插入图片描述

    getServletName(); //获取servlet的名称,也就是我们在web.xml中配置的servlet-name

    getServletContext(); //获取ServletContext对象,该对象的作用看下面讲解

    getInitParameter(String); //获取在servlet中初始化参数的值。这里注意与全局初始化参数的区分。这个获取的只是在该servlet下的初始化参数
     
    getInitParameterNames(); //获取在Servlet中所有初始化参数的名字,也就是key值,可以通过key值,来找到各个初始化参数的value值。注意返回的是枚举类型

  2. ServletContext对象

    web项目中共享数据,getAttribute(String name)、setAttribute(String name, Object obj)、removeAttribute(String name)

     setAttribute(String name, Object obj) 在web项目范围内存放内容,以便让在web项目中所有的servlet读能访问到
     getAttribute(String name) 通过指定名称获得内容
     removeAttribute(String name) 通过指定名称移除内容  
    

    整个web项目初始化参数

     getInitPatameter(String name)  //通过指定名称获取初始化值
     getInitParameterNames()  //获得枚举类型
    

    获取web项目资源

     获取web项目下指定资源的路径:getServletContext().getRealPath("/WEB-INF/web.xml")
     获取web项目下指定资源的内容,返回的是字节输入流。InputStream getResourceAsStream(java.lang.String path)
    

    getResourcePaths(java.lang.String path) (指定路径下的所有内容)

  3. request对象
    请求行内容的获取

    请求头的获取

    请求体的获取 – 请求参数的获取

     get请求参数:http://localhost:8080/test01/MyServlet?username=jack&password=1234
     post请求参数: <form method="post"><input type="text" name="username">
    

String request.getParameter(String) 获得指定名称,一个请求参数值。

String[] request.getParameterValues(String) 获得指定名称,所有请求参数值。例如:checkbox、select等

Map<String , String[]> request.getParameterMap() 获得所有的请求参数

  1. 请求转发
                   request.getRequestDispatcher(String path).forward(request,response);  //path:转发后跳转的页面,这里不管用不用

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值