8、HttpServletResponse对象讲解

 Web服务器收到客户端的http请求,会针对每一次请求,分别创建一个用于**代表请求**的 request 对象和**代表响应**的 response 对象。

​ request 和 response 对象代表请求和响应:获取客户端数据,需要通过 request 对象;向客户端输出数据,需要通过 response 对象
​ HttpServletResponse 的主要功能用于服务器对客户端的请求进行响应,将 Web 服务器处理后的结果返回给客户端。service()方法中形参接收的是 HttpServletResponse 接口的实例化对象,这个对象中封装了向客户端发送数据、发送响应头,发送响应状态码的方法。

响应数据

接收到客户端请求后,可以通过 HttpServletResponse 对象直接进行响应,响应时需要获取输出流。

        // 响应数据:
        // PrintWriter字符输出流-获取字符流(只能响应回字符)
        resp.getWriter().write("hi01");//只能打印输出文本格式,不可以输出对象
        resp.getWriter().print("hi01");//可以输出对象

        // ServletOutputStream字节输出流-获取字节流(能响应一切数据)
        resp.getOutputStream().write("hi".getBytes());
        // 设置响应头,一般用于更新原来的响应头,key相同,后面设置的会覆盖前面设置的
        resp.setHeader("key1","value1");
        resp.setHeader("key1","value2");
        // 设置响应头,一般用于添加新的响应头,key不同,后面设置的不会覆盖前面设置的
        resp.addHeader("key3","value3");
        resp.addHeader("key3","value4");

结果:
在这里插入图片描述

响应乱码问题

在响应中,如果我们响应的内容中含有中文,则有可能出现乱码。这是因为服务器响应的数据也会经过网络传输,服务器端有一种编码方式,在客户端也存在一种编码方式,当两端使用编码方式不同时则出现乱码。
设置传输过程中编码格式:

   response.setCharacterEncoding("UTF-8");

设置浏览器解码格式:

// 下面两行代码是等价的
response.setHeader("content-type", "text/html;charset=UTF-8");
response.setContentType("text/html;charset=UTF-8");

总结:

以后要想请求和响应都没有乱码问题,写Servlet上来加入三句代码:

// 设置请求信息的解码格式:
req.setCharacterEncoding("UTF-8");
// 设置响应信息的编码格式:
resp.setCharacterEncoding("UTF-8");
// 设置浏览器的编码格式:
resp.setContentType("text/html;charset=UTF-8");

重定向

重定向是一种服务器指导,客户端的行为。客户端发出第一个请求,被服务器接收处理后,服务器会进行响应,在响应的同时,服务器会给客户端一个新的地址(下次请求的地址 response.sendRedirect(url);),当客户端接收到响应后,会立刻、马上、自动根据服务器给的新地址发起第二个请求,服务器接收请求并作出响应,重定向完成。
​ 从描述中可以看出重定向当中有两个请求存在,并且属于客户端行为。

// 重定向跳转到index.jsp
response.sendRedirect("index.jsp");

请求转发与重定向的区别

不同1:语法不同

请求转发:request.getRequestDispatcher(“dis02”).forword(request,response);
重定向:response.sentRedirect(“red02”);

不同2:请求不同
请求转发:是一个请求
重定向:是不同的请求

不同3:地址栏是否发生改变

请求转发:不变
重定向:变

不同4:请求参数能否携带

请求转发:可以
重定向:不可以, 但是可以手动设置携带参数:resp.sendRedirect(“red2?uname=”+req.getParameter(“uname”)+“&pwd=123”);

不同5:执行效率不同

请求转发:服务器内部跳转,所以效率高啊
重定向:相对效率低

不同6:跳转范围不同

请求转发:只能在服务器内部跳转
重定向:既能跳转服务器内部资源,又能跳转服务器外部资源

不同7:表单是否发生重复提交

请求转发:会,指的是数据提交后,刷新页面,因为地址栏地址不变,每刷新一次都会重复请求一次,数据提交一次。如果刚好是个添加操作,每次都会添加一次。

重定向:不会

不同8:路径书写方式不同

(1)绝对路径 - 有协议、IP、端口 ,eg: http://www.baidu.com

​ 请求转发:不支持

​ 重定向:支持

(2)相对路径:相对servlet的url地址的路径 (不建议)

​ 自行测试:将第一个servlet地址改为"/msb/s1",然后分别请求转发,重定向到第二个servlet,观看相对地址和运行结果

​ 对于不加/,就是相对路径,相对servlet配置的url-pattern(请求地址),所以你要是url-pattern配置的是 /a 那么不加/ 没啥问题 ,但是url-pattern里面要是 /a/b/c 那么在访问jsp的时候 可能就出错了! 代码不加/就出错了!

(3)根路径: 资源路径加"/" (建议)

​ 请求转发:到项目根目录下查找资源 http://localhost:8080/项目访问名/

​ 重定向:到服务器根目录下查找资源 http://localhost:8080/

​ eg:resp.sendRedirect(req.getContextPath()+“/dis2”);

转发和重定向使用场景

1、跳转前后是否需要共享request中数据

​ 如果需要共享:转发

​ 如果不需要共享:都可以

2、是否要跳转到服务器外部资源

​ 如果需要跳出项目:重定向

如果不需要:都可以

3、是否涉及表单重复提交

​ 重定向:不会造成表单重复提交

​ 转发:会造成表单重复提交

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值