request请求对象、response响应对象

HttpServletResponse对像

 在Servlet API中,定义一个HttpServletResponse接口,他继承ServletResponse接口,专门用
 封装HTTP响应消息。HTTP响应消息分为状态行、响应消息头、消息体三部分。

1.1发送状态码相关的方法
(1)setStatus(int status)方法
用于设置HTTP响应消息的状态码,并生成响应状态行。需要注意的是,正常情况下,Web服务器会默认产生一个状态码为200的状态行。
(2)sendError(int sc)方法
该方法用于发送表示错误信息的状态码。

public void sendError (int code) throws java.io.IOException
public void sendError (int code,String message) throws java.io.IOException

1.2发送响应消息体相关的方法
(1)getOutputStream()方法
该方法所获取的字节输出流对象为ServletOutputStream类型。
(2)getWriter()方法
该方法所获取的字符流对象为PrintWriter类型。

public class PrintServlet extends HttpServlet{
  private static final long serialVersionUID=1L;
  protected void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException{
	  response.setContentType("text/html;charset=utf-8");
	  System.out.println("test01收到前端的请求");
   ServletOutputStream out=response.getOutputStream();
   String value="大数据2003";
   out.write(value.getBytes());
  }}

浏览器显示出了reponse对象响应的数据。
但是 在映射后可能会出现乱码的情况所以要在编码中加一句:

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

或者设置HttpServletResponse使用utf-8。

response.setCharacterEncoding("utf-8");

在这里插入图片描述
在这里插入图片描述

@WebServlet("/chinese")
public class PrintServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html;charset=UTF-8");
        String data="中国.大数据产业";
        System.out.println("chinese 收到前端请求,回复大数据");
        PrintWriter pw=response.getWriter();
	    pw.print(data);
	}
	/**
	 * @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);
	}
}

在这里插入图片描述

在这里插入图片描述

2.1实现网页定时刷新并跳转
在HTTP协议中,定义了一个Redfresh头字段,它可以通知浏览器在指定的时间内自动刷新并跳转到其他页面。

@WebServlet("/refersh")
public class RefreshServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
    static int num=0;
	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		//response.getWriter().append("Served at: ").append(request.getContextPath());
	     System.out.println("收到请求"+num);
	     response.setHeader("Refresh","5");
	     response.getWriter().print(new Date());
	     num++;
	
	}

	/**
	 * @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);
	}

}

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

@WebServlet("/login")
public class LoginServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
   
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		//response.getWriter().append("Served at: ").append(request.getContextPath());
          System.out.println("前段请求login,而不是loginDASHUJU.html");	
	
	}

	/**
	 * @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);
	}

}

在这里插入图片描述
HttpServletRequest请求对象
HttpServletRequest它是一个接口,它的父接口ServletRequest,在开发中,常用的是带协议的请求对象。
请求消息:请求行,请求头,请求参数。
1.1 HttpServletRequest请求对象
1.获取请求行消息的相关方法:
常用的请求行方法:
>>> 1.获取请求提交的方式: getMethod();
>>> 2.获取请求的协议: getProtocol();
>>> 3.获取项目名称:getContextPath();
>>> 4.获取servlet路径:getServletPath();
>>> 5.获取请求路径: getRequsetURI(),getRequestURL();
uri对应的值:/项目名称/servlet路径
url对应的值:http://localhost:8080/uri

@WebServlet("/requesttead")
public class RequestHeadServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		//response.getWriter().append("Served at: ").append(request.getContextPath());
	    response.setContentType("text/html;charset=utf-8");
	    Enumeration<String> er=request.getHeaderNames();
	    
	    while(er.hasMoreElements()) {
	    	String name=er.nextElement();
	    	String value =request.getHeader(name);
	    	response.getWriter().print("消息头:"+name+""+"value");//送回网页前端
	    	System.out.print("消息头:"+name+""+value);//在服务器后端打印
	    }
	}

	/**
	 * @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);
	}

}

在这里插入图片描述
2.获取请求消息头相关的方法
>>> 1. 根据消息头,获取值: String value = getHeader(消息头的名称);
>>> 2. 获取所有的消息头: Enumeration er = getHeaderNames();
根据Referer请求消息头,做一个防盗链的案例:
难点:怎么判断这个发起的下载请求是从别的网站上发起的?
解决方法:根据Referer请求头对应的值,是否包含了服务器的名称
如果包含,就说明是从本网站下载的,否则就不是。
3.获取请求参数相关的方法:
>>> 1.根据name属性值,获取用户输入的值:String value = getParameter(name属性对应的值);
>>> 2.根据name属性值,获取用户选择的值:String[] vaules = getParameterValues(name属性对应的值);
>>> 3.没有参数,获取所有值:Map<String ,String[]> map = getParameterMap();
4.解决请求参数的中文乱码问题:
中文乱码处理分两种情况:
第一种情况:处理get方式提交的中文乱码
使用的String的构造方法解决中文乱码:new String(字节数组,编码格式);
代码:String newvalue = new String(value.getBytes(“ISO8859-1”),“utf-8”);
第二种情况:处理post请求的中文乱码问题:
post提交,会把参数首先提交到request对象的缓冲区中,缓冲区默认编码是ISO8859-1,不支持中文
处理方法:把request缓冲区的编码给设置成支持中文的码表格式。
代码:request.setCharacterEncoding(“utf-8”);
5.通过Requset对象传递数据
什么域对象:在一定的范围内,可以存值和取值。
request域对象:在一次请求中,可以存值和取值。
>>> 存值: setAttribute(String key,Object obj);
>>> 取值:Object obj = getAttribute(String key);
>>> 移除: removeAttribute(String key);

使用getParameter Values()方法,获取多个同名参数的值,返回一个String类型的数组,通过遍历数组,打印出每个“hobby”参数对应的值。

@WebServlet("/requestparam")
public class RequestParamServlet 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 {
		// TODO Auto-generated method stub
		//response.getWriter().append("Served at: ").append(request.getContextPath());
	     System.out.print("收到前端的请求");
	     String username=request.getParameter("username");
	     String ps=request.getParameter("password");
	     System.out.println("用户名:"+username);
	     System.out.println("密码:"+ps);
	     
	     String [] hobbys=request.getParameterValues("hobby");
	     System.out.println("hobby"+Arrays.toString(hobbys));
	
	
	}

	/**
	 * @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);
		request.setCharacterEncoding("utf-8");
		String username=request.getParameter("username");
		System.out.println(username);
				
	}

}

在这里插入图片描述

RequestDispatcher接口
在开发中访问到一个web资源后,需要服务器跳转到另一个资源去处理请求,可以通过sendRedirect重定向
方法来实现,也可以RequestDispatcher转发对象的forward方法来实现。
得到转发对象:RequestDispatcher forwardObj = request.getRequestDispatcher(“另一个资源的路径”);
常用方法:
>>> 1.实现请求转发:forwardObj.forward(request,response);
>>> 2.实现请求包含:forwardObj.include(request,response);
1. 请求转发:
特点:发送了一次请求,响应一次,和request域对象配合使用,可以实现值的传递。
转发路径:转发动作是在服务器内部实现的,所以转发路径不要携带项目名称。
请求重定向:
特点:发送了两次请求,响应了两次,不能和request域对象配合使用。
重定向路径:重定向动作在浏览器端执行的,所以路径需要携带项目名称。
2.请求包含:
请求包含:在服务器内部完成的,路径不需要携带项目名称。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值