JavaWeb基础知识——Servlet、Request、Response详解

一、Servlet详解

  1. Servlet概述
    Servlet是基于java语言开发动态web资源的技术。
    本质上是一段java代码,可以放置到Servlet容器中运行。
  2. 入门案例
    a. 写一个类实现javax.Servlet接口
    Servlet接口中定义了和Servlet开发相关的方法

JavaWeb基础知识——Servlet、Request、Response详解_第1张图片

但直接实现Servlet接口开发起来比较麻烦,可以选择继承Serlvet接口的通用实现类GenericServlet

JavaWeb基础知识——Servlet、Request、Response详解_第2张图片

在这个抽象类中,默认实现了除service之外的方法,而将service方法定义为抽象方法

开发者只需要继承此类,实现service就可以开发出一个Servlet

public class FirstServlet extends GenericServlet {
     

    @Override

    public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException{
     

        System.out.println("hello servlet~");

        response.getWriter().write("hello servlet~");

    }

}

b. 配置Servlet
在web.xml中配置Servlet及Serlvet的访问路径



<servlet>

    <servlet-name>FirstServletservlet-name>

    <servlet-class>cn.tedu.web.FirstServletservlet-class>

servlet>



<servlet-mapping>

    <servlet-name>FirstServletservlet-name>

    <url-pattern>/FirstServleturl-pattern>

servlet-mapping>

c.访问测试

JavaWeb基础知识——Servlet、Request、Response详解_第3张图片

  1. Servlet的调用过程和生命周期

JavaWeb基础知识——Servlet、Request、Response详解_第4张图片

JavaWeb基础知识——Servlet、Request、Response详解_第5张图片

  1. Servlet详解
    a. 继承结构

    Servlet接口
        |-GenericServlet抽象类
              |-HttpServlet类
    

i. Servlet接口
Serlvet的根接口
定义了一个servlet应该具有的方法,所有的
Servlet都应该直接或间接实现此接口。

ii.GenericServlet抽象类
GenericServlet抽象类是对Servlet接口的默认实现。
对Serlvet接口中的大部分方法都做了默认实现,只有service方法是一个抽象方法需要开发者实现。
开发者只需要继承GenericServlet实现service方法,就可以在其中编写Servlet逻辑代码码。

iii.HttpServlet类
HttpServlet类继承自GenericServlet类。
HttpServlet在GenericServlet类的基础上增加了和HTTP协议相关的属性和方法。

实现了service方法,在其中判断请求方式,根据请求方式调用对应的doXxx()方法。
开发者只需要继承HttpServlet,重写需要处理的doXxx()方法就可以完成对不同请求方式请求的处理了。
这是最常用的开发Servlet的方式。

public class SecondServlet extends HttpServlet {
     

    @Override

    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
     

        String time = new Date().toLocaleString();

        resp.getWriter().write(time+"");

    }
    @Override

    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
     

        doGet(req,resp);

    }

}
<servlet>

    <servlet-name>SecondServletservlet-name>

    <servlet-class>cn.tedu.web.SecondServletservlet-class>

servlet>

<servlet-mapping>

    <servlet-name>SecondServletservlet-name>

    <url-pattern>/SecondServleturl-pattern>

servlet-mapping>

b. Servlet对外访问路径配置

i.基本结构

<servlet-mapping>

    <servlet-name>FirstServletservlet-name>

    <url-pattern>/FirstServleturl-pattern>

servlet-mapping>

一个< servlet>可以对应多个< servlet-mapping>
一个< servlet-mapping>中可以配置多个< url-pattern>

