|
JavaEE
HTTP —— HTTP 响应详解, 构造 HTTP 请求
HTTPS —— HTTPS的加密方式
Tomcat 是一个 HTTP 服务器
HTTP
客户端, 就是大家平时用到的浏览器.
HTTP
服务器, 需要开发实现一个服务器, 搭建网站的 “后端部分”.
开发实现一个服务器, 本质上就是写个 TCP socket
服务器. 但是比较麻烦, 有很多重复性工作.
业界就有一些大佬实现了一些现成的 HTTP 服务器, 我们进行开发网站, 就不必从头去写了, 只需要基于这些 HTTP
服务器, 进行二次开发即可.
下载Tomcat
简单介绍
webapps 中放的是我们想要部署的网站
就可以把前端和后端的代码拷贝到这个目录中.
每个目录都可以视为是一个 webapp
(网站)
ROOT 目录
ROOT 目录里放的就是欢迎页面
启动 Tomcat, 双击 startup.bat
看到这个信息, 说明启动成功!
如果有问题, 可以把 bat 拖到 cmd 中运行, 查看报错信息是什么.
在浏览器上输入 127.0.0.1:8080
如果出现这样的页面, 说明 Tomcat
启动正常 (Tomcat 默认端口: 8080)
我们写一个 .html
DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Documenttitle>
head>
<body>
<style>
div {
font-size: 40px;
color: hotpink;
font-weight: 500;
}
style>
<div>Gujiu ! !div>
body>
html>
将其移动到 ROOT 中
在 127.0.0.1:8080 后面加上 /gujiu.html
这个页面就是通过 Tomcat
这个 http 服务器来获取到的.
既然都可以双击本地打开, 为什么还要通过 Tomcat 折腾一下?
本地打开只能访问你自己电脑的.
使用
Tomcat
可以通过网络访问到别人电脑的网页.
# 注意事项 #
我们如果把所有文件都直接放到 ROOT 里, 就会弄得很乱, 一般我们都会新建一个文件夹.
将 gujiu.html
放到 Gujiu
下. 输入如下地址.
Servlet 就是 Tomcat 给程序员提供的进行二次开发的 API, 学了这些 API 就可以比较方便的写出一个网站的后端程序了.
动态页面 vs 静态页面
静态页面
: 页面的内容, 是固定 (以文件的形式, 静静的躺在你的硬盘的指定目录中).
无论什么时候, 无论谁来访问,得到的页面效果, 都一样.
动态页面
: 不是一个真实的硬盘的文件, 而是通过代码在内存中构造出一个 “虚拟的资源”.
就可以根据你访问的时间的不同, 访问的人的不同, 访问时带有的参数不同, 就可以构造出不同的页面来了.
静态页面部分拷贝到 webapps
里就行; 动态页面就需要基于 servlet
.
写一个 Servlet
的 hello world
这里和 JDBC 差不多, 都是固定套路
创建一个 maven
项目
目录结构
小知识:
maven 是一个构建工具 (build,包括不限于: 编译, 打包, 部署)
#
之前写代码,都是直接在 idea 中, 点击 main
方法前的 三角号, 就自动编译程序
#
这种方式针对一些比较简单的程序还好, 如果是一些更复杂的程序, 尤其是有多个模块, 并且互相依赖. 这时我们直接点运行就没有那么容易了.
比如 A 依赖 B, B 依赖 C.
此时你要想编译运行 A, 就必须先编译运行 B, 要想编译运行 B, 就需要先编译运行 C.
#
构建工具, 就是为了解决这个问题, 使我们在开发比较复杂的项目的时候, 也可以比较方便的进行编译和打包操作
#
我们这里使用 maven 主要就是借助 maven
进行编译, 打包, 管理依赖…
Servlet
不是 Java 标准库自带的, 要想使用, 就需要额外的下载安装, 并引入到项目中.
maven
的一个核心功能, 就是能够自动的管理依赖, 就会把咱们使用的库中依赖的东西, 自动从中央仓库中下载下来
中央仓库链接
选择 3.1.0
版本.
# 注意 #
servlet 3.1.0 和 Tomcat 8.5 和 jdk 8 是配套的.
选择 maven 把 maven 中的这段内容复制出来, 然后粘贴到 pom.xml
的
复制的内容, 粘贴到 \
这个标签中
<dependencies>
<dependency>
<groupId>javax.servletgroupId>
<artifactId>javax.servlet-apiartifactId>
<version>3.1.0version>
<scope>providedscope>
dependency>
dependencies>
# 注意事项 #
拷贝过来, 可能是标红的.
当我们把他拷贝过来, idea
就会自动根据你这里写的内容, 从中央仓库上下载依赖.
在这个依赖下载好之前, 这里都是标红的, 在下载过程中, 我们需要耐心等待.
如果等了很久, 还是标红的, 就可以尝试手动刷新一下. (在 idea 的最右侧边边上, 有一个 maven, 鼠标点击 maven )
虽然 maven
已经给我们创建出了一些目录了, 但是还不够
我们需要搞得是一个 符合 Tomcat 要求的目录结果
我们还需要再 web.xml
中填入下面这段代码
DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>
<display-name>Archetype Created Web Applicationdisplay-name>
web-app>
# 注意事项 #
webapp 目录就是未来部署到 Tomcat 中的一个重要的目录. 当前我们可以往 webapp 中放一些静态资源, 比如 html , css 等.
在这个目录中还有一个重要的文件 web.xml. Tomcat 找到这个文件才能正确处理 webapp 中的动态资源.
这里的作用: 验证 + 补全
这里标红, 只是影响到 idea 对于 web.xml 的验证和补全
可以
alt + enter
使其不再标红.
#
要把代码放到 java 目录下, 我们创建一个 helloServlet
#
我们先要 extends HttpServlet
这个类, 但是这里有时会标红.
这个类来自于, 刚才通过 maven 下载的那个 servlet
的 jar
包. 报红的原因可能有:
解决方法: 点击刷新按钮尝试
#
重写 doGet
方法
public class helloServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//注意, 自动生成的这个调用父类方法的代码, 一定一定要注释掉, 不然会出问题!!
//super.doGet(req, resp);
}
}
doGet 方法 就是 HttpServlet
父类里已经包含的方法了, 此处是需要 Overide 父类的方法
doGet
表示: 当前 Tomcat 在收到某些 GET
请求的时候, 会调用这个 doGet 方法.
此处 doGet
做的工作, 就是 “根据请求, 计算响应”.
doGet 就需要根据 req 里的一些数据 + 业务逻辑构造生成一个完整的 resp 对象.
再进一步, tomcat
就把 resp 对象转成一个 HTTP 响应报文.
典型的服务器要做三件事:
- 读取请求并解析
- 根据请求计算响应
- 把响应结果返回给客户端
1 和 3 都是固定的套路, 2 则是我们需要实现的业务逻辑 (可能比较简单, 也可能非常复杂)
#
编写如下代码
@WebServlet("/hello")
public class HelloServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 注意, 自动生成的这个调用父类方法的代码, 一定一定要注释掉或删掉
// super.doGet(req, resp);
// 是 Tomcat 这边打印这个日志
System.out.println("hello");
// 还可以给客户端返回这个 hello
resp.getWriter().write("hello");
}
}
当我们发送的请求是 GET
路径是 /hello
.此时 Tomcat 才会调用到这里的 doGet 方法.
Tomcat 可以让你关联上很多路径.
可以给请求中的不同路径, 关联上不同的类, 也就是执行了不同的方法了.
小知识:
/hello 其实就是一个 “虚拟的资源”.
硬盘上目录中是没有这个 /hello 文件,浏览器访问这个路径的资源, 就通过 servlet 代码, 直接返回了一个 hello 字符串.
当前写的 Servlet 代码, 没有 main 方法. 我们要想程序运行, 就需要 打包 + 部署程序.
单击右侧的 maven, 双击 package
打包.
打包:
- 把缺失的依赖给下载好
- 然后编译所有 .java 文件得到一堆 .class 文件
- 再把这些 .class 给打包到一个压缩包中
当我们看到 BUILD SUCCESS
这个提示, 就是打包成功了.
这时我们可以看到这里多了一个 .jar 文件.
# 注意事项 #
虽然我们打出来 jar 包, 但是 Tomcat
不认! !
Tomcat 要求的压缩包格式, 是 war 包
最主要的区别, war 包, 会把整个 webapp 目录都给打进去, 包括 web.xml
,以及未来放的一些静态 html, css ...
这时我们需要修改 pom.xml , 在
<packaging>warpackaging>
<build>
// war 包的名字
<finalName>helloServletfinalName>
build>
这时再次双击 package
, 打包完毕后, 我们再看左侧, 多了一个 helloServlet.war
文件
把 war
包, 拷贝到 Tomcat 的 webapps
中.
重新启动 Tomcat
服务器. Tomcat 就会加载这里的 war
包.
我们看到这里多了一个 helloServlet
文件. 加载操作就是把这个 war 解压缩成目录了.
通过浏览器, 构造一个HTTP 请求, 访问 Tomcat 服务器.
我们打开一个浏览器, 在地址栏上输入 http://127.0.0.1:8080/helloServlet/hello
此时在浏览器的页面上, 和 Tomcat 日志中, 都出现了 hello 这个字符串.
- 第一级目录来指定 webapps 中的目录
- 第二级目录来指定 第一级目录下的文件
浏览器发送一个 HTTP 请求给 Tomcat 服务器. (GET /helloServlet/hello
)
Tomcat
服务器就会解析请求
获取到 URL 中的第一级路径, /helloServlet
确定一个 webapp
Tomcat 找到 helloServlet 目录之后, 就会加载里面的类, 尤其是重点去识别出 @WebServlet
注解修饰的类
就会取出 URL 中的第二级路径 /hello
.
然后就在 @WebServlet 注释中, 找到名字为 /hello 的类.
找到类之后, 创建实例 (只会创建一次. 如果之前创建过了, 就直接复用上次的实例)
再解析出 HTTP 请求的方法 “GET
”, 取出 GET 之后, 就可以根据 HTTP 方法来调用对应的 servlet 中的方法:
GET
请求就调用 doGet 方法
POST
请求就调用 doPost 方法
PUT
请求就调用 doPut 方法
DELETE
请求就调用 doDelete 方法 …
同时 Tomcat 还会构造出 HttpServletRequest
对象和 HttpServletResponse
对象
|
以上就是今天要讲的内容了,希望对大家有所帮助,如果有问题欢迎评论指出,会积极改正!!