05请求和响应

请求和响应的概述:

什么请求:在浏览器地址栏输入地址,点击回车请求服务器,这个过程就是一个请求过程。
什么响应:服务器根据浏览器发送的请求,返回数据到浏览器在网页上进行显示,这个过程就称之为响应。

HttpServletResponse对象

HttpServletResponse是一个接口,它的父接口是ServletResponse,在开发中通常使用HttpServletResponse
响应信息分为三部分:响应行、响应头、响应正文(响应体)

发送状态码的相关方法:

    1.设置状态码
	setStatus(int sc) :参数就是状态码。
	setStatus(int sc, String sm) :第一个参数表示状态码,第二个参数 就状态码的描述。
	常见的状态码:200 响应成功
		      302 重定向
		      404 请求资源找不到
		      500 服务器代码出异常。
	   
2.错误信息方法:
        sendError(int sc) :参数状态码
	sendError(int sc, String sm) :第一个参数表示状态码,第二个参数 就状态码的描述。
	比如:response.sendError(404, "chapter04项目的请求资源不存在");

发送响应消息头相关的方法:

    响应消息头的数据格式:key-value的形式,有的是一个key,一个value,有的是一个key,多个value

设置响应消息头:

	   * 一个key ,一个value
	   setHeader(String key,String value);
	   比如:setHeader("aa","AA");
	   如果:setHeader("aa","AA");
	         setHeader("aa","BB");
		 最终的结果:aa这个头对应的值就是BB
	   * 一个key,对应多个value
	   addHeader(String key,String value);
	   比如:addHeader("aa","AA");
	         addHeader("aa","BB");
		 最终的结果:aa这个头对应的值AA和BB

         比如:
		 //与响应消息头相关的方法
		// 在用户名和密码输入错误的情况下,重新回到登录页面让用户重新数据
		//1.设置状态码
		response.setStatus(302);
		//2.设置响应头,完成重定向到登录页面
		response.setHeader("Location","/chapter04/login.html");
         2.设置响应数据的长度:setContentLength(int src)方法
     3.设置处理乱码的方法:
         * setCharacterEncoding(String a);参数就是一个 码表格式,比如:"utf-8"
	 * setContentType(String a);参数代表响应数据的类型和码表格式,比如: "text/html;charset=utf-8"

发送响应体相关的方法:

第一个方法:

getOutputStream(),通过response向浏览器返回图片、视频等二进制数据的文件,当然也可以向浏览器、 返回文本数据。
比如:
ServletOutputStream out = response.getOutputStream();
String value=“itcast”;
out.write(value.getBytes());

第二个方法:

getWriter(),通常response向浏览器返回文本数据,不能向浏览器返回图片、视频等二进制文件。
比如:
//字符流向浏览器输出数据
PrintWriter pw = response.getWriter();
String value=“itcast—”;
//pw.print(value);
pw.write(value);

1.4 解决中文输出的乱码问题

第一种方式:

字节流向浏览器输出中文,会不会乱码:可能会出现乱码。
出现乱码的原因:服务器端的编码格式和浏览器的编码格式不一致引起的。
比如:
//1.处理字节流的中文乱码问题
String data=“中国”;
ServletOutputStream out = response.getOutputStream();
//2.处理乱码:服务器端的编码和浏览器端的编码保持一致。
//3.让浏览器端的编码也是utf-8
response.setHeader(“Content-Type”, “text/html;charset=utf-8”);
//4.让服务器端的中文编码格式是utf-8
out.write(data.getBytes(“utf-8”));

处理字节流的中文乱码问题两种方式:
		第一种:response.setHeader("Content-Type", "text/html;charset=utf-8");
		第二钟:response.setContentType("text/html;charset=utf-8");

第二种方式:

字符流向浏览器输出中文,会不会乱码:肯定乱码。
乱码的形式:?? ,这个问号就表示中文的编码格式是采用iso-8859-1编码的,这种编码格式不支持中文。
处理原则:让浏览器和服务器的编码保持一致:
//1.处理字符流的中文乱码问题
//2.处理服务器的编码,让这个编码支持中文
response.setCharacterEncoding(“utf-8”);
//3.处理器浏览器端的编码:
response.setHeader(“Content-Type”, “text/html;charset=utf-8”);
String data=“中国”;
//4.获取字符流
PrintWriter pw = response.getWriter();
pw.print(data);

