JavaWeb11 Servlet Response

Reponse的引入

Response的基本使用

输出数据

输出字符数据

使用字符流

To send character data, use the PrintWriter object returned by getWriter().

PrintWriter pw =Response.getWriter(); //字符打印流

按照打印流的格式输出。

我们关心的是输出的乱码问题

编解码不一致。

编码是? 服务器

响应正文的编码,If no charset is specified, ISO-8859-1 will be used.

默认情况下,无法输出中文。所以需要先去给服务器制定输出的正文的编码格式。

如何解决乱码

方法1:

The charset for the MIME body response can be specified with
setContentType(java.lang.String). For example, “text/html; charset=Shift_JIS”.

-–》正文的编码可以通过这个api去修改。

以上的api有两个作用

  1. 告诉tomcat 的字符流使用什么编码输出这段字符

2 通过在响应报文的响应头增加 这个头信息

告诉浏览器采用什么编码格式去解码。

解码是?浏览器

方法2:

控制浏览器解码的方式 还有

浏览器可以控制。如果浏览器也是utf-8

就不会存在乱码问题了。

方法3:

输出字节数据

To send binary data in a MIME body response, use the ServletOutputStream
returned by getOutputStream().

getOutputStream().

如何解决乱码

使用字节流输出中文也会有乱码问题

需要知道,字节流的时候,使用的编码格式是 字节流里的字节数组本身的编码。

需要做的就是,告诉浏览器是使用正确的对应的编码去解码。

或者

方法3:

效果如下:

Response的其他案例

发送http头,控制浏览器定时刷新网页

案例1:

具体实现:

改进写法2:

改进写法3:

同表单的写法。

为什么?

都是浏览器通过当前的页面去发的新请求。

看看这个路径是写给谁最终去使用的!

案例:

利用Refresh刷新到其他组件。模拟注册页面,注册处理交由一个Servlet,在Servlet处理完成后,显示注册成功并转向主页

设置一个页面浏览器的缓存时间

通过response实现请求重定向。

如何实现重定向

void sendRedirect)(java.lang.String location)
Sends a temporary redirect response to the client using the specified redirect location URL.

重定向 vs 请求转发

相同点:都可以实现转到另一个页面去显示

不同点:

请求转发:浏览器仅仅发送了一个请求,转发是在tomcat内部完成的,浏览器不知道。

转发的源组件 和目标组件 :共用一个请求。所以可以使用request域传递数据。

转发浏览器的地址栏不会发生任何变化。

转发只能转发给当前服务器内部资源。

重定向:浏览器发送了两个请求。重定向是通过浏览器去完成的。

源组件和目标组件:并不是公用一个请求,而且不同的两个请求。不能使用request域传递数据。

重定向浏览器的地址栏会变化,从原组件的地址变化到目标组件的地址。

重定向可以重定向到任意的其他网站。

重定向里的细节补充

如果源组件在进行重定向之前,已经提交了响应结果,会抛出IllegalStateException。

response细节

  • getOutputStream和getWriter这两个方法互相排斥,调用了其中的任何一个方法后,就不能再调用另一方法。
    会抛异常。

  • Servlet程序向ServletOutputStream或PrintWriter对象中写入的数据将被Servlet引擎从response里面获取,Servlet引擎将这些数据当作响应消息的正文,然后再与响应状态行和各响应头组合后输出到客户端。

  • Serlvet的service方法结束后,Servlet引擎将检查getWriter或getOutputStream方法返回的输出流对象是否已经调用过close方法,如果没有,Servlet引擎将调用close方法关闭该输出流对象。