Servlet总结
一. 快速入门
Servlet是Java的一种动态的 web资源开发技术;
Servlet是JavaEE的规范,也是一套接口,由开发人员去定义接口的是实现类;
由Tomcat创建Servlet对象,并调用Servlet方法;
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>
-
定义一个类,实现
HttpServlet
接口,并重写重写doGet()
和doPast()
方法;;
HttpServlet继承了Servlet接口,底层是service()方法: -
配置:在类上面使用
@WebServlet
注解,用注释配置Servlet的访问路径
(注释是新版本的配置,早期使用xml来配置)
-
启动:启动Tomcat服务器,浏览器输入url访问该Servlet;
二. Servlet执行流程
Servlet在Web项目中;
然后将Web项目发布在Tomcat服务器中;
右键点击module→run maven: tomcat7,然后通过浏览器输入url就能访问Servlet;
分别是Tomcat路径、Web项目路径(可通过
三. 生命周期
Servlet 运行在Servlet的容器(Web服务器如Tomcat)中,其生命周期由容器来管理:
-
加载和实例化:
(默认情况下)
,当Servlet第一次被访问时,由容器创建Servlet对象; -
初始化:在Servlet实例化后,容器使用
inti()
方法初始化这个Servlet对象,完成加载配置、创建链接等工作。 init()方法只被调一次; -
请求处理:请求每次Servlet时,容器(Tomcat) 都会调用
service()
方法进行处理! -
服务终止:当需要释放内存或者关闭容器时,容器会调用servlet对象的
destroy()
方法完成资源的释放!而后容器会释放servlet对象,其会被GC回收。
注意:
-
初始化:只会执行一次
init()
用于初始化!
修改时间:通过修改loadOnStartup
属性修改Servlet对象被创建的时间,也就修改了init()被调用的时间;
loadOnStartup默认是-1,设置为正整数就会在Tomcat服务器启动时就创建Servlet并执行init()
方法! -
请求处理:service()被调用的时间:每一次Servlet被访问时!
service()被调用的次数:多次! -
服务终止:正常关闭: Ctrl+c,这样会执行
destroy()
方法!
destroy() 被调用次数:一次;
红色停止是关闭进程!不会执行destroy() !
四. 体系结构
将来开发B/S架构的web项目,都是针对HTTP协议!
所以自定义的Servlet要继承 HttpServlet
! ,并重写 doGet
和 doPost
方法;
httpservlet实际上是简化了servlet的操作;
问题1:HttpServlet为什么根据请求方式的不同,调用不同方法?
因为get方式提交的参数在请求行中,和url一起
而post方式提交的参数在请求体中,更安全!
所以根据不同的方式请求,而分别处理!
问题2:如何调用?
①写一个类继承HttpServlet
②重写doGet()
和doPost()
方法;
五. urlPattern配置
urlPattern就是Servlet的访问路径;也是表单提交的路径 action
:
早期使用XML配置路径,新版本使用@注解来访问!
Servlet要被访问,必须配置访问路径即urlPatten;
注意访问路径要从 /
开始!
匹配规则
DefaultServlet为 / 即Tomcat默认的Servlet,是用来处理静态资源的!
而如果使用任意配置 “/”,就会覆盖默认的Servlet!默认的Servlet就不生效了,那么静态资源就没法访问了!
所以一般不用④任意匹配。
六. 请求与响应
request和response是service()方法的参数,
HTTP的请求就是字符串,会被 Tomcat
解析,解析完成之后,被放到request对象
中保存;
通过request对象可以获取用户请求的数据,以此进行逻辑判断 !
响应的字符串被放到response对象,将来通过response对象来设置响应的数据,然后由 Tomcat
将数据拼成HTTP响应报文格式的字符串,返回给浏览器(客户端);
1. Request
作用: 通过Reques对象来获取请求数据;
流程:
Tomcat
解析HTTP请求数据 ,- 封装为
request对象
, - 并且创建request对象,传递到
service()
方法中;
1.1 Request继承体系
如果自定义Servlet类实现的是Servlet,则参数是ServletRequest
如果自定义Servlet类实现的是HttpServlet,则参数是HttpServletRequest
使用:
将来使用request对象,查阅JavaEE API文档的HttpServletRequest接口!
1.2 Request获取请求数据API
总结: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对象中去:
总结转发的特点:(和重定向完全相反!
)
- 浏览器地址不发生变化;
- 只能转发当前服务器的内部资源,即资源A和资源B在同一个Web服务器中;
- 一次请求,可以在转发的资源间使用request对象共享数据;
2. Response
作用: 通过Response对象来设置响应数据;
流程:
- 响应的字符串被放到response对象,将来通过response对象来设置响应的数据,传入
service()
方法; - 然后由
Tomcat
将数据拼成HTTP响应报文格式的字符串, - 由
Tomcat
将响应报文返回 给浏览器(客户端);
2.1 设置响应数据功能
2.2 重定向
定义: 资源跳转的方式, 类似于Request的转发;
资源A(通过响应状态码302)告诉浏览器自己处理不了,要去资源B;
步骤:
1.设置响应状态码302
2.设置响应头(键值对), 响应头的值就是资源B的地址;
效果:
访问resp1,url 跳转到了resp2 !
也可以将location 填入外部网站,如 https://www.baidu.com ,即可跳转到其他服务器的页面!
在某些盗版电影网站 或钓鱼网站中,会重定向到广告页面。
总结转发的特点: (和转发的特点完全相反!
)
- 浏览器地址栏路径发生变化;(浏览器发出来两次请求,而转发只有一次请求)
- 可以重定向到任意位置(服务器内、外均可);
- 两次请求,不能再多个资源使用request共享数据;(两次请求发往了不同域,所以不能共享数据)
2.3 资源路径问题
什么时候才加虚拟目录(项目访问路径)?
- 浏览器使用:则需要加虚拟目录
- 服务器使用:不需要加虚拟目录
如:
转发时是在服务器内部使用,就不加虚拟目录;
而重定向中写的location的路径是给浏览器使用,所以需要加虚拟路径!
以及<form action=“…” 也要加,因为是浏览器使用,需要加项目路径;
动态获取虚拟目录: request.getContextPath()
这样避免地址写死,降低耦合;
2.4 响应字符数据
方法:
1.通过Response对象获取字符输出流 response.getWriter()
2.write() 写数据,
Tomcat会将数据从输出流中拿出,放到响应报文中;
例:
这里先设置响应头content-type为html,则浏览器会解析响应体中的html代码;
注意:
- 输出流是随着Response对象获取的,当Response对象被销毁时,输出流会哦自动被关掉;
- 要写
html
标签时,要先设置content-type
,否则会被视为纯文本; - 解决中文乱码问题: 使用
response.setContenType()
;
2.5 响应字节数据
- 先获取字节输出流,
response.getOutputStream()
- 再write即可;
例:
假设要返回一个图片,使用文件输入流读取,
然后将输入流的内容读取到byte[]数组,
再将byte[]数组拷贝到字节输出流,关闭文件输入流;
补充:流拷贝工具 IOUtils
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/89156.html