JAVASpring

Spring boot 和 Servlet 的关系

背景


开发了很久的web服务,使用了很多web框架,都忘记web技术最原始的模样了,今天来回顾下。

首先回忆下web服务器和tomcat


web技术分为动态(servlet技术)和静态html

不管动态还是静态,访问web都是通过http协议,你理解为都是url访问(不管动态还是静态都是url访问),因此一般web服务器==HTTP服务器

web容器(web服务器)主要有:Apache、IIS、Tomcat、Jetty、JBoss、webLogic等,而Tomcat、Jetty、JBoss、webLogic同时也是servlet容器,或者说他们还包含了servlet容器,原因是支持动态,即servlet技术。

与动态不同的是,Apache仅支持静态Hmtl

Apache和Tomcat区别

Apache:在Web服务器中,Apache是纯粹的Web服务器,经常与Tomcat配对使用。它对HTML页面具有强大的解释能力,但是不能解释嵌入页面内的服务器端脚本代码(JSP/Servlet)。

Tomcat:早期的Tomcat是一个嵌入Apache内的JSP/Servlet解释引擎Apache+Tomcat就相当于IIS+ASP。后来的Tomcat已不再嵌入Apache内,Tomcat进程独立于Apache进程运行。 而且,Tomcat已经是一个独立的Servlet和JSP容器,业务逻辑层代码和界面交互层代码可以分离了。因此,有人把Tomcat叫做轻量级应用服务器。

IIS:微软早期的IIS,就是一个纯粹的Web服务器。后来,它嵌入了ASP引擎,可以解释VBScript和JScript服务器端代码了,这时,它就可以兼作应用服务器。当然,它与J2EE应用服务器根本无法相比,但是,从功能上说,从原理上说,它勉强可以称之为应用服务器。确切地说,它是兼有一点应用服务器功能的Web服务器。

Apache 和 Tomcat 都是web网络服务器,两者既有联系又有区别:

  • Apache是web服务器(仅支持静态解析,如HTML)
也就是说你在服务器的目录下面丢个index.html,通过http:xxx//8080/index.html可以访问
倘若丢个index.jsp,无法解析,无法通过http:xxx//8080/index.jsp访问
  • tomcat是java应用服务器(支持动态解析,如JSP)

index.html和index.jsp均支持,但对静态文件处理的性能差,这一点不如Apache 效率高

Tomcat只是一个servlet(jsp也翻译成servlet)容器,可以认为是apache的扩展,但是可以独立于apache运行。

Apache是很最开始的页面解析服务,tomcat是后研发出来的,从本质上来说tomcat的功能完全可以替代Apache,但Apache毕竟是tomcat的前辈级人物,并且市场上也有不少人还在用Apache,所以Apache还会继续存在,不会被取代,apache不能解析java的东西,但解析html速度快。

因此,由于各有优缺点,一般会整合使用:

  • 如果请求是静态网页则由Apache处理,并将结果返回;
  • 如果是动态请求,Apache会将解析工作转发给Tomcat处理,Tomcat处理后将结果通过Apache返回。

这样可以达到分工合作,实现负载均衡,提高系统的性能。

来自其他网站的回答

某种程度上,Servlet 就是 Spring Boot 的底层基础代码


Servlet 是 Sun 公司所设计开发的可以用于接收和处理 HTTP 请求的 Java 类。

Servlet是sun公司提供的一门用于开发动态web资源的技术。我们普通的Java类实现了Servlet接口后,可将我们的服务部署在Web容器中,这样我们的服务就可以提供Web服务了。

Servlet是JavaWeb最为核心的内容,它是Java提供的一门动态web资源开发技术。

以前的java web项目,需要在web.xml中定义servlet,对应不同的请求,而在spring项目中,我们用controller定义了各种各样的servlet(当然不包括DispatcherServlet),那么controller是servlet吗?
servlet的本质其实也是一个java bean,controller是对servlet的封装,底层依旧是servlet。
web开发使用Controller基本能解决大部分的需求,但是有时候我们也需要使用Servlet,因为相对于拦截和监听来说,有时候原生的还是比较好用的,现在就来简单的在SpringBoot中使用这些特殊类吧。

可以说,Servlet就是SpringBoot在web服务的底层代码。

