Servlet总结

导读:本篇文章讲解 Servlet总结,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

一. 快速入门

Servlet是Java的一种动态的 web资源开发技术;

Servlet是JavaEE的规范,也是一套接口,由开发人员去定义接口的是实现类;

由Tomcat创建Servlet对象,并调用Servlet方法;

1. 使用方法

  1. 创建Web项目,导入Servlet依赖坐标;
    provided:依赖范围是provided,即只在编译和测试话环境生效,打包时没有!因为Tomcat自带了Servlet的jar包;
    如果不写provided会出错!在运行环境把jar包排除掉;
    端口号:默认8080
    路径:默认路径是 /项目名称
	<dependency>
	<groupId>javax.servlet</groupId>
  	<artifactId>javax.servlet-api</artifactId>
  	<version>3.1.0</version>
  	<!--  scope是依赖范围 -->
  	<scope>provided</scope>
	</dependency>
  1. 定义一个类,实现HttpServlet接口,并重写重写doGet()doPast()方法;;
    HttpServlet继承了Servlet接口,底层是service()方法:

  2. 配置:在类上面使用 @WebServlet注解,用注释配置Servlet的访问路径
    (注释是新版本的配置,早期使用xml来配置)
    在这里插入图片描述

  3. 启动:启动Tomcat服务器,浏览器输入url访问该Servlet;

二. Servlet执行流程

Servlet在Web项目中;
然后将Web项目发布在Tomcat服务器中;
右键点击module→run maven: tomcat7,然后通过浏览器输入url就能访问Servlet;

url在这里插入图片描述

分别是Tomcat路径、Web项目路径(可通过 隐藏)、Servlet路径;

三. 生命周期

Servlet 运行在Servlet的容器(Web服务器如Tomcat)中,其生命周期由容器来管理:

  1. 加载和实例化(默认情况下),当Servlet第一次被访问时,由容器创建Servlet对象

  2. 初始化:在Servlet实例化后,容器使用 inti() 方法初始化这个Servlet对象,完成加载配置、创建链接等工作。 init()方法只被调一次;

  3. 请求处理请求每次Servlet时,容器(Tomcat) 都会调用 service() 方法进行处理!

  4. 服务终止:当需要释放内存或者关闭容器时,容器会调用servlet对象的 destroy() 方法完成资源的释放!而后容器会释放servlet对象,其会被GC回收。

注意:

  1. 加载和实例化:可以提前实例化Servlet对象,通过 loadOnStartup 参数即可:
    在这里插入图片描述

  2. 初始化:只会执行一次init()用于初始化!
    修改时间:通过修改loadOnStartup属性修改Servlet对象被创建的时间,也就修改了init()被调用的时间;
    loadOnStartup默认是-1,设置为正整数就会在Tomcat服务器启动时就创建Servlet并执行init()方法!

  3. 请求处理:service()被调用的时间:每一次Servlet被访问时!
    service()被调用的次数:多次

  4. 服务终止:正常关闭: Ctrl+c,这样会执行destroy()方法!
    destroy() 被调用次数:一次
    红色停止是关闭进程!不会执行destroy() !在这里插入图片描述

四. 体系结构

在这里插入图片描述

将来开发B/S架构的web项目,都是针对HTTP协议
所以自定义的Servlet要继承 HttpServlet ,并重写 doGetdoPost 方法;
httpservlet实际上是简化了servlet的操作;

在这里插入图片描述

问题1:HttpServlet为什么根据请求方式的不同,调用不同方法?
因为get方式提交的参数在请求行中,和url一起
post方式提交的参数在请求体中,更安全!
所以根据不同的方式请求,而分别处理!

问题2:如何调用?
①写一个类继承HttpServlet
②重写doGet()doPost()方法;

五. urlPattern配置

在这里插入图片描述

urlPattern就是Servlet的访问路径;也是表单提交的路径 action
在这里插入图片描述
早期使用XML配置路径,新版本使用@注解来访问!

Servlet要被访问,必须配置访问路径即urlPatten;
注意访问路径要从 / 开始!

一个Servlet可以配置多个urlParttern
在这里插入图片描述

匹配规则

在这里插入图片描述

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

DefaultServlet为 / 即Tomcat默认的Servlet,是用来处理静态资源的!
而如果使用任意配置 “/”,就会覆盖默认的Servlet!默认的Servlet就不生效了,那么静态资源就没法访问了!
所以一般不用④任意匹配。

六. 请求与响应

request和response是service()方法的参数,
在这里插入图片描述

HTTP的请求就是字符串,会被 Tomcat 解析,解析完成之后,被放到request对象 中保存
通过request对象可以获取用户请求的数据,以此进行逻辑判断 !

响应的字符串被放到response对象,将来通过response对象来设置响应的数据,然后由 Tomcat 将数据拼成HTTP响应报文格式的字符串,返回给浏览器(客户端);

1. Request

作用: 通过Reques对象来获取请求数据;

流程:

  1. Tomcat 解析HTTP请求数据 ,
  2. 封装request对象
  3. 并且创建request对象,传递service() 方法中;

1.1 Request继承体系

在这里插入图片描述

如果自定义Servlet类实现的是Servlet,则参数是ServletRequest
在这里插入图片描述

如果自定义Servlet类实现的是HttpServlet,则参数是HttpServletRequest
在这里插入图片描述

