zoukankan      html  css  js  c++  java
  • request $ response

    两个对象  request response 指的是实现了 ServletResponse接口的

    HttpServletResponse

    功能1 response对象的概述

    1. response  代表 服务器对浏览器的响应  通过HTTP响应协议

    2.response中 存在的方法 响应给客户端

    应用RESPONSE

    1. 响应首行手动向浏览器 发送404 状态码

    a) 如果一个方法过时了 一般源码有提示信息

    2重定向

    效果图 输入www.localhost:80/jw08resq&req/Bservlet  错误

    2.1开发中重定向

    傻瓜式重定向不用明白原理

    使用response的一个方法

    3浏览器和服务器的访问流程

    4. web项目结构

    5. refresh头,刷新 五秒后跳转

    6. 浏览器和服务器通信监视器Fidder

    7. 相应正文

    7.1发送字节流 发送中文 制造并且解决乱码问题

      字节流乱码   utf-------gbk

    7.2使用字符流发送字符

     IS5 9  编码集中不存在中文

    字节流 发文本  字符流 发图片或者多媒体信息

    7.3字节流和字符流不能同时使用

    8服务器错误

    7.4使用字节流发送图片

    告诉浏览器 服务器输入的文件类型 text/html是关于字符内容类型

    imgae/jpeg” 告诉浏览器 服务器发送过去的是一个图片

     

     

     

     

     

    告诉浏览器 你发送的字节流 0101 是什么格式的  浏览器去解析  这个文件的是什么类型 image/jpeg

     

     

    7.4使用字节流发送文件(就是文件下载)

    服务器把文件发送个浏览器

    1. 直接访问该文件 下载
    1. 把文件放在 WEB-INF外界访问不到 控制下载权限

    //0 告诉浏览器是什么东西(不用手动去类型查文件对象那个是什么)

    //getServletContext().getMimeType(".jar") Context对象根据 后缀名去             

                      web.xml查找mime类型.

    response.setContentType(getServletContext().getMimeType(".avi"));

    //告诉浏览器推荐用户使用什么名称下载 一般选择英文类型

    response.setHeader("Content-Disposition", "attachment;filename=java.avi");

    //1 获得图片的输入流

    InputStream  in =   

                      getServletContext().getResourceAsStream("/WEB-INF/03225.avi");

    //2 通过response获得输出字节流

    OutputStream out = response.getOutputStream();

    //3 两个对接

    byte[] buffer = new byte[1024];

    int len = 0;

    while((len=in.read(buffer))>0){

    out.write(buffer, 0, len);

    out.flush();

    }

    in.close();

    out.close();

    功能2 request对象的概述

    1.request对象 封装了 浏览器发过来的信息

    Request对象

    1. 获取浏览器请求首行请求头

    请求首行  请求方式 请求路径  协议/版本号

    request.getMethod(): GET

    request.getRequestURI(): /Day08-request/AServlet

    request.getServletPath(): /AServlet

    request.getContextPath(): /Day08-request 获得应用路径 /jw08rr02

    request.getScheme(): http

    请求头

              //--原始方式获得请求头 比较繁琐有key  得到value

    String getHeader(String name)   

    long getDateHeader(String name)

    int getIntHeader(String name)

    Enumeration getHeaders(String name)

    Enumeration getHeaderNames()

               //---javaee封装好的方法.

    request.getContentLength(): -1

    request.getContentType(): null

    request.getLocale(): zh_CN zh 中文

    request.getQueryString(): name=tom&age=18

    request.getRequestURL(): http://localhost:8080/Day08-request/AServlet 绝对路径 网络上的任何资源

    request.getRequestURI(): /Day08-request/AServlet  相对路径

    request.getRemoteAddr(): 0:0:0:0:0:0:0:1

    request.getRemoteHost(): 0:0:0:0:0:0:0:1

    request.getRemotePort(): 52074 获得远端 浏览器的

    request.getServerName(): localhost

    request.getServerPort(): 8080

    请求空行

    请求正文 表单传送过来的键值对

    2.获得请求正文 获得表单提交的参数. 乱码问题

    2.1乱码:只要确保编码和解码一致,就绝对没有问题.

    1. GET方式 
    1.  http://localhost:8080/jw08rr02/BBServlet?name=tom&age=18

    1.浏览器负责编码.浏览器使用的码表就是表单所在页面的码表.

    2.服务器负责解码.服务器默认使用ISO-8859-1解码. 但如果你的服务器使用的是utf-8就不用配置了 如下配 置的URIEncoding来决定   

                  解码码表

     <Connector port="8080" protocol="HTTP/1.1"  URIEncoding="UTF-8"

    connectionTimeout="20000"

    redirectPort="8443" /> tomcat  servlet .xml

    如上配置会影响整个服务器不推荐.

    我们使用如下代码解决:

    //获得参数

    String name = request.getParameter("name");

    //因为服务器使用了错误的码表,那么我们按照错误的码表原路返回

    byte[] nameByte = name.getBytes("ISO-8859-1");

    //用正确的码表重新解码

    String newName = new String(nameByte,"UTF-8");

    System.out.println("解决之后的:"+newName);

    2.POST方式

    因为Post解码是在调用getParameter同时进行解码,那么解决乱码只需要在调用该方法之前设置服务器解码方式

    request.setCharacterEncoding("UTF-8");

    String name = request.getParameter("name");

    System.out.println(name);

    涉及到获得表单参数的方法还有哪些呢?

    String getParameter() 根据键获得值

    Map getParameterMap()  获得服务器保存表单参数的容器

               就是map<String,String[]>. 泛型: habit=chi&habit=shui&habit=la

                for(Entry<String, String[]> en : map.entrySet()){

        String key = en.getKey();

        String[] value = en.getValue();

        System.out.println(key+"==>" +Arrays.toString(value));

        }

    Enumeration getParameterNames()  获得提交的所有键  列举

                while(en.hasMoreElements()){

    String key = en.nextElement();

    System.out.println("提交上来的键==>"+key);

    }

    String[] getParameterValues(String name)  根据键获得值.

                  获得一键对应多 个值的情况的.

                  System.out.println(Arrays.toString(habits));

    //---------------------------------------------------------------------------------------------------------------------

    2. request的请求转发和包含功能.

     

    转发:

    一个Servlet处理完毕交给下面的servlet(JSP)继续处理.

    作用:

    在现实开发中,没有servlet转发给servlet的情况.都是由servlet转发给JSP.

    这样可以达到分工的作用:

    servlet: 比较适合处理业务.

    JSP: 比较适合显示功能

    注意问题:

    //servlet中不要做 输出正文的动作,没有结果的

    //如果放到前面会出现乱码.  解决 response.serCharacterEncoding(“utf-8”);  

                              字符串 通过 utf-8编码 变为 二进制字节 传输

                                             网页 通过  utf-8编码集  把二进制字节解码

       

    逻辑处理

    //1 获得表单提交的用户名密码

    String name = request.getParameter("name");

    String password = request.getParameter("password");

    //2 判断是否正确 tom 1234 才算成功

    if(name!=null && name.trim().length()>0 && name.equals("tom")&&

    password!=null && password.trim().length()>0 &&   

                    password.equals("1234")){

    //成功 ==>  转发到成功页面

    request.getRequestDispatcher("/login/success.jsp").forward(request,

                                             response);

    //自己来做,很多弊端,不要这样

    /* AServlet a = new AServlet();

    a.service(request, response);*/

    }else{

    //失败 ==>  转发到失败页面

    request.getRequestDispatcher("/login/error.jsp").forward(request, response);

    }

    //但是响应头是可以设置的.

    请求包含:

    两个servlet(jsp)共同向浏览器输出内容.

    作用:

    在现实开发中,多个页面含有相同的内容,我们把相同的内容抽取到一个jsp,在需要显示这个段内容的jsp,包含抽取的jsp.可以达到

    统一管理相同的内容.

    正文部分和页脚分开显示
    两个jsp页面 success包含 error页面  访问一个 success页面就行

    有不严谨的地方   使用jsp标签来实现

    3.request域的应用.

    原理:

    request对象中含有一个map.这个map就是request.

    作用:

    在将来开发中. 使用请求转发时,servlet处理完数据, 处理结果要交给jsp显示. 可以使用request域将处理结果有servlet带给jsp显示. 共享数据

    操作:

    1.setAttribute(key,value)  存入一个键值对

    2.getAttribute(key)  通过键取出值

    3.getAttributeNames() 获得域中所有键

    4.removeAttribute(key) 跟据键移除一个键值对

    request的范围:

    一个request对象对应一个request(map).

    系统当前有多少个request就有多少request.

    //1 获得表单提交的用户名密码

    String name = request.getParameter("name");

    String password = request.getParameter("password");

    //

    Map<String,String> error = new HashMap<String, String>();

    //2 验证

    if(!(name!=null && name.trim().length()>0 && name.equals("tom"))){

    error.put("name", "用户名有误!");

    }

    if(!(password!=null && password.trim().length()>0 && password.equals("1234"))){

    error.put("password", "密码错误!");

    }

    //将错误信息通过request域带到错误页面

    request.setAttribute("error",error );

    if(error.size() > 0){

    //失败==> 回到登录页面,并显示错误信息

    request.getRequestDispatcher("/login2/login.jsp").forward(request, response);

    }else{

    //成功==> 成功页面

    request.getRequestDispatcher("/login2/success.jsp").forward(request, response);

    }

      <body>

      <h1>用户登录</h1>

      <form action="/Day08-request/HServlet" method="POST">

      用户名:<input type="text" name="name" /> <br>

      密码:<input type="password" name="password" /><br>

      <input type="submit" >

      </form>

      <%

      Map<String,String> error = (Map<String,String>)request.getAttribute("error");

      if(error!=null && error.size()>0){

      for(Entry<String,String> en : error.entrySet()){

      out.print("<font color='red'>");

      out.print(en.getValue()+"<br>");

      out.print("</font>");

      }

      }

      %>

      </body>

    //=================================================================================================================

    路径总结:

    路径分为两种情况:

    1.客户端路径 ==> 给浏览器用的路径/相对于主机

    <form action="/Day08-request/AServlet" >

    <a href="/Day08-request/AServlet" >

    <img src="/Day08-request/AServlet" >

    response.sendRedirect("/Day08-request/AServlet")

    Refresh:3;url=/Day08-request/AServlet

    路径写法:

    "/" :  "/" ==> 相对于 主机.

    例如: 表单所在页面路径为==>

             http://localhost:8080/Day08-request/login.jsp ==> "/" 代表http://localhost:8080/

    不带"/":(开发中一定不要出现不带"/"的情况).代表从当前目录找.

    例如: 表单所在页面路径为==>     

             http://localhost:8080/Day08-request/info/login.jsp ==> 代表  

             http://localhost:8080/Day08-request/info/

    2.服务器端路径/相对于项目

    <url-pattern> /AServlet  ==> http://localhost:8080/Day08-request/AServlet

    request.getRequestDispatcher("/AServlet") ==>  

                               http://localhost:8080/Day08-request/AServlet

    路径写法:

    "/": 相对于项目.  "/"==>http://localhost:8080/Day08-request/

     

     

    两个对象  request response 指的是实现了 ServletResponse接口的

    HttpServletResponse

    功能1 response对象的概述

    1. response  代表 服务器对浏览器的响应  通过HTTP响应协议

    2.response中 存在的方法 响应给客户端

    应用RESPONSE

    1. 响应首行手动向浏览器 发送404 状态码

    a) 如果一个方法过时了 一般源码有提示信息

    2重定向

    效果图 输入www.localhost:80/jw08resq&req/Bservlet  错误

    2.1开发中重定向

    傻瓜式重定向不用明白原理

    使用response的一个方法

    3浏览器和服务器的访问流程

    4. web项目结构

    5. refresh头,刷新 五秒后跳转

    6. 浏览器和服务器通信监视器Fidder

    7. 相应正文

    7.1发送字节流 发送中文 制造并且解决乱码问题

      字节流乱码   utf-------gbk

    7.2使用字符流发送字符

     IS5 9  编码集中不存在中文

    字节流 发文本  字符流 发图片或者多媒体信息

    7.3字节流和字符流不能同时使用

    8服务器错误

    7.4使用字节流发送图片

    告诉浏览器 服务器输入的文件类型 text/html是关于字符内容类型

    imgae/jpeg” 告诉浏览器 服务器发送过去的是一个图片

     

     

     

     

     

    告诉浏览器 你发送的字节流 0101 是什么格式的  浏览器去解析  这个文件的是什么类型 image/jpeg

     

     

    7.4使用字节流发送文件(就是文件下载)

    服务器把文件发送个浏览器

    1. 直接访问该文件 下载
    1. 把文件放在 WEB-INF外界访问不到 控制下载权限

    //0 告诉浏览器是什么东西(不用手动去类型查文件对象那个是什么)

    //getServletContext().getMimeType(".jar") Context对象根据 后缀名去             

                      web.xml查找mime类型.

    response.setContentType(getServletContext().getMimeType(".avi"));

    //告诉浏览器推荐用户使用什么名称下载 一般选择英文类型

    response.setHeader("Content-Disposition", "attachment;filename=java.avi");

    //1 获得图片的输入流

    InputStream  in =   

                      getServletContext().getResourceAsStream("/WEB-INF/03225.avi");

    //2 通过response获得输出字节流

    OutputStream out = response.getOutputStream();

    //3 两个对接

    byte[] buffer = new byte[1024];

    int len = 0;

    while((len=in.read(buffer))>0){

    out.write(buffer, 0, len);

    out.flush();

    }

    in.close();

    out.close();

    功能2 request对象的概述

    1.request对象 封装了 浏览器发过来的信息

    Request对象

    1. 获取浏览器请求首行请求头

    请求首行  请求方式 请求路径  协议/版本号

    request.getMethod(): GET

    request.getRequestURI(): /Day08-request/AServlet

    request.getServletPath(): /AServlet

    request.getContextPath(): /Day08-request 获得应用路径 /jw08rr02

    request.getScheme(): http

    请求头

              //--原始方式获得请求头 比较繁琐有key  得到value

    String getHeader(String name)   

    long getDateHeader(String name)

    int getIntHeader(String name)

    Enumeration getHeaders(String name)

    Enumeration getHeaderNames()

               //---javaee封装好的方法.

    request.getContentLength(): -1

    request.getContentType(): null

    request.getLocale(): zh_CN zh 中文

    request.getQueryString(): name=tom&age=18

    request.getRequestURL(): http://localhost:8080/Day08-request/AServlet 绝对路径 网络上的任何资源

    request.getRequestURI(): /Day08-request/AServlet  相对路径

    request.getRemoteAddr(): 0:0:0:0:0:0:0:1

    request.getRemoteHost(): 0:0:0:0:0:0:0:1

    request.getRemotePort(): 52074 获得远端 浏览器的

    request.getServerName(): localhost

    request.getServerPort(): 8080

    请求空行

    请求正文 表单传送过来的键值对

    2.获得请求正文 获得表单提交的参数. 乱码问题

    2.1乱码:只要确保编码和解码一致,就绝对没有问题.

    1. GET方式 
    1.  http://localhost:8080/jw08rr02/BBServlet?name=tom&age=18

    1.浏览器负责编码.浏览器使用的码表就是表单所在页面的码表.

    2.服务器负责解码.服务器默认使用ISO-8859-1解码. 但如果你的服务器使用的是utf-8就不用配置了 如下配 置的URIEncoding来决定   

                  解码码表

     <Connector port="8080" protocol="HTTP/1.1"  URIEncoding="UTF-8"

    connectionTimeout="20000"

    redirectPort="8443" /> tomcat  servlet .xml

    如上配置会影响整个服务器不推荐.

    我们使用如下代码解决:

    //获得参数

    String name = request.getParameter("name");

    //因为服务器使用了错误的码表,那么我们按照错误的码表原路返回

    byte[] nameByte = name.getBytes("ISO-8859-1");

    //用正确的码表重新解码

    String newName = new String(nameByte,"UTF-8");

    System.out.println("解决之后的:"+newName);

    2.POST方式

    因为Post解码是在调用getParameter同时进行解码,那么解决乱码只需要在调用该方法之前设置服务器解码方式

    request.setCharacterEncoding("UTF-8");

    String name = request.getParameter("name");

    System.out.println(name);

    涉及到获得表单参数的方法还有哪些呢?

    String getParameter() 根据键获得值

    Map getParameterMap()  获得服务器保存表单参数的容器

               就是map<String,String[]>. 泛型: habit=chi&habit=shui&habit=la

                for(Entry<String, String[]> en : map.entrySet()){

        String key = en.getKey();

        String[] value = en.getValue();

        System.out.println(key+"==>" +Arrays.toString(value));

        }

    Enumeration getParameterNames()  获得提交的所有键  列举

                while(en.hasMoreElements()){

    String key = en.nextElement();

    System.out.println("提交上来的键==>"+key);

    }

    String[] getParameterValues(String name)  根据键获得值.

                  获得一键对应多 个值的情况的.

                  System.out.println(Arrays.toString(habits));

    //---------------------------------------------------------------------------------------------------------------------

    2. request的请求转发和包含功能.

     

    转发:

    一个Servlet处理完毕交给下面的servlet(JSP)继续处理.

    作用:

    在现实开发中,没有servlet转发给servlet的情况.都是由servlet转发给JSP.

    这样可以达到分工的作用:

    servlet: 比较适合处理业务.

    JSP: 比较适合显示功能

    注意问题:

    //servlet中不要做 输出正文的动作,没有结果的

    //如果放到前面会出现乱码.  解决 response.serCharacterEncoding(“utf-8”);  

                              字符串 通过 utf-8编码 变为 二进制字节 传输

                                             网页 通过  utf-8编码集  把二进制字节解码

       

    逻辑处理

    //1 获得表单提交的用户名密码

    String name = request.getParameter("name");

    String password = request.getParameter("password");

    //2 判断是否正确 tom 1234 才算成功

    if(name!=null && name.trim().length()>0 && name.equals("tom")&&

    password!=null && password.trim().length()>0 &&   

                    password.equals("1234")){

    //成功 ==>  转发到成功页面

    request.getRequestDispatcher("/login/success.jsp").forward(request,

                                             response);

    //自己来做,很多弊端,不要这样

    /* AServlet a = new AServlet();

    a.service(request, response);*/

    }else{

    //失败 ==>  转发到失败页面

    request.getRequestDispatcher("/login/error.jsp").forward(request, response);

    }

    //但是响应头是可以设置的.

    请求包含:

    两个servlet(jsp)共同向浏览器输出内容.

    作用:

    在现实开发中,多个页面含有相同的内容,我们把相同的内容抽取到一个jsp,在需要显示这个段内容的jsp,包含抽取的jsp.可以达到

    统一管理相同的内容.

    正文部分和页脚分开显示
    两个jsp页面 success包含 error页面  访问一个 success页面就行

    有不严谨的地方   使用jsp标签来实现

    3.request域的应用.

    原理:

    request对象中含有一个map.这个map就是request.

    作用:

    在将来开发中. 使用请求转发时,servlet处理完数据, 处理结果要交给jsp显示. 可以使用request域将处理结果有servlet带给jsp显示. 共享数据

    操作:

    1.setAttribute(key,value)  存入一个键值对

    2.getAttribute(key)  通过键取出值

    3.getAttributeNames() 获得域中所有键

    4.removeAttribute(key) 跟据键移除一个键值对

    request的范围:

    一个request对象对应一个request(map).

    系统当前有多少个request就有多少request.

    //1 获得表单提交的用户名密码

    String name = request.getParameter("name");

    String password = request.getParameter("password");

    //

    Map<String,String> error = new HashMap<String, String>();

    //2 验证

    if(!(name!=null && name.trim().length()>0 && name.equals("tom"))){

    error.put("name", "用户名有误!");

    }

    if(!(password!=null && password.trim().length()>0 && password.equals("1234"))){

    error.put("password", "密码错误!");

    }

    //将错误信息通过request域带到错误页面

    request.setAttribute("error",error );

    if(error.size() > 0){

    //失败==> 回到登录页面,并显示错误信息

    request.getRequestDispatcher("/login2/login.jsp").forward(request, response);

    }else{

    //成功==> 成功页面

    request.getRequestDispatcher("/login2/success.jsp").forward(request, response);

    }

      <body>

      <h1>用户登录</h1>

      <form action="/Day08-request/HServlet" method="POST">

      用户名:<input type="text" name="name" /> <br>

      密码:<input type="password" name="password" /><br>

      <input type="submit" >

      </form>

      <%

      Map<String,String> error = (Map<String,String>)request.getAttribute("error");

      if(error!=null && error.size()>0){

      for(Entry<String,String> en : error.entrySet()){

      out.print("<font color='red'>");

      out.print(en.getValue()+"<br>");

      out.print("</font>");

      }

      }

      %>

      </body>

    //=================================================================================================================

    路径总结:

    路径分为两种情况:

    1.客户端路径 ==> 给浏览器用的路径/相对于主机

    <form action="/Day08-request/AServlet" >

    <a href="/Day08-request/AServlet" >

    <img src="/Day08-request/AServlet" >

    response.sendRedirect("/Day08-request/AServlet")

    Refresh:3;url=/Day08-request/AServlet

    路径写法:

    "/" :  "/" ==> 相对于 主机.

    例如: 表单所在页面路径为==>

             http://localhost:8080/Day08-request/login.jsp ==> "/" 代表http://localhost:8080/

    不带"/":(开发中一定不要出现不带"/"的情况).代表从当前目录找.

    例如: 表单所在页面路径为==>     

             http://localhost:8080/Day08-request/info/login.jsp ==> 代表  

             http://localhost:8080/Day08-request/info/

    2.服务器端路径/相对于项目

    <url-pattern> /AServlet  ==> http://localhost:8080/Day08-request/AServlet

    request.getRequestDispatcher("/AServlet") ==>  

                               http://localhost:8080/Day08-request/AServlet

    路径写法:

    "/": 相对于项目.  "/"==>http://localhost:8080/Day08-request/

     

     

  • 相关阅读:
    【Qt】splitter
    android 使用AsyncHttpClient框架上传文件以及使用HttpURLConnection下载文件
    poj 1879 Truck History
    在LinuxMint中对firefox进行手动安装flash插件
    王立平--include在Android中的应用
    【IPC进程间通讯之二】管道Pipe
    我组织类时无意间遵守了依赖倒置原则
    百度2016笔试(算法春招实习)
    制作翻转效果动画
    vim常用命令行备忘总结
  • 原文地址:https://www.cnblogs.com/nextgg/p/7657650.html
Copyright © 2011-2022 走看看