ii.通配符的使用
在配置< url-pattern>可以使用
号通配符进行通配路径配置
*表示匹配零个或多个任意字符

  1. 体格式为:
    以/开头以星号*结尾的路径

    /ThirdServlet/*
    

以*.后缀结尾的路径

*.do
  1. 使用*带来的路径重复匹配问题

    Servlet1 映射到 /abc/* 
    Servlet2 映射到 /* 
    Servlet3 映射到 /abc 
    Servlet4 映射到 *.do 
    
    当请求URL为"/abc/a.html",哪个servlet响应 ?-Servlet1
    当请求URL为“/abc”时,哪个servlet响应 ?-Serlvet3
    当请求URL为“/abc/a.do”时,哪个servlet响应 ?-Servlet1
    当请求URL为“/a.do”时,哪个servlet响应 ?-Servelt2
    当请求URL为“/xxx/yyy/a.do”时,哪个servlet响应 ?-Servelt2
    

配置的越精细,匹配度越高,优先级越高
*.后缀方式,优先级最低

c.缺省Servlet
将Serlvet的访问路径配置为"/",则该Servlet成为缺省Servlet
没有其他Servlet处理的请求都交由缺省Servlet来处理
通用web.xml中自带一个缺省Servlet
此缺省Servlet会在被访问时先找静态资源,找到就返回,找不到返回404页面

d.< load-on-startup>
< servlet>标签中可以配置< load-on-startup>标签,在其中配置大于0的数字
一旦配置此标签,Servlet将在服务器启动web应用加载后立即创建
数字越小,启动优先级越高
部分特殊的Servlet需要应用启动后立即存在,则可以配置此标签
例如,缺省Serlvet就配置了此标签

<servlet>

    <servlet-name>defaultservlet-name>

    <servlet-class>org.apache.catalina.servlets.DefaultServletservlet-class>

    <init-param>

        <param-name>debugparam-name>

        <param-value>0param-value>

    init-param>

    <init-param>

        <param-name>listingsparam-name>

        <param-value>falseparam-value>

    init-param>

    <load-on-startup>1load-on-startup>

servlet>

e.Serlvet的多线程并发安全问题
Servlet默认机制下是单例的,存在多线程并发安全问题的风险。
所以,通常推荐,不要在Servlet中使用静态成员变量、普通成员变量。

f.通过idea快速构建Servlet

JavaWeb基础知识——Servlet、Request、Response详解_第6张图片
JavaWeb基础知识——Servlet、Request、Response详解_第7张图片

二、Request详解

  1. Request概述
    代表HTTP请求的对象。
  2. Request继承结构
    ServletRequest
    |-HttpServletRequest

a. ServletRequest
request的根接口,定义了请求相关的方法

b. HttpServletRquest
ServletRequest接口的实现类,在ServletRequest接口的基础上增加了很多和HTTP协议相关的方法

  1. Request功能详解
    a. 获取客户机相关信息

JavaWeb基础知识——Servlet、Request、Response详解_第8张图片

b. 获取请求头信息

JavaWeb基础知识——Servlet、Request、Response详解_第9张图片

c.获取请求参数

JavaWeb基础知识——Servlet、Request、Response详解_第10张图片

d. 请求参数乱码原理

浏览器发送请求参数时采用的编码取决于表单页面的编码。
如果没有表单页面,直接在地址栏上敲地址,则采用系统码。
服务器在解析请求参数时,解析用的编码如下:

JavaWeb基础知识——Servlet、Request、Response详解_第11张图片

在产生请求参数乱码时,可以以上原理通过改变表单页面编码、tomcat连接器配置(GET乱码)、设置request.setCharacterEncoding(POST乱码)来解决。
如果因为各种原因,乱码已经产生,此时可以通过手动编解码解决乱码。
注意仅限ios8859-1产生的乱码可以通过这种方式来解决。

String str = new String(??????.getBytes("iso8859-1"),"utf-8")

i. 案例
EasyMall注册功能 - 获取表单数据实现

JavaWeb基础知识——Servlet、Request、Response详解_第12张图片

e. 实现请求转发
请求转发时javaweb开发中的三种资源跳转方式之一

i. 请求转发的特点:

服务器内部的资源跳转机制
一次请求一次响应
可以利用request域传递数据
浏览器地址栏不会发生变化

ii.转发的实现

RequestDispatcher dispatcher=request.getRequestDispatcher("/MyServlet05");
dispatcher.forward(request,response);

简写

request.getRequestDispatcher("/MyServlet05").forward(request,response);

!!!注意,请求转发是服务器内部的资源跳转,目标地址不需要写应用名称

iii. 转发注意事项
1.可以多次转发,但不能循环转发
2.无论转发多少次,只有最后一个资源可以对外输出数据,其他资源的输出在转发时会被清空
iv. 案例
EasyMall注册功能 - 数据校验功能实现

JavaWeb基础知识——Servlet、Request、Response详解_第13张图片

f. 作为域对象使用

request是一个域对象
request域是javaweb开发中四大作用域之一
利用request域可以在转发的过程中传递数据

i.操作api

setAttribute(String name,Object obj)   向域中存入数据
getAttribute(String name)   从域中获取数据
removeAttribute(String name)    删除域中指定数据
getAttributeNames()   获取域中所有属性名组成的枚举

ii. 特点

  1. 作用范围
    在一次请求范围内有效

  2. 生命周期
    请求开始 request对象创建 作用域创建
    请求结束 request对象销毁 作用域销毁

  3. 主要功能
    在一个请求范围内(转发、包含)共享数据

iii. 案例
EasyMall注册功能 - 数据校验功能实现 - 传递错误消息

JavaWeb基础知识——Servlet、Request、Response详解_第14张图片
在这里插入图片描述

g. 实现请求包含
请求包含可以将其他资源的输出包含到当前资源中。

i. 包含的实现

request.getRequestDispacher(path).include(request,response);

ii. 案例
EasyMall主页通过包含引入头和尾。

在这里插入图片描述
在这里插入图片描述

三、Response详解

  1. Response概述
    response是代表响应的对象。

  2. Response继承结构

     ServletResponse
     |-HttpServletResponse
    

a. ServletResponse
定义了Response应该具有的基本的方法

b. HttpServletResponse
在ServletResponse的基础上增加了很多HTTP协议相关的方法

  1. Response功能详解
    a. 设置状态码

在这里插入图片描述

b. 设置响应头

JavaWeb基础知识——Servlet、Request、Response详解_第15张图片

c. 获取输出流

JavaWeb基础知识——Servlet、Request、Response详解_第16张图片

多次调用getOutputStream()得到的是同一个流
多次调用getWriter()得到的是同一个流
getOutputStream()和getWriter()是互斥的,在同一个response对象上只能获取一种
getOutputStream()和getWriter()不要手动关闭,Servlet容器会关闭此流

d. 响应乱码解决
i. getOutputStream()
利用字节流输出字符数据时,需要开发人员手动将字符转为字节,此时可以手动指定输出编码。
浏览器解析时,如果不指定,默认采用操作系统码解码数据。
如果两码不一致,产生乱码。
此时可以通过设置Content-Type的响应头,告知浏览器当前数据的格式及编码,命令浏览器用指定编码打开数据,乱码解决。

在这里插入图片描述

可以手动设置Content-Type,也可以通过便捷方法设置

JavaWeb基础知识——Servlet、Request、Response详解_第17张图片

ii. getWriter()
利用字符流输出字符数据时,会将字符按指定编码转为字节写入response响应体,最终发送给浏览器。
此编码默认为iso8859-1,其中没有中文,输出中文时必然产生乱码。
此时可以通过response.setCharacterEncoding();控制写入response时的编码,解决这个问题。

在这里插入图片描述

除此之外,如果浏览器打开数据的编码和发送编码不一致仍然会有乱码,
可以通过response.setContentType()指定浏览器打开编码,解决乱码

在这里插入图片描述

其实,setContentType方法,除了会设置Content-Type头,还会隐含的设置setCharacterEncoding,所以其实只需设置setContentType就可以解决响应乱码

在这里插入图片描述

iii. 响应乱码解决总结
一句话解决响应乱码,无论字节流还是字符流

在这里插入图片描述

e. 实现请求重定向
重定向是javaweb三种资源跳转方式之一
原理就是通过302状态码加Location响应头,通知浏览器重定向访问指定资源,从而实现资源跳转。

i. 请求重定向特点

浏览器和服务器之间的资源跳转
两次请求两次响应
无法通过request域传递数据
地址栏会发生变化

ii. 重定向实现
重定向是浏览器和服务器之间的资源跳转,地址是给浏览器用的,地址必须以应用名称开头。

  1. 手动实现重定向

在这里插入图片描述

  1. 便捷方式实现重定向

在这里插入图片描述

iii. 案例 - EasyMall注册成功回到主页

在这里插入图片描述

f. 实现定时刷新
定时刷新时javaweb三种资源跳转方式之一
原理是通过refresh头命令浏览器在指定时间之后自动刷新访问一个新的地址,从而实现资源跳转。

i. 定时刷新特点

浏览器和服务器之间的资源跳转
两次请求两次响应
无法通过request域传递数据
地址栏会发生变化
可以在资源跳转期间提示额外消息

ii. 定时刷新实现
重定向是浏览器和服务器之间的资源跳转,地址是给浏览器用的,地址必须以应用名称开头。

在这里插入图片描述

iii. 案例 - EasyMall注册成功回到主页

JavaWeb基础知识——Servlet、Request、Response详解_第18张图片

g. 禁止缓存
浏览器默认有缓存机制,可以缓存曾经访问过的资源,再次访问该资源时,可以直接使用本地缓存提高访问效率。
但有些资源,开发者不希望浏览器缓存,例如 验证码图片 二维码图片 等等
此时可以通过设置禁止缓存响应头,禁止浏览器缓存指定资源

i. 禁止缓存实现

JavaWeb基础知识——Servlet、Request、Response详解_第19张图片

ii. 案例 - EasyMall验证码图片实现及禁止缓存实现

JavaWeb基础知识——Servlet、Request、Response详解_第20张图片

你可能感兴趣的:(JavaWeb,servlet,java)