Spring MVC 这样的框架就是对 Servlet 的二次封装,能够帮助我们自动的从 HTTP 请求中获得请求参数等工作,让我们可以将精力集中在业务代码上。

如果你使用过 Spring MVC 的,你就知道 Spring MVC 框架要想启动,必须配置 Spring MVC 最核心的一个类,DispatcherServlet,这个类就是 Servlet,没有这个核心类,你连整个 Spring MVC 框架都启动不了。

Spring Boot 其实就是对 Spring MVC 的二次封装,能够使我们不在困于 Spring MVC 繁琐的 XML 配置中,能够实现开箱即用的便利程度。因此 Spring Boot 的底层就是 Spring MVC,而 Spring MVC 的底层就是 Servlet。

springboot本身默认封装了tomcat,所以本质上还是用到了servlet技术。只不过是通过框架继续使用。比如springmvc框架,也可以简单的理解为springmvc框架是对servlet的再封装和扩展。虽然已经用到servlet技术了,但是你写的代码都是springmvc的代码标准。

servlet是spring的基础,springboot是为了简化spring的配置,并封装成了微服务。

Tomcat与servlet之间的关系


如何使用Servlet搭建web服务


1、依赖引入

需要在pom.xml中添加servlet依赖,然后才可以在项目中使用HttpServlet

<!--加入servlet依赖(servlet的jar)-->
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>javax.servlet-api</artifactId>
      <version>4.0.1</version>
      <scope>provided</scope>
    </dependency>
    <!--jsp的依赖(jsp相关的jar加进来)-->
    <dependency>
      <groupId>javax.servlet.jsp</groupId>
      <artifactId>javax.servlet.jsp-api</artifactId>
      <version>2.2.1</version>
      <scope>provided</scope>
    </dependency>

2、编写接口服务类

接口类需要继承javax.servlet.http.HttpServlet。

假设定义的类叫HelloServlet

public class HelloServlet extends HttpServlet{
	//初始化servlet,调用init方法
	@Override
	public void init() throws ServletException {
		System.out.println("初始化时调用");
	}
	//开启服务
	@Override
	protected void service(HttpServletRequest arg0, HttpServletResponse arg1) throws ServletException, IOException {
		System.out.println("开启服务时调用");
	}
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		
	}
	//销毁时调用destory
	@Override
	public void destroy() {
		System.out.println("销毁时调用");
	}
}

3、在web.xml文件中注册Servlet类

<!--任何一个servlet都对应一个servlet-mapping-->
  <servlet>
      <servlet-name>hello</servlet-name>
      <!--这个位置必须是带有包名的全限定类名-->
      <servlet-class>com.qiyi.HelloServlet</servlet-class>
  </servlet>
 
  <!--servlet映射信息-->
  <servlet-mapping>
      <!--这里随意填写,但是名字必须与上方相同-->
      <servlet-name>hello</servlet-name>
 
      <!-这里需要一个路径,必须以/开始,可以随便写-->
      <url-pattern>/sdafs/sada/ds</url-pattern>
  </servlet-mapping>

4、启动Tomcat服务器

Servlet生命周期


1、图解说明

2、说明

3.生命周期方法执行流程

Servlet规范三大组件


1、介绍

Servlet规范三大件分别是:servlet、过滤器、监听器

2、拦截器与过滤器区别

拦截器核心原理:AOP思想

过滤器是Servlet的技术。

执行顺序不同:所有的请求都是先经过过滤器,最后离开过滤器,中间执行的拦截器的方法。拦截器是在dispatcherservlet这个servlet中执行的。如下图所示:

SpringMVC拦截器处理流程:

拦截器与过滤器的区别:

  • 1 拦截器是基于java的反射机制的,而过滤器是基于函数回调。
  • 2 过滤器是servlet规范规定的,只能用于web程序中,而拦截器是在spring容器中,它不依赖servlet容器。
  • 3 过滤器可以拦截几乎所有的请求(包含对静态资源的请求),而拦截器只拦截action请求(不拦截静态资源请求)。
  • 4 拦截器可以访问action上下文、值栈里的对象,而过滤器不能访问。
  • 5 在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次。
  • 6 拦截器可以获取IOC容器中的各个bean,而过滤器就不行,这点很重要,在拦截器里注入一个service,可以调用业务逻辑。
  • 7 拦截器是被包裹在过滤器之中。