Response

首先我们介绍下它的数据格式
首先有两大类需要了解,数据行和数据头。其他的还有数据空行和数据体,这里就不写了

关于数据行,我们介绍两大类,一个是数据响应行,一个是状态码

数据响应行
HTTP/1.1 200 OK; // 这个就是其数据响应行,我们可以去浏览器F12看看下面就是状态码了
1xx:在服务器接收客户端消息一段时间后,发送1xx状态码,主要是免得:请求一次断开一次,大大降低了网页的载入速度

2xx:这个一般是200,表示成功

3xx:这个的代表是 302,代表重定向成功,还有304。就是客户端请求过服务器一次文件资源后,在其本地生成了一个缓存,下次请求的时候,客户端直接使用存在其本地的缓存就可以直接载入了。

4xx:代表的就是404,表示服务器没有这个资源路径,是客户端的问题。405:代表网页提交的表单方式,在服务器中没有对应的处理方法。

5xx:代表的就是500,表示客户端的错误,一般会出现异常日志,可以根据日志找错误。

我们可以通过代码来设置其响应的状态码,这个函数会用在重定向的操作中,如下:
response.setStatus(int 状态码);

数据头,这个里面有很多的信息,以至于我们后面很多操作都会用到

这里介绍两个,一个是 Context-Type,一个是 Conntext-disposition

Context-Type:告诉服务器响应内容是什么以及编码的格式
Context-Type:text/html;charset=utf-8;

关于响应头,这里提下,text/html是可以通过一个函数获取的
servletContext.getMimeType(); // 这里获取就是当前请求网页的响应体内容是什么格式的

Context-disposition:这个是用来告诉浏览器,处理响应体的方式,响应体就是网页的数据
一般给出两种方法,如下
in-line; // 在当前浏览器页面中打开,这是默认的方法attachment;filename=文件名; //这个就是以附件的形式打开,用来下载文件

这里给出一个函数,可以用来设置所有响应头的格式,注意,是 resposne的响应头,不是request,这两者的响应头是不同的
response.setHeader("响应头的昵称","响应头对应的格式"); // Context-Type 和 Context-Disposition 都可以通过这个函数来设置

下面我们讲怎么设置其编码格式,因为浏览器的编码解析是固定的,有的是GBK,有的是UTF-8,但是我们response是ISO编码,所以我们需要设置,具体看下面的代码

// 下面先讲复杂的
response.setCharacterEncoding("utf-8");	// 这是设置流的默认编码,流:就是给浏览器的响应体数据
response.setHeader("context-type","text/html;charset=utf-8");	// 这里是建议浏览器采用我们服务器所采用的编码格式

// 这个就是简单的
reponse.setContextType("text/html;charset=utf-8");	// 这个就是强制浏览器使用这个编码了,一般来说,这个用的比较多

下面,我们就介绍一下 路径 的规则,这部分内容比较复杂,需要手动的去实践才能获得更好的体验和理解

我们先讲 相对路径,就是本身的资源相对于目标的资源的路径,下面看例子
首先,我们访问服务器后,处在这样的一个网页上,链接如下(/test是虚拟目录)
localhost/test/web/login.html;

其次,我们需要在登录界面输入了登录数据后,就需要跳转到一个资源去检验数据库吧?那么我们就需要在 login.html 中写一个资源路径,在用户触发某个按钮之后,就可以跳转到下面的这个资源路径,进行用户数据的校验
localhost/test/web/loginServlet;

那么我们看上面,localhost/test/web 这个路径都是一样的,这个就是相对了,我们只是要访问到同一级下的另一个资源而已,那么就可以用如下访问
./ 这个就是访问当前同级目录下的另一个资源
…/ 两个点,就是访问上一级目录的另一个资源,这个就是相对于我们这个 localhost/test/web 资源路径,也就是我们当前处于的这个资源路径下

需要注意的是,只要是 . 开头的资源路径,都是相对路径!!!
存放具体资源的路径(IDEA版)

项目名称\out\artifacts\Web_war_exploded

下面我们继续讲绝对路径,绝对路径就好比我们电脑电脑文件夹上面的框,如 C:\Windows ,这个就是是用盘符直接将这个文件 从根目录到文件所处目录的所有经过的文件夹都显示了出来,这个就是绝对目录,绝对目录不加 . 它是 / 开头的,/ 表示的就是服务器资源的根目录

说了这么多,其实在Web里面的绝对路径,就是 虚拟目录 加与不加的两种问题而已
如果是服务器给客户端发送资源,就不用加。如果是客户端给服务器发送,就是需要加。

为什么呢?因为比如上面这个 login.html,它在虚拟目录 /text 下有 login.html,它同样在其他的目录下也有一个资源叫 login.html,那么客户端到底找哪一个呢

而服务器的内部转发就不需要,就如同 request 的转发功能,它是内部进行的一个转发,并没有让浏览器重新发送请求,而重定向就必须加 虚拟目录,因为重定向是两次请求,最后还是客户端发送给服务器的。

我们在编写代码的时候,最好在获取虚拟目录的时候不要手动的去写,用 request.getContextPath(); 这样如果虚拟目录改变了,可以动态的去改变

下面我们讲一个简单的,字符输出流与字节输出流,记得转换编码格式

response.getWrite.write(需要输出的字符);	// 这个就可以将数据发送到网页上显示

response.getOutputStream.write("Hello World".getBytes());	// 这个就可以将字节数据发送到网页上

最后我们讲下关于重定向的问题

重定向,有两种方式,一种简单的,一种难的。
重定向是两次请求
第一次:客户端->服务器,服务器->客户端(服务器告诉客户端需要重定向的资源)
第二次:客户端->服务器(跳转到之前服务器发来的资源路径),服务器->客户端

所以 request 域在这里没有用

难的

response.setStatus(302);	// 先设置状态码,302是代表重定向

response.setHeader("location","资源路径");	// location 是代表的是位置,也就是资源路径,后面的资源路径可以是当前服务器的资源路径,也可以是任意一个网页的地址

简单的

response.sendRedriect("资源路径");	// 这个就是简化版的,它直接帮我们解决了上面两个固定的东西

本文的最后,就是关于 ServletContext 的介绍

ServletnContext:代表的是整个服务器的域,只要服务器没有断开,那么这个域中的任何数据,所有资源都可以访问

获取及使用

cont = request.getServletContext();	// 这里会得到一个 ServletContext 对象
cont.setArrtibute("key","value");	// 和 request域 操作数据一样,都是这个方法,只不过调用的对象不一样

cont.getArrtibute("key");
cont.removeAttribute("key");

获取 MIME 类型:就是 text/htm:大类型/小类型 具体可以通过web.xml了解每个文件
String getMimeType(String file); // 获取给出文件的大小类型,如 1.jpg 2.html

获取 文件的真实路径,就是文件存储在服务器的本地资源路径
如果在服务器中,存放了一个 1.jpg 的文件,那么通过这个方法就可以直接定位到本地的资源,一般用来进行上传文件的操作
注意:在src目录下的文件,都存放在WEB-INF下的classes文件夹中
String getRealPath(String path); // 需要给定一个 服务器的绝对路径,就如 /test/day15/login.html

设置不使用缓存,因为服务器会存储缓存,导致我们下一次访问的时候还是上次的数据

response.setDateHeader("Expires",0 );
response.setHeader("Cache-Control","no-cache");
response.setHeader("pragma","no-cache");