Servlet总结
- 一. 简介
- 二. Servlet执行流程
- 三. 生命周期
- 四. 体系结构
- 五. urlPattern配置
- 匹配规则
- 六. Request和Response
- 1. Request
- 1.1 Request继承体系
- 1.2 Request获取请求数据API
- 1.3 通用方式获取请求参数
- 1.4 通用方式中文乱码解决
- 1.5 Request请求转发
- 2.1 Response
一. 简介
Servlet是Java的一种动态的 web资源开发技术;
Servlet是JavaEE的规范,也是一套接口,由开发人员去定义接口的是实现类;
二. Servlet执行流程
Servlet在Web项目中;
然后将Web项目发布在Tomcat服务器中;
右键点击module→run maven: tomcat7,然后通过浏览器输入url就能访问Servlet;
url:
分别是Tomcat路径、Web项目路径(可通过
三. 生命周期
Servlet 运行在Servlet的容器(Web服务器如Tomcat)中,其生命周期由容器来管理:
-
加载和实例化:
(默认情况下)
,当Servlet第一次被访问时,由容器创建Servlet对象; -
初始化:在Servlet实例化后,容器使用
inti()
方法初始化这个Servlet对象,完成加载配置、创建链接等工作。 init()方法只被调一次; -
请求处理:请求每次Servlet时,Servlet容器都会调用
service()
方法进行处理! -
服务终止:当需要释放内存或者关闭容器时,容器会调用servlet对象的
destroy()
方法完成资源的释放!而后容器会释放servlet对象,其会被GC回收。
注意:
-
加载和实例化:可以提前实例化Servlet对象,通过
loadOnStartup
参数即可:
-
初始化:只会执行一次
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配置
urlPatten就是Servlet的访问路径;也是表单提交的路径 action
:
早期使用XML配置路径,新版本使用@注解来访问!
Servlet要被访问,必须配置访问路径即urlPatten;
注意访问路径要从 /
开始!
一个Servlet可以配置多个urlParttern
匹配规则
DefaultServlet为 / 即Tomcat默认的Servlet,是用来处理静态资源的!
而如果使用任意配置 “/”,就会覆盖默认的Servlet!默认的Servlet就不生效了,那么静态资源就没法访问了!
所以一般不用④任意匹配。
六. Request和Response
request和response是Servlet()方法的参数,
HTTP的请求就是字符串,会被 Tomcat
解析,解析完成之后,被放到request对象中保存;
通过request对象可以获取用户请求的数据,以此进行逻辑判断 !
(即Tomcat解析HTTP请求数据 ,封装为request对象,并且创建request对象,传递到service方法中;
)
响应的字符串被放到response对象,将来通过response对象来设置响应的数据,然后由 Tomcat
将数据拼成HTTP响应报文格式的字符串,返回给浏览器(客户端);
1. Request
1.1 Request继承体系
如果自定义Servlet类实现的是Servlet,则参数是ServletRequest
如果自定义Servlet类实现的是HttpServlet,则参数是HttpServletRequest
使用:
将来使用request对象,查阅JavaEE API文档的HttpServletRequest接口!
1.2 Request获取请求数据API
参数为请求头名称;
总结:GET通过getQueryString()
方法获取参数,POST通过输入流的方式获取参数(doPost()中);
1.3 通用方式获取请求参数
doGet()和doPost() 只有请求参数(只有POST才有请求头)不一样,其他都一样---------------- 这会导致代码重复;
大部分时候,参数只有一个value;
方法:
将重复的部分写到doGet()方法内,而doPost() 方法中写:this.doGet(HttpServletRequest,HttpServletResponse)
1.4 通用方式中文乱码解决
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提供的特殊功能,一种在服务器内部的资源跳转方式,可以完成资源之间的跳转;
方法:
在资源A中使用Request对象的方法,参数资源B路径和资源A的Request、Response对象:
一般转发时多个资源间要数据共享,一般将数据存到Request对象中去:
总结转发的特点:
1.浏览器地址不发生变化
2.只能转发当前服务器的内部资源,即资源A和资源B在同一个Web服务器中
一次请求,可以在转发的资源间使用request对象共享数据;