JavaWeb (七) Servlet : HTTP协议、HttpSerbletRequest、HttpServletResponse、转发、重定向

个人博客网:   https://wushaopei.github.io/     (你想要这里多有)

1、Http协议

1.1 什么是HTTP协议
        什么是协议?
            双方相互约定好,都需要遵守的规则。叫协议。    
        
        http协议:客户端和服务器之间通知走的是http协议。
            那么这个协议指的是客户端发送数据给服务器和服务器回传数据给客户端,这个数据需要遵守的数据格式。

        http报文 ,所谓报文就是发送的数据。

1.2 请求的HTTP协议格式

  • GET请求
         (1)请求行    
                 1.1请求的方式GET
                 1.2请求的资源地址?参数
                 1.3请求的协议和版本号      HTTP/1.1
         (2)请求头

  • POST请求
           (1)请求行
                   1.1请求的方式POST
                   1.2请求的资源地址
                   1.3请求的协议和版本号    HTTP/1.1
           (2)请求头
                    空行
           (3)请求体

在谷歌浏览器下如何查看HTTP协议

火狐浏览器如何查看HTTP协议内容:

 

GET请求HTTP协议分为两部分:	
请求行
        1 请求的方式GET
        2 请求的资源?参数
        3 请求的协议和版本号  HTTP/1.1
请求头

POST请求的HTTP协议分为三部分:
     请求行
        1 请求的方式POST
        2 请求的资源
        3 请求的协议和版本号	HTTP/1.1
     请求头
            空行
     请求体


  常用请求头的说明
	Accept:		        告诉服务器客户端可以接收的数据类型
	Accept-Language:	告诉服务器客户端希望接收的语言
	Host:			告诉服务器。客户端请求的服务器IP和端口号
	User-Agent:		告诉服务器浏览器的信息

  哪些是GET请求,哪些是POST请求
	GET请求有哪些
            1.在浏览器地址栏中输入地址,敲回车。是GET请求
            2.a标签,都是get请求
            3.form标签 method=get也是get请求
            4.link标签用来引入css样式,是get请求
            5.script标签用来引入js文件,也是get请求
            6.img标签引入图片是get请求
            7.iframe标签用来引入单独的html,也是Get请求

	POST请求
	    form标签	method=post是POST请求		

  响应的HTTP协议格式
	响应行	
		响应的协议和版本号	HTTP/1.1
		响应状态码
		响应状态描述符
	响应头
		空行
	响应体

常用的响应码说明
		200				请求响应成功		
		404				请求的资源不存在
		302				请求重定向
		500				请求已经被服务器接收到,但是服务器内部错误

    
MIME类型说明

 MIME是HTTP协议中数据类型。
 MIME的英文全称是"Multipurpose Internet Mail Extensions" 多功能Internet 邮件扩充服务。MIME类型的格式是“大类型/小类型”,并与某一种文件的扩展名相对应。

    text/html		.html	.htm
    text是大类型
    html是小类型

    MIME	    就是数据类型字符串描述符

常见的MIME类型:

         

我们的Tomcat支持哪些类型,可以到web.xml中去查看


谷歌浏览器查看HTTP响应

火狐浏览器查看HTTP响应

2、HttpServletRequest类

2.1 HttpServletRequest类有什么作用。
    它表示请求的信息,每次请求进来。Tomcat服务器就会创建一个HttpServletRequest对象。然后把请求的数据封装到request对象中
    我们可以从request对象中获取到所有请求有关的信息。

2.2 HttpServletRequest类的常用方法

常用API

public class RequestAPI extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void doGet(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
//		i.getRequestURI()				获取请求资源地址
		System.out.println("请求的资源地址:" + request.getRequestURI());
//		ii.getRequestURL()				获取请求的统一资源定位符(绝对路径)
		System.out.println( "请求的统一资源定位符:" + request.getRequestURL() );
//		iii.getRemoteHost()			获取客户端的IP
		System.out.println( "客户端的IP:" + request.getRemoteHost() );
//		iv.getHeader()					获取请求头信息
		System.out.println( "请求头:" + request.getHeader("Accept-Language") );
		System.out.println( "请求头:" + request.getHeader("User-Agent") );
//		vii.getMethod()				获取请求的方式	GET或POST
		System.out.println( "请求的方式:" + request.getMethod() );
	}

}

