• Http与HttpServelRequest,HttpServletResponse


     什么是HTTP协议

    什么是协议?
    协议是双方或多方相互之间约定好,大家都需要遵守的规则。叫协议。
    
    什么是HTTP协议?
    HTTP协议是客户端和服务器之间通信时数据都需要遵守的规则。
    
    HTTP协议,也包含是通信的数据内容。
    客户端和服务器之间数据通信的内容,也叫报文。

    请求的HTTP协议格式

    i.GET请求
    1、请求行            
    (1)请求的方式        ====>>>>    GET
    (2)请求的资源地址  ====>>>>    请求的资源地址(+?+请求参数)
    (3)请求的协议和版本号    ===>>>>  HTTP/1.1
    2、请求头
    (1)key : value            不同的key有不同的作用

    POST请求

    1、请求行
    1、请求的方式        ====>>>>    POST
    2、请求的资源地址  ====>>>>    请求的资源地址
    3、请求的协议和版本号    ===>>>>  HTTP/1.1
    2、请求头
    1、key : value            不同的key有不同的作用
    请求头和请求体之间有一个空行
    3、请求体

     常用请求头的说明

    Accept:                    客户端可以接收的数据类型
    Accept-Language:            客户端可以接收的语言
    Host:                    请求的服务器IP和端口号
    User-Agent:                浏览器的信息
    Content-Length:            请求体的长度
    Accept-Encoding:            服务器返回的数据,支持的压缩格式(或编码格式)

    哪些是GET请求,哪些是POST请求

    GET请求:
    1、在浏览器地址栏中输入请求地址,然后敲回车
    2、a标签
    3、script标签引入js文件
    4、link标签引入css文件
    5、img标签引入图片
    6、iframe标签引入页面
    7、form标签 method=GET        
    
    POST请求:
    form标签 method=POST

    响应的HTTP协议格式

    1、响应行
    (1)响应的协议和版本号            HTTP/1.1
    (2)响应状态码                    200
    (3)响应状态描述符                OK
    2、响应头
    (1)空行
    3、响应体

    a) 常用的响应码说明

    200                表示请求成功
    302                表示请求重定向
    404                表示服务器已经收到你的请求,但是你请求的资源不存在
    500                表示服务器已经收到你的请求,但是服务器内部错误(代码)

    1.HttpServletRequest

    HttpServletRequest类有什么作用

    HttpServletRequest类它表示所有请求过来的信息。每次只要有请求进来。Tomcat服务器都会把请求里的内容封装到HttpServletReqeust对象中,然后传递给Servlet程序去使用。
    HttpServletRequest对象实例,由Tomcat服务器在每次请求进来的时候负责创建。

    a) HttpServletRequest类的常用方法

    request.getRequestURI()                            获取请求的URI地址        请求的资源地址
    request.getRequestURL()                            获取请求的统一资源定位符        请求的绝对路径
    request.getRemoteHost() 获取客户端的ip request.getHeader() 获取请求头 request.getParameter() 获取请求的参数值 request.getParameterValues() 获取请求的参数值
    ==多个值 request.getMethod() 获取请求的方式 request.setAttribute(key, value); 保存域数据 request.getAttribute(key); 获取域数据 request.getRequestDispatcher() 获取请求转发对象 ========================后面的内容================================= request.getCookies() 获取Cookie信息 request.getSession() 获取会话信息

    常用API介绍:

    public class RequestAPI extends HttpServlet {
        private static final long serialVersionUID = 1L;
    
        protected void doGet(HttpServletRequest request,
                HttpServletResponse response) throws ServletException, IOException {
    //        i.getRequestURI()                            获取请求的URI地址        请求的资源地址
            System.out.println( "请求的资源地址:" + request.getRequestURI() );
    //        ii.getRequestURL()                            获取请求的统一资源定位符        请求的绝对路径
            System.out.println("请求的资源绝对路径:" + request.getRequestURL());
    //        iii.getRemoteHost()                        获取客户端的ip
            /**
             * 如果请求地址是localhost ====客户端是>>>0:0:0:0:0:0:0:1<br/> 
             * 如果请求地址是127.0.0.1 ====客户端是>>>127.0.0.1<br/> 
             * 如果请求地址是:你真正的ip(或域名)   ====客户端是>>>真实的客户端ip地址<br/> 
             */
            System.out.println( "客户端的ip地址:" + request.getRemoteHost() );
            
    //        iv.getHeader()                                获取请求头
            System.out.println( "浏览器信息:" + request.getHeader("User-Agent") );
            System.out.println( "Host:" + request.getHeader("Host") );
    //        getMethod()                            获取请求的方式        
            System.out.println( "请求的方式:" + request.getMethod() );
        }
    }

    如何获取请求参数

    表单:

    <form action="http://localhost:8080/day07/getParameterServlet" method="get">
                用户名:<input type="text" name="username"/><br/>
                密码:<input type="password" name="password"/><br/>
                兴趣爱好:
                    <input type="checkbox" name="hobby" value="cpp" />C++
                    <input type="checkbox" name="hobby" value="java" />java
                    <input type="checkbox" name="hobby" value="js" />javaScript
                    <br/>
                <input type="submit" />
        </form>

    服务器代码

    protected void doGet(HttpServletRequest request,
                HttpServletResponse response) throws ServletException, IOException {
            // 用户名
            String username = request.getParameter("username");
            // 密码
            String password = request.getParameter("password");
            String[] hobby = request.getParameterValues("hobby");
            
            System.out.println("用户名:" + username);
            System.out.println("密码:" + password);
            System.out.println("兴趣爱好:" + Arrays.asList(hobby));
    }

    a) GET请求的中文乱码解决

    解决GET请求中文乱码第一种方案:

     * 1、先以字符集iso-8859-1进行编码<br/>

     * 2、以字符集UTF-8进行解码操作<br/>

    // 用户名
            String username = request.getParameter("username");
            /**
             * 1、先以字符集iso-8859-1进行编码<br/>
             * 2、以字符集UTF-8进行解码操作<br/>
             */
            username = new String (username.getBytes("iso-8859-1"),"UTF-8" );
        System.out.println( username );

    解决GET请求中文乱码第二种方案:

    找到你Eclipse中的Tomcat的配置文件server.xml,找到Connector标签,添加URIEncoding=”UTF-8” 属性

    <Connector URIEncoding="UTF-8" connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/>

    a) POST请求的中文乱码解决

    POST请求中文乱码解决方案一(不推荐使用):

     * 1、先以字符集iso-8859-1进行编码<br/>

     * 2、以字符集UTF-8进行解码操作<br/>

    POST请求中文乱码解决方案二(推荐使用):

    // 设置请求体的字符集,解决post请求中文知码
            // setCharacterEncoding方法一定要在getParameter之前调用才能生效
            request.setCharacterEncoding("UTF-8");

    a) 请求的转发(在jsp之后显示如何具体使用)

    请求的转发,是指,从一个动态资源,跳转到另一个资源的行为。叫转发。

    a) base标签的作用

    a) Web中的相对路径和绝对路径

    回顾JavaSE的路径:
        相对路径:    从工程名开始算
    
        绝对路径:    盘符:文件名
    
    JavaSE的路径,不能在html页面中使用。
    
    
    Web的路径是:
        相对路径:    
            .                当前目录
            ..                上一级目录
            资源名            ./资源名            ./可以省略
    
        绝对路径:
            http://ip:port/工程名/资源名
    
    
    1、在实际开发中,不允许简单的使用相对路径进行开发
    2、在实际开发中,都必须使用绝对路径。
        http://ip:port/工程名/资源名
        base标签+相对路径    
        斜杠打头的地址

    web/斜杠的不同意义

    在web中 /斜杠 就是绝对路径。
    
        /斜杠 被html浏览器解析的时候,地址是:http://ip:port/
    
        /斜杠  如果在服务器代码中被解析。则得到的地址是:http://ip:port/工程名/
            比如说:
            web.xml 配置文件: <url-pattern>/errorServlet</url-pattern>
            servletContext.getRealPath(“/”);    也表示到http://ip:port/工程名/        映射到代码的WebContent目录
            request.getRequestDisapcher(“/servlet2”);   也表示到http://ip:port/工程名/        映射到代码的WebContent目录
    
        
        注意:
            特殊情况是:
            response.sendRedirect(“/”);        表示:http://ip:port/

    1.HttpServletResponse

    a) HttpServletResponse类的作用

    HttpServletResponse类表示所有响应的信息。通过这个类,我们可以设置返回给客户端的信息。

    两个输出流的说明

    字符流            response.getWriter();                    常用
    字节流            response.getOutputStream();                少用(下载)
    
    
    这两个流,只能同时使用一个。使用了字节流,就不能使用字符流。反之亦然。
    
    
    两个流,同时只能使用一个。

    a) 如何往客户端回传数据

    要求往客户端回传字符串。hello

    // 先获取字符流
            PrintWriter writer = response.getWriter();
            // print方法往客户端输出数据
            writer.print("hello");

    响应的乱码解决

    // 同时设置客户端和服务器都统一使用UTF-8字符集,还设置了响应头
            // 此方法一定要在获取流之前调用 才有效
            response.setContentType("text/html; charset=UTF-8");

    a) 如何设置响应头和响应状态码

    请求重定向,是指从一次请求结果,获取信息,再请求到另一个资源。这种行为叫请求重定向

    // 设置响应状态码
            response.setStatus(302);
            // 设置响应头
            response.setHeader("Location", "http://localhost:8080/day07/response2");

    a) 请求重定向

    // 设置请求重定向
        response.sendRedirect("http://www.baidu.com");

    1.请求转发和重定向的对比

    转发

    重定向

    浏览器地址栏

    没有变化

    有变化

    几次请求

    1次请求

    2次请求

    API

    request

    response

    WEB-INF

    可以访问WEB-INF下的资源

    不能访问WEB-INF下的资源

    共享request请求域数据

    可以

    不可以

    目标资源

    只能访问当前工程以内的资源

    可以访问工程外的资源

    1、看需求
    (1)我要访问WEB-INF里面的内容        === 请求转发
    (2)我要访问http://www.baidu.com        === 请求重定向
    
    2、在请求转发和请求重定向都可以跳转的情况下
    (1)优先使用请求转发            (因为快   ,    SpringMVC底层默认也是使用请求转发)
    (2)请求转发出bug,再排查,不行,再使用重定向。
    (3)跳到首页(一般使用重定向,注销功能)

    .

  • 相关阅读:
    Fiddler 简介
    jQuery 属性操作
    Win7的虚拟Wi-Fi
    接口与内部类
    继承(二)
    J2EE框架(Struts&Hibernate&Spring)的理解
    继承(一)
    对象与类
    控制流程
    数据类型
  • 原文地址:https://www.cnblogs.com/zhaoyunlong/p/13545659.html
Copyright © 2020-2023  润新知