处理字符流的中文乱码问题:

			第一种方式:response.setCharacterEncoding("utf-8");
					response.setHeader("Content-Type", "text/html;charset=utf-8");
			第二种方式:response.setContentType("text/html;charset=utf-8");

		结论:在处理字符流和字节流输出中文乱码时,都采用response.setContentType("text/html;charset=utf-8");
		注意:常见的编码格式:
			GB GB18030 GB2312 都是支持中文的编码格式,当然支持其它一些字符。
			UTF-8 :万能码表格式,支持所有的字符。
			ISO-8859-1:不支持中文。

实现网页的定时跳转并刷新:

    定时跳转:从一个注册页面跳转到登录页面,输入之前注册的用户名和密码。
		代码如下:
		// 1.定时跳转:需要用到Refresh响应头
		response.setHeader("Refresh", "5;URL=/chapter04/login.html");
    定时刷新: 在当前页面的地址不发生变化,但是当前页面自己定时刷新,页面数据会发生变化。
		代码如下:
             response.setHeader("Refresh","5");
			 response.getWriter().print(new Date());

实现请求重定向

    实现重定向相关的方法:
    >>> 第一种方式:302和Location配合使用,实现重定向。
	 response.setStatus(302);
         response.setHeader("Location","/chapter04/login.html");
    >>> 第二种方式:sendRedirect("/chapter04/login.html");
    重定向通过登录案例来完成:
    需求分析:在登录页面输入用户名和密码,在LoginServlet里面,判断用户名和密码是否正确。
	      如果输入错误,会重新定向到登录界面,如果正确,跳转到欢迎页面。
     获取登录页面提交的用户名和密码:request.getParameter()方法。
     重定向的特点:1.浏览器地址栏发生变化
		   2.发送了两次请求。都是由浏览器发送的请求
     重定向的路径:由于是浏览器发送得到请求,所以路径必须要带项目名称,比如:/chapter04/welcome.html;

HttpServletRequest请求对象

HttpServletRequest它是一个接口,它的父接口ServletRequest,在开发中,常用的是带协议的请求对象。
请求消息:请求行,请求头,请求参数。

HttpServletRequest请求对象

	1.获取请求行消息的相关方法:
	  常用的请求行方法:
	  >>> 1.获取请求提交的方式: getMethod();
	  >>> 2.获取请求的协议: getProtocol();
	  >>> 3.获取项目名称:getContextPath();
	  >>> 4.获取servlet路径:getServletPath();
	  >>> 5.获取请求路径: getRequsetURI(),getRequestURL();
	       uri对应的值:/项目名称/servlet路径
	       url对应的值:http://localhost:8080/uri

获取请求消息头相关的方法

	  >>> 1. 根据消息头,获取值: String value = getHeader(消息头的名称);
	  >>> 2. 获取所有的消息头: Enumeration er = getHeaderNames();
	  根据Referer请求消息头,做一个防盗链的案例:
	    难点:怎么判断这个发起的下载请求是从别的网站上发起的?
	    解决方法:根据Referer请求头对应的值,是否包含了服务器的名称
		       如果包含,就说明是从本网站下载的,否则就不是。

获取请求参数相关的方法:

	 >>> 1.根据name属性值,获取用户输入的值:String value = getParameter(name属性对应的值);
	 >>> 2.根据name属性值,获取用户选择的值:String[] vaules = getParameterValues(name属性对应的值);
	 >>> 3.没有参数,获取所有值:Map<String ,String[]> map = getParameterMap();

解决请求参数的中文乱码问题:

	  中文乱码处理分两种情况:
	  第一种情况:处理get方式提交的中文乱码
		      使用的String的构造方法解决中文乱码:new String(字节数组,编码格式);
		      代码:String newvalue = new String(value.getBytes("ISO8859-1"),"utf-8");
	  第二种情况:处理post请求的中文乱码问题:
		       post提交,会把参数首先提交到request对象的缓冲区中,缓冲区默认编码是ISO8859-1,不支持中文
		       处理方法:把request缓冲区的编码给设置成支持中文的码表格式。
		       代码:request.setCharacterEncoding("utf-8");

