HTTP&Tomcat&Servlet
一、web相关概念
1. 软件架构
讲解
C/S架构
- C:Client,客户端;S:Server,服务器
- 比如:QQ、微信、网游
- 优点:
- 显示效果好:2D,3D
- 安全性高:
- 服务器压力小:客户端软件可以处理一部分的数据运算
- 缺点:
- 安装客户端软件
- 更新维护不方便
- 开发成本高
B/S架构
- B:Broswer,浏览器;S:Server,服务器
- 比如:京东、淘宝、12306、网银、页游
- 优点:
- 不需要再额外安装软件:直接使用浏览器即可访问
- 更新维护方便:所有资源都在服务器,不需要客户端做任何操作,就可以更新
- 开发成本低
- 缺点:
- 显示效果略差:可以解决,使用HTML5和CSS3
- 服务器压力大:浏览器处理的数据是有限的,服务端要承担更多压力。可以解决,使用集群
- 安全性低:可以解决,使用https协议,U盾,等等
小结
- C/S架构:客户端/服务器架构
- B/S架构:浏览器/服务器架构
2. web资源
讲解
web资源
- 通过web网络能够访问的资源,是web资源
web资源分类
- 静态资源:资源/数据是不变的。比如:HTML、CSS、JS、图片、音频、视频等等
- 动态资源:资源/数据是不同的。比如:Servlet、JSP、PHP、ASP
小结
- 静态资源:不同人、不同时间、不同地点访问一个资源,看到的内容/效果是一样的
- 动态资源:不同人、或者不同时间、或者不同地点访问同一资源,看到的内容/效果可能是可变的
3. 服务器软件
讲解
服务器软件
把资源部署在服务器软件上,就可以让其它人通过网络访问到,从而成为web资源
常见的服务器软件
- Tomcat:Apache提供的,免费开源的小型服务器软件。支持JSP和Servlet规范。
- WebLogic:Oracle提供的,收费大型服务器软件。支持JavaEE所有规范。功能更强,生产环境使用的多
- WebSphere:IBM提供的,收费的大型服务器软件。支持JavaEE所有规范。功能强大,稳定,贵
小结
二、Tomcat软件
1. 下载与安装
讲解
1) 下载与安装
-
官网地址:https://tomcat.apache.org/
-
免安装,直接解压即可
2) 目录结构
tomcat
|- bin:可执行命令的文件夹。比如:启动和关闭
|- conf:配置文件夹
| |- server.xml:是Tomcat本身的配置,比如端口号
| |- web.xml:主要是部署的web项目的默认配置
|- lib:Tomcat的核心程序jar包
|- logs:日志文件夹
|- temp:临时文件夹
|- webapps:用于部署web项目的文件夹
|- work:工作目录,主要给JSP使用的
小结
- 启动和关闭Tomcat的命令:在bin目录里
- Tomcat的配置文件:在conf目录里
- web应用部署在哪:在webapps目录里
2. 启动和关闭
讲解
1) 启动和关闭Tomcat
- 启动:双击
tomcat/bin/startup.bat
- 关闭:
- 双击
tomcat/bin/shutdown.bat
- 直接关闭Tomcat的黑窗口
- 双击
2) 启动时常见的问题
1. Java环境变量没有正确配置,导致Tomcat无法启动
- 现象:启动Tomcat时,黑窗口一闪而过
- 验证:打开cmd,执行java的命令:
java
命令,输出的有提示信息,说明是正确的javac
命令,输出的有提示信息,说明是正确的
- 正确配置JDK环境变量
JAVA_HOME
Path
2. 端口冲突导致Tomcat无法启动
- Tomcat默认要占用3个端口:
- 8005(关闭命令使用的)
- 8080(HTTP协议使用的)
- 8009(AJP协议使用的)
-
现象:通过查看日志,确定是否是端口冲突。日志文件:
tomcat/logs/catalina*
Caused by: java.net.BindException: Address already in use: bind
-
解决方案:
-
方案一:杀掉占用端口的进程,然后再启动Tomcat
- 找到占用端口的进程:在cmd里执行命令
netstat -ano | findstr ":8080"
,找最后一列值,是进程的pid
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IYk6k8Wv-1581677314685)(img/image-20200115094824923.png)]
- 杀掉进程:在任务管理器里找到pid对应的进程,结束进程
- 找到占用端口的进程:在cmd里执行命令
-
方案二:更改Tomcat配置文件,使用其它端口
- 找到
tomcat/conf/server.xml
搜索port=
,修改值 - 把端口修改成其它值:建议是1024~65535之间,或者是:80
- 找到
-
小结
- 如何启动Tomcat:
startup.bat
- 如何关闭Tomcat:
shutdown.bat
或者 直接关闭Tomcat的黑窗口 - 如果JDK环境变量不正确:Tomcat不能启动,需要正确配置JDK环境变量
- 如果端口冲突:Tomcat也不能启动
- 端口冲突的现象:找日志文件
logs/catalina开头的文件
,找Address already in use
- 解决方案一:杀掉占用端口的进程,然后再启动Tomcat
- 解决方案二:修改Tomcat,使用其它端口启动
- 端口冲突的现象:找日志文件
3. 部署web应用
讲解
1) Tomcat部署项目
-
方案一:把web项目文件夹直接放到
tomcat\webapps
里- 注意:仅限于静态web项目(Static web),可以直接拷贝放到
webapps
文件夹里 - 如果:是动态web项目,即项目里有页面、Java程序,不能直接拷贝放到webapps里。
- 需要使用idea编译web项目,把编译好的结果,拷贝放到webapps里
- 注意:仅限于静态web项目(Static web),可以直接拷贝放到
-
方案二:修改server.xml(不建议)
- 在
server.xml
的Host
标签中增加:
<Context docBase="项目文件所在位置" path="项目访问路径"></Context> <Context docBase="E:\heima\travel" path="travel"></Context>
- 访问时
http://ip:port/项目访问路径/资源路径
- 在
-
方案三:虚拟路径方式(idea使用的,了解)
-
在Tomcat的
conf\Catalina\localhost
中创建xml文件项目访问路径.xml
(如果文件夹不存在,就创建) -
例如:
travel.xml
,内容如下
<Context docBase="E:\heima\travel"></Context>
http://ip:port/xml文件名称/资源路径
-
2) 部署后,访问web项目:
- 在浏览器里输入地址:
http://ip:port/项目访问路径/资源路径
- 示例:
http://192.168.65.67:80/day05/traval/index.html
- ip:tomcat所在的电脑的ip
- port:Tomcat的http协议的端口。80是默认端口,如果地址里不写端口,默认就找80端口
- 项目访问路径:默认是webspps里的文件夹名称(每个文件夹就是一个web项目)
- 示例:
小结
- 使用Tomcat部署web应用:
- 如果是静态web应用:直接把web应用文件夹,拷贝到Tomcat的
webapps
里 - 如果后边学习的动态web应用:把idea编译后的结果,拷贝到Tomcat的
webapps
里
- 如果是静态web应用:直接把web应用文件夹,拷贝到Tomcat的
- 如何使用浏览器,访问已经部署好的web应用:
- 输入地址:
http://ip:port/项目路径/资源路径
- 输入地址:
三、HTTP协议
1. HTTP协议
讲解
- HTTP:HyperText Transfer Protocol,超文本传输协议,是互联网上应用最为广泛的一种网络协议
- HTTP协议:是客户端和服务端数据交互时,数据的格式规范
- HTTP协议分为:
- HTTP请求:客户端发给服务端的数据
- HTTP响应:服务端返回给客户端数据
- 没有请求,就没有响应;有请求才有响应
小结
- 理解什么是HTTP协议
- 超文本传输协议,是互联网应用最为广泛的一种网络协议
- 规定了:客户端 和 服务端交互时,数据的格式规范
- 知道HTTP协议的组成
- HTTP请求:客户端 给 服务端 发的
- HTTP响应:服务端 给 客户端 回的
2. HTTP请求
讲解
用抓包工具抓取HTTP请求
-
用来抓取HTTP请求和HTTP响应数据的工具。只能看,不能拦截,不能修改
-
HttpWatch,浏览器自带的F12->Network(网络),发请求就能自动抓到这次请求和响应
- 抓取请求
- 抓取到HTTP请求数据,示例如下:
POST /day16/req HTTP/1.1
Host: localhost
Connection: keep-alive
Content-Length: 25
Cache-Control: max-age=0
Origin: http://localhost
Upgrade-Insecure-Requests: 1
Content-Type: application/x-www-form-urlencoded
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
Referer: http://localhost/day16/index.jsp
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,cs;q=0.7
Cookie: JSESSIONID=844ABB8A9F63FA147D8194E47C4BB1AF
username=tom&password=tom
请求行
- 本次请求的基本信息
- 格式:
请求方式 请求资源 协议版本
- 例如:
POST /day16/req HTTP/1.1
请求头
- 本次请求的附加信息
- 格式:一行一个键值对,一个键值对是一个请求头,一次请求有多个请求头
- 例如:
Referer:http://www.jd.com
请求体
- 本次请求的正文内容,是提交的表单数据
- 格式:
name=value&name=value&...
- 例如:
username=123&password=123
小结
- HTTP请求分为三部分:
- 请求行:本次请求的基本信息
- 格式:
请求方式 请求资源 协议版本
- 示例:
POST /day07/success.html HTTP/1.1
- 格式:
- 请求头:本次请求的附加信息
- 格式:一行一个键值对,一个键值对是一个请求头,一次请求可以有多个请求头
- 例如:
Host: localhost
- 请求体:本次请求的正文内容,是提交的表单数据
- 格式:
name=value&name=value&...
- 例如:
username=tom&password=123
- 格式:
- 请求行:本次请求的基本信息
3. HTTP响应
讲解
-
抓取的HTTP响应数据示例
HTTP/1.1 200 Content-Length: 12 Date: Fri, 30 Aug 2019 01:55:45 GMT hello, kitty
2. HTTP响应的格式
1) 响应行
-
本次响应的基本信息
-
格式:
协议版本 响应状态码 [响应状态描述]
-
比如:
HTTP/1.1 200 [Ok]
-
常见的响应状态码:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zyiN3is6-1581677314686)(img/tu_20.png)]
- 200:一切正常
- 302:重定向,让浏览器跳转到其它地址
- 304:让浏览器取本地缓存
- 404:找不到资源
- 500:服务器内部错误
2) 响应头
- 本次响应的附加信息
- 格式:一行一个键值对,一个键值对是一个响应头,一次响应可以有多个响应头
- 比如:
Content-Length: 12
3) 响应体
- 本次响应的正文内容,是会显示到浏览器页面上的内容
- 格式:没有固定格式。请求什么,就响应什么
小结
- HTTP响应的三部分:
- 响应行:本次响应的基本信息
- 格式:
协议版本 响应状态码
- 比如:
HTTP/1.1 200
- 常见的响应状态码:
- 200:一切正常
- 302:让浏览器跳转到指定地址=》重定向
- 304:让浏览器取缓存
- 404:告诉浏览器,请求的资源不存在
- 500:告诉浏览器,服务端出错了
- 格式:
- 响应头:本次响应的附加信息
- 格式:一行一个键值对,一个键值对是一个响应头,一次响应可以有多个响应头
- 例如:
Content-Type: text/html
- 响应体:本次响应的正文内容,会显示到浏览器页面上
- 格式:没有固定格式,请求什么就响应什么
- 响应行:本次响应的基本信息
四、Servlet
1. Servlet简介
讲解
1) 什么是Servlet
- Servlet:Server Applet,是服务端运行Java程序。是Sun公司提供的一套规范(接口),可以让客户端以url的形式远程调用服务器的Servlet(Java程序)。
- 如果一个Java程序,想让客户端通过网络访问到,Java程序必须满足以下两个条件:
- Java程序必须实现Servlet接口
- 必须把Servlet部署到Tomcat上才能运行
2) Servlet的作用
和客户端交互的:
- 接收客户端提交的参数
- 完成客户端要求的功能
- 给客户端返回处理的结果
小结
- Servlet:是Sun公司提供的一套规范(接口)
- 我们创建Java程序实现Servlet接口:和客户端交互的
- 接收客户端提交的参数
- 完成客户端要求的功能
- 给客户端返回功能的结果
2. Servlet快速入门
分析
实现的步骤:
-
创建一个Java类,实现
javax.servlet.Servlet
接口 -
重写接口里的方法(共有5个,了解3个,重点关注1个:
service
) -
使用
@WebServlet
注解配置Servlet类(配置Servlet的虚拟访问路径)客户端不能通过类名称访问Servlet
必须要通过Servlet配置的虚拟访问路径,才可以访问到
实现
@WebServlet(urlPatterns = "/demo01")
public class Demo01Servlet implements Servlet {
@Override
public void init(ServletConfig config) throws ServletException {
}
@Override
public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException {
System.out.println("Demo01Servlet.service 运行了");
}
@Override
public void destroy() {
}
@Override
public ServletConfig getServletConfig() {
return null;
}
@Override
public String getServletInfo() {
return null;
}
}
小结
-
创建一个Java类,实现
Servlet
接口 -
重写接口的方法:重点关注service方法
-
使用注解@WebServlet配置虚拟访问路径
-
把web应用部署到Tomcat里,启动Tomcat,客户端可以通过浏览器访问Servlet
http://ip:port/项目路径/资源路径
3. Servlet的生命周期和API
讲解
1) 生命周期(面试题)
- 何时创建:
- 默认第一次访问时,Tomcat创建Servlet对象
- 创建Servlet对象时,会执行init方法
- init方法只执行一次,一个Servlet类只有一个对象
- 何时销毁:
- 当服务器关闭时,Servlet对象会被销毁
- Servlet对象销毁时,会执行destroy方法
- destroy方法只执行一次
- 每次访问Servlet时,必定执行的方法:service方法
2) API介绍【了解】
方法 | 参数 | 说明 |
---|---|---|
init(ServletConfig) | Servlet配置信息对象 | 初始化方法 |
service(ServletRequest, ServletResponse) | 请求对象,响应对象 | 业务方法 |
destroy() | 销毁方法 |
-
ServletConfig
:是Servlet的配置信息对象。作用是了解的:config.getServletName()
: 获取Servlet的名称config.getInitParameter("参数名称")
:获取初始化参数值config.getServletContext()
:获取ServletContext对象
-
ServletRequest
:用于接收客户端提交的数据request.getParameter("表单项的name")
:接收客户端提交的表单数据
-
ServletResponse
:用于给客户端返回数据的response.getWriter().print("会显示到浏览器页面上的内容")
小结
- Servlet的生命周期:
- 何时创建:默认第一次访问时,Tomcat会创建Servlet对象,创建时执行一次init方法
- 何时销毁:服务器关闭时,Servlet对象会销毁,销毁时会执行一次destroy方法
- 每次访问Servlet,必定执行的方法是:service方法
4. Servlet的配置了解
-
在web3.0以前,用web.xml配置
-
在web3.0以后,用注解配置 或者 用web.xml配置
-
如果一个Servlet要想被客户端访问,就必须使用注解
@WebServlet
,提供一个虚拟访问路径@WebServlet( urlPatterns/value=虚拟路径, name="Servlet名称", loadOnStartup=整数,表示Servlet创建的时机 )
- **urlPatterns或者value:**配置Servlet的虚拟访问路径,必须的。
- 值:以
/
开头的路径,比如:/demo01
,/login
,/admin/manager
- 注意:不同Servlet的虚拟访问路径不能相同
- 值:以
- loadOnStartup:Servlet对象的创建时机
- Servlet默认是第一次访问时创建的
- 如果设置值为正整数,就表示:服务器一启动,Tomcat就会创建Servlet对象。
- 数值越小,创建的越早
- SpringMVC框架里有一个Servlet,需要配置:服务器一启动就创建
- name:非必须
- **urlPatterns或者value:**配置Servlet的虚拟访问路径,必须的。
小结
- Servlet必须要用注解
@WebServlet
配置
@WebServlet(value="/demo01")
@WebServlet(urlPatterns="/demo01")
@WebServlet("/demo01")
- 多个Servlet的虚拟访问路径,一定不能重复 ;否则Tomcat不能启动
5. Servlet的继承体系
讲解
1) 创建Java类,实现Servlet
接口
- 多个Servlet中,有大量的冗余代码
- 只用到Servlet的service方法,其它方法基本用不上,但是又必须写
2) 创建Java类,继承GenericServlet
父类
- 由
GenericServlet
实现Servlet
接口,实现接口的方法 - 我们再创建类,继承
GenericServlet
,重写业务方法service
@WebServlet(urlPatterns = "/demo02")
public class Demo02GenericServlet extends GenericServlet {
@Override
public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException {
System.out.println("Demo02GenericServlet.service 运行了");
}
}
3) 创建Java类,继承HttpServlet
父类
- 由
HttpServlet
继承GenericServlet
父类,重写service
方法:- 如果是
get
方式的请求,就调用doGet
- 如果是
post
方式的请求,就调用doPost
- 如果是
- 我们再创建类,继承
HttpServlet
,重写doGet
和doPost
方法
@WebServlet(urlPatterns = "/demo03")
public class Demo03HttpServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("get和post请求,共同的功能代码");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doGet(req, resp);
}
}