zoukankan      html  css  js  c++  java
  • Java实战之04JavaWeb-02Request和Response

    一、Response和Request的生态环境

    二、HttpServletResponse---代表响应对象

    1.设置状态码

    void setStatus(int sc)

    状态码:

    200:一切正常 正常返回数据

    302:重定向

    304:拿缓存

    404:找不到资源

    500:服务器端报错(一般情况,代码有异常)

    2.设置响应头

    (1)设置响应头的API

    (2)案例-重定向

    重定向:

    实现重定向:302+Location

    servlet1:

    response.setStatus(302);

    response.setHeader(“Location”,”url地址”);

    servlet2:

    response.getWriter().write(“hello”);

    重定向的特点:

    1)客户端访问两次

    2)客户端的地址栏的地址发生了变化

    response中便捷的重定向的方法:

    void sendRedirect(String location)

    (3)案例-定时跳转

    refresh头代表定时跳转

    头对应的值的写法:秒值;url=url地址

    response.setHeader("refresh","5;url=/response2");

    (4)304状态码的原理

    3.设置响应体

    (1)写给客户端字符

    PrintWriter writer = response.getWriter();

    writer.write(字符);

    原因:write方法在写的时候 其实是将内容写到response的缓冲区,response的缓 冲区本有默认的编码格式 iso-8859-1问题:写给客户端的中文乱码

    解决:手动的设置response的缓冲区编码

    void setCharacterEncoding(String Charset)

    问题:设置response的编码为UTF-8之后 发现页面显示


    解决:通过代码去指定页面解析时的编码
    原因:页面默认解析的编码是GBK

    通过Content-Type头去指导浏览器使用哪种编码进行页面的解析

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

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

    注意:设置Content-Type的方法内部有两个功能

    1)自行设置response的缓冲区的编码是UTF-8;

    2)指导浏览器的解析页面时的编码是UTF-8;

    记住:解决response发中文乱码

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

    (2)写给客户端字节

    1)获得字节流

    ServletOutputStram  response.getOutputStream();

    2)需求:输出验证码图片

    3)需求:文件下载

    两个流:

    输入流:读取文件

    输出流:写给客户端---写到response缓冲区

    两个头:

    //显示的告诉客户端文件的mime类型

    response.setContentType("audio/mpeg");

    //告知客户端回写的文件要以附件的形式打开(下载)

    response.setHeader("Content-Disposition","attachment;filename=1.mp3");

    4.Response的一些细节

    1)getWriter和getOutputSteam在一个Servlet中不能同时调用

    2)通过response获得的流不用手动关闭

    web容器在service方法结束后会检查response获得的流是否关闭,没有关闭容器会关闭这个流。

    3)response缓冲区的大小是8k  可以设置大小 只能向更大的范围设置

    三、HttpServletRequest

    1.获取请求行

    1)获取请求方式

    String method = request.getMethod(); //GET  POST

    2)获得请求的资源

    request.getRequestURI()

    request.getRequestURL()

    request.getContextPath():web应用的名称

     1         //1、请求方式
     2         String method = request.getMethod();
     3         System.out.println(method);//GET
     4         //2、获得请求资源
     5         String requestURI = request.getRequestURI();
     6         StringBuffer requestURL = request.getRequestURL();
     7         System.out.println(requestURI);
     8         System.out.println(requestURL.toString());
     9         String contextPath = request.getContextPath();
    10         System.out.println(contextPath);        

    3)获取get提交的数据的字符串形式

    1         //3、获取get提交的字符串形式的 参数
    2         String queryStr = request.getQueryString();
    3         System.out.println(queryStr);

    4)获取客户机的参数

    1         //4、获得客户机的ip
    2         String remoteAddr = request.getRemoteAddr();
    3         System.out.println(remoteAddr);

    2.获取请求头

     1         //1、获取一个指定的头
     2         String header = request.getHeader("User-Agent");
     3         System.out.println(header);
     4         //2、判断客户端的浏览器的类型
     5         if(header.contains("MSIE")){
     6             System.out.println("这是IE");
     7         }else if(header.contains("Firefox")){
     8             System.out.println("这是火狐");
     9         }else{
    10             System.out.println("这是其他");
    11         }
    12         //3、获得所有的头的名称
    13         System.out.println("-------------------------------------------");
    14         Enumeration headerNames = request.getHeaderNames();
    15         while(headerNames.hasMoreElements()){
    16             String headerName = (String) headerNames.nextElement();
    17             System.out.println(headerName+":"+request.getHeader(headerName));
    18         }

    3.获得请求体(获得post提交的参数)

    请求体的格式:

    username=zhangsan&password=123&hobby=zq&hobby=pq

    1)String getParamter(name)

    获得zhangsan:request.getParameter(“username”);

    2)String[] getParameterValues(name)

    获得爱好hobby:request.getParamterValues(“hobby”);

    3)Map<String,String[]>  getParameterMap()

    获取上述的请求体:

    username:{zhangsan}

    password:{12345}

    hobby:{zq,pq}

    4)getParameterNames():获得所有的请求参数的名称

    获取上述的请求体:

    [ username,password,hobby ]

     1         //1、获取username---????
     2         String username = request.getParameter("username");
     3         //get方式
     4         //编码---字节数组
     5         byte[] bytes = username.getBytes("iso8859-1");
     6         //解码---utf-8
     7         username = new String(bytes, "UTF-8");
     8         
     9         
    10         System.out.println(username);
    11         //2、password
    12         String password = request.getParameter("password");
    13         System.out.println(password);
    14         //3、获取hobby
    15         String[] hobby = request.getParameterValues("hobby");
    16         System.out.println(hobby.length);
    17         //4、获取所有的参数的map形式
    18         Map<String,String[]> parameterMap = request.getParameterMap();
    19         System.out.println(parameterMap);

    问题:页面在提交中文时 到服务器端获取后乱码

    原因:request对象默认的编码是iso-8859-1

    解决方案:将request的编码设置成UTF-8(只适合post提交)

    request.setCharacterEncoding(“UTF-8”);

    注意:get怎样解决中文乱码

    客户端的编码是(编码)UTF-8---->服务器端request编码是(解码)iso8859-1--->????????--->用iso8859-1编码---->UTF-8进行解码

    4.Request是一个域对象和请求转发

    转发的语法:

    request.getRequestDispatcher(“要转发的地址”).forward(request,response);

    1 request.getRequestDispatcher("/request2").forward(request, response);

    request域可见范围:在一次请求链中

    5.请求包含

    语法:

    request.getRequestDispatcher(“要包含的资源的地址”).include(request,response);

  • 相关阅读:
    一款开源免费跨浏览器的视频播放器--videojs使用介绍(转)
    forward内部跳转 和redirect重定向跳转的区别
    心理学--斯纳金
    心理学--大脑
    心理学--普及
    经济--国债,外汇
    经济--公积金
    经济--技术分析
    经济--分级基金3
    经济--分级基金
  • 原文地址:https://www.cnblogs.com/minihouseCoder/p/5624363.html
Copyright © 2011-2022 走看看