使用:
将来使用request对象,查阅JavaEE API文档的HttpServletRequest接口!

1.2 Request获取请求数据API

在这里插入图片描述
在这里插入图片描述
参数为请求头名称;

在这里插入图片描述

例: 使用request对象调用API即可
在这里插入图片描述

例: 获取HTTP请求报文中的请求体数据
在这里插入图片描述

总结:GET通过getQueryString()方法获取参数,POST通过 getReader() 输入流的方式获取参数(doPost()中);

1.3 通用方式获取请求参数

doGet()和doPost() 只有请求参数(只有POST才有请求头)不一样,其他都一样—————- 这会导致代码重复;

在这里插入图片描述
大部分时候,参数只有一个value,所以 getParameter() 常用;

方法:
将重复的部分写到doGet()方法内,而doPost() 方法中写:this.doGet(HttpServletRequest,HttpServletResponse)
在这里插入图片描述

1.4 通用方式中文乱码解决

Tomcat8 已解决;

POST:
底层获取参数是getReader()方法,即流的方式,默认编码是ISOiso8859-1,改成UTF-8即可:
在这里插入图片描述

GET:
底层是getQueryString()方法,
浏览器不支持中文,会将中文转换成URL编码,
Tomcat接收到数据会进行URL解码,而在编码时中文是UTF-8编码的,而Tomcat默认是默认编码是ISOiso8859-1,

在这里插入图片描述
解决:
由于字节是一样的,可以将将url先解码,然后获取解码后的decode字节byte数组,然后再转换成中文;
在这里插入图片描述
在这里插入图片描述
主要是后两步,先编码为byte[]数组,再用utf-8解码为中文!

1.5 Request请求转发

是Request提供的特殊功能,一种在服务器内部的资源跳转方式,可以完成【资源之间】的跳转;(区别Response重定向)
在这里插入图片描述

方法:
在资源A中使用Request对象的方法,参数资源B路径和资源A的Request、Response对象:
在这里插入图片描述
一般转发时多个资源间要数据共享,一般将数据存到Request对象中去:
在这里插入图片描述

总结转发的特点:和重定向完全相反!

  1. 浏览器地址不发生变化;
  2. 只能转发当前服务器的内部资源,即资源A和资源B在同一个Web服务器中;
  3. 一次请求,可以在转发的资源间使用request对象共享数据;

2. Response

作用: 通过Response对象来设置响应数据;

流程:

  1. 响应的字符串被放到response对象,将来通过response对象来设置响应的数据,传入 service() 方法;
  2. 然后由 Tomcat 将数据拼成HTTP响应报文格式的字符串,
  3. Tomcat 将响应报文返回 给浏览器(客户端);

继承体系:
在这里插入图片描述

2.1 设置响应数据功能

在这里插入图片描述

2.2 重定向

定义: 资源跳转的方式, 类似于Request的转发;
资源A(通过响应状态码302)告诉浏览器自己处理不了,要去资源B;
在这里插入图片描述
步骤:
1.设置响应状态码302
2.设置响应头(键值对), 响应头的值就是资源B的地址;
在这里插入图片描述

可简化为:
在这里插入图片描述

效果:
访问resp1,url 跳转到了resp2 !
也可以将location 填入外部网站,如 https://www.baidu.com ,即可跳转到其他服务器的页面!
在某些盗版电影网站 或钓鱼网站中,会重定向到广告页面。

总结转发的特点:和转发的特点完全相反!

  1. 浏览器地址栏路径发生变化;(浏览器发出来两次请求,而转发只有一次请求)
  2. 可以重定向到任意位置(服务器内、外均可);
  3. 两次请求,不能再多个资源使用request共享数据;(两次请求发往了不同,所以不能共享数据)

2.3 资源路径问题

什么时候才加虚拟目录(项目访问路径)?

  • 浏览器使用:则需要加虚拟目录
  • 服务器使用:不需要加虚拟目录

如:
转发时是在服务器内部使用,就不加虚拟目录;
而重定向中写的location的路径是给浏览器使用,所以需要加虚拟路径!
以及<form action=“…” 也要加,因为是浏览器使用,需要加项目路径;

动态获取虚拟目录request.getContextPath()
在这里插入图片描述
这样避免地址写死,降低耦合;

2.4 响应字符数据

方法:
1.通过Response对象获取字符输出流 response.getWriter()

2.write() 写数据,
Tomcat会将数据从输出流中拿出,放到响应报文中;

例:
这里先设置响应头content-type为html,则浏览器会解析响应体中的html代码;
在这里插入图片描述

效果:
在这里插入图片描述

注意:

  1. 输出流是随着Response对象获取的,当Response对象被销毁时,输出流会哦自动被关掉;
  2. 要写html标签时,要先设置content-type,否则会被视为纯文本;
  3. 解决中文乱码问题: 使用 response.setContenType()
    在这里插入图片描述

2.5 响应字节数据

  1. 先获取字节输出流response.getOutputStream()
  2. 再write即可;

例:
假设要返回一个图片,使用文件输入流读取,
然后将输入流的内容读取到byte[]数组,
再将byte[]数组拷贝到字节输出流,关闭文件输入流;
在这里插入图片描述

补充:流拷贝工具 IOUtils

所在包:org.appache.commons-io
在这里插入图片描述

在这里插入图片描述

改进上例:
在这里插入图片描述
只需要一行就可以拷贝;

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/89156.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!