Java – Servlet 基础原理
简介
Servlet 是Java的一种JavaEE规范,因为我们平时所使用的Java Web服务器中比较常使用Tomcat,而Tomcat是能运行Servlet规范的轻量级服务器(因为只支持Servlet和JDBC所以相对轻量),Servlet是由Tomcat进行管理,我们的Java代码运行在Servlet中,所以我们通常把Servlet和Tomcat作为Java的一种容器。
Maven 安装Servlet依赖
<dependencies>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
</dependency>
</dependencies>
Servlet 接口
Servlet 容器提供一个原始接口Servlet接口,且 Servlet 由Tomcat进行管理,当Tomcat接收到网络请求后,会实例化Servlet的实现类,并执行Servlet的接口方法。
Servlet提供5个原始接口抽象方法,通过重写这5个方法,可以接收来自Tomcat接收的请求。
// 接收Tomcat请求方法,当Tomcat收到请求时,会调用此方法,包含GET和POST等
public void service(ServletRequest servletRequest, ServletResponse servletResponse)
// Tomcat 对Servlet接口实现类进行实例化,默认收到请求后才开始实例化,
// 多次请求只执行一次
public void init(ServletConfig servletConfig)
// 取得Servlet配置
public ServletConfig getServletConfig()
// 取得Servlet版本信息等,自定义填写返回。
public String getServletInfo()
// 当服务器需要内存释放或关闭时调用,一般用于对在 init() 方法上加载的资源进行释放等操作
public void destroy()
HttpServlet 类
Java考虑到Http中包含7种请求类别,如果所有请求都调用 service() 方法的话,那么我们必须手动在service()方法里判断请求类型,且工作重复,所以提供了一个 HttpServlet 类,该类已实现Servlet 接口方法,并帮助我们判断好请求类型,区别不同类型不同方法,我们只需要继承 HttpServlet 类,并重写 HttpServlet 中的对应方法即可。
void doGet(HttpServletRequest req, HttpServletResponse resp)
void doHead(HttpServletRequest req, HttpServletResponse resp)
void doPost(HttpServletRequest req, HttpServletResponse resp)
void doPut(HttpServletRequest req, HttpServletResponse resp)
void doDelete(HttpServletRequest req, HttpServletResponse resp)
void doOptions(HttpServletRequest req, HttpServletResponse resp)
void doTrace(HttpServletRequest req, HttpServletResponse resp)
Servlet 注解用法
Servlet 在相当地方使用了注解,注解的用法如下
@WebServlet()
/*
例:@WebServlet(“/index”)
用于 Servlet 实现类请求url的声明,此注解通常标注在类上面,表示这个类是用来处理“/index”请求页面的逻辑的。
@WebServlet(urlPatterns = "/index")
与 @WebServlet(“/index”) 相同作用,在注解中,如果注解有多个参数值,但只传入单个值时,那么该值会被赋给 value 成员变量,value 值可以是一个数组类型,但在注解中,当传入成员只有一个时,可以省略 [] 语法。
@WebServlet(urlPatterns = "/index", loadOnStartup = 1)
Servlet 中的 init() 方法被用于实现类在Servlet容器中创建实例的过程,该过程可能需要一点时间,而Servlet中 init() 方法默认当收到请求后才会被执行,如果想把实例化提前到Tomcat启动时就实例化,可在WebServlet中定义loadOnStartup
loadOnStartup 值为负整数时即为第一次访问时才创建Servlet对象
loadOnStartup 值为0或正整数是即服务器启动时创建Servlet对象,数字越小优先级越高
*/
@ResultMap()
/*
例:@ResultMap(“BrandResultMap”)
与 mapper.xml 文件中定义ResultMap标签,如果定义sql语句使用的是 @select() 注解的话,当需要做ResultMap时,可以在Mapper接口中加上@ResultMap()注解
*/
urlPatterns 配置
urlPatterns 中用于在注解【@WebServlet】上使用的参数,它指接收某个url请求在这个实现类中处理。
一个Servlet实现类,可以配置多个urlPattern,urlPattern 本质是一个String数组。
@WebServlet(urlPatterns = {"/url1", "/url2", ...})
urlPatterns 还支持规则匹配
1.精确匹配
配置路径: @WebServlet(urlPatterns ="/user/select")
访问路径: /webPath/user/select
2.目录匹配
配置路径: @WebServlet(urlPatterns ="/user/*")
访问路径:
/webPath/user/aaa
/webPath/user/bbb
3.扩展名匹配
配置路径: @WebServlet(urlPatterns ="*.do*")
访问路径:
/webPath/aaa.do
/webPath/bbb.do
4.任意匹配
配置路径: @WebServlet(urlPatterns ="/"), @WebServlet(urlPatterns ="/*")
访问路径:
/webPath/abcd
/webPath/cdef
注意:
/ 和 /* 的区别 :
当我们的项目中的Servlet配置 "/" ,会覆盖掉tomcat中的 DefaultServlet, 当其他的 url-pattern 都匹配不上时都会走这个Servlet
当我们的项目中配置了 "/*" , 意果着匹配任意访问路径
所以在项目中我们一般不会使用这样的任意路径匹配。
Filter 过滤器
Filter是JavaWeb中其中一大组件,我们平时会发现,某些页面资源希望需要通过登陆后才给于展示,而Servlet中可以直接通过访门就可,这时就需要使用Filter对某些页面进行过滤,对于某些页面而言需要先满足某些条件,否则跳转到指定页面(如登陆页)。
创建Filter
定义一个类,实现Filter接口,重写方法,类中需要设置@WebFilter()
// 初始化过滤器
public void init(FilterConfig filterConfig)
// 对连接进来的请求,都会选经过一个过滤器进行加工
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
/*
如果通过了,就可以调用filterChain对象的通过方法
*/
filterChain.doFilter();
/*
如果不通过,可以使用跳转的方式对页面进行跳转
*/
@WebFilter 注解定义
Filter可以根据需求,配置不同的拦截资源路径
@WebFilter(/*)
public class FilterDemo implements Filter{}
拦截具体资源: /index.jsp => 只有访问 index.jsp 时才会被拦截
目录拦截: /iser/* => 访问/user下的所有资源,都会被拦截
后缀名拦截:*.jsp => 访问后缀名为 jsp的资源,都会被拦截
拦截所有: /* => 访问所有资源,都会被拦截。
共有 0 条评论