【JSP】08 request和response[详细版]

文章详细阐述了HTTP中的转发和重定向概念。转发是服务器内部资源间的跳转,保留请求数据,路径不变。重定向则是通过状态码302和location信息让浏览器发起新请求,地址栏路径改变,适用于外部资源跳转。此外,还介绍了response如何设置响应数据,包括字符数据和字节数据的处理方式。
摘要由CSDN通过智能技术生成

一、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的销毁而销毁 

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值