Servlet知识概括
Servlet介绍
介绍:
- Servlet 是 JavaEE 规范之一。规范就是接口
- Servlet 就 JavaWeb 三大组件之一。三大组件分别是:Servlet 程序、Filter 过滤器、Listener 监器。
- Servlet 是运行在服务器上的一个 java 小程序,它可以接收客户端发送过来的请求,并响应数据给客户端。
- Tomcat是servlet的容器。
- spring mvc 基于servlet上面封装的框架。
Java与Servlet简介:
- Java针对Web提出了Servlet规范,即提供了Java与HTTP协议沟通的接口,这意味着Java可以以直观的面向对象的抽象方式编写HTTP服务端代码;Servlet接受请求对象,检查其中的数据,执行适当的后台逻辑,然后向客户返回响应。
①提供Java使用HTTP的方法;
②提供了会话机制,解决无状态问题;
③负责包装的请求对象,无须开发人员解析传入的HTTP请求;
CGI和Servlet的对比:
- Java Servlet 通常情况下与使用 CGI(Common Gateway Interface,公共网关接口)实现的程序可以达到异曲同工的效果。但是相比于 CGI,Servlet 有以下几点优势:
①性能明显更好。
②Servlet 在 Web 服务器的地址空间内执行。这样它就没有必要再创建一个单独的进程来处理每个客户端请求。
③Servlet 是独立于平台的,因为它们是用 Java 编写的。
④服务器上的 Java 安全管理器执行了一系列限制,以保护服务器计算机上的资源。因此,Servlet 是可信的。
⑤Java 类库的全部功能对 Servlet 来说都是可用的。它可以通过 sockets 和 RMI 机制与 applets、数据库或其他软件进行交互。
CGI:
- 链接:CGI是什么
- 早期的Web服务器,只能响应浏览器发来的HTTP静态资源的请求,并将存储在服务器中的静态资源返回给浏览器。随着Web技术的发展,逐渐出现了动态技术,但是Web服务器并不能够直接运行动态脚本,为了解决Web服务器与外部应用程序(CGI程序)之间数据互通,于是出现了CGI(Common Gateway Interface)通用网关接口。
- 简单理解,可以认为CGI是Web服务器和运行其上的应用程序进行“交流”的一种约定。
- CGI是Web服务器和一个独立的进程之间的协议,它会把HTTP请求Request的Header头设置成进程的环境变量,HTTP请求的Body正文设置成进程的标准输入,进程的标准输出设置为HTTP响应Response,包含Header头和Body正文。
- CGI只是一个接口规范或协议,它的实现则与具体的编程语言相关。在2000年以前,CGI通用网关接口盛行,那个时候,Perl是编写CGI的主流语言,以至于一般的CGI程序都是Perl程序。
URL地址到Servlet程序的访问:
Servlet 的生命周期:
- ①执行 Servlet 构造器方法
- ②执行 init 初始化方法
第一、二步是在第一次访问的时候创建 Servlet 程序会调用。
- ③执行 service 方法
第三步,每次访问都会调用。
- ④执行 destroy 销毁方法
第四步在 web 工程停止的时候调用。
Servlet 类的继承体系:
servlet配置详解:
- 用来声明一个servlet数据,常用的有以下几个子标签
<servlet-name></servlet-name>
servlet名称,与下文提到的 servlet-mapping 标签的 servlet-name 相对应
<servlet-class></servlet-class>
servlet类的完整类名
<url-pattern></url-pattern>
映射路径,使用该路径可以访问到想要访问的 servlet,可自行定义
<init-param></init-param>
servlet类的初始化参数,有两个子标签
<param-name></param-name>
可以理解为map中的key
<param-value></param-value>
可以理解为map中的value
<load-on-startup></load-on-startup>
当web应用启动时,用于指定加载servlet的顺序
当值 大于等0 时,web容器会按照值大小 从小到大 顺序加载
当值 为负或未定义 时,web容器会在首次访问该servlet时加载它
ServletConfig与ServletContext
ServletConfig类简介:
- ServletConfig 类从类名上来看,就知道是 Servlet 程序的配置信息类。
- Servlet 程序和 ServletConfig 对象都是由 Tomcat 负责创建,我们负责使用。
- Servlet 程序默认是第一次访问的时候创建,
ServletConfig 是每个 Servlet 程序创建时,就创建一个对应的ServletConfig 对象。
- 案例:
<servlet>
<servlet-name>ServletConfigDemo1</servlet-name>
<servlet-class>gacl.servlet.study.ServletConfigDemo1</servlet-class>
<!--配置ServletConfigDemo1的初始化参数 -->
<init-param>
<param-name>name</param-name>
<param-value>gacl</param-value>
</init-param>
<init-param>
<param-name>charset</param-name>
<param-value>UTF-8</param-value>
</init-param>
</servlet>
ServletConfig 类的三大作用:
可以获取 Servlet 程序的别名 servlet-name 的值
获取初始化参数init-param
获取ServletContext 对象
ServletContext 类简介:
- ServletContext 是一个接口,它表示 Servlet 上下文对象
- 一个 web 工程,只有一个 ServletContext 对象实例。
- ServletContext 对象是一个域对象。
- ServletContext 是在 web 工程部署启动的时候创建。在 web 工程停止的时候销毁
- 案例:
<!-- 全局配置参数,因为不属于任何一个servlet,
但是所有的servlet都可以通过servletContext读取这个数据 -->
<context-param>
<param-name>param1</param-name>
<param-value>value1</param-value>
</context-param>
<context-param>
<param-name>param2</param-name>
<param-value>value2</param-value>
</context-param>
ServletContext 类的四个作用 :
获取 web.xml 中配置的上下文参数 context-param
获取当前的站点根目录
①返回结果格式:/工程名
②调用ServletContext.getContextPath()方法
//获得的是当前的项目(工程)名 :/report_emp
System.out.println(request.getContextPath());
获取工程部署后在服务器硬盘上的绝对路径
①调用ServletContext.getRealPath()方法
②参数格式:加不加“/”无所谓
//工程下 不加斜杠的绝对路径是:E:\IdeaWork\JavaWeb\out\artifacts\servlettemp_war_exploded\
System.out.println("工程下 不加斜杠的绝对路径是:" +servletContext.getRealPath(""));
//工程下 的绝对路径是:E:\IdeaWork\JavaWeb\out\artifacts\servlettemp_war_exploded\
System.out.println("工程下 的绝对路径是:" +servletContext.getRealPath("/"));
//工程下 css 不加斜杠目录的绝对路径是:E:\IdeaWork\JavaWeb\out\artifacts\servlettemp_war_exploded\css
System.out.println("工程下 css 不加斜杠目录的绝对路径是:" + servletContext.getRealPath("css"));
//工程下 css 目录的绝对路径是:E:\IdeaWork\JavaWeb\out\artifacts\servlettemp_war_exploded\css
System.out.println("工程下 css 目录的绝对路径是:" + servletContext.getRealPath("/css"));
像Map 一样存取数据
ServletContext与ServletConfig的区别:
- 定义
①ServletConfig:Servlet的配置对象,容器在初始化Servlet时通过它传递信息给Servlet。
②ServletContext:上下文对象,提供了一系列方法供Servlet与Web容器交互。 - 创建时机
①ServletConfig:在容器初始化Servlet的时候,并为其提供上下文初始化参数的名/值对的引用。
②ServletContext:容器启动的时候,并为其提供Servlet初始化参数的名/值对的引用。 - 作用范围(可见性)
①ServletContext:每个JVM中每个Web应用一个ServletContext。
②ServletConfig:每个JVM中每个Web应用的每个Servlet一个ServletConfig。 - 总结:
ServletConfig=Servlet初始化参数,ServletContext=上下文初始化参数。
HTTP协议
HTTP协议简介:
- 什么是协议? 协议是指双方,或多方,相互约定好,大家都需要遵守的规则,叫协议。
- 所谓 HTTP 协议,就是指,客户端和服务器之间通信时,发送的数据,需要遵守的规则,叫 HTTP 协议。
- HTTP 协议中的数据又叫报文。
Get请求:
Post请求:
GET 请求与POST有哪些:
- GET请求:
①form 标签 method=get
②a 标签
③link 标签引入 css
④Script 标签引入 js 文件
⑤img 标签引入图片
⑥iframe 引入 html 页面
⑦在浏览器地址栏中输入地址后敲回车
- POST 请求有哪些:
①form 标签 method=post
- POST 与GET总结:
①除了form 标签 method=post是post请求,其他几乎都是get请求。
GET 请求与POST的区别:
- 链接:GET 和 POST 到底有什么区别?
- 关于安全性:
①我们常听到GET不如POST安全,因为POST用body传输数据,而GET用url传输,更加容易看到。
②但是从攻击的角度,无论是GET还是POST都不够安全,因为HTTP本身是明文协议。每个HTTP请求和返回的每个byte都会在网络上明文传播,不管是url,header还是body。这完全不是一个“是否容易在浏览器地址栏上看到“的问题。 - 关于编码:
①常见的说法有,比如GET的参数只能支持ASCII
,而POST能支持任意binary,包括中文
。
②但其实从上面可以看到,GET和POST实际上都能用url和body。因此所谓编码确切地说应该是http中url用什么编码,body用什么编码。
- 总结:
①上面讲了一大堆,是希望读者不要死记硬背GET和POST的区别,而是能从更广的层面去看待和思考这个问题。
②最后,协议都是人定的。只要客户端和服务器能彼此认同,就能工作。
请求报头和响应报头列表:
- 链接:HTTP协议的请求头列表和分类描述
- Requests 头列表:
Header | 解释 | 示例 |
---|---|---|
Accept | 指定客户端能够接收的内容类型 | Accept: text/plain, text/html |
Accept-Charset | 浏览器可以接受的字符编码集。 | Accept-Charset: iso-8859-5 |
Accept-Encoding | 指定浏览器可以支持的web服务器返回内容压缩编码类型。 | Accept-Encoding: compress, gzip |
Accept-Language | 浏览器可接受的语言 | Accept-Language: en,zh |
Accept-Ranges | 可以请求网页实体的一个或者多个子范围字段 | Accept-Ranges: bytes |
Authorization | HTTP授权的授权证书 | Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ== |
Cache-Control | 指定请求和响应遵循的缓存机制 | Cache-Control: no-cache |
Connection | 表示是否需要持久连接。(HTTP 1.1默认进行持久连接) | Connection: close |
Cookie | HTTP请求发送时,会把保存在该请求域名下的所有cookie值一起发送给web服务器。 | Cookie: $Version=1; Skin=new; |
Content-Length | 请求的内容长度 | Content-Length: 348 |
Content-Type | 请求的与实体对应的MIME信息 | Content-Type: application/x-www-form-urlencoded |
Date | 请求发送的日期和时间 | Date: Tue, 15 Nov 2010 08:12:31 GMT |
Expect | 请求的特定的服务器行为 | Expect: 100-continue |
From | 发出请求的用户的Email | From: user@email.com |
Host | 指定请求的服务器的域名和端口号 | Host: www.zcmhi.com |
If-Match | 只有请求内容与实体相匹配才有效 | If-Match: “737060cd8c284d8af7ad3082f209582d” |
If-Modified-Since | 如果请求的部分在指定时间之后被修改则请求成功,未被修改则返回304代码 | If-Modified-Since: Sat, 29 Oct 2010 19:43:31 GMT |
If-None-Match | 如果内容未改变返回304代码,参数为服务器先前发送的Etag,与服务器回应的Etag比较判断是否改变 | If-None-Match: “737060cd8c284d8af7ad3082f209582d” |
If-Range | 如果实体未改变,服务器发送客户端丢失的部分,否则发送整个实体。参数也为 | Etag If-Range: “737060cd8c284d8af7ad3082f209582d” |
If-Unmodified-Since | 只在实体在指定时间之后未被修改才请求成功 | If-Unmodified-Since: Sat, 29 Oct 2010 19:43:31 GMT |
Max-Forwards | 限制信息通过代理和网关传送的时间 | Max-Forwards: 10 |
Pragma | 用来包含实现特定的指令 | Pragma: no-cache |
Proxy-Authorization | 连接到代理的授权证书 | Proxy-Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ== |
Range | 只请求实体的一部分,指定范围 | Range: bytes=500-999 |
Referer | 先前网页的地址,当前请求网页紧随其后,即来路 | Referer: http://www.zcmhi.com/archives/71.html |
TE | 客户端愿意接受的传输编码,并通知服务器接受接受尾加头信息 | TE: trailers,deflate;q=0.5 |
Upgrade | 向服务器指定某种传输协议以便服务器进行转换(如果支持) | Upgrade: HTTP/2.0, SHTTP/1.3, IRC/6.9, RTA/x11 |
User-Agent | User-Agent的内容包含发出请求的用户信息 | User-Agent: Mozilla/5.0 (Linux; X11) |
Via | 通知中间网关或代理服务器地址,通信协议 | Via: 1.0 fred, 1.1 nowhere.com (Apache/1.1) |
Warning | 关于消息实体的警告信息 | Warn: 199 Miscellaneous warning |
- Responses 头列表:
Header | 解释 | 示例 |
---|---|---|
Accept-Ranges | 表明服务器是否支持指定范围请求及哪种类型的分段请求 | Accept-Ranges: bytes |
Age | 从原始服务器到代理缓存形成的估算时间(以秒计,非负) | Age: 12 |
Allow | 对某网络资源的有效的请求行为,不允许则返回405 | Allow: GET, HEAD |
Cache-Control | 告诉所有的缓存机制是否可以缓存及哪种类型 | Cache-Control: no-cache |
Content-Encoding | web服务器支持的返回内容压缩编码类型。 | Content-Encoding: gzip |
Content-Language | 响应体的语言 | Content-Language: en,zh |
Content-Length | 响应体的长度 | Content-Length: 348 |
Content-Location | 请求资源可替代的备用的另一地址 | Content-Location: /index.htm |
Content-MD5 | 返回资源的MD5校验值 | Content-MD5: Q2hlY2sgSW50ZWdyaXR5IQ== |
Content-Range | 在整个返回体中本部分的字节位置 | Content-Range: bytes 21010-47021/47022 |
Content-Type | 返回内容的MIME类型 | Content-Type: text/html; charset=utf-8 |
Date | 原始服务器消息发出的时间 | Date: Tue, 15 Nov 2010 08:12:31 GMT |
ETag | 请求变量的实体标签的当前值 | ETag: “737060cd8c284d8af7ad3082f209582d” |
Expires | 响应过期的日期和时间 | Expires: Thu, 01 Dec 2010 16:00:00 GMT |
Last-Modified | 请求资源的最后修改时间 | Last-Modified: Tue, 15 Nov 2010 12:45:26 GMT |
Location | 用来重定向接收方到非请求URL的位置来完成请求或标识新的资源 | Location: http://www.zcmhi.com/archives/94.html |
Pragma | 包括实现特定的指令,它可应用到响应链上的任何接收方 | Pragma: no-cache |
Proxy-Authenticate | 它指出认证方案和可应用到代理的该URL上的参数 | Proxy-Authenticate: Basic |
refresh | 应用于重定向或一个新的资源被创造,在5秒之后重定向(由网景提出,被大部分浏览器支持) | Refresh: 5; url=http://www.zcmhi.com/archives/94.html |
Retry-After | 如果实体暂时不可取,通知客户端在指定时间之后再次尝试 | Retry-After: 120 |
Server | web服务器软件名称 | Server: Apache/1.3.27 (Unix) (Red-Hat/Linux) |
Set-Cookie | 设置Http Cookie | Set-Cookie: UserID=JohnDoe; Max-Age=3600; Version=1 |
Trailer | 指出头域在分块传输编码的尾部存在 | Trailer: Max-Forwards |
Transfer-Encoding | 文件传输编码 | Transfer-Encoding:chunked |
Vary | 告诉下游代理是使用缓存响应还是从原始服务器请求 | Vary: * |
Via | 告知代理客户端响应是通过哪里发送的 | Via: 1.0 fred, 1.1 nowhere.com (Apache/1.1) |
Warning | 警告实体可能存在的问题 | Warning: 199 Miscellaneous warning |
WWW-Authenticate | 表明客户端请求实体应该使用的授权方案 | WWW-Authenticate: Basic |
- 普通报头:
在普通报头中,有少数报头域用于所有的请求和响应消息
,如:
①Cache-Control:
Cache-Control用于指定缓存指令,缓存指令是单向的(响应中出现的缓存指令在请求中未必会出现),且是独立的(一个消息的缓存指令不会影响另一个消息处理的缓存机制),HTTP1.0使用的类似的报头域为Pragma。
<1>请求时的缓存指令:
no-cache(用于指示请求或响应消息不能缓存)、
no-store、
max-age、
max-stale、
min-fresh、
only-if-cached;
<2>响应时的缓存指令:
public、
private、
no-cache、
no-store、
no-transform、
must-revalidate、
proxy-revalidate、
max-age、
s-maxage.
<3>为了指示IE浏览器(客户端)不要缓存页面,服务器端的JSP程序可以编写如下:
response.sehHeader(“Cache-Control”,“no-cache”);
//response.setHeader(“Pragma”,“no-cache”);作用相当于上述代码,通常两者//合用
这句代码将在发送的响应消息中设置普通报头域:Cache-Control:no-cache
②Date报头:
Date普通报头域表示消息产生的日期和时间
③Connection报头:
Connection普通报头域允许发送指定连接的选项。
<1>例如指定连接是连续,或者指定“close”选项,通知服务器,在响应完成后,关闭连接 - 请求报头:
请求报头允许客户端向服务器端传递请求的附加信息以及客户端自身的信息。
常用的请求报头Accept:
①Accept:
Accept请求报头域用于指定客户端接受哪些类型的信息。
<1>eg:Accept:image/gif,表明客户端希望接受GIF图象格式的资源;Accept:text/html,表明客户端希望接受html文本。
②Accept-Charset:
Accept-Charset请求报头域用于指定客户端接受的字符集。
<1>eg:Accept-Charset:iso-8859-1,gb2312.如果在请求消息中没有设置这个域,缺省是任何字符集都可以接受。
③Accept-Encoding:
Accept-Encoding请求报头域类似于Accept,但是它是用于指定可接受的内容编码。
<1>eg:Accept-Encoding:gzip.deflate.如果请求消息中没有设置这个域服务器假定客户端对各种内容编码都可以接受。
④Accept-Language:
Accept-Language请求报头域类似于Accept,但是它是用于指定一种自然语言。
<1>eg:Accept-Language:zh-cn.如果请求消息中没有设置这个报头域,服务器假定客户端对各种语言都可以接受。
⑤Authorization:
Authorization请求报头域主要用于证明客户端有权查看某个资源。
<1>当浏览器访问一个页面时,如果收到服务器的响应代码为401(未授权),可以发送一个包含Authorization请求报头域的请求,要求服务器对其进行验证。
⑥Host(发送请求时,该报头域是必需的):
Host请求报头域主要用于指定被请求资源的Internet主机和端口号,它通常从HTTP URL中提取出来的。
<1>我们在浏览器中输入:http://www.xxx.com/index.html,浏览器发送的请求消息中,就会包含Host请求报头域,如下:Host:www.xxx.com,此处使用缺省端口号80,若指定了端口号,则变成:Host:www.xxx.com:指定端口号
⑦User-Agent:
我们上网登陆论坛的时候,往往会看到一些欢迎信息,其中列出了你的操作系统的名称和版本,你所使用的浏览器的名称和版本,这往往让很多人感到很神奇,实际上,服务器应用程序就是从User-Agent这个请求报头域中获取到这些信息。
<1>User-Agent请求报头域允许客户端将它的操作系统、浏览器和其它属性告诉服务器。
<2>不过,这个报头域不是必需的,如果我们自己编写一个浏览器,不使用User-Agent请求报头域,那么服务器端就无法得知我们的信息了。 - 响应报头:
响应报头允许服务器传递不能放在状态行中的附加响应信息,以及关于服务器的信息和对Request-URI所标识的资源进行下一步访问的信息。
常用的响应报头:
①Location:
Location响应报头域用于重定向接受者到一个新的位置。Location响应报头域常用在更换域名的时候。
②Server:
Server响应报头域包含了服务器用来处理请求的软件信息。与User-Agent请求报头域是相对应的。 - 实体报头:
请求和响应消息都可以传送一个实体。
一个实体由实体报头域和实体正文组成,但并不是说实体报头域和实体正文要在一起发送,可以只发送实体报头域。实体报头定义了关于实体正文(eg:有无实体正文)和请求所标识的资源的元信息。常用的实体报头:
①Content-Encoding:
Content-Encoding实体报头域被用作媒体类型的修饰符,它的值指示了已经被应用到实体正文的附加内容的编码,因而要获得Content-Type报头域中所引用的媒体类型,必须采用相应的解码机制。Content-Encoding这样用于记录文档的压缩方法,
<1>eg:Content-Encoding:gzip
②Content-Language:
Content-Language实体报头域描述了资源所用的自然语言。没有设置该域则认为实体内容将提供给所有的语言阅读者。
<1>eg:Content-Language:da
③Content-Length:
Content-Length实体报头域用于指明实体正文的长度,以字节方式存储的十进制数字来表示。
④Content-Type:
Content-Type实体报头域用语指明发送给接收者的实体正文的媒体类型。
<1>eg:Content-Type:text/html;charset=ISO-8859-1
<2>Content-Type:text/html;charset=GB2312
⑤Last-Modified:
Last-Modified实体报头域用于指示资源的最后修改日期和时间。
⑥Expires:
Expires实体报头域给出响应过期的日期和时间。为了让代理服务器或浏览器在一段时间以后更新缓存中(再次访问曾访问过的页面时,直接从缓存中加载,缩短响应时间和降低服务器负载)的页面,我们可以使用Expires实体报头域指定页面过期的时间。
<1>eg:Expires:Thu,15 Sep 2006 16:23:12 GMT
<2>HTTP1.1的客户端和缓存必须将其他非法的日期格式(包括0)看作已经过期。
<3>eg:为了让浏览器不要缓存页面,我们也可以利用Expires实体报头域,设置为0,jsp中程序如下:response.setDateHeader(“Expires”,“0”);
HTTP状态码的分类:
- HTTP状态码由三个十进制数字组成,第一个十进制数字定义了状态码的类型,后两个数字没有分类的作用。HTTP状态码共分为5种类型:
分类 | 分类描述 |
---|---|
1** | 信息,服务器收到请求,需要请求者继续执行操作 |
2** | 成功,操作被成功接收并处理 |
3** | 重定向,需要进一步的操作以完成请求 |
4** | 客户端错误,请求包含语法错误或无法完成请求 |
5** | 服务器错误,服务器在处理请求的过程中发生了错误 |
- HTTP状态码表(版本1) 此表含状态码英文名称
状态码 | 状态码英文名称 | 中文描述 |
---|---|---|
100 | Continue | 继续。客户端应继续其请求 |
101 | Switching Protocols | 切换协议。服务器根据客户端的请求切换协议。只能切换到更高级的协议,例如,切换到HTTP的新版本协议 |
200 | OK | 请求成功。一般用于GET与POST请求 |
201 | Created | 已创建。成功请求并创建了新的资源 |
202 | Accepted | 已接受。已经接受请求,但未处理完成 |
203 | Non-Authoritative Information | 非授权信息。请求成功。但返回的meta信息不在原始的服务器,而是一个副本 |
204 | No Content | 无内容。服务器成功处理,但未返回内容。在未更新网页的情况下,可确保浏览器继续显示当前文档 |
205 | Reset Content | 重置内容。服务器处理成功,用户终端(例如:浏览器)应重置文档视图。可通过此返回码清除浏览器的表单域 |
206 | Partial Content | 部分内容。服务器成功处理了部分GET请求 |
300 | Multiple Choices | 多种选择。请求的资源可包括多个位置,相应可返回一个资源特征与地址的列表用于用户终端(例如:浏览器)选择 |
301 | Moved Permanently | 永久移动。请求的资源已被永久的移动到新URI,返回信息会包括新的URI,浏览器会自动定向到新URI。今后任何新的请求都应使用新的URI代替 |
302 | Found | 临时移动。与301类似。但资源只是临时被移动。客户端应继续使用原有URI |
303 | See Other | 查看其它地址。与301类似。使用GET和POST请求查看 |
304 | Not Modified | 未修改。所请求的资源未修改,服务器返回此状态码时,不会返回任何资源。客户端通常会缓存访问过的资源,通过提供一个头信息指出客户端希望只返回在指定日期之后修改的资源 |
305 | Use Proxy | 使用代理。所请求的资源必须通过代理访问 |
306 | Unused | 已经被废弃的HTTP状态码 |
307 | Temporary Redirect | 临时重定向。与302类似。使用GET请求重定向 |
400 | Bad Request | 客户端请求的语法错误,服务器无法理解 |
401 | Unauthorized | 请求要求用户的身份认证 |
402 | Payment Required | 保留,将来使用 |
403 | Forbidden | 服务器理解请求客户端的请求,但是拒绝执行此请求 |
404 | Not Found | 服务器无法根据客户端的请求找到资源(网页)。通过此代码,网站设计人员可设置"您所请求的资源无法找到"的个性页面 |
405 | Method Not Allowed | 客户端请求中的方法被禁止 |
406 | Not Acceptable | 服务器无法根据客户端请求的内容特性完成请求 |
407 | Proxy Authentication Required | 请求要求代理的身份认证,与401类似,但请求者应当使用代理进行授权 |
408 | Request Time-out | 服务器等待客户端发送的请求时间过长,超时 |
409 | Conflict | 服务器完成客户端的PUT请求是可能返回此代码,服务器处理请求时发生了冲突 |
410 | Gone | 客户端请求的资源已经不存在。410不同于404,如果资源以前有现在被永久删除了可使用410代码,网站设计人员可通过301代码指定资源的新位置 |
411 | Length Required | 服务器无法处理客户端发送的不带Content-Length的请求信息 |
412 | Precondition Failed | 客户端请求信息的先决条件错误 |
413 | Request Entity Too Large | 由于请求的实体过大,服务器无法处理,因此拒绝请求。为防止客户端的连续请求,服务器可能会关闭连接。如果只是服务器暂时无法处理,则会包含一个Retry-After的响应信息 |
414 | Request-URI Too Large | 请求的URI过长(URI通常为网址),服务器无法处理 |
415 | Unsupported Media Type | 服务器无法处理请求附带的媒体格式 |
416 | Requested range not satisfiable | 客户端请求的范围无效 |
417 | Expectation Failed | 服务器无法满足Expect的请求头信息 |
500 | Internal Server Error | 服务器内部错误,无法完成请求 |
501 | Not Implemented | 服务器不支持请求的功能,无法完成请求 |
502 | Bad Gateway | 充当网关或代理的服务器,从远端服务器接收到了一个无效的请求 |
503 | Service Unavailable | 由于超载或系统维护,服务器暂时的无法处理客户端的请求。延时的长度可包含在服务器的Retry-After头信息中 |
504 | Gateway Time-out | 充当网关或代理的服务器,未及时从远端服务器获取请求 |
505 | HTTP Version not supported | 服务器不支持请求的HTTP协议的版本,无法完成处理 |
- 链接:HTTP状态码对照表
MIME 类型说明:
MIME 是 HTTP 协议中数据类型。
- MIME 的英文全称是"Multipurpose Internet Mail Extensions" 多功能 Internet邮件扩充服务。MIME 类型的格式是“大类型/小 类型”,并与某一种文件的扩展名相对应。 常见的 MIME 类型:
HttpServletRequest类
HttpServletRequest类简介:
- 每次只要有请求进入 Tomcat 服务器,Tomcat 服务器就会把请求过来的 HTTP 协议信息解析好封装到 Request 对象中。然后传递到 service 方法(doGet 和 doPost)中给我们使用。
- 我们可以通过HttpServletRequest 对象,获取到所有请求的信息。
HttpServletRequest 类的常用方法:
- getRequestURI() 获取请求的资源路径
- getRequestURL() 获取请求的统一资源定位符(绝对路径)
- getRemoteHost() 获取客户端的 ip 地址 iv. getHeader() 获取请求头
- getParameter() 获取请求的参数,
①如果 使用 form 表单 而且制定了 参数传输类型为 multipart/form-data ,则 java 后端无法使用 requerst.getParam("")获取 form 参数。
②因为参数都是在二进制流中;必须用 reuqets.getInPutStream() 获取流,spring 可能对此做了封装,所以参数能直接获取到。 - getParameterValues() 获取请求的参数(多个值的时候使用)
- getMethod() 获取请求的方式 GET 或 POST
- setAttribute(key, value); 设置域数据
- getAttribute(key); 获取域数据
- getRequestDispatcher() 获取请求转发对象
- String getProtocl():获取协议及版本
- String getRemoteAddr ():获取客户机的IP地址
- String getQueryString():获取get方式请求参数
- String getServletPath():获取Servlet路径
- String getContextPath():.获取虚拟目录
- String getMethod():获取请求方式
BufferedReader getReader():获取字符输入流,只能操作字符数据。
ServletInputSteam getInputStream():获取字节输入流,可以操作所有类型数据。(文件上传)
- getPart():获取文件上传(Servlet3.0)
- getParts():就是多个Part,获取文件上传(Servlet3.0)
- 链接:Servlet中request的用法
请求的转发:
- 请求转发是指服务器收到请求后,从一次资源跳转到另一个资源的操作叫请求转发。
①服务器内请求转发也是要经过前端控制器,跟普通请求一样。
②forward是转发请求,不转发地址。forward不但转发请求内容,还把请求的方式也转发了
,所以forward的请求是get还是post取决于启用forward的源请求是post方式还是get方式。
③例如:a.jsp 以 post 方式调b.jsp,那么b.jsp 以forward的方式访问c.jsp也会以post方式访问。 - 请求转发方式(B->C):
①首先A向B发出请求(第一次)
,然后B通过请求转发的方式跳转到C,这就不会通过A来跳转,而是B自己直接向C发出请求,具体看下面这张图。
请求转发只有一次请求,且仅仅是服务器的内部跳转,所以地址会不会改变
。是否保留一次请求数据:
①pageContext:仅仅是当前页面有效,转发无效。
②request:一次请求有效,因此转发有效。
③session:同一次会话有效,因此转发也有效。
④application:全局变量,整个项目运行期间都有效,因此转发有效。转发只能在一个appliaction(服务器)内,不能跨域访问。
登录提交后转发的特点:
- 问题:以登陆为例,在浏览器页面填写账号、密码然后点击登陆。账号密码正确登陆成功。服务器端通过请求转发的方式响应浏览器一个页面,当我们在这个页面上点击刷新的时候。就会被提示是否重复提交表单。这个情况其实不应该出现。
- 原因:请求转发是不改变浏览器的URL路径的,URL不改变浏览器的里面的表单数据也还在,刷新就是重新提交一次
- 解决:
①JavaScript防止表单重复提交(主要用于网络延迟情况下用户点击多次submit按钮导致表单重复提交)
②将提交按钮设置为不可用,让用户点击第一次提交之后,没有机会点击第二次提交按钮的机会。(也可以将提交按钮隐藏起来,在点击第一次之后,将提交按钮隐藏起来)
③利用Session防止表单重复提交(主要用于表单提交之后,点击浏览器刷新按钮导致表单重复提交,以及点击浏览器返回按钮退回到表单页面后进行再次提交)
<1>表单页面由servlet程序(服务器端)生成,servlet为每次产生的表单页面分配一个唯一的随机标识号(Token令牌),并在FORM表单的一个隐藏字段中设置这个标识号,同时在当前用户的Session域中保存这个标识号。
<2>当用户提交FORM表单时,负责处理表单提交的serlvet得到表单提交的标识号,并与session中存储的标识号比较,如果相同则处理表单提交,处理完后清除当前用户的Session域中存储的标识号。如果不一致,就是重复提交了,此时服务器端就可以不处理重复提交的表单了。
<3>服务器程序将拒绝用户提交的表单请求情况如下:
1、存储Session域中的表单唯一的标识号与表单提交的标识号不同
2、当前用户的Session中不存在表单标识号
3、用户提交的表单数据中没有标识号字段
<4>创建标识号:String token = TokenProccessor.getInstance().makeToken();
<5>在服务器端使用Session保存标识号:request.getSession().setAttribute(“token”,token);
<6>在form表单中也就是JSP页面中,使用隐藏域来存储标识号(Token令牌)
④用重定向的响应方式后浏览器就不会再保存原来URL的表单了
Web中的相对路径和绝对路径:
- 在 javaWeb 中路径分为相对路径和绝对路径两种:
①相对路径是:
<1> . 表示当前目录
<2>.. 表示上一级目录
<3>资源名表示当前目录/资源名
②绝对路径是:
<1>http://ip:port/工程路径/资源路径 - 在实际开发中,路径都使用绝对路径,而不简单的使用相对路径:
①绝对路径
②base+相对路径
base标签的作用:
- base标签可以设置当前页面中所有相对路径工作时,参照哪个路径来进行跳转。
web 中 / 斜杠的不同意义 :
- 在 web 中 / 斜杠 是一种绝对路径。
- / 斜杠 如果被浏览器解析,得到的地址是:http://ip:port/
①<a href="/">斜杠 - / 斜杠 如果被服务器解析,得到的地址是:http://ip:port/工程路径
①<url-pattern>/servlet1</url-pattern>
②servletContext.getRealPath(“/”);
③request.getRequestDispatcher(“/”);
④特殊情况:response.sendRediect(“/”); 把斜杠发送给浏览器解析。得到 http://ip:port/
HttpServletResponse类
HttpServletResponse类简介:
- HttpServletResponse 类和 HttpServletRequest 类一样。
- 每次请求进来,Tomcat 服务器都会创建一个 Response 对象传 递给 Servlet 程序去使用。
- HttpServletRequest 表示请求过来的信息,HttpServletResponse 表示所有响应的信息,我们如果需要设置返回给客户端的信息,都可以通过 HttpServletResponse 对象来进行设置。
两个输出流的说明:
字节流 getOutputStream();:常用于下载(传递二进制数据)
字符流 getWriter();:常用于回传字符串(常用)
- 两个流同时只能使用一个,使用了字节流,就不能再使用字符流,反之亦然,否则就会报错。
response的常用方法:
- 告诉浏览器数据类型 setContentType()
- 设置response的编码格式 setCharacterEnconding()
- 返回服务器的预设错误网址并显示错误信息 sendError()
- 重定向页面 sendRedirect()
- 获取通向浏览器的字节流 getOutputStream()
- 获取通向浏览器的字符流 getWriter()
- 回传路径 encodeRedirectURL()
- setHeader()设置消息头
- setStatus()设置状态
- addCookie()添加Cookie
请求重定向:
- 请求重定向,是指客户端给服务器发请求,然后服务器告诉客户端说:“我给你一些地址,你去新地址访问”。叫请求重定向(因为之前的地址可能已经被废弃)。
①redirect(重定向)是通过服务端向客户端发送状态码,在客户端跳转url,redirect都是get的方式请求
,而且url地址会跳转到目标地址
。
- 重定向方式(B->C):首先A向B发出请求
(第一次)
,然后B通过重定向的方式跳转到C,但不会直接向C发出请求,而是先返回到A,通过A向C发出请求(第二次)
。具体看下面这张图: 由于两次请求,且第二次请求也是A发的,所以地址栏会改变
。是否保留一次请求数据:
①pageContext:仅仅是当前页面有效,重定向无效。
②request:一次请求有效,两次请求就不是不一样的请求了
,因此重定向无效。
③session:同一次会话有效,因此重定向也有效。
④application:全局变量,整个项目运行期间都有效,因此重定向也有效。重定向可以不在一个appliaction内,即重定向可以跨域访问。
web.xml常用标签
web.xml主要用于配置web项目启动时加载的信息:
- 总结:web.xml中元素的加载顺序 元素节点的加载顺序与它们在 web.xml 文件中的先后顺序无关,通常是
ServletContext -> listener -> filter -> servlet---->------>error-page
- context-param 用来配置初始参数
- listener 用来配置监听器
- filter用来配置过滤器
- servlet 用来配置servlet实例
web-app:xml文件的根标签,用于声明命名空间、schema约束等
①xmlns="http://java.sun.com/xml/ns/javaee"
<1>XML Namespaces,声明了命名空间,用于避免命名冲突,有疑惑的小伙伴可以点击这里
②xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
<1>XML Schema Instance,声明了web.xml所需要遵循的xml规范(xsi只是一个别名,可以自行定义,不过约定俗成使用xsi来表示)
③xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
<1>schemaLocation 是xsi的一个子元素,所以以 xsi:schemaLocation 来命名,它由一个 URI引用对 组成,两个URI之间以 空白符 分隔。第一个URI是 命名空间的名字,第二个URI是 模式文档的位置,模式处理器将从这个位置读取模式文档
<2>声明了 XML Namespace和对应的 XSD(Xml Schema Definition) 文档的位置,实际上就是声明了该命名空间对应的具体模板是哪个
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
version="3.0">
</web-app>
welcome-file-list: 用来配置欢迎页
①设置欢迎页,若不设置则会默认访问 WEB-INF 下的 index.html 页面
②当访问项目时,容器会按顺序依次搜索页面,如果有对应的页面存在,则显示该页面,若都没匹配到,则会报404错误
<welcome-file-list>
<welcome-file>index1.html</welcome-file>
<welcome-file>index2.html</welcome-file>
<welcome-file>index3.html</welcome-file>
</welcome-file-list>
session-config:设置 session 超时时间,单位为分钟
<session-config>
<session-timeout>30</session-timeout>
</session-config>
error-page:设置错误页,当404或500或指定异常时可以跳转至指定页面
,有三个子标签:
①按错误号指定跳转--error-code
。
②按异常类型指定跳转--exception-type
。
<error-code></error-code>
错误码,例如 404, 500等
<exception-type></exception-type>
异常类型,例如 java.lang.NullPointerException(空指针异常)
<location></location>
用来设置错误页
<error-page>
<error-code>404</error-code>
<location>/error_404.html</location>
</error-page>
<error-page>
<exception-type>java.lang.NullPointerException</exception-type>
<location>/error_null.html</location>
</error-page>
icon:当使用GUI(Graphic User Interface)工具时,用于指定web应用的图标,拥有两个字子标签,只支持 gif 和 jpg 格式。
<small-icon></small-icon>
小图标为 16*16像素
<large-icon></small-icon>
大图标为 32*32像素
<icon>
<small-icon>/images/xxx.jpg</small-icon>
<large-icon>/images/xxx.jpg</large-icon>
</icon>
display-name:当使用GUI(Graphic User Interface)工具时,用于指定web应用的名称
<display-name>xxxxxxx</display-name>
description:用于描述web应用的相关信息
<description>xxxxxxx</description>
distributable:元素为空标签,它的存在与否可以指定站台是否可分布式处理,也就是实现session复制,分布式web容器应用。
①如果在web.xml中指定该标签,则表示应用程序已经可以部署在分布式的servlet容器中了,即此应用程序可以在多个实例之间分发servlet及会话
②只要看web.xml中是否出现该标签,就可以判断web项目是否具有分布式的功能
<distributable/>
jsp-config 包括taglib>和jsp-property-group 两个子元素。
①其中taglib元素在JSP 1.2时就已经存在;而jsp-property-group是JSP 2.0 新增的元素。
jsp-property-group元素主要有八个子元素,它们分别为:
<1>description:设定的说明;
<2>display-name>:设定名称;
<3>url-pattern:设定值所影响的范围,如:/CH2 或 /*.jsp;
<4>el-ignored:若为true,表示不支持EL 语法;
<5>scripting-invalid:若为true,表示不支持<% java代码%>语法;
<6>page-encoding:设定JSP 网页的编码;
<7>include-prelude:设置JSP 网页的抬头,扩展名为.jspf;
<8>include-coda:设置JSP 网页的结尾,扩展名为.jspf。
<jsp-config>
<taglib>
<taglib-uri>Taglib</taglib-uri>
<taglib-location>/WEB-INF/tlds/MyTaglib.tld</taglib-location>
</taglib>
<jsp-property-group>
<description>Special property group for JSP Configuration JSP example.</description>
<display-name>JSPConfiguration</display-name>
<url-pattern>/jsp/* </url-pattern>
<el-ignored>true</el-ignored>
<page-encoding>GB2312</page-encoding>
<scripting-invalid>true</scripting-invalid>
<include-prelude>/include/prelude.jspf</include-prelude>
<include-coda>/include/coda.jspf</include-coda>
</jsp-property-group>
</jsp-config>