JavaWeb 学习笔记(一)—— HTTP 与 Servlet

HTTP 协议

HTTP 协议的概念

超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议。所有的 WWW 文件都必须遵守这个标准。

规定被约束的对象要遵守的规则!

HTTP 协议

HTTP 协议规定:浏览器(客户端)向服务器发送何种格式的数据,服务器会处理数据,向浏览器(客户端)作出响应。(向客户端发送何种格式的数据)

HTTP 协议的特点:

  • HTTP 协议遵守一个请求响应模型;

  • 请求和响应必须成对出现;

  • 必须先有请求后有响应;

  • HTTP 协议默认的端口:80

HTTP 协议的请求部分(Request)

组成部分:请求行请求头请求体

1
2
3
4
5
6
7
8
9
10
//get 请求方式的抓包:
GET /WEB09/demo1/subSucc.html?username=aaa&password=123 HTTP/1.1
Accept: text/html, application/xhtml+xml, */*
X-HttpWatch-RID: 63397-10023
Referer: http://localhost:8080/WEB09/demo1/demo1.html
Accept-Language: zh-Hans-CN,zh-Hans;q=0.5
User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; rv:11.0) like Gecko
Accept-Encoding: gzip, deflate
Host: localhost:8080
Connection: Keep-Alive
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//post 请求方式的抓包:
POST /WEB09/demo1/subSucc.html HTTP/1.1
Accept: text/html, application/xhtml+xml, */*
X-HttpWatch-RID: 63397-10049
Referer: http://localhost:8080/WEB09/demo1/demo1.html
Accept-Language: zh-Hans-CN,zh-Hans;q=0.5
User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; rv:11.0) like Gecko
Content-Type: application/x-www-form-urlencoded
Accept-Encoding: gzip, deflate
Host: localhost:8080
Content-Length: 25
Connection: Keep-Alive
Cache-Control: no-cache

username=aaa&password=123

请求行

请求行:请求信息的第一行,包含:请求方式请求路径协议版本

例如:

1
GET /WEB09/demo1/subSucc.html?username=aaa&password=123 HTTP/1.1

请求方式:请求方式有很多种,常用的是 GETPOST

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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Accept-Ranges: bytes
ETag: W/"147-1455670867735"
Last-Modified: Wed, 17 Feb 2016 01:01:07 GMT
Content-Type: text/html
Content-Length: 147
Date: Wed, 17 Feb 2016 01:17:06 GMT

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Java</title>
</head>
<body>
<h1>Java学习</h1>
</body>
</html>

响应行

响应行:响应信息的第一行。

格式:协议/版本 状态码 状态码说明

例如: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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<!-- 配置Servlet -->
<servlet>
<!-- Servlet的名称 -->
<servlet-name>DemoServlet</servlet-name>
<!-- Servlet的类的全路径 -->
<servlet-class>com.servlet.demo1.DemoServlet</servlet-class>
</servlet>

<!-- 配置Servlet的映射 -->
<servlet-mapping>
<!-- Servlet的名称 -->
<servlet-name>DemoServlet</servlet-name>
<!-- Servlet的访问路径 -->
<url-pattern>/servletDemo1</url-pattern>
</servlet-mapping>

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 会帮我们处理信息。

路径的写法

相对路径:

  • 当前路径 ./ 或者 什么都不写

  • 上一级路径 ../

绝对路径:(我们使用)

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
2
3
//设置响应头:
//设置字符串形式的响应头
response.setHeader(String key,String value);
1
2
//追加响应头,若之前设置过这个头,则追加;若没有设置过,则设置
response.addHeader(String key,String value);
1
2
//设置定时刷新:
response.setHeader("refresh","3;url=/day0901/login.htm");

另: 可以通过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 类同时具有该方法。

作用:

  1. 获取全局的初始化参数
  2. 共享资源(xxxAttribute)
  3. 获取文件资源
  4. 其他操作

获取 servletcontext

方式1:了解

getServletConfig().getServletContext()

方式2:

getServletContext()

常用方法

  1. 了解
1
2
String getInitParameter(String key)//通过名称获取指定的参数值
Enumeration getInitParameterNames()//获取所有的参数名称

在根标签下有一个 context-param 子标签,用来存放初始化参数:

1
2
3
4
<context-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</context-param>
  1. xxxAttribute(set,get)

1
2
3
4
5
String getRealPath(String path)//获取文件部署到tomcat上的真实路径(带tomcat路径)

getRealPath("/")//D:\javaTools\apache-tomcat-7.0.52\webapps\day09\

InputStream getResourceAsStream(String path)//以流的形式返回一个文件
  1. 获取文件的 mime 类型(大类型/小类型)
1
String getMimeType(String 文件名称)

域对象 ★★★

servletcontext 可以被当成map集合。

常用方法:

xxxAttribute()

servletcontext 创建和销毁:

当项目启动的时候服务器为每一个 web 项目创建一个 servletcontext 对象。
当项目被移除的时候或者服务器关闭的时候 servletcontext 销毁。

存放:

共享的数据

获取文件的路径

通过类加载器获取文件:2.txt 放在 classes 目录下无论是 java 项目还是 web 项目都可以。

1
类.class.getClassLoader().getResource("2.txt").getPath();