JavaWEB基础 -- Servlet

修改原文传送地址,原文写的内容比较优秀,不过鉴于排版各方面问题对原文内容进行一些修改与重排版。大家有兴趣可以查看原文作者的文章

一:概述与结构

现在很多做JavaWEB开发的攻城狮恐怕都对Servlet懵懵懂懂,MVC框架一顿操作猛如虎,随便问一下Servlet怂如狗的人不在少数。Servlet究其根本就是Java中用于和客户端交互达到数据浏览与修改目的。首先具备这样功能的Servlet不少,祖宗都是Servlet接口,也就是正常的子类对父类的扩展,所以个人不是很认可网络流传的狭义与广义的说法。别说了,都是Servlet就完事儿了
在这里插入图片描述

二:Servlet与容器

在这里插入图片描述
其实有人看到这里是不太清楚WEB容器与Servlet,所以这里提一下容器与Servlet是怎样的爱恨情仇。也可以说一图描述Servlet工作模型

三:祖宗接口Servlet
3.1 方法功能介绍

不多BB,既然是祖宗那就定义完成WEB请求处理到返回的基本功能就行,所以Servlet接口提供如图几个重写方法,具体含义如下:

  • init:Servlet实例化依赖的方法,该方法在整个生命周期中只能被调用一次,生命毕竟只有一次。传入的参数就是实例化Servlet对象时需要的一些数据
  • service:请求来了得处理呀,处理的逻辑就写在service方法即可
  • destroy:当你老了,容器停了。destory方法就是最后的归宿,销毁
  • getServletInfo:返回一段Servlet的描述,有兴趣可以调用方法打印出来看看
  • getServletConfig:返回的就是init初始化方法用到的ServletConfig对象

在这里插入图片描述

3.2 配置使用

首先需要在WEB容器的web.xml中配置好Servlet,需要两部分的内容

  • <servlet>:定义Servlet对象由WEB容器进行加载
  • <servlet–mapping>:定义Servlet匹配处理的请求
    在这里插入图片描述
    在这里插入图片描述
四:请求封装接口ServletRequest

发起一次请求包含许多信息数据,除了参数传递外可能重要的就是编码类型、协议类型、请求端的IP地址端口等信息。ServletRequest接口定义许多相关方法,方法过多下图展示几种常用方法。经过这里的IP其实并不能拿到客户端真实的IP地址,真实IP在后面讲解。有关characterEncoding与ContentType也是很多人疑惑的地方,会有单独的文章讲解
在这里插入图片描述

五:响应封装接口ServletResponse

请求处理完毕总得对客户端有个交代,返回数据信息还是什么操作就依靠ServletResponse完成。所以这个接口与ServletRequest接口有比较鲜明的对比就是方法大部分都是set赋值操作,get获取的就是一些流操作。除了Writer流之外还有OutPutStream单字节流,关于Java的I/O流知识自行查看相关文章
在这里插入图片描述

六:初始化信息封装接口ServletConfig

web.xml配置文件中可以配置一些Servlet初始化的信息,比如名字以及一些默认参数等信息。这些信息则封装到ServletConfig中然后init初始化时就会根据这个对象进行系列的初始化。下面演示一下web.xml中随便配置点默认参数后再init()初始化方法中获取打印
在这里插入图片描述
在这里插入图片描述

七:WEB项目容器与ServletContext
7.1 Tomcat容器

其余部分都不看,这里主要就是想说这个Context容器。一个Tomcat容器可以部署多个WEB项目,每个WEB项目就对应唯一的Context容器,包含了运行时的一些数据信息存储等
在这里插入图片描述

7.2 多个Servlet

Servlet当然可以有多个,只需要在web.xml配置文件中配置即可,每一个Servlet可能都会有自己匹配的方法后进行不同的逻辑处理等。但是如果这些Servlet想要留下点什么怎么保留?这时候就可以通过ServletContext容器
在这里插入图片描述

7.3 ServletContext使用

通过前面你知道init()初始化参数会传递一个ServletConfig对象,这个对象就可以获取到ServletContext容器。所以初始化的时候就把这个ServletConfig配置对象交给属性servletConfig维护,然后在getServletConfig()返回
在这里插入图片描述
在这里插入图片描述
页面首先请求FirstServlet然后再请求TwoServlet就可以获取到容器中存储的属性对象

在这里插入图片描述

八:初级抽象GenericServlet
8.1 继承结构

