首页 > 其他 > 详细

response

时间:2019-09-01 18:17:24      阅读:67      评论:0      收藏:0      [点我收藏+]

 

 

 HttpServletResponse

response实际上用的是HttpServletResponse,HttpServletResponse是ServletResponse的子类

我们在创建Servlet需要重写service()方法,或者doGet()/doPost(),   service()方法是由Servlet接口定义的,oGet()/doPost()方法是由HttpServlet接口定义的

这些方法都有两个参数:代表请求的request和代表响应response

 

 

service方法中的 对象response的类型是ServletResponse,而doGet/doPost方法的 对象response的类型是HttpServletResponse

 

HttpServletResponseServletResponse的子接口.

 

(response多为set方法)

 

response运行流程

由tomcat创建respone和request这两个对象,传入Service()方法,response将哟输出的内容组装成响应,响应给浏览器。

 

 

因为response代表响应,所以我们可以通过该对象分别设置Http响应的响应行,响应头和响应体

 

抓包看看响应行,,

 

 

  • 设置响应行

 

设置响应行的状态码:

 

setStatus(int sc)

  • 设置响应头

相关方法

set

setHeader(String name, String value)

setIntHeader(String name, int value)

setDateHeader(String name, long date)

使用set方式添加的数据,如果之前有同名的key存放了数据,会将其覆盖。

 

add

addHeader(String name, String value)

addIntHeader(String name, int value)

addDateHeader(String name, long date)

使用add方式添加的数据如果之前有同名的key已经存放了数据,会再次添加一个数据进去

 

 

 

重定向

 

 

 

重定向过程:

 

浏览器发送http请求——>服务器接受后发送302状态码进行响应及对应新的 location(请求地址给浏览器——>浏览器发现是302响应,就会自动再发送一个新的http请求,请求url是接收到location (请求地址)——>服务器根据此请求寻找资源并发送给客户。

 

 

 

在这里新的请求地址 location可以重定向到任意URL,既然是浏览器重新发出了请求,那么之前request就相当于结束了生命周期最终在客户浏览器路径栏显示的是其重定向的路径,客户可以观察到地址的变化的。

 

重定向行为是浏览器做了至少两次的访问请求的。

 

 

 

重定向可以到另一个servlet(动态) 或 另一个页面(静态)   反正是一个新的路径资源

 

 

    public class RedirecteServlet extends HttpServlet {

    protected void doGet(HttpServletRequest request,
            HttpServletResponse response) throws ServletException, IOException {
            doPost(request, response);
    }

    protected void doPost(HttpServletRequest request,
            HttpServletResponse response) throws ServletException, IOException {
            /**
             * 1.设置状态码为302
             * 2.设置响应头location
             * 
             * sendRedirect(url);重定向,完成了上述2个操作的封装
             */
            System.out.println("实现重定向的操作");
//            response.setStatus(302);
//            //response.setHeader("location", "http://www.baidu.com");
//            response.setHeader("location", "/web03/index.html");
            response.sendRedirect("/web03/index.html");   
    }

}

 

注意:

重定向的地址是给浏览器解析的,需要(会加上)加上 项目名

 (  通过获取请求行获取包含项目名的路径 项目名: request.getContextPath()  )   例如: /javaweb01

 

响应体(字符和字节)以及乱码问题

 

应用场景浏览器显示的内容, 下载文件等.

 

response 可以将响应内容输出给浏览器,也可以输出一个html浏览器。

 

 

 

response.getWriter() 获取响应体的字符输出流   (中文乱码的问题) 需要设置编码

 

response.getOutputStream() 获取响应体的字节输出流     响应一张图片/电影  获取要响应的资源:注意项目发布的路径 servetContext去获取项目完整路径 getRealpath()

 

字节流的响应

 

  * 字节流响应
             */
            ServletOutputStream out = response.getOutputStream();
            //1.获取文件的绝对路径
            String realPath = getServletContext().getRealPath("/img3.jpg");
            System.out.println(realPath);
            //2.获取文件流对象
            FileInputStream fs = new FileInputStream(realPath);
            int len = 0;
            byte[] buf = new byte[1024];
            while((len = fs.read(buf))!=-1){
                //3.将文件以字节的方式响应给浏览器
                out.write(buf, 0, len);
            }
            fs.close();

 

 

字节流和字符流都可以,通过这两个流都可以向浏览器响应数据.

getOutputStream  getWriter 相互排斥,调用了其中一个方法就不能调用另外一个方法

tomcat会自动调用response输出流的 close方法和flush方法, 因此不需要我们手动关闭流。

 

字符流输出流 ,中文乱码的问题

因为编码和解码使用的码表不一致,汤姆猫默认码表iso-8859-1,浏览器默认码表GBK;

因此在输出响应体的过程(代码),对码表进行设置

将汤姆猫的编码设置为: response.setCharacterEncoding(utf-8) ;

将浏览器的解码方式设置为: response.setHeader(content-type, text/html; charset=utf-8)   /   html中的meta标签

 

直接指定response缓冲区编码方式浏览器解析页面的解码方式,【设置媒体类型】  以上的结合

response.setContentType("  text/html;  charset=utf-8  ");

 

text/html; charset=utf-8 指的是输出html 编码是utf-8

Json呢?

 

ServletContext对象

 

ServletContext:直译servlet的上下文对象,ServletContext就代表一个web应用

ServletContext内部维护着web应用的一些相关信息,这些信息可以被工程中的所有的servlet共享。

 

如何获取:

可以通过底层代码查看获取ServletConfigServletContext获取过程和之间的联系

1、ServletContext context = config.getServletContext()

2、ServletContext context = this.getServletContext();  

             * servletContext:指代了当前项目的上下文对象。就代表了当前项目的一些配置信息
             *     1.获取全局的初始化参数(了解)
             *  2.可以获取文件的绝对路径(常用)
             *      servletContext.getRealPath("");获取的当前项目发布的绝对路径
             *      这个方法是将当前项目的发布的绝对路径和方法的参数做了个字符串的拼接
             *  3. 域对象  :servletContext可以作为一个存储数据库的对象。这个区域是有范围的。 
             *          如下特点:
             *              setAttribute(key,value);
             *              getAttribute(key);
             *              removeAttribute(key);
             */
    
            ServletContext servletContext = getServletContext();

//获取初始化信息
            /*String username = servletContext.getInitParameter("username");
            System.out.println(username);    */
    
//获取绝对路径
            String realPath = servletContext.getRealPath("/WEB-INF/classes/2.txt");    
//配置信息 2.txt /properties 位置是是class
            FileInputStream fs = new FileInputStream(realPath);
            System.out.println(realPath);
            
//作为域对象存值
            servletContext.setAttribute("sex", "female");

 

response

原文:https://www.cnblogs.com/wenhui2015/p/11442783.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!