一、Request
forward 资源A跳转到资源B的过程称为转发,用forward实现
先访问demo5 然后自动跳转到demo6 访问demo6
在转发的页面间进行数据共享,我们先在demo5中setAttribute方法设置键msq 值111,通过forward方法,在demo6中,利用getAttribute方法就可以获取到111了
浏览器路径不发生变化,即在浏览器的路径中,启动服务器时是demo5页面的路径,随后它会通过forward方法跳转到demo6,但是浏览器上面的路径依旧显示在demo5中,不会发生改变。 只能转发到当前服务器的内部资源即,只能在Tomcat部署的内部进行转发,而不能转发到百度、淘宝这些外部资源。 一次请求,记住它
二、Response
request获取请求数据 response设置响应数据 request是get response是set
当浏览器对资源A进行请求时,资源A发现自己请求不了,但是它知道资源B可以完成请求,于是它向浏览器提供资源B的位置,浏览器会根据资源A提供的资源B的位置,去对资源B进行请求,那么这个过程,就是重定向
资源A要告诉浏览器,它处理不了这个事情,需要浏览器重定向时,不能用汉字告诉浏览器啊,因为浏览器读不懂,因此我们要给资源A设置一个状态码302,当浏览器看到302后进行解析,就知道,资源A此时处理不了这个事情,需要进行重定向
资源A还得告诉浏览器找谁啊,位置在哪。 因此资源A还需要设置一个位置,即location:,这个location就是资源B的路径。资源A将302状态码和location资源B的路径告诉浏览器后,浏览器就可以根据这两项,找到资源B,完成对资源B的访问。
在第一张图片中,我们可以发现 状态码302和location都是不需要改变的,我们完成不同的重定向时,只需改变资源B的路径。 所以我们对第一张图片的代码进行简化,使用sendRedirect方法,其中redirect就是重新定位的意思,在其中我们只需传入资源B的路径即可,其内部就包含了setStatus()和setHeader()两个方法
地址栏路径发生变化,即 我们使用tomcat启动服务器后,浏览器打开/resp1的页面,当我们一敲回车,根据sendRedirect()方法,会进行重定向,重定向到/resp2,这时,浏览器上的地址栏会从resp1的访问路径改成resp2的访问路径。出现这个现象的原因是,浏览器发出了两次请求。第一次浏览器向resp1发出请求,结果resp1不能完成任务,并且推荐了resp2的地址,因此浏览器发出第二次请求,即向resp2发出请求,完成重定向来解决浏览器要解决的问题。 将来这些请求都是由浏览器来发出请求的,因此浏览器可以重定向到外部资源,例如百度、淘宝等外部网站。 重定向有两次请求,从而request有两个域,因此不能像request一样进行资源存储了。 以后我们要进行转发,要根据request和response的特点来进行选择,特别是利用第二个和第三个特点,选择适合需求的那一种转发方式。
response 除了重定向以外,还有一个功能是相应数据。数据分为 响应字符数据和响应字节数据。 我们先使用response.getWriter()方法获取字符输出流,这个返回的对象有一个write功能,可以将里面的字符串写到页面上去。我们用<h1>标签想设置字符串的css,但是发现并不能被识别。因此我们要加上setHeader()方法,设置内容类型为text/html,告诉浏览器,我们这个地方需要识别html,那么这个时候h1这个标签就会被识别了
细节1:这里的输出流,是不需要我们手动调用close()方法来进行关闭的,因为输出流是随着response的创建而创建的,当服务器关闭时,输出流会随着response的销毁而销毁
细节2:我们这里的输出流,默认的编码方式其实是ISO方式,所以如果我们是要输出中文的话,存在中文乱码问题。因此,我们需要将其编码方式设置成utf-8。我们先将之前setHeader()方法注释掉,而调用一个setContentType()方法。setContentType()方法跟之前的setHeader()方法比的好处在于,setContentType()方法不仅可以设置输出流的格式为html,还可以将输出流的编码方式转换为utf-8,解决乱码问题。值得注意的是,先编码,再输出,因此我们需要将setContentType()方法放在最上面,以保持 统筹全局的效果。
response响应字节数据。首先我们通过fis方法读取文件,我们要相应字节数据的话,本质上其实是进行文件的拷贝,所以我们需要一个fis和一个fos来完成拷贝。首先我们通过fis()方法获取我们要拷贝的文件,然后通过response中的getOutPutStream()方法获取到一个fos输出流。然后进行文件拷贝。最后关闭fis。fos不用关闭,因为它是随着response的创建而创建,会随response的销毁而销毁