前面一直操作Servlet接口然后提供实现类,这属于骚操作,太累了有点。所以需要提供一个解放程序员的类,那就是抽象类GenericServlet。该抽象类实现了Servlet与ServletConfig接口,实现了比如前面讲到的使用属性维护ServletConfig对象,方便操作容器。然后还提供ServletConfig里面的参数、Servlet名字以及ServletContext等。当然唯一没有实现的就是处理逻辑的service(),有兴趣可以看看这个抽象类的源码
在这里插入图片描述

8.2 init初始化

看了源码都会奇怪为什么在GenericServlet中要新增一个无参的init()方法,是不是会感觉特别没用?仔细看看别人做的什么操作,正常重写带有ServletConfig参数的初始化方法后调用了这个方法,也就是GenericServlet的子类你重写初始化方法就给我重写这个无参的,有参的别动。必须要保证ServletConfig对象属性不为空的引用,别给瞎写破坏了
在这里插入图片描述
在这里插入图片描述

九:深层抽象HttpServlet

GenericServlet已经做出了优秀的成绩,但是对于Http请求来说还差那么点意思。所以呀它的子类HttpServlet横空出世

  • 强转ServletRequest与ServletResponse
  • 分化处理GTE、POST等请求

首先看HttpServlet重写的service()方法,直接把参数的ServletRequest与ServletyResponse强转为其子接口HttpServletRequest、HttpServletResponse。强转不报错是因为Servlet容器传给service方法的参数就是这俩,只不过经历了向上转型后又强转回来
在这里插入图片描述
再来看一下另外一个被调用的service()在干嘛,如下图可以很清晰看到就是在根据请求的方式然后调用不同的方法进行处理,也就是分化处理不同类型请求。所以在继承实现HttpServlet抽象类的时候不需要覆盖service(),只需要重写doGet()、doPost()等请求方法即可
在这里插入图片描述
使用测试一下还是比较容易的,如下图所示。改下写前面使用的TwoServlet后浏览器发起请求返回
在这里插入图片描述
在这里插入图片描述

十:Http环境请求接口HttpServletRequest

HTTP请求分为请求行、请求头、请求体,HttpServletRequest自然可以分门别类的获取这三部分信息内容。至于HTTP请求的详细信息移步通信信息分类

10.1 请求行信息

请求行信息中主要就是包括请求方式、WEB应用名称、跟在URL后面的参数(GET请求)。针对这个WEB应用名称其实就是配置WEB容器的时候设置的名称,这个名称也就是请求的根路径,如图二所示
在这里插入图片描述
在这里插入图片描述

10.2 请求头信息

请求头也就是key-value形式的map数据,可以根据key获取到对应的value。这个与ServletConfig获取到web.xml配置文件中的信息类似
在这里插入图片描述

10.3 请求体信息

请求体就是封装POST请求数据的地方,并不会直接暴露在URL路径下,所以一般做登录提交的时候都会发起POST请求。需要说明一点的就是接下来的方法也可以适用于GET请求获取URL路径后跟着的参数。在这总结一下这种key-value的操作:

  • ServletConfig中获取web.xml配置的参数init
  • HttpServletRequest中可以获取请求头header
  • HttpServletRequest中可以获取请求体parameter
    在这里插入图片描述
十一:Http环境响应接口HttpServletResponse

HttpServletResponse接口继承自ServletResponse接口,主要是做一些HTTP请求响应的工作。HTTP请求具备请求行、请求头、请求体。自然HTTP响应也具备这三块内容,所以在HttpServletResponse接口中提供三者的设置方法
在这里插入图片描述
在这里插入图片描述

十二:乱码问题

servlet默认的编码以及解码字符集采用iso8859-1,这个字符集中是没有中文的。所以会造成最后的乱码现象,这时候就需要设定Servlet编码以及解码的字符集

12.1 请求参数带中文

当服务端接收到请求的时候需要使用到请求参数,请求参数的编码字符集可以通过ServletRequest对象的setCharacterEncoding()进行设置,设置为与项目编码一致的字符集,达到使用请求参数不乱码的效果
在这里插入图片描述

12.2 响应带中文

通过服务端系列逻辑处理后需要给客户端浏览器返回信息难免会带有中文数据,这时候服务端需要做的工作就是将数据进行编码并且告诉浏览器解码的字符集类型
在这里插入图片描述
除了这两个步骤之外还有没有一步到位的方法?别说还真有,一个方法指定服务端编码格式与浏览器客户端解码格式
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值