2.3 如何获取请求参数

    protected void doGet(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		// getParameter获取请求的参数,这个方法的参数是请求的参数名
		String username = request.getParameter("username");
		String password = request.getParameter("password");
		String[] hobbies = request.getParameterValues("hobby");
		System.out.println("用户名:" + username);
		System.out.println("密码:" + password);
		if (hobbies != null) {
			Arrays.asList(hobbies).forEach(System.out::println);
		}
    }

2.4 GET请求的中文乱码解决

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

                // 先使用iso-8859-1进行编码
		byte[] buffer = username.getBytes("iso-8859-1");
		// 再使用UTF-8字符集进行解码
		username = new String(buffer, "UTF-8");

GET请求中文乱码解决方案二:
    找到Tomcat的server.xml配置文件。找到Connector标签,添加URIEncoding属性

2.5 POST请求的中文乱码解决
    POST请求解决中乱码方案一:

        // 先使用iso-8859-1进行编码
		byte[] buffer = username.getBytes("iso-8859-1");
		// 再使用UTF-8字符集进行解码
	username = new String(buffer, "UTF-8");

POST请求解决中文乱码方案二:

        // 解决post中文乱码(通过设置请求体的字符集)
		// 必须在getParameter方法之前调用才有效
	request.setCharacterEncoding("UTF-8");

中文乱码解决,需要注意的点:

        1、request.setCharacterEncoding("UTF-8");
            不能解决GET请求的中文乱码

        2、Tomcat8之后,GET请求默认是没有中文乱码的

2.6 请求的转发(需要结合jsp一起)

2.7 Base标签的作用

         

        

2.8 Web中的相对路径和绝对路径

          

2.9 web中/斜杠的不同意义

3、 HttpServletResponse类

3.1 概述

a) HttpServletResponse类的作用
    所响应的信息,都可以通过httpServletResponse类进行设置。

b ) 两个输出流说明。
     字节流            response.getOutputStream();            主要实现下载
     字符流            response.getWriter()                           主要输出字符串

    一个response对象,只能在一个时间内使用字节流,或字符流,两个流不能同时使用。

c ) 如何往客户端回传数据
        往客户端输出字符串

    public class ResponseIO extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void doGet(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		PrintWriter writer = response.getWriter();
		
		writer.write("this is the response's content!");		
	}
}

3.2 响应的乱码解决
        解决响应中文乱码的第一种方案:

        protected void doGet(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
//		System.out.println( response.getCharacterEncoding() );
		// 设置服务器响应字符集为UTF-8
		response.setCharacterEncoding("UTF-8");
		
		// 通过设置响应头,告诉客户端使用UTF-8查看
		response.setHeader("Content-Type", "text/html; charset=UTF-8");
		
		PrintWriter writer = response.getWriter();
		
		writer.write("这是响应返回的内容!");
		
}

解决响应中文乱码的第二种方案:

                // 解决响应中文乱码。
		// 必须要获取流之前调用
		//设置服务器使用UTF-8.并设置响应头"Content-Type:text/html; charset=UTF-8"
	response.setContentType("text/html;charset=UTF-8");

3.3 如何设置响应头和响应状态码

请求重定向第一种实现方案:

    protected void doGet(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		System.out.println("曾到此一游Response1");
		
		request.setAttribute("abc", "abcValue");
		
		// 需要设置响应状态码和响应头
		response.setStatus(302); // 设置响应状态码为302
		// 设置响应头
//		response.setHeader("Location", "http://localhost:8080/day07/response2");
		response.setHeader("Location", "http://www.baidu.com");
    }

a)  请求重定向

        // 请求重定向(推荐使用)
	response.sendRedirect("http://localhost:8080/day07/response2");

4、请求转发和重定向

 

如果两种都可以实现。优先使用转发
如果转发问题,再考虑使用重定向

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章