servlet的开发
servlet的使用
相关参考:
- 菜鸟教程参考:https://www.runoob.com/servlet/servlet-tutorial.html
- servlet3.0:http://tomcat.apache.org/tomcat-7.0-doc/servletapi/index.html
- servlet3.0社区文档:https://www.ibm.com/developerworks/cn/java/j-lo-servlet30/index.html
- servlet4.0:http://tomcat.apache.org/tomcat-9.0-doc/servletapi/
- servlet4.0社区文档:https://www.ibm.com/developerworks/cn/java/j-javaee8-servlet4/index.html?ca=drs-&utm_source=tuicool&utm_medium=referral
Servlet基础
什么是Servlet
sun公司制订的一种用来扩展web服务器功能的组件规范。
- 用来扩展web服务器功能
早期很多web服务器(比如apache,iis等)只能够处理静态资源的请求(需要实现将html文档准备好),不能够处理状态资源的请求(需要通过计算机,生成html),所以需要扩展。
早起使用CGI(Common Gateway Interface通用网关接口)程序来扩展,因为CGI开发繁琐,并且不好移植,所以用得少。可以使用Servlet来扩展web服务器功能
-
组件规范
-
什么是组件:符合规范、实现部分功能,并且需要部署到相应的容器当中才能运行的软件模块。Servlet就是一个符合Servlet规范的组件,需要部署到Servlet容器当中才能运行。
-
什么是容器:符合规范,提供组件的运行环境的程序。Servlet容器(比如Tomcat)为Servlet提供运行环境(主要是提供网络相关的服务)
-
servlet是如何运行的
- 浏览器依据ip和port,建立连接。
- 浏览器创建请求数据包并发送。
- 服务器解析请求数据包,并且将解析到的数据存放到request对象里面,同时,创建response对象。
- 服务器创建Servlet对象,然后调用该对象的service方法。(服务器会将request和response作为参数传递给service方法)
- 服务器从respnose对象中获取处理结果,然后创建响应数据包并发送。
- 浏览器解析响应数据包,然后依据解析到的数据生成相应的页面。
servlet 3.0部分新特性
新增的注解支持
@WebServlet
@WebServlet 用于将一个类声明为 Servlet,该注解将会在部署时被容器处理,容器将根据具体的属性配置将相应的类部署为 Servlet。该注解具有下表给出的一些常用属性(以下所有属性均为可选属性,但是 vlaue 或者 urlPatterns 通常是必需的,且二者不能共存,如果同时指定,通常是忽略 value 的取值)
属性名 | 类型 | 描述 |
---|---|---|
name | String | 指定 Servlet 的 name 属性,等价于 。如果没有显式指定,则该 Servlet 的取值即为类的全限定名。 |
value | String[] | 该属性等价于 urlPatterns 属性。两个属性不能同时使用。 |
urlPatterns | String[] | 指定一组 Servlet 的 URL 匹配模式。等价于 标签。 |
loadOnStartup | int | 指定 Servlet 的加载顺序,等价于 标签。 |
initParams | WebInitParam[] | 指定一组 Servlet 初始化参数,等价于 标签。 |
asyncSupported | boolean | 声明 Servlet 是否支持异步操作模式,等价于 标签。 |
description | String | 该 Servlet 的描述信息,等价于 标签。 |
displayName | String | 该 Servlet 的显示名,通常配合工具使用,等价于 标签。 |
@WebInitParam
该注解通常不单独使用,而是配合 @WebServlet 或者 @WebFilter 使用。它的作用是为 Servlet 或者过滤器指定初始化参数,这等价于 web.xml 中 和 的 子标签。@WebInitParam 具有下表给出的一些常用属性:
属性名 | 类型 | 是否可选 | 描述 |
---|---|---|---|
name | String | 否 | 指定参数的名字,等价于 。 |
value | String | 否 | 指定参数的值,等价于 。 |
description | String | 是 | 关于参数的描述,等价于 。 |
@WebFilter
@WebFilter 用于将一个类声明为过滤器,该注解将会在部署时被容器处理,容器将根据具体的属性配置将相应的类部署为过滤器。该注解具有下表给出的一些常用属性 ( 以下所有属性均为可选属性,但是 value、urlPatterns、servletNames 三者必需至少包含一个,且 value 和 urlPatterns 不能共存,如果同时指定,通常忽略 value 的取值 )
属性名 | 类型 | 描述 |
---|---|---|
filterName | String | 指定过滤器的 name 属性,等价于 |
value | String[] | 该属性等价于 urlPatterns 属性。但是两者不应该同时使用。 |
urlPatterns | String[] | 指定一组过滤器的 URL 匹配模式。等价于 标签。 |
servletNames | String[] | 指定过滤器将应用于哪些 Servlet。取值是 @WebServlet 中的 name 属性的取值,或者是 web.xml 中 的取值。 |
dispatcherTypes | DispatcherType | 指定过滤器的转发模式。具体取值包括: ASYNC、ERROR、FORWARD、INCLUDE、REQUEST。 |
initParams | WebInitParam[] | 指定一组过滤器初始化参数,等价于 标签。 |
asyncSupported | boolean | 声明过滤器是否支持异步操作模式,等价于 标签。 |
description | String | 该过滤器的描述信息,等价于 标签。 |
displayName | String | 该过滤器的显示名,通常配合工具使用,等价于 标签。 |
@WebListener
该注解用于将类声明为监听器,被 @WebListener 标注的类必须实现以下至少一个接口:
- ServletContextListener
- ServletContextAttributeListener
- ServletRequestListener
- ServletRequestAttributeListener
- HttpSessionListener
- HttpSessionAttributeListener
属性名 | 类型 | 是否可选 | 描述 |
---|---|---|---|
value | String | 是 | 该监听器的描述信息。 |
@MultipartConfig
该注解主要是为了辅助 Servlet 3.0 中 HttpServletRequest 提供的对上传文件的支持。该注解标注在 Servlet 上面,以表示该 Servlet 希望处理的请求的 MIME 类型是 multipart/form-data。另外,它还提供了若干属性用于简化对上传文件的处理。具体如下:
属性名 | 类型 | 是否可选 | 描述 |
---|---|---|---|
fileSizeThreshold | int | 是 | 当数据量大于该值时,内容将被写入文件。 |
location | String | 是 | 存放生成的文件地址。 |
maxFileSize | long | 是 | 允许上传的文件最大值。默认值为 -1,表示没有限制。 |
maxRequestSize | long | 是 | 针对该 multipart/form-data 请求的最大数量,默认值为 -1,表示没有限制。 |
异步处理支持
-
为了解决servlet异步阻塞的问题
-
异步处理特性可以应用于 Servlet 和过滤器两种组件
-
默认是不开启的,开启方式如下:
- 配置文件版:
<async-supported>true</async-supported>
- 注解版:
@WebFilter(urlPatterns = "/demo",asyncSupported = true)
- 配置文件版:
servlet4.0部分新特性
服务器推送
服务器推送使服务器能预测客户端请求的资源需求。然后,在完成请求处理之前,它可以将这些资源发送到客户端。
要了解服务器推送的好处,可以考虑一个包含图像和其他依赖项(比如 CSS 和 JavaScript 文件)的网页。客户端发出一个针对该网页的请求。服务器然后分析所请求的页面,确定呈现它所需的资源,并主动将这些资源发送到客户端的缓存。
在执行所有这些操作的同时,服务器仍在处理原始网页请求。客户端收到响应时,它需要的资源已经位于缓存中。
所谓服务器推送,就是指服务器预测性的提前将资源发给浏览器进行缓存,当用户访问到需要这些资源的页面时,就可以直接从缓存中读取,从而加快页面访问速度,增加用户的体验感。
-
推送步骤
-
设置推送资源
PushBuilder pd = request.newPushBuilder();
pd.path("1.jpg");
-
进行推送
pd.push();
-
HttpServletMapping的使用
HttpServletMappingde API
-
getMatchValue()
返回部分 URI 路径,该路径会导致请求匹配。 -
getPattern()
返回 URL 模式的String
表示形式。 -
getServletName()
返回 servlet 名称的String
表示形式。 -
getMappingMatch()
返回匹配的类型,表示为MappingMatch
枚举值,该枚举值将为以下值之一:CONTEXT_ROOT
(根目录) 、DEFAULT
(默认) 、EXACT
(精准) 、EXTENSION
(拓展)或PATH
(路径)。
HttpFilter和Filter的区别
- HttpFilter是一个类,直接继承即可,而Filter是一个接口,需要实现;
- HttpFilter是Filter接口的一个实现类,多了对http协议的支持;
- HttpFilter里的doFilter方法里面的参数带Http协议的,而Filter里面的这两个参数是不带http协议的;
- 如果我们在拦截器里需要使用到带http协议的请求和响应的话,就优先使用HttpFilter类;
struts的使用
servlet、struts.x和struts2.x的关系说明
Struts2参考教程:https://w3cschool.cn/structs_2/
Struts2官方文档:https://struts.apache.org
共同点:
- 都是用来作为MVC模型中的Control层;
- 主要功能在于交互式地浏览和修改数据,生成动态Web内容;
不同点:
- struts1.x需要继承Action类,和servlet的耦合度很高,甚至可以看成就是个servlet的封装,而struts2的就是一个javabean,实现是基于拦截器;
- servlet和struts1均是单实例、多线程,线程不安全,struts2本身就是多实例、单线程的,所以可以说本身就是线程安全的。
SpringMVC的使用
参考资料:
- http://w3cschool.cn/wkspring/9pf81ha5.html
和struts1均是单实例、多线程,线程不安全,struts2本身就是多实例、单线程的,所以可以说本身就是线程安全的。
[外链图片转存中…(img-02N5XNjE-1598521138560)]
SpringMVC的使用
参考资料:
-
http://w3cschool.cn/wkspring/9pf81ha5.html
-
官网:http://docs.spring.io