servlet以及url匹配规则

一、什么是servlet
Servlet是sun公司提供的一门用于开发动态web资源的技术。
API中提供了一个servlet接口,要开发一个Java程序向浏览器输出数据,需要完成以下2个步骤:
  1、编写一个Java类,实现servlet接口。
  2、把开发好的Java类部署到web服务器中。
按照一种约定俗成的称呼习惯,通常我们也把实现了servlet接口的java程序,称之为Servlet

二、servlet运行过程
servlet的访问是由web容器发起调用,首次调用创建servlet实例并调用init()方法进行初始化,若非首次访问,直接创建HttpServletRequest对象和HttpServletResponse对象(封装http请求需要),然后带着参数去请求servlet的service方法,service会返回信息放进HttpServletResponse,web容器会从response对象中读取数据展示给客户端
运行图如下:
在这里插入图片描述 Servlet是一个供其他Java程序(Servlet引擎)调用的Java类,它不能独立运行,它的运行完全由Servlet引擎来控制和调度。

服务器只会创建一个Servlet实例对象,也就是说Servlet实例对象一旦创建,它就会驻留在内存中,为后续的其它请求服务,直至web容器退出,servlet实例对象才会销毁。
在Servlet的整个生命周期内,Servlet的init方法只被调用一次。每次访问请求,Servlet引擎都会创建一个新的HttpServletRequest请求对象和一个新的HttpServletResponse响应对象,调用的Servlet的service(req,resp)方法,service方法再根据请求方式分别调用doXXX方法。

这个过程包含servlet的生命周期4个阶段:
1.加载和实例化
2.初始化
3.请求处理
4.服务终止

三、Servlet接口实现类
Servlet接口定义了两个默认实现类,分别为:GenericServlet、HttpServlet。 HttpServlet是从GenericServlet继承而来的
具体说一下HttpServlet
  HttpServlet指能够处理HTTP请求的servlet,它在原有Servlet接口上添加了一些与HTTP协议处理方法(比如 在 service() 方法中直接把 ServletReuqest 和 ServletResponse 强转为 HttpServletRequest 和 HttpServletResponse),它比Servlet接口的功能更为强大。因此在编写Servlet时,通常继承HttpServlet,避免直接去实现Servlet接口。
  HttpServlet在实现Servlet接口时,重写了service方法,在方法体内的代码会自动判断用户的请求方式,若为GET请求,则调用HttpServlet的doGet方法,若为Post请求,则调用doPost方法。所以,在编写Servlet时,通常只需要重写doGet或doPost方法,不需要重写service方法。

举个栗子:在SpringBoot项目中简单使用Servlet
1.创建TestServlet继承HttpServlet,重写doGet和doPost方法
在这里插入图片描述
2.在spring中注册自己的TestServlet
在这里插入图片描述运行项目 访问http://localhost:8080/test 如下
在这里插入图片描述
这也就意味着 每个访问接口都需要实现一个Httpservlet,并在springboot中注册指定匹配路径来访问

四、url访问匹配

1.servlet容器有特定的servlet url-pattern匹配规则,不同于通配符或者正则表达式
2.Servlet2.5开始,一个servlet可以使用多个url-pattern规则
3.当servlet容器接收到浏览器发起的一个url请求后,容器会用url减去当前应用的上下文 路径,以剩余的字符串作为servlet映射,假如url是http:// localhost:8080/spring/index, 其应用上下文是appDemo,容器会将http:// localhost:8080/spring去掉,用剩下的/index部分拿来做servlet的映射匹配
4.url-pattern映射匹配过程是有优先顺序的,当有一个servlet匹配成功以后,就不会去理会剩下的servlet了。

具体说一下四种匹配方式
1.精确匹配
list.add("/index");
list.add("/login");
当浏览器请求 http:// localhost:8080/index 和 http:// localhost:8080/login 时,都可以匹配到该url
2.路径匹配
list.add("/user/");
当浏览器请求http:// localhost:8080/user/save 和 http:// localhost:8080/user/update,都可以匹配到该url,即路径以/user/开始,后面的任意路径都可以被匹配。
3.扩展名匹配
list.add("
.htm")
当浏览器请求http:// localhost:8080/index.htm 和 http:// localhost:8080/test.htm,都可以匹配到该url,即路径以.htm结尾的路径都可以被匹配。
4.缺省匹配
list.add("/")
以上都找不到servlet,就用这个默认的servlet

当一个url与多个servlet的匹配规则可以匹配时,则按照 “ 精确路径 > 最长路径>扩展名”这样的优先级匹配到对应的servlet

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值