request与response

1. request和response概述

    Web服务器收到客户端的http请求,会针对每一次请求,分别创建一个用于代表请求的request对象、和代表响应的response对象。request和response对象代表请求和响应,若要获取客户机提交过来的数据,只需要找request对象就行了。若要向客户机输出数据,只需要找response对象就行了。


2. response

         response是用来向客户端完成响应,类型为HttpServletResponse,它是Servlet的service()方法的参数。当客户端发出请求时,tomcat会创建request和rsponse来调用Servlet的service()方法,每次请求都会创建新的request和response。

    2.1 response操作响应行

         在http响应行中,包括协议,版本号,以及响应状态码,响应行中主要就是操作这些状态码。

        常用方法:

            void setStatus(int sc,String sm) 设置状态代码

            void sendError(int sc) throws IOException 设置错误状态码

            void sendError(int sc,String msg) throwsIOException 设置错误状态码及信息

    2.2 response操作响应头

         http响应头的格式是  name:value的格式,如果有多个value值,以”,”分开,

        例如:

            Content-Encoding:gzip

            Content-Length: 123

            Content-Language: zh-cn

        Response设置响应头:

            一个key对应一个value

        

            一个key对应多个value

        

    

    2.3 response操作响应体

        http响应正文是我们最终在浏览器上看到的结果。对于HttpServletResponse如果想要操作响应正文,需要通过response对象获取到输出流,将信息写回到浏览器端。

    Response设置响应体:

    

    注意

        getOutputStream和getWriter方法分别用于得到输出二进制数据、输出文本数据的ServletOuputStream、Printwriter对象。

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

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

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

    2.4 设置输出数据编码

        默认情况下,浏览器编码格式是ISO-8859-1

        publicvoid setCharacterEncoding(String charset)

        设置发送到客户端的响应的字符编码

        publicvoid setContentType(String type)

     设置将发送到客户端的响应的内容类型,如果该响应尚未提交。给定内容类型可能包含字符编码规范,例如text/html;charset=UTF-8

    示例:

        字节流:

        设置浏览器默认打开编码

        response.setHeader("Content-Type","text/html;charset=UTF-8");

        中文转成字节数组编码

        response.getOutputStream().write("薛之谦".getBytes("UTF-8"));

    字符流:

        设置response的缓冲区的编码

        response.setCharacterEncoding("UTF-8");

        设置浏览器默认打开的编码.

        response.setHeader("Content-Type","text/html;charset=UTF-8");

        response.setContentType("text/html;charset=UTF-8");相当于上面两句

    2.5自动刷新

       有一个响应头:Refresh,它的作用是在指定的时间后,自动重定向到指定路径。

       例如:response.setHeader(“Refresh”, “5;URL=http://www.baidu.com”);,表示在5秒后自动跳转到百度。

    2.6文件下载

       一种:超链接方式.(不推荐)

          <a href=”aa.zip”>下载</a>

          <a href=”1.jpg”>下载</a>

       二种:手动编码方式完成文件下载.

          设置两个头和一个流:

          Content-Type:文件MIME的类型.

          Content-Disposition:

          文件的输入流:

    2.7重定向

        重定向:两个请求。

        第一个请求,服务器响应码:302。第一个请求的响应头有一个Location头,它说明了要重定向的URL;

        第二个请求,浏览器重新向Location头指定的URL发出。

        重定向:可以重定向到本项目之外的页面。例如可以重定向到百度!

        重定向:可以重定向到本项目内的其他资源,可以使用相对路径,以“/项目名”开头

        重定向:会使浏览器的地址栏发生变化!

        实现:    //1.设置状态码

                      response.setStatus(302);

                    //2.设置相应头--跳转目录

                      response.setHeader(“location”,”http://localhost/test/ss”);

                      response.setHeader(“location”,”test/ss”);

                    开发中也可以使用:response.sendRedirect(String path);

servlet:


登录页面:


用户名与密码错误,登陆失败,重定向到登陆页面



用户名与密码正确,登陆成功:



3. request

         HttpServletRequest对象用于封装http请求,对于http请求它有三部分组成,http请求行,http请求行及请求正文。

    3.1 request操作请求行

         public String getMethod()

        返回用于发出此请求的 HTTP 方法的名称,例如 GET、POST

         public String getRequestURI()

        返回此请求的 URL 的一部分,从协议名称一直到 HTTP 请求的第一行中的查询字符串。

         public String getProtocol()

        以protocol/majorVersion.minorVersion 的形式(例如 HTTP/1.1)返回请求使用的协议的名称和版本。

         public String getQueryString()

        返回包含在请求 URL 中路径后面的查询字符串。如果 URL 没有查询字符串,则此方法返回 null。

    3.2 request获取客户信息

         public String getContextPath()

        返回请求 URI 指示请求上下文的那一部分。

         public StringBuffergetRequestURL()

        重新构造客户端用于发出请求的 URL。返回的 URL 包含一个协议、服务器名称、端口号、服务器路径,但是不包含查询字符串参数。

         public String getRemoteAddr()

        返回发送请求的客户端或最后一个代理的 InternetProtocol (IP) 地址

    3.3 request操作请求头
    

        public String getHeader(String name)

        以 String 的形式返回指定请求头的值。

         publicjava.util.Enumeration<E> getHeaders(String name)

        以 String 对象的 Enumeration 的形式返回指定请求头的所有值。

         publicjava.util.Enumeration<E> getHeaderNames()

        返回此请求包含的所有头名称的枚举。如果该请求没有头,则此方法返回一个空枚举。

         public int getIntHeader(Stringname)

        以 int 的形式返回指定请求头的值。如果该请求没有指定名称的头,则此方法返回 -1。如果无法将头转换为整数,则此方法抛出NumberFormatException。

         public longgetDateHeader(String name)

        以表示 Date 对象的 long 值的形式返回指定请求头的值

    3.4 request获取请求参数
      

        请求参数是浏览器发送请求时携带的信息。对于请求方式GET与POST,请求参数存在位置不同。

         GET:请求参数存在于请求的资源路径中。

         POST:请求参数存在于正文中

         public StringgetParameter(String name)

        以 String 形式返回请求参数的值,如果该参数不存在,则返回 null

         public String[]getParameterValues(String name)

        返回包含给定请求参数拥有的所有值的 String 对象数组,如果该参数不存在,则返回 null。

         public java.util.Map<K,V> getParameterMap()

        返回此请求的参数的 java.util.Map。请求参数是与请求一起发送的额外信息。对于 HTTPservlet,参数包含在查询字符串或发送的表单数据中。

         publicjava.util.Enumeration<E> getParameterNames()

        返回包含此请求中所包含参数的名称的 String 对象的 Enumeration。如果该请求没有参数,则此方法返回一个空的Enumeration。

    3.5 request域对象

            request对象同时也是一个域对象,开发人员通过request对象在实现转发时,把数据通过request对象带给其它web资源处理。

        setAttribute方法

        getAttribute方法 

        removeAttribute方法

        getAttributeNames方法

        request对象提供了一个getRequestDispatcher方法,该方法返回一个RequestDispatcher对象,调用这个对象的forward方法可以实现请求转发,从而共享请求中的数据

    3.6 请求转发

         请求转发可以实现路径的跳转操作.

         ReqeustDispatcherdispatcher=request.getRequestDispatcher("路径")

         dispatcher.forward(request,response)

        请求转发和重定向的区别:

        (1)请求转发是服务器内部跳转,地址栏不会发生改变

                重定向地址栏会发生改变。

 

        (2)请求转发,只有一次请求,一次响应.

                重定向,有两次请求,两次响应。

 

        (3)请求转发存在request域,可以共享数据.

                重定向不存在request域。

 

        (4)请求转发只能在服务器的内部跳转,简单说,只能访问本站内资源。

                重定向可以访问站外资源,也可以访问站内资源.

 

        (5)请求转发是由request 发起的 .request.getRequestDispatcher().forward()

                重定向是由response 发起的  response.sendRedirect();

 

        (6)请求转发与重定向时路径写法不一样.

                 请求转发是服务器内部跳转,这时它与浏览器无关 写法:/资源

                重定向要跳转的路径是从浏览器在次发起的,是浏览器端路径,写法: /工程名/资源

 

    3.7 请求包含

        RequestDispatcher.include()方法用于将RequestDispatcher对象封装的资源内容作为当前响应内容的一部分包含进来,从而实现可编程的服务器端包含功能,被包含的Servlet程序不能改变响应消息的状态码和响应头,如果它里面存在这样的语句,这些语句的执行结果将被忽略。include在程序执行上效果类似forward,但是使用forward只有一个程序可以生成响应,include可以由多个程序一同生成响应 ----- 常用来页面布局。

        RequestDispatcher rd = request.getRequestDispatcher(“/BServlet”);

        rd.include(request,response);



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值