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)跳到首页(一般使用重定向,注销功能)

.

原文地址:https://www.cnblogs.com/zhaoyunlong/p/13545659.html