通过Requset对象传递数据

	  什么域对象:在一定的范围内,可以存值和取值。
	  request域对象:在一次请求中,可以存值和取值。
	   >>> 存值: setAttribute(String key,Object obj);
	   >>> 取值:Object obj = getAttribute(String key);
	   >>> 移除: removeAttribute(String key);

RequestDispatcher接口

	在开发中访问到一个web资源后,需要服务器跳转到另一个资源去处理请求,可以通过sendRedirect重定向
	方法来实现,也可以RequestDispatcher转发对象的forward方法来实现。
	得到转发对象:RequestDispatcher forwardObj = request.getRequestDispatcher("另一个资源的路径");
	常用方法:
		>>> 1.实现请求转发:forwardObj.forward(request,response);
		>>> 2.实现请求包含:forwardObj.include(request,response);

请求转发:

		    特点:发送了一次请求,响应一次,和request域对象配合使用,可以实现值的传递。
		    转发路径:转发动作是在服务器内部实现的,所以转发路径不要携带项目名称。
	   请求重定向:
		     特点:发送了两次请求,响应了两次,不能和request域对象配合使用。
		     重定向路径:重定向动作在浏览器端执行的,所以路径需要携带项目名称。
	2.请求包含:
	  请求包含:在服务器内部完成的,路径不需要携带项目名称。
项目代码
package cn.itcast.Servlet;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class HttpServlet
 */
@WebServlet("/HttpServlet")
public class HttpServlet extends javax.servlet.http.HttpServlet {
    
    
	private static final long serialVersionUID = 1L;
       
	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
		System.out.println("收到前端的get请求");
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
		// System.out.println("收到前端的poss请求");
		doGet(request, response);
	}

}

package cn.itcast.Servlet;

import java.io.IOException;
import java.util.Enumeration;

import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class Servlet02
 */
@WebServlet("/Servlet02")
public class Servlet02 extends HttpServlet {
    
    
	private static final long serialVersionUID = 1L;
       

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
		ServletConfig config=this.getServletConfig();
		String name=config.getServletName();
		System.out.println("servlet name :" +name);
		
		/*
		 * String value=config.getInitParameter("encoding");
		 * System.out.print("encoding:"+value)
		 * 
		 * String value1=config.getInitParameter("username");
		 * System.out.print("username:"+value1);
		 */
		
		Enumeration<String> er=config.getInitParameterNames();
		while (er.hasMoreElements()) {
    
    
			String name1=er.nextElement();
			String value2=config.getInitParameter(name1);
			
			System.out.println("全局初始化参数名称: "+name1);
			System.out.println("全局初始化参数值: "+value2);
			
		}
		
		System.out.println("前面是servlet自己的配置----------后面是全局配置");
		
ServletContext context=this.getServletContext();
		

		Enumeration<String> er1=context.getInitParameterNames();
		while (er.hasMoreElements()) {
    
    
			String name1=er.nextElement();
			String value2=context.getInitParameter(name1);
			
			System.out.println("全局初始化参数名称: "+name1);
			System.out.println("全局初始化参数值: "+value2);
			
		}
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}
package cn.itcast.Servlet;

import java.io.IOException;
import java.util.Enumeration;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class Servlet03
 */
@WebServlet("/Servlet03")
public class Servlet03 extends HttpServlet {
    
    
	private static final long serialVersionUID = 1L;

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
        ServletContext context=this.getServletContext();
		

		Enumeration<String> er=context.getInitParameterNames();
		while (er.hasMoreElements()) {
    
    
			String name1=er.nextElement();
			String value2=context.getInitParameter(name1);
			
			System.out.println("全局初始化参数名称"+name1);
			System.out.println("全局初始化参数值"+value2);
			
		}
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}
大数据2005 周敏 2020080605048

猜你喜欢

转载自blog.csdn.net/qq_54262540/article/details/121358300