tomcat与servlet

1. Servlet

1.1 Servlet是什么

首先说明,Servlet什么都不是,他只是一个规范,是Java的一个接口。

 

 

所以Servlet做的事情就是接口做的事情,Java的接口的作用就是规范。

servlet接口定义的是一套处理网络请求的规范,所有实现servlet的类,都需要实现它那五个方法,其中最主要的是两个生命周期方法 init()和destroy(),还有一个处理请求的service(),也就是说,所有实现servlet接口的类,或者说,所有想要处理网络请求的类,都需要回答这三个问题:

  • 你初始化时要做什么
  • 你销毁时要做什么
  • 你接受到请求时要做什么

1.2 Web服务器和Servlet容器

Web服务器: web服务器就是将一个电脑上的资源映射成为一个URL供外界访问。

Servlet容器: 存放Servlet对象的容器,我们如果想要将通过URL来获得计算机上的资源,总绕不开三步:

  1. 接收请求
  2. 处理请求
  3. 响应请求

由于接受请求和响应请求是共性请求,不存在差异性(也就是不需要程序员根据不同的业务场景进行自定义),所以接收请求和处理请求这两个步骤就被抽取为Web服务器。

 

 

这里Tomcat就既是Web服务器,又是Servlet容器,他接收外部请求并封装成ServletRequest,并将request发送给指定的Servlet,同时又将Servelet的处理结果整理成ServletResponse返回给客户端。

可以发现Servlet的是在真正被启用的时候才会执行初始化,并且只执行一次。在项目关闭的时候执行销毁:

 

2.1 几个问题

上面有几个问题,JSP是什么,JSP又起什么作用?JSPServlet是什么,而index.html明显是一个静态资源,却还是走到了DefaultServlet,难道静态资源也会通过DefaultServlet来进行访问吗?

2.2 浏览器是如何获得html语句的?

我们知道,浏览器能通过解析html语句渲染出页面。比如:

 

 

 

 

因为仔细想来,我们的主要目的就是希望在最终输出的html的代码中嵌入后台数据罢了。除了把html语句拿出来在Servlet里拼接好再输出这种方式外,我们也可以直接在html语句中写入动态数据(注意,不是HTML文件,必须是JSP之类的动态模板文件中的HTML语句)。而这两种几乎是完全相反的设计思路!

也就是说,我们可以在其他工具中写好html语句,再在其中嵌入我们的数据即可,由这个工具生成最终的html静态语句返回给浏览器。而JSP就是这个工具。

2.3 JSP是什么

JSP全称Java Server Page,直译就是“运行在服务器端的页面”。上面已经介绍过,我们可以直接在JSP文件里写HTML代码,使用上把它当做HTML文件。而且JSP中HTML/CSS/JS等的写法和HTML文件中的写法是一模一样的。但它毕竟不是HTML,而且本质差了十万八千里。因为我们还可以把Java代码内嵌在JSP页面中,很方便地把动态数据渲染成静态页面。这一点,HTML打死都做不到。

当有人请求JSP时,服务器内部会经历一次动态资源(JSP)到静态资源(HTML)的转化,服务器会自动帮我们把JSP中的HTML片段和数据拼接成静态资源响应给浏览器。也就是说JSP是运行在服务器端,但最终发给客户端的都已经是转换好的HTML静态页面(在响应体里)。

即:JSP = HTML + Java片段(各种标签本质上还是Java片段)

 

 

但所谓的“JSP和HTML相似”只是JSP给我们的表面印象。我们还要继续往下挖一挖。实际上,JSP和HTML差远了。JSP本质是一个Java类(Servlet),是在服务器混的,只不过它输出结果是HTML语句。蜜蜂产出蜂蜜,但是蜜蜂不是蜂蜜啊!

Servlet是什么?

  • 一个Java类,运行在Servlet容器中(Tomcat)
  • 负责接收请求
  • 调用Service处理数据
  • 负责响应数据

 

 

2.5 JSP的工作流程

 

 

原本,我们需要把美工的HTML代码一行行复制到Servlet中,然后拼接数据,最后向客户端响应拼接好的HTML页面。

 

 

 

2.7 JSP与AJAX+HTML

其实请求、响应这么一来一回,无非要的就两样东西:数据+HTML骨架。如果把服务器端比作淘宝卖家,客户端(浏览器)比作买家,而数据和HTML则是一件商品的两个重要组成部件。那么我们很自然地能够想到,其实运输方式至少可以有两种:

1.卖家组装好商品后再发货(JSP)

2.卖家把部件拆开,运到之后买家自己组装(AJAX+HTML)

 

虽然我们在浏览器地址栏输入localhost:8080/xxx/xxx.jsp,就显示出了当前页面,但那不是JSP页面,而是HTML页面。服务器并没有直接把JSP文件从服务端扔到客户端!JSP是Java Server Page,是服务器端的东西。服务器的东西永远不可能直接在浏览器运行。浏览器只能接受静态页面。

 

 

 

 

 

聊这个,纯粹是因为很多朋友很容易搞错一个概念,认为MVC模式是JavaEE独有的开发模式。其实不是的。MVC是web开发都有的一种模式,比如PHP开发web时也有MVC模式。而三层架构则是JavaEE的:Controller/Service/Dao。分层开发是为了使代码逻辑更加清晰,也起到了一定的解耦合作用。

值得注意的是,MVC只是在web层。当然,如果站在更高的角度,可以看成这样:

 



 

posted @ 2024-01-26 13:38  予真  阅读(25)  评论(0编辑  收藏  举报