Servlet 为创建基于 web 的应用程序提供了基于组件、独立于平台的方法。一个 Servlet 其实就是一个 Java 类,并且可以通过 “请求-响应” 编程模型来访问的这个驻留在服务器内存里的 Servlet 程序。
Java Servlet API 是Servlet容器(tomcat)和servlet之间的接口,它定义了serlvet的各种方法,还定义了Servlet容器传送给Servlet的对象类,其中最重要的就是ServletRequest和ServletResponse。所以说我们在编写servlet时,需要实现Servlet接口。
Tomcat和Servlet的关系
Tomcat 是Web应用服务器,是一个Servlet/JSP容器. Tomcat 作为Servlet容器,负责处理客户请求,把请求传送给Servlet,并将Servlet的响应传送回给客户。
请求响应流程
- Tomcat将http请求文本接收并解析,然后封装成HttpServletRequest类型的request对象,所有的HTTP头数据读可以通过request对象调用对应的方法查询到。
- Tomcat同时会要响应的信息封装为HttpServletResponse类型的response对象,通过设置response属性就可以控制要输出到浏览器的内容,然后将response交给tomcat,tomcat就会将其变成响应文本的格式发送给浏览器
Servlet的使用
1、使用 Servlet,首先继承 HttpServlet,并重写 doGet() 和 doPost() 方法:
import javax.servlet.http.HttpServlet;
public class UploadServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
}
}
然后在 web.xml 中注册 Servlet 即可:
<servlet>
<servlet-name>upload</servlet-name>
<servlet-class>com.example.servlet.UploadServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>upload</servlet-name>
<!-- 访问路径地址 -->
<url-pattern>/servlet/upload</url-pattern>
</servlet-mapping>
2、Servlet 的生命周期
- 初始化阶段,判断 Servlet 实例是否存在,若不存在则调用构造方法装载 Servlet 类并创建实例,然后调用init()方法,若存在执行第二步;
- 响应客户端请求阶段,调用service(ServletRequest req, ServletResponse res)方法根据提交方式选择执行doGet()或者doPost()方法;
- 服务器关闭,调用destroy()的方法。
注意:在 Servlet 的整个生命周期,init() 方法只被调用一次。
Filter
Filter也称之为过滤器,它是Servlet技术中最实用的技术,Web开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图片文件或静态 html 文件等进行拦截,从而实现一些特殊的功能。例如实现URL级别的权限访问控制、过滤敏感词汇、压缩响应信息等一些高级功能。
Filter链
在我们的请求到达Servle之前是可以经过多个Filter的,一般来说,建议Filter之间不要有关联,各自处理各自的逻辑即可。如果一定要确保执行顺序,就要对配置进行修改了,执行顺序如下
- 在web.xml中,filter执行顺序跟定义的顺序有关,先声明的先执
- 使用注解配置的话,filter的执行顺序跟名称的字母顺序有关,例如AFilter会比BFilter先执行
- 如果既有在web.xml中声明的Filter,也有通过注解配置的Filter,那么会优先执行web.xml中配置的Filter
应用:实现Filter接口,重写doFilter方法
Spring Interceptor
类似于Servlet开发中的过滤器Filter,用于对处理器进行预处理和后处理。
应用
-
实现HandlerInterceptor接口
-
继承HandlerInterceptorAdapter抽象类,按需重写部分实现即可,
HandlerInterceptor有如下3个方法:- boolean preHandler():在controller执行之前调用
- void postHandler():controller执行之后,且页面渲染之前调用
- void afterCompletion():页面渲染之后调用,一般用于资源清理操作
-
注册自定义的HandlerInterceptor到spring框架中
@Configuration
public class InterceptorsConfig extends WebMvcConfigurerAdapter {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new RequestInterceptor()).addPathPatterns("/**");
super.addInterceptors(registry);
}
}