JavaWeb 学习笔记(一)—— HTTP 与 Servlet
HTTP 协议
HTTP 协议的概念
超文本传输协议
(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议。所有的 WWW 文件都必须遵守这个标准。
规定被约束的对象要遵守的规则!
HTTP 协议
HTTP 协议规定:浏览器(客户端)向服务器发送何种格式的数据,服务器会处理数据,向浏览器(客户端)作出响应。(向客户端发送何种格式的数据)
HTTP 协议的特点:
HTTP 协议遵守一个请求响应模型;
请求和响应必须成对出现;
必须先有请求后有响应;
HTTP 协议默认的端口:80
HTTP 协议的请求部分(Request)
组成部分:请求行
、请求头
、请求体
1 | //get 请求方式的抓包: |
1 | //post 请求方式的抓包: |
请求行
请求行:请求信息的第一行,包含:请求方式
、请求路径
、协议版本
。
例如:
1 | GET /WEB09/demo1/subSucc.html?username=aaa&password=123 HTTP/1.1 |
请求方式:请求方式有很多种,常用的是 GET
和 POST
。
GET 和 POST 区别:
- GET:请求参数会显示到地址栏;GET方式有大小的限制;GET方式没有请求体。
- POST:请求参数不会显示到地址栏;在请求体中,POST没有大小限制;POST方式有请求体。
只有表单设置为 method="post"
才是 post 请求,其他的都是 get 请求
请求头
请求头:请求信息的第二行到空行结束。
格式:key:value(value可以是多个值)
常见的请求头:
请求头 | 描述 |
---|---|
Accept: text/html,image/bmp | 支持数据类型 text/html text/css text/javascript 大类型/小类型 mime类型 |
Accept-Charset: ISO-8859-1 | 字符集 |
Accept-Encoding: gzip | 支持压缩 |
Accept-Language:zh-cn | 语言环境 |
Host: www.renkaigis.com:80 | 访问主机 |
★ If-Modified-Since: Tue, 11 Jul 2000 18:23:51 GMT | 缓存文件的最后修改时间,和响应中一个头一起使用,完成本地缓存的查找 |
★ Referer: http://www.renkaigis.com/index.jsp | 来自哪个页面、防盗链 |
★ User-Agent: Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0) | 获得客户端浏览器的信息。(文件下载:IE:URL编码,火狐:Base64) |
Connection:Keep-Alive | 链接状态 |
请求体
请求体:空行以下的内容。
只有post才有请求体,获取请求参数:http://xxxx?username=tom&password=123
格式:username=tom&password=123
HTTP 协议的响应部分(Response)
组成部分:响应行
、响应头
、响应体
1 | HTTP/1.1 200 OK |
响应行
响应行:响应信息的第一行。
格式:协议/版本 状态码 状态码说明
例如:HTTP/1.1 200 OK
状态码:
- 200 正常响应成功
- 302 重定向
- 304 读缓存
- 404 用户操作资源不存在
- 500 服务器内部异常
响应头
响应头:从响应信息的第二行到空行结束。
格式:key:value(value可以是多个值)
常见的响应头:
响应头 | 描述 |
---|---|
★ Location: http://www.it315.org/index.jsp | 跳转方向 和302一起使用的 |
Server:apache tomcat | 服务器型号 |
Content-Encoding: gzip | 数据压缩 |
Content-Length: 80 | 数据长度 |
Content-Language: zh-cn | 语言环境 |
★ Content-Type: text/html; charset=GB2312 | 数据类型 |
★ Last-Modified: Tue, 11 Jul 2000 18:23:51 GMT | 最后的修改文件的事件.与 If-Modified-Since 一起使用 |
★ Refresh: 1;url=http://www.it315.org | 定时刷新 |
★ Content-Disposition: attachment; filename=aaa.zip | 下载 |
★ Set-Cookie:SS=Q0=5Lb_nQ; | path=/search |
Expires: -1 | 缓存 |
Cache-Control: no-cache | 缓存 |
Pragma: no-cache | 缓存 |
Connection: Keep-Alive | 连接 |
响应体
响应体:页面上展示的内容。
Servlet
概念
Servlet
是运行在服务器端的一个 Java 小程序,动态的 web 开发技术,主要功能在于交互式地浏览和修改数据,生成动态 web 内容。
Servlet = Service + Applet
Servlet 实现过程
客户端发送请求至服务器端;
服务器将请求信息发送至 Servlet;
Servlet 生成响应内容并将其传给服务器。响应内容动态生成,通常取决于客户端的请求;
服务器将响应返回给客户端。
编写一个 Servlet 步骤
1、编写一个类:
a. 继承 HttpServlet,
b. 重写 doGet 或者 doPost 方法;
2、编写配置文件(web-inf/web.xml
):
a. 注册 Servlet;
b. 绑定路径
3、访问:http://主机:端口号/项目名/路径
接收参数
格式:key=value
1 | Sting value=request.getParameter("key") |
例如: http://localhost/day09/hello?username=tom
- request.getParameter(“username”) 就可以获取 tom 值
回写内容
1 | response.getWriter().print("success"); |
处理响应数据中文乱码:
1 | response.setContentType("text/html;charset=utf-8"); //建议放在方法中的第一行 |
编写配置文件
配置文件路径:web-inf/web.xml
- 配置 Servlet 到 WEB 服务器。
1 | <!-- 配置Servlet --> |
url-pattern的配置: ★
方式1:完全匹配 必须以
"/"
开始 例如:/hello /a/b/c
方式2:目录匹配 必须
"/"
开始 以"*"
结束 例如:/a/* /*
方式3:后缀名匹配 以
"*"
开始 以字符结尾 例如:*.jsp *.do *.action
优先级:
- 完全匹配 > 目录匹配 > 后缀名匹配
练习:
有如下的一些映射关系:
Servlet1 映射到 /abc/*
Servlet2 映射到 /*
Servlet3 映射到 /abc
Servlet4 映射到 *.do
问题:
当请求URL为“/abc/a.html”,“/abc/*”和“/*”都匹配,哪个servlet响应
Servlet引擎将调用Servlet1。
当请求URL为“/abc”时,“/*”和“/abc”都匹配,哪个servlet响应
Servlet引擎将调用Servlet3。
当请求URL为“/abc/a.do”时,“/abc/*”和“*.do”都匹配,哪个servlet响应
Servlet引擎将调用Servlet1。
当请求URL为“/a.do”时,“/*”和“*.do”都匹配,哪个servlet响应
Servlet引擎将调用Servlet2.
当请求URL为“/xxx/yyy/a.do”时,“/*”和“*.do”都匹配,哪个servlet响应
Servlet引擎将调用Servlet2。
配置 Servlet 的启动时加载
在 web.xml 中 <servlet>
标签中配置
1 | <load-on-startup>2</load-on-startup> |
作用:用来修改 servlet 的初始化时机
取值:正整数,值越大优先级越低
当我们的配置文件里面没有指定配置的话,会查找 tomcat 的 web.xml,若请求我们自己的项目处理不了,tomcat 的默认的 servlet 会帮我们处理信息。
路径的写法
相对路径:
当前路径 ./ 或者 什么都不写
上一级路径 ../
绝对路径:(我们使用)
带主机和协议的绝对路径(访问站外资源)
不带主机和协议的绝对路径
/day09/hello(经常使用)
Servlet 结构与方法
servlet的体系结构:
Servlet:接口
|
GenericServlet:抽象类
|
HttpServlet:抽象类
|
自定义servlet
Servlet 常用方法:
void init(ServletConfig config)
:初始化void service(ServletRequest request,ServletResponse response)
:服务 处理业务逻辑void destroy()
:销毁ServletConfig getServletConfig()
:获取当前 servlet 的配置对象
GenericServlet 常用方法:
除了 service 方法没有显示,其他都实现了
空参的 init(),若我们自己想对 servlet 进行初始化操作,重写这个 init() 方法即可
HttpServlet 常用方法:
service 做了实现,把参数强转,调用了重载的 service 方法
重载的 service 方法获取请求的方式,根据请求方式的不同调用相应 doXxx()
方法
doGet 和 doPost 方法
Servlet 的生命周期
生命周期指的是一个对象从创建到销毁的过程。
Servlet 的生命周期,指的是 Servlet 对象从创建到销毁的过程。
void init(ServletConfig config)
:初始化
* 初始化方法
* 执行者:服务器
* 执行次数:一次
* 执行时机:默认第一次访问的时候void service(ServletRequest request,ServletResponse response)
:服务 处理业务逻辑
* 服务
* 执行者:服务器
* 执行次数:请求一次执行一次
* 执行时机:请求来的时候void destroy()
:销毁
* 销毁
* 执行者:服务器
* 执行次数:只执行一次
* 执行时机:当servlet被移除的时候或者服务器正常关闭的时候
Serlvet是单实例多线程
默认客户端第一次访问 Servlet 的时候,服务器创建一个 Servlet 对象,并调用 init 实现初始化操作。并调用一次 service 方法,每当请求来的时候,服务器创建一个线程,调用 service 方法执行自己的业务逻辑。当 Servlet 被移除的时候或者服务器正常关闭的时候,Servlet 对象就会被销毁,服务器调用 Servlet 的 destroy 方法实现销毁操作。
补充
常见的响应头——refresh
refresh(定时刷新)
响应头格式:
refresh:秒数;url=跳转的路径
1 | //设置响应头: |
1 | //追加响应头,若之前设置过这个头,则追加;若没有设置过,则设置 |
1 | //设置定时刷新: |
另: 可以通过html页面中的一个标签设置头信息 <meta>
标签,跳转到指定路径。
1 | <meta http-equiv="Refresh" content="5;url=/WEB09/succ.html"> |
ServletContext
ServletContext
:全局管理者(上下文),是一个项目的引用,代表了当前项目。
当项目启动的时候,服务器会为每一个 web 项目创建一个 servletContext 对象。
当项目被移除的时候或者服务器关闭的时候 servletContext 销毁。
servletContext 接口是 Servlet 中最大的一个接口,呈现了 web 应用的 Servlet 视图。 ServletContext 实例是通过 getServletContext() 方法获得的,由于 HttpServlet 继承 GenericServlet 的关系,GenericServlet 类和 HttpServlet 类同时具有该方法。
作用:
- 获取全局的初始化参数
- 共享资源(xxxAttribute)
- 获取文件资源
- 其他操作
获取 servletcontext
方式1:了解
getServletConfig().getServletContext()
方式2:
getServletContext()
常用方法
- 了解
1 | String getInitParameter(String key)//通过名称获取指定的参数值 |
在根标签下有一个 context-param
子标签,用来存放初始化参数:
1 | <context-param> |
xxxAttribute(set,get)
1 | String getRealPath(String path)//获取文件部署到tomcat上的真实路径(带tomcat路径) |
- 获取文件的 mime 类型(大类型/小类型)
1 | String getMimeType(String 文件名称) |
域对象 ★★★
servletcontext 可以被当成map集合。
常用方法:
xxxAttribute()
servletcontext 创建和销毁:
当项目启动的时候服务器为每一个 web 项目创建一个 servletcontext 对象。
当项目被移除的时候或者服务器关闭的时候 servletcontext 销毁。
存放:
共享的数据
获取文件的路径
通过类加载器获取文件:2.txt 放在 classes 目录下无论是 java 项目还是 web 项目都可以。
1 | 类.class.getClassLoader().getResource("2.txt").getPath(); |