目录
1. Web
1.1 软件架构
-
C/S(客户端/服务器端)
- 需要安装客户端应用。
-
B/S(浏览器/服务器端)
- 不需要安装客户端应用,用户只需记住域名即可访问。
- 高效且客户端零维护。
1.2 资源分类
-
静态资源
- 所有用户访问后得到的结果相同。
- 可直接被浏览器解析。
- 例如:HTML、CSS、JavaScript。
-
动态资源
- 每个用户访问相同资源后,得到的结果可能不同。
- 访问后需要转换为静态资源再返回给浏览器。
- 例如:Servlet/JSP、PHP、ASP等。
1.3 Web服务器软件
-
服务器
- 安装了服务器软件的计算机。
- 根据IP地址,其他主机可以访问服务器并获取数据。
- 服务器软件:接收用户请求,处理请求,做出响应。
- Web服务器软件:接收用户请求,处理请求,做出响应。
- 在Web服务器软件中,可以部署Web项目,让用户通过浏览器访问。
-
常见的Java相关Web服务器软件
- WebLogic:Oracle公司,大型JavaEE服务器,支持所有JavaEE规范,收费。
- WebSphere:IBM公司,大型JavaEE服务器,支持所有JavaEE规范,收费。
- JBOSS:JBOSS公司,大型JavaEE服务器,支持所有JavaEE规范,收费。
- Tomcat:Apache基金会,中小型JavaEE服务器,仅支持部分JavaEE规范(Servlet/JSP),开源免费。
-
JavaEE
- Java语言在企业级开发中使用的技术规范总和。
- 共规定了13项大的规范。
1.4 Tomcat
Tomcat是一种Web服务器软件。
-
下载
访问 Apache Tomcat官网 下载。 -
安装
解压压缩包即可。(安装目录建议不要有中文和空格) -
启动
运行startup.bat
(Windows)或startup.sh
(Linux/Mac)。 -
停止
运行shutdown.bat
(Windows)或shutdown.sh
(Linux/Mac)。
2. Servlet
2.1 概念
- Servlet 是运行在服务器端的小程序,即
server applet
。 - Servlet 是一个接口,定义了 Java 类被浏览器访问的规则。
- 实现 Servlet 接口的类,需要复写接口中的方法。
2.2 快速入门
-
创建 JavaEE 项目
-
导入依赖
<dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1.0</version> </dependency>
-
定义一个类,实现 Servlet 接口
public class ServletDemo1 extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) { System.out.println("doGet"); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) { System.out.println("doPost"); } }
-
在 web.xml 中配置
<web-app> <display-name>Archetype Created Web Application</display-name> <servlet> <servlet-name>login</servlet-name> <servlet-class>com.codingfuture.ServletDemo1</servlet-class> </servlet> <servlet-mapping> <servlet-name>login</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> </web-app>
2.3 Servlet 3.0
支持注解配置,可以不需要配置 web.xml。
步骤
- 创建 JavaEE 项目
- 定义一个类,实现 Servlet 接口
- 重写方法
- 在类上使用 @WebServlet 注解,进行配置
代码示例
@WebServlet(urlPatterns = "/demo1")
@WebServlet(value = "/demo2")
@WebServlet(name = "/demo3")
@WebServlet("/demo4")
2.4 前端跳转 Servlet
HTML 表单:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="/servlet4" method="get">
<input name="username">
<input type="submit" value="提交">
</form>
</body>
</html>
Servlet 代码:
@WebServlet("/servlet4")
public class Servlet4 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) {
System.out.println("doGet");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) {
System.out.println("doPost");
}
}
2.5 Servlet 相关配置
urlPattern: Servlet 访问路径
- 一个 Servlet 可以定义多个访问路径:
@WebServlet({"/d4","/dd4","/ddd4"})
- 路径定义规则:
/xxx
:路径匹配/xxx/xxx
: 多层路径,目录结构*.do
:扩展名匹配
@WebServlet({"/d2", "/dd2", "/ddd2"}) // 都可以访问到
@WebServlet("/demo2/user") // 多层路径
@WebServlet("/demo2/*") // 通配符,*任意字符
@WebServlet("*.do") // 任意字符.do 访问
3. HTTP
HTTP(超文本传输协议,HyperText Transfer Protocol)是一种用于从网络传输超文本到本地浏览器的传输协议。它定义了客户端与服务器之间请求和响应的格式以及传输数据的规则。
HTTP 基于 TCP/IP 协议,是一个应用层协议,它使用 TCP 作为其传输层协议。HTTP 协议的主要特点包括:
- 无状态协议:服务器不会保存关于客户端请求的任何信息,每个请求都是独立的。
- 请求-响应模型:客户端发起请求,服务器响应请求,一次请求对应一次响应
- 支持多种媒体类型:HTTP 可以传输文本、图片、视频等多种类型的数据。
- 简单快速:HTTP 协议格式简单,易于实现,且传输速度快。
- 默认端口号是80
HTTP 请求和响应都包含头部(Headers)和可选的主体(Body)。请求头部包含请求的方法(如 GET、POST)、目标资源的 URI、协议版本等信息;响应头部则包含状态码、服务器信息等。
4. Request
4.1 请求消息数据格式
4.1.1 请求行
请求行包含三个部分:HTTP 方法、请求的资源路径(URI)和HTTP版本。
方法 请求URI HTTP版本
GET /index.html HTTP/1.1
4.1.2 请求头部(Headers)
请求头部包含一系列的键值对,用来提供关于请求的附加信息,如客户端信息、请求体的内容类型等。
常见的请求头部:
Host
:指定请求的服务器的域名和端口号。User-Agent
:包含了发出请求的用户代理软件信息。Accept
:告知服务器客户端能够接收哪些类型的信息。Accept-Language
:告知服务器客户端偏好的语言。Accept-Encoding
:告知服务器客户端能够接受的压缩格式。Content-Type
:当发送包含body的请求时,指定body的媒体类型。Content-Length
:当发送包含body的请求时,指定body的长度。Connection
:指定或要求服务器的连接状态。
头部字段名: 值
头部字段名: 值
...
Host: www.example.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64)
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Content-Type: application/x-www-form-urlencoded
Content-Length: 43
Connection: keep-alive
4.1.3 请求空行
请求空行是一个额外的行,仅包含一个回车换行符(CRLF),没有其他内容。它的作用是明确地分隔请求头部和请求体。
\r\n
4.1.4 请求体(Body)
请求体通常用于POST和PUT请求,用来发送需要被服务器处理的数据。请求体的内容类型由Content-Type头部字段指定。
name=JohnDoe&age=25
4.2 ServletRequest 接口
ServletRequest接口是Java Servlet API中的一个接口,用于访问Servlet容器接收到的HTTP请求的信息。ServletRequest接口定义了一系列方法,用于获取HTTP请求的参数、属性、输入流等信息,以及对这些信息的操作。
ServletRequest接口提供了访问HTTP请求的各种信息和操作的方法,方便在开发中获取HTTP请求的相关参数和属性。在实际开发中,我们通常会使用HttpServletRequest接口,它继承了ServletRequest接口,并增加了更多HTTP特定的请求和响应信息的方法。
4.2.1 获取请求行信息
HTTP 请求的请求行中包含请求方法、请求资源名、请求路径等信息,HttpServletRequest 接口定义了一系列获取请求行信息的方法,如下表。
返回值类型 | 方法声明 | 描述 |
---|---|---|
String | getMethod() | 该方法用于获取 HTTP 请求方式(如 GET、POST 等)。 |
String | getRequestURI() | 该方法用于获取请求行中的资源名称部分,即位于 URL 的主机和端口之后,参数部分之前的部分。 |
String | getQueryString() | 该方法用于获取请求行中的参数部分,也就是 URL 中“?”以后的所有内容。 |
String | getContextPath() | 返回当前 Servlet 所在的应用的名字(上下文)。对于默认(ROOT)上下文中的 Servlet,此方法返回空字符串""。 |
String | getServletPath() | 该方法用于获取 Servlet 所映射的路径。 |
String | getRemoteAddr() | 该方法用于获取客户端的 IP 地址。 |
String | getRemoteHost() | 该方法用于获取客户端的完整主机名,如果无法解析出客户机的完整主机名,则该方法将会返回客户端的 IP 地址。 |
4.2.2 获取请求头信息
当浏览器发送请求时,需要通过请求头向服务器传递一些附加信息,例如客户端可以接收的数据类型、压缩方式、语言等。为了获取请求头中的信息, HttpServletRequest 接口定义了一系列用于获取 HTTP 请求头字段的方法,如下表所示。
返回值类型 | 方法声明 | 描述 |
---|---|---|
String | getHeader(String name) | 该方法用于获取一个指定头字段的值。 如果请求消息中包含多个指定名称的头字段,则该方法返回其中第一个头字段的值。 |
Enumeration | getHeaders(String name) | 该方法返回指定头字段的所有值的枚举集合, 在多数情况下,一个头字段名在请求消息中只出现一次,但有时可能会出现多次。 |
Enumeration | getHeaderNames() | 该方法返回请求头中所有头字段的枚举集合。 |
String | getContentType() | 该方法用于获取 Content-Type 头字段的值。 |
int | getContentLength() | 该方法用于获取 Content-Length 头字段的值 。 |
String | getCharacterEncoding() | 该方法用于返回请求消息的字符集编码 。 |
4.2.3 获取请求参数
在实际开发中,我们经常需要获取用户提交的表单数据,例如用户名和密码等。为了方便获取表单中的请求参数,ServletRequest 定义了一系列获取请求参数的方法,如下表所示。
返回值类型 | 方法声明 | 功能描述 |
---|---|---|
String | getParameter(String name) | 返回指定参数名的参数值。 |
String [ ] | getParameterValues (String name) | 以字符串数组的形式返回指定参数名的所有参数值(HTTP 请求中可以有多个相同参数名的参数)。 |
Enumeration | getParameterNames() | 以枚举集合的形式返回请求中所有参数名。 |
Map | getParameterMap() | 用于将请求中的所有参数名和参数值装入一个 Map 对象中返回。 |
4.2.4 乱码问题
Tomcat8解决了get请求乱码,但post请求仍会乱码
乱码的原因:POST 提交的数据在请求体中,其所使用的编码格式时页面一致(即 utf-8)。request 对象接收到数据之后,会将数据放到 request 缓冲区,缓冲区的默认字符集是 ISO-8859-1(该字符集不支持中文),两者使用的字符集不一致导致乱码。
//修改request缓冲区的字符集为UTF-8
request.setCharacterEncoding("utf-8");
4.2.5 请求转发
请求转发是指将一个HTTP请求从一个Servlet转发到另一个Servlet或JSP页面的过程。它允许在Web应用程序中的不同组件之间共享请求和响应对象,从而实现模块化的代码和更好的代码重用。
客户端发送一个HTTP请求到Web服务器。
Web服务器将请求路由到相应的Servlet。
Servlet通过
getRequestDispatcher()
方法获取RequestDispatcher
对象。Servlet使用
RequestDispatcher
对象的forward()
方法将请求转发到另一个Servlet或JSP页面。目标Servlet或JSP页面处理请求并生成响应。
Web服务器将响应发送回客户端。
客户端收到响应并显示结果。
特点
-
浏览器地址栏路径不发生变化
-
只能转发到当前服务器内部资源中。
-
请求转发是一次请求
4.2.6 共享数据
-
域对象:一个有作用范围的对象,可以在范围内共享数据
-
request域:代表一次请求的范围,一般用于请求转发的多个资源中共享数据
-
方法:
-
void setAttribute(String name,Object obj):存储数据
-
Object getAttitude(String name):通过键获取值
-
void removeAttribute(String name):通过键移除键值对
-
Servlet三大域对象:request、session、ServletContext,是Java Web开发中用于存储和传递信息的重要机制。
-
ServletContext
- 定义:ServletContext是应用级的对象,它在服务器启动时创建,在服务器关闭时销毁。
- 作用范围:全局的,对所有用户和所有请求都是可见的。
- 属性:存储在ServletContext中的属性,一旦设置,可以被应用中的所有用户和所有请求访问。
- 使用方法:
ServletContext servletContext = this.getServletContext(); servletContext.setAttribute("name", "zhangsan");
-
request
- 定义:request对象代表一个客户端的请求,每个请求都会创建一个新的request对象。
- 作用域:仅限于当前请求,请求结束后,该对象就会被销毁。
- 用途:常用于在一次请求的多个页面之间传递参数。
- 使用方法:
request.setAttribute("attributeName", "value");
-
session
- 定义:session对象代表用户的会话,从用户打开浏览器开始,直到关闭浏览器结束。
- 作用域:每个用户都有一个独立的session对象,用于跟踪用户的状态。
- 用途:常用于需要用户登录验证的Web应用中,用于存储用户登录状态和个性化信息。
- 使用方法:
HttpSession session = request.getSession(); session.setAttribute("attributeName", "value");
5. Response
5.1 响应消息数据格式
HTTP响应是服务器发送给客户端的数据,它包括以下几个部分:
-
请求消息:客户端发送给服务器的数据。
- 数据格式包括请求行、请求头、请求空行和请求体。
-
响应消息:服务器发送给客户端的数据。
- 数据格式包括响应行、响应头、响应空行和响应体。
5.1.1 响应行
响应行由协议/版本、响应状态码和状态码描述组成,例如:
HTTP/1.1 200 OK
- 响应状态码:服务器通过状态码告诉客户端请求的处理结果。
- 1xx:信息性状态码,表示服务器已接收到请求,需要客户端继续执行操作。
- 例如:100 Continue(继续请求)
- 2xx:成功状态码,表示请求已成功被服务器接收、理解、并接受。
- 例如:200 OK(请求成功)
- 3xx:重定向状态码,表示需要客户端采取进一步操作才能完成请求。
- 例如:302 Found(临时重定向)、304 Not Modified(未修改,使用缓存)
- 4xx:客户端错误状态码,表示请求包含语法错误或无法完成请求。
- 例如:404 Not Found(未找到)、405 Method Not Allowed(方法不允许)
- 5xx:服务器错误状态码,表示服务器在处理请求的过程中发生了错误。
- 例如:500 Internal Server Error(内部服务器错误)
- 1xx:信息性状态码,表示服务器已接收到请求,需要客户端继续执行操作。
5.1.2 响应头
响应头包含了关于服务器和响应的元数据,格式如下:
头名称:值
常见的响应头包括:
Content-Type: text/html;charset=utf-8
5.1.3 响应空行
响应空行是一个额外的行,仅包含一个回车换行符(CRLF),没有其他内容。它的作用是明确地分隔响应头部和响应体。
\r\n
5.1.4 响应体
响应体是服务器传输给前端的数据,通常是HTML文档、图片、JSON等格式的数据。
HTTP/1.1 200 OK
Content-Type: text/html;charset=UTF-8
Content-Length: 101
Date: Thu, 17 Sep 2020 02:59:05 GMT
Location: /servletB
我是response
5.2 重定向
重定向是资源跳转的一种方式,可以通过以下方式实现:
- 设置状态码为302。
response.setStatus(302);
- 设置响应头
location
。response.setHeader("location", "/Day03/responseServlet02");
- 使用简单的重定向方法。
response.sendRedirect("/Day03/responseServlet02");
@WebServlet("/test ")
public class test extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 重定向到/responseServlet02
response.sendRedirect("/xx/test2");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
5.3 forward 和 redirect 区别
-
重定向(redirect):
- 地址栏发生变化。
- 可以访问其他站点的资源。
- 是两次请求,不能使用request对象共享数据。
-
转发(forward):
- 地址栏路径不变。
- 只能访问当前服务器下的资源。
- 是一次请求,可以使用request对象共享数据。
注意
- 不能使用重定向来访问request域中的数据。