前言
本期也属于Java后端专栏,笔者为复习Web根本知识所特意出的一期,仅作为复习参考笔记。
HTTP
HTTP全称是HyperText Transfer Protocal,翻译过来是超文本传输协议。它是Internet的应用层协议,它界说了客户机的浏览器与服务器的Web应用之间如何通讯以及通讯时用于传递数据的数据包的格式。HTTP有许多版本,当前主流的是 HTTP/2 与 HTTP/3 ,不外这里我们以相对简单的HTTP1.1版举例说明。
HTTP是接纳请求/响应模式的无状态协议。浏览器向Web应用发送一个请求,Web 应用接收并处理该请求,然后向浏览器发回响应。在这一过程中,Web应用不生存与客户机的通讯状态。
HTTP请求与响应
我们先看一个HTTP请求消息的示例:
- GET / HTTP/1.1
- Accept:image/gif,image/x-xbitmap,image/jpeg,image/pjpeg,application/x-shockwave-flash,application/vnd.
- ms-excel, application/vnd.ms-powerpoint, application/msword, */*
- Accept-Language: zh-cn
- Accept-Encoding: gzip, deflate
- User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)
- Host: www.csai.cn
复制代码 该消息用于请求http://www.csai.cn的主页。
响应消息如下:
- HTTP/1.1 200 OK
- Server: Microsoft-IIS/5.0
- Content-Location: http://www.csai.cn/index.htm
- Date: Mon, 24 Dec 2007 08:31:08 GMT
- Content-Type: text/html
- Accept-Ranges: bytes
- Last-Modified: Mon, 24 Dec 2007 02:48:20 GMT
- Content-Length: 60744
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/
- xhtml1-transitional.dtd">
- <html xmlns="http://www.w3.org/1999/xhtml" lang="zh-CN">
- <head>
- <title>希赛网 中国IT技术门户 为企业和IT技术人员提供最全面的服务平台</title>
- …
- </body>
- </html>
复制代码 在IE的地址栏中键入希赛网主页的地址http://www.csai.cn,单击回车后,IE浏览器便会将这一段请求消息以文本的形式发送出去,经过网络传递到希赛网的Web服务器上,Web服务器经过分析发现该客户端请求的是希赛网的主页,于是将希赛网的主页放在响应消息中发送回客户机的浏览器。
HTTP请求消息
HTTP请求消息由Request-Line(请求行)、Header Field(头域)和Message-Body(消息体)组成。
Request-Line(请求行)
- Request-Line = Method[SP]Request-URI[SP]HTTP-Version CRLF
- //示例
- GET /index.htm HTTP/1.1
复制代码 此中Method称为HTTP方法,它表示操纵类型,Request-URI称为请求URl,表示请求有关的Web服务器中的资源定位符,HTTP-Version表示HTTP请求版本号,[SP]表示空格 CRLF表示回车
1)HTTP方法
HTTP请求消息通过使用差别的HTTP方法来向接收到请求的主机说明其请求所期望执行的操纵。HTTP/1.1统共界说了8种方法。
- OPTIONS:用于获取服务器支持的 HTTP 方法列表,或预检跨域请求(CORS)
- GET:请求获取指定资源(如网页、图片、API 数据)
- HEAD:获取资源的元数据(如响应头),不返回响应体
- POST:向服务器提交数据(如表单、JSON),创建新资源。
- PUT:上传或替换服务器上的资源(需指定完整 URL)。
- DELETE:删除服务器上的指定资源。
- TRACE:测试 HTTP 请求路径,返回服务器收到的原始请求信息。
- CONNECT:建立到目的服务器的隧道(常用于 HTTPS 署理)
常用的重要是GET和POST请求。
- Request-URl
Request-URI称为请求URI,它是一个不含空白字符的字符串,符合URI(资源定位符)的格式规范,表示Web服务器上的一个资源位置,可以是以下四种格式:
- Request-URI = "*" | absoluteURI | abs path | authority
复制代码
- *:表示请求的资源是服务器本身,而非特定路径下的资源。
- absoluteURI: 完整的 URL,包罗协议、主机、端口和路径(如 http://api.example.com/users/123)
- abs path:不包罗协议和主机部分的路径(如 /users/123)
- authority:仅包罗主机和端口(如 api.example.com:8080)
留意:当使用abs path时,Host头必须包罗目的主机信息
我们看个简单示例:
- POST /api/users HTTP/1.1
- Host: example.com
- Content-Type: application/json
- Content-Length: 58
- {
- "name": "John Doe",
- "email": "john@example.com",
- "age": 30
- }
复制代码 HTTP响应消息
HTTP响应消息是Web服务器在处理完HTTP请求消息后返回给客户机浏览器的消息,它由状态行、头域和消息体组成。
- Status-Line = HTTP-Version[SP]Status-Code[SP]Reason-Phrase CRLF
复制代码 此中,HTTP-Version、SP和CRLF的意义与请求消息中的一样,不重复累述。
1)Status-Code是响应状态码,它是3位十进制数,根据首位数字差别分为五类。
- 1xx:信息响应类,表示接收到请求而且继续处理。例如“100Continue”表示服务器已接收并开始处理请求,要求客户机继续发送请求的剩余部分,如果请求已被发送完全,客户机可以忽略该消息。
- 2xx:处理乐成响应类,表示动作被乐成接收、理解和担当。例如“200 OK”表示请求的操纵已乐成完成。
- 3xx:重定向响应类,为了完成指定的动作,必须担当进一步处理。
- 4xx:客户端错误类,客户请求包罗语法错误大概是不能被精确执行。“404 Not Found”表示客户端请求中Request-URI指定的资源位置不存在。
- 5xx:服务端错误类,服务器不能精确执行一个精确的请求。
简单示例:
- HTTP/1.1 200 OK
- Content-Type: application/json
- Content-Length: 112
- {
- "status": "success",
- "data": {
- "id": 123,
- "name": "John Doe",
- "email": "john@example.com"
- }
- }
复制代码 Header Field(头域)
在HTTP请求消息和响应消息中都包罗Header Field,这些头域用于说明一些辅助信息。头域项的一般格式为:
此中Field -Name是头域名,Field -Value是头域值
有些头域用于说明一些通用信息,称为General Header Field (通用头域),即可以用于请求消息也可以用于响应消息;有些头域只被用于请求消息,称为Request Header Field(请求头域);有些头域只被用于响应消息,称为Response Header Field(响应头域);有些头域用于说明传输内容的信息,它们可以被用于请求消息也可以被用于响应消息。整个头域由多条头域项组成,每条头域项占一行。
- General Header Field
用以形貌了传递消息的一些属性。
- Cache-Control:用于指定一种缓冲机制,这种缓冲机制在整个请求/响应过程中必须被服从。
- Date:表示消息生成时的日期时间,该域所使用的日期格式必须符合HTTP日期格式。
- Pragma:用于指定一些实现相关的参数,在HTTP协议中并没有规定该头域所携带参数的意义。
- Transfer-Encoding:如果该头域被指定,那就说明消息体接纳了所指定的传输类型举行传输。
- Cache-Control: no-cache//该头域中指定的缓冲机制将覆盖默认的缓冲机制
- Date: Tue, 13 Nov 2007 08:12:31 GMT//表示消息生成时的日期时间
- Pragma: “string”//可以利用该头域定义用于传递特定信息的一系列字符串。
- Transfer-Encoding: chunked//表示消息体采用分块传输的方式进行传输。
复制代码
- Request Header Field
这类头域只出如今请求消息中,它们通常被客户机用于向服务器传递一些客户机的信息大概请求消息的信息。
- Accept:可以被用来说明客户机浏览器能够担当的媒体格式。
- Accept-Charset:可以被用来说明客户机浏览器能够担当的字符编码方式。
- Accept-Encoding:可以被用来说明客户机浏览器能够担当的内容编码方法,通常用来指定内容的压缩方法。
- Accept-Language:可以被用来说明客户机浏览器能够担当的语言。
- From:表示提交该请求的终端用户的电子邮件。
- Host:指示Internet上的一个主机和端标语,主机通常是域名大概IP地址。
- If-Match:该请求为条件请求,该域的值是一个匹配字符串,如果该匹配字符串匹配乐成则执行操纵,否则不执行操纵。
- If-None-Match:意义与If-Match恰好相反,表示匹配不乐成则执行,否则不执行。
- If-Modified-Since:值是一个日期,表示请求的资源如果从给定的日期后修改过则执行操纵,否则不执行。
- If-Unmodified-Since:意义与If-Modified-Since恰好相反。
- If-Range:假如客户机的缓冲池中已有了资源实体的一部分,而期望获得剩余部分,则客户机的请求可以使用该头域。
- Max-Forwards:在TRACE和OPTIONS方法中使用,用于限制消息在网络中传播的跳数,即消息被署理大概网关转发的次数,以此来限制消息的生命期。
- Range:用于指定一个范围,它表示请求的资源实体的范围,可以使用字节数指定。
- Referer:客户机用该域告诉服务器,请求中的Request-URI是如何获得的。
- User-Agent:可以被用来说明客户机浏览器的型号
3)Response Header Field
这类头域只出如今响应消息中,它们通常被服务器用于向客户机传递一些服务器的信息大概响应消息的信息。
- Accept-Ranges:服务器用于指示它所担当的Range类型
- Age:顾名思义,在响应消息中该头域表示响应消息的“年龄”,也就是服务器估计的该响应消息产生后的时间长度。
- Location:当响应消息的响应码为3xx时,该头域会被响应消息用于指示重定向后新的URL。
- Retry-After:通常用于响应码为503的响应消息,503响应消息表示服务器当前不可用,该头域估计了一个服务器不可用的时间
- Server:表示运行在服务器上用于处理请求的软件的信息。
4)Entity Header Field
该类头域形貌了消息体中携带的数据的元数据(即对数据的长度、类型、修改时间等属性的形貌信息。
- Allow:表示Request-URI指定的资源实体所支持的HTTP方法列表,在响应码为405的响应消息中必须包罗该头域。
- Content-Encoding:指示消息内容的编码方法,通常指示内容的压缩算法。
- Content-Language:表示消息内容所接纳的天然语言。
- Content-Length:表示消息长度。头域值是十进制数,表示字节数。
- Content-Location:表示除了Request-URI指定的位置外,其他可以访问到消息内容的位置。
- Content-MD5:表示消息体中数据的MD5校验码,用来实现端到端的消息完整性查抄。
- Content-Range:当传递的数据是整个资源实体的一部分时,用该域说明当前传递的数据是资源实体的哪一部分。
- Content-Type:指示消息体中内容的媒体格式。
- Expires:指定了一个日期,表示消息体中的内容在该日期之前有效,过了该日期则消息内容就过时了。
- Last-Modified:表示消息中携带的内容实体的末了修改时间。
Cookie
Cookie是Web服务器要求客户机浏览器生存在客户机当地的一个非常小的文本文件,该文件的内容由服务器指定。同时服务器还指定了一个URL聚集,当浏览器下次访问这些URL中的任何一个时都会携带上Cookie中的内容。普通来讲,Cookie中的内容实质上是一系列属性,属性由属性名和属性值组成,属性名和属性值都是由Web服务器指定的。我们看一下Cookie工作过程。
此中expires表示过期时间,即表示这个Cookie设置到该日期以后就无效了。domain属性和path属性合起来规定了一系列URL,即只要访问的URL的域名是example.com,Request-URI是以/login开始的话,那么就将该Cookie携带在HTTP请求头中。
Session
Session(会话) 是一种跟踪用户状态的机制,用于解决 HTTP 协议的无状态性题目。我们考虑一下这个场景:邮件服务器中每个用户的邮件内容应该是受密码保护的,在没有使用精确的用户名和密码登录后是不能访问的。用户的邮箱中有许多资源,例如邮件列表、邮件内容、通讯录等,由于每个资源都应该受密码保护,所以用户在每一次请求任何一个资源时都必须输入用户名和密码,否则别人就有大概通过构造该资源的URL访问到该资源。但是,云云频繁的输入用户名和密码对于用户来说是无法容忍的。而Session的出现就是为相识决这一个题目。
Session机制是一种服务器端的机制,它可以解决上面提到的情形:当用户登录乐成时,服务器通过一种特殊的算法生成一个不会重复而且很难找到规律的字符串,称为Session ID,而且将Session ID生存在当地Session ID库中(使用一种类似于散列表的结构来生存信息),同时通过某种机制将Session ID告诉给客户机;当服务器接收到任何访问受保护资源的请求时,只需要查看请求中是否已携带 Session ID 而且查抄携带的Session ID是否已在Session ID库中存在,假如存在则表示该客户机已乐成登录,否则拒绝该请求。
我们详细看一下它的流程:
1 创建 Session
用户初次访问服务器时,服务器生成一个唯一的 Session ID(例如:98f7a5b6-3d2e-4c1f-8a5d-2f4b8c7d9e01)。然后Session ID 通过 Set-Cookie 响应头返回给客户端,存储在浏览器的 Cookie 中,大概通过URL将这个ID传给浏览器。
2 维护 Session
后续请求中,客户端主动携带 Cookie: sessionid=xxx。而服务器通过 Session ID 查找对应的用户数据。
3 烧毁 Session
如果想要烧毁Session时,可以手动调用 session_destroy()(如用户退出登录),大概到达超时时间(默认 24 分钟,可配置)以及关闭浏览器(依赖 Cookie 的过期策略)。
Session 的本意是“会话”的意思,会话表示一组顺序而且相互关联的对话过程。HTTP 是无状态协议,假如将 HTTP 的一次请求/响应过程看作是一次对话,那么无状态就表示每一次对话和其他对话之间都是没有关联的,即本次对话时已经忘记了上次对话的情况甚至已经忘记了以前是否对话过。所以,引入Session机制让Web服务器与一个客户端的交流过程更像是一个对话。
末了,Session 和 Cookie 固然都用于跟踪用户状态,但它们的工作方式完全差别。Cookie 直接在客户端存储数据,而 Session 是通过 ID 间接在服务器端存储数据。
CGI技术
把Web应用带向动态化的第一个技术就是CGI,即通用网关接口(Common Gateway Interface)。CGI(Common Gateway Interface,通用网关接口)是一种在 Web 服务器和外部程序之间举行通讯的标准协议,它允许 Web 服务器将客户端的请求传递给外部程序处理,并将程序的响应返回给客户端。CGI程序可以用许多语言编写,好比:C++、Perl等。
每当收到CGI请求时,Web服务器都需要建立一个新的历程。这将导致响应时间变慢,因为对于一个历程来说,服务器必须创建新的地址空间并举行初始化。多数服务器的配置只能运行有限数量的历程,用户大概面对历程空间耗尽的题目。如果服务器历程空间到达极限,将无法再处理客户机新的请求。
Servlet技术
为相识决上述题目,Sun引入了Servlet。Servlet是CGI的替代品,也是Java进军Web开辟范畴的第一款技术。Servlet完全基于Java实现,提供了对整个Java应用编程接口(API)的完全访问和一个用于处理Web应用的完备的库。与CGI差别的是,Servlet为每个请求启动一个单独的线程举行响应,从而大大的节约了空间和时间。
工作原理
工作原理
1 客户端请求:用户通过浏览器向 Web 服务器发送 HTTP 请求。
2 服务器接收请求:Web 服务器(如 Tomcat)接收到请求后,根据请求的 URL 和配置信息,查找对应的 Servlet。
3 Servlet 容器管理:Servlet 容器(如 Tomcat 就是一个 Servlet 容器)负责加载、实例化和管理 Servlet。当接收到请求时,容器会查抄 Servlet 是否已经被加载和实例化,如果没有,则会举行相应的操纵。
4 调用 Servlet 方法:Servlet 容器将请求传递给对应的 Servlet,并调用其相应的方法(如 doGet() 处理 GET 请求,doPost() 处理 POST 请求)。
5 Servlet 处理请求:Servlet 接收到请求后,根据业务逻辑举行处理,大概会访问数据库、调用其他服务等。
6 生成响应:Servlet 处理完请求后,将生成的响应数据(如 HTML 页面、JSON 数据等)封装成 HttpServletResponse 对象,返回给 Servlet 容器。
7 服务器返回响应:Servlet 容器将响应数据发送给客户端浏览器举行表现。
Servlet 的生命周期
1 加载和实例化:Servlet 容器在启动时或接收到第一个请求时,会加载 Servlet 类并创建其实例。
2 初始化:Servlet 实例创建后,容器会调用其 init() 方法举行初始化操纵。init() 方法在 Servlet 的生命周期中只会被调用一次。
3 服务:当有请求到达时,容器会调用 Servlet 的 service() 方法,service() 方法会根据请求的方法类型(如 GET、POST)调用相应的 doGet() 或 doPost() 等方法来处理请求。
4 烧毁:当 Servlet 容器关闭或 Servlet 不再需要时,容器会调用 Servlet 的 destroy() 方法举行资源开释和清算工作。
编写 Servlet 的简单示例
1 导入必要的包:需要导入 javax.servlet 和 javax.servlet.http 包中的类。
2 创建一个类继承 HttpServle:HttpServlet 是一个抽象类,它实现了 Servlet 接口,提供了处理 HTTP 请求的根本方法。
3 重写 doGet() 或 doPost() 方法:根据需要处理的请求方法,重写相应的方法。
4 摆设和配置 Servlet:将编写好的 Servlet 类摆设到 Servlet 容器中,并在 web.xml 文件(传统方式)或使用注解(现代方式)举行配置。
- import javax.servlet.ServletException;
- import javax.servlet.annotation.WebServlet;
- import javax.servlet.http.HttpServlet;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- import java.io.IOException;
- import java.io.PrintWriter;
- // 使用注解配置 Servlet
- @WebServlet("/hello")
- public class HelloServlet extends HttpServlet {
- protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
- // 设置响应内容类型
- response.setContentType("text/html");
- // 获取响应输出流
- PrintWriter out = response.getWriter();
- // 输出 HTML 页面
- out.println("<html>");
- out.println("<head><title>Hello Servlet</title></head>");
- out.println("<body>");
- out.println("<h1>Hello, World!</h1>");
- out.println("</body>");
- out.println("</html>");
- }
- }
复制代码 JSP技术
JSP的全称是JavaServer Pages,它是基于Java的动态页面技术,它可用于创建跨平台和跨Web服务器的动态网页。JSP是除Servlet之外的又一个Java Web开辟的关键技术。它允许开辟者在 HTML 页面中嵌入 Java 代码和特定标签,从而简化动态网页的开辟。
JSP也需要运行于JSP容器中,但是与Servlet差别的是,JSP与HTML一样是JSP以单独的文件形式存在的。JSP文件的内容非常类似于一个HTML文件,它在HTML文件中通过特殊的标签将Java代码添加到此中。JSP文件直接存在于Web应用的Web目次中,客户端的请求URL直接指向该JSP文件,当JSP容器发现客户端正在请求某个JSP文件时它就对该JSP文件举行解析,运行此中的Java代码,并将执行完后生成的HTML内容返回给客户端。一个简单的JSP文件内容如下:
- <%@ page language="java" contentType="text/html; charset=GBK" pageEncoding="GBK"%>
- <%@ page import="java.util.Date;"%>
- <HTML>
- <HEAD>
- <TITLE>提示</TITLE>
- </HEAD>
- <BODY>
- 现在时间是:<%= new Date().toString() %>!
- </BODY>
- </HTML>
复制代码 JSP语法初探
1)语法结构:
- 脚本元素:在 HTML 中嵌入 Java 代码(如<% Java代码 %>)。
- 声明:JSP 里用来界说变量和方法的地方。
- 表达式:直接输出变量值(如<%= 表达式 %>)。
- 指令:控制 JSP 的举动(如<%@ page %>设置页面属性)。
- 动作标签:用于动态引入资源、调用 JavaBean 等(如jsp:include)。
- <%
- String name = "张三";
- out.println("你好," + name); //脚本元素
- %>
- <%!
- private int count = 0;
- public void increment() { //声明
- count++;
- }
- %>
- <%= "当前时间:" + new java.util.Date() %> //表达式
- <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>//指令
- <jsp:include page="header.jsp" />//动作标签
复制代码 2)表达式语言(EL):
- 简化数据访问,例如${user.name}直接获取对象属性。
- 支持运算符、函数和隐式对象(如request、session)。
- ${user.name}//之间获取
- ${requestScope.user.name}//隐式对象
复制代码 3)JSTL(JSP 标准标签库):
提供通用标签(如条件判断<c:if>、循环<c:forEach>),淘汰 Java 代码的使用。
支持国际化、格式化和 XML 处理。
- <%
- int score = 80;
- request.setAttribute("score", score);
- %>
- <c:if test="${score >= 60}">
- <p>恭喜,你已经及格了!</p>
- </c:if>
复制代码 Web服务器(Tomcat)
在前面先容Servlet和JSP技术时都提到了,Servlet需要在Servlet容器中运行,而JSP也需要在JSP容器中运行。而且,如果需要Servlet和JSP能应用到Web应用中,还必须将JSP和Servlet摆设到Web服务器上。传统的Web服务器(例如Apache)并不能对JSP和Servlet提供支持,所以将JSP技术、Servlet技术应用于实际Web应用中的方法只有如下两种:
(1)实现能够支持JSP和Servlet的Web服务器;
(2)实现JSP和Servlet容器并将其与Web服务器相结合。
Tomcat正是Apache基金会针对JSP和Servlet标准实现的标准的JSP/Servlet容器,而且以上提到的两种方式它都支持,同时最新的Servlet和JSP规范总能在Tomcat中得到体现。
Tomcat的摆设
Tomcat中的应用程序是一个Web应用目次或一个WAR(Web Archive)文件。WAR是Sun提出的一种 Web应用程序格式,它与 JAR类似,也是一个压缩包,压缩包的内部结构符合一个Web应用的目次结构。通常,Web应用的根目次下除了包罗诸如HTML和JSP等Web对象文件及其目次外,还会包罗一个特殊的目次WEB-INF;在WEB-INF目次下通常有一个web.xml文件、一个lib目次和一个classes目次,web.xml是这个应用的配置文件、lib目次包罗一些库文件、classes目次则包罗已编译好的 class文件,库文件和 class文件中在应用中需要使用的 Servlet类和JSP/Servlet所依赖的其他类(如JavaBean)。Tomcat提供了许多种将Web应用摆设到此中的途径,此中最简单的可以直接将WAR文件大概Web应用根目次复制到Tomcat的webapp目次下,Tomcat就会主动检测该Web应用,对WAR文件解压,并将Web应用摆设到Tomcat中。
工作原理
1 客户端请求:用户通过浏览器或其他客户端工具向 Tomcat 服务器发送 HTTP 请求。
2 毗连器(Connector)接收请求:Tomcat 中的毗连器负责接收客户端的请求,它可以处理差别的协议(如 HTTP、HTTPS)和端口。当接收到请求后,毗连器会将请求封装成一个Request对象。
3 容器(Container)处理请求:请求被传递到 Tomcat 的容器中,容器负责管理 Servlet 和 JSP 的生命周期,并调用相应的 Servlet 或 JSP 来处理请求。Tomcat 有多个条理的容器,包罗 Engine、Host、Context 和 Wrapper,它们协同工作来处理请求。
4 Servlet 或 JSP 处理请求:容器根据请求的 URL 和配置信息,找到对应的 Servlet 或 JSP,并调用其相应的方法(如doGet()、doPost())来处理请求。处理完成后,生成响应数据。
5 响应返回给客户端:处理效果被封装成一个Response对象,通过毗连器发送回客户端浏览器举行表现。
重要组件
1 毗连器(Connector):负责接收客户端的请求并将响应返回给客户端。常见的毗连器有 HTTP 毗连器和 HTTPS 毗连器,它们监听差别的端口,处理差别协议的请求。例如,HTTP 毗连器默认监听 8080 端口,HTTPS 毗连器默认监听 8443 端口。
2 容器(Container):
- Engine:表示整个 Tomcat 服务器,是最顶层的容器,负责管理多个虚拟主机。
- Host:代表一个虚拟主机,通常对应一个域名或 IP 地址。一个 Engine 可以包罗多个 Host。
- Context:表示一个 Web 应用程序,每个 Context 都有自己独立的上下文路径。例如,/myapp 大概对应一个名为 myapp 的 Web 应用。
- Wrapper:表示一个 Servlet,负责管理 Servlet 的生命周期。
3 服务器(Server):代表整个 Tomcat 实例,它包罗一个或多个 Service 组件。
4 服务(Service):将一个或多个毗连器与一个容器关联起来,形成一个完整的服务单元。一个 Server 可以包罗多个 Service。
Tomcat 通过“服务→虚拟主机→应用”的条理将提供的全部功能分成多个条理和级别举行组织和管理。一个Tomcat服务器可以摆设多个服务,每个服务可以配置多个虚拟主机,每个虚拟主机可以摆设多个应用。如许的结构便于将一个服务器的各种功能举行分类和分层管理。
MVC模式
MVC是Model-View-Controller的简称,即把一个应用的输入、处理、输出流程按照 Model、View、Controller 的方式举行分离,如许一个应用被分成三个层——业务逻辑层、表示层、控制层。
视图(View)属于表示层,它代表与用户交互的界面,在基于HTTP 协议的开辟技术中视图层都是基于HTML的技术。MVC中的视图仅限于向用户展现模型中的数据和接收用户的交互信息。视图不具备任何与业务模型或业务流程相关的知识,只需要负责展现获得的数据和将接收到的用户交互信息提交给控制器。
模型(Model)属于业务逻辑层,它用于实现详细的业务逻辑、状态管理的功能。模型包罗业务模型和数据模型两种:业务模型负责业务流程/状态的处理和业务规则的制定,数据模型是对对象的数据持久化。MVC并没有提供模型的筹划方法,而只是规定应该组织管理这些模型,以便于模型的重构和复用。
控制器(Controller)属于控制层,接收来自视图的用户请求,将请求转换为数据模型的命令传递给模型。控制器就是一个分发器,根据用户请求选择模型和视图。控制层并不做任何的数据处理。模型、视图与控制器的分离,使得一个模型可以对应多个视图。如果用户通过某个视图的控制器改变了模型的数据,全部其他依赖于这些数据的视图都会反映这些变化。因此,无论何时发生了何种数据变化,无论控制器选择任何视图,视图都会从模型获得最新的更新。模型、视图、控制器三者之间的关系和各自的重要功能。
在 JavaWeb 开辟里,Struts 框架率先将 MVC(Model-View-Controller)模式引入企业级开辟,然而Struts 的配置复杂、机动性差、性能低,使其不敌Spring MVC,以 “约定优于配置” 理念重构了 JavaWeb 开辟模式,成为JavaWeb开辟的主流。
总结
本期从HTTP协议以及CGI技术讲起,分别先容了Java Web开辟中最根本的Servlet技术和JSP技术以及Java Web开辟中主流的MVC筹划模式。
写在文末
如果想要继续更深入学习后端知识的友友,关注我,下期更精彩
请大家肯定肯定要关注!!!
请大家肯定肯定要关注!!!
请大家肯定肯定要关注!!!
友友们,你们的支持是我持续更新的动力~
创作不易,求关注,点赞,收藏,谢谢~
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |