request&response

只愿长相守 提交于 2020-04-11 18:45:31

基本概念:

        在调用service之前,服务器(tomcat)会将用户的请求封装到request对象里面,同时也会创建一个response对象,通过service方法传递到我们的Servlet中。我们做一定的处理,将处理的结果,封装到response中,再将response对象返回给服务器,服务器响应到客户端。

response:

1.设置响应体

(1) 向客户端响应文本

PrintWriter response.getWriter();

writer.write("文本") ---  向response的缓冲区中去写

注:向客户端回写中文数据时 乱码 

乱码的原因:response缓冲区的编码方式是iso8859-1(西欧编码方式)

解决方式:response.setContentType("text/html;charset=UTF-8");

上面的代码完成两个设置:(1) 设置response缓冲区的编码---response.setCharacterEncoding("UTF-8");

                                          (2) 设置浏览器的解码方式----response.setHeader("Content-Type", "text/html;charset=UTF-8")

(2) 向客户端响应字节

ServletOutputStream out = response.getOutputStream();

2.response的一些细节:

(1) response.getOutputStream()获得的流不用手动关闭 --- web容器帮我们关闭

(2) 重定向:302+Location

response有一个重定向的方法:sendRedirect(url)

(3) response有两个获取流的方法 getWriter和getOutputStream 不能一起使用

(4) response缓存区有大小 默认是8k  通过setBufferSize设置大小  只能向大设置

(5) resposse缓冲区的内容被真正的刷出 不能再进行转发和重定向

    什么情况下 缓冲区的内容被刷出?

                response.flushBuffer();

                缓冲区的内容写满了

                转发或重定向也会刷出缓冲区的内容

(6) 当进行转发或重定向时 之前写到response缓冲区的内容会被清空  但是写入的头仍然有效

servlet01.java

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class servlet01 extends HttpServlet {

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doPost(request, response);
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		// 设置响应头
		response.setHeader("vw", "v6");
		// 追加响应头
		response.addHeader("mu", "77");
		// 字符流响应正文,浏览器显示信息
		/*
		 * PrintWriter writer = response.getWriter(); writer.print("thanks");
		 */
		// 字节流响应正文(字节流和字符流不能同时使用)
		
		  ServletOutputStream outputStream = response.getOutputStream();
		  outputStream.write("hello".getBytes());
		 
	}
}

request:

get提交方式有哪些?

直接输入网址 、超链接<a href=""> 、<from method="get"> 、重定向  、定时跳转 、  js的location.href

post提交方式哪些?

<form method="post">

URI与URL?

URI:全球资源标识符   可以是绝对的,也可以是相对的。相对的都是uri  /day10_205/request1    C:\\

URL: 全球资源定位符  URL是一种具体的URI  http://   

1、获取请求行的数据

获得请求方式:getMethod();

获得访问资源:getRequestURI/getRequestURL

获取访问的资源后面参数的字符串:getRequestQuery()

获取客户机的ip:getRemoteAddr()

获取web应用的名称:getContextPath()

2、获取请求头的信息

getHeader(头的名称)根据指定头名称获取值

getHeaderNames()获取所有的请求头的名字

getHeaders()获取指定的头的所有值

getIntHeader()

getDateHeader()

Referer:该资源的访问来源  ----- 防盗链

3、获取请求体的数据

(1) request.getParameter(name的属性值);

(2)request.getParameterNames();  可以得到所有的要提交标签的name的属性值。

(3)request.getParameterValues("hobby"); 多个属性值 。例如checkbox 。

注:

request乱码问题

原因:

 我们提交信息  =====》浏览器会按照utf-8的形式给我们传递的信息 进行编码======

 服务器按照iso-8859-1的的形式给我们解码。

解决: 

  乱码中文 ==== 》按照iso-8859-1编码===》 按照utf-8的格式进行解码===》我们提交信息 

post请求的乱码解决方案

   request.setCharacterEncoding("utf-8");

get,post请求通用解决方式

String str1 = new String (name.getBytes("iso-8859-1"),"utf-8");

4. request对象是一个域对象

可见范围:一次请求链中

setAttribute(String name,Object value)

getAttrbute(String name)

removeAttrbute(String name)

5. 请求转发

request.getRequestDispatcher().forward(request,response);

转发和重定向的区别?

    (1) 转发地址不变 客户端一次请求  重定向地址变化 两次请求

    (2) 转发是web应用内部的行为 重定向是客户端重新访问的

    (3) 转发的性能高一些

6.请求包含:

request.getRequestDispatcher().include(request,response);

RequestServlet01.java

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

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class RequestServlet01 extends HttpServlet {

	
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doPost(request, response);
	}

	
	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		//解决request请求乱码问题(post提交数据)
		request.setCharacterEncoding("utf-8");
		/*乱码原因:
		 * 我们提交信息  =====》浏览器会按照utf-8的形式给我们传递的信息 进行编码======》
 			服务器按照iso-8859-1的的形式给我们解码。
		 * get请求方式解决乱码方法
			String str1 = new String (name.getBytes("iso-8859-1"),"utf-8");
		 */
		//得到用户的请求方式
		String method = request.getMethod();
		//得到协议
		String protocol = request.getProtocol();
		//得到资源路径
		 String requestURI = request.getRequestURI();
		System.out.println(method+"--"+protocol+"--"+requestURI);
		System.out.println("------------------------------------------------------");
		/*
		 * POST--HTTP/1.1--/Response_Request_test/RequestServlet01
		 */
		//协议的请求资源路径
		StringBuffer requestURL = request.getRequestURL();
		//得到用户的地址
		String remoteAddr = request.getRemoteAddr();
		//得到资源名或者项目名
		String contextPath = request.getContextPath();
		System.out.println(requestURL+"--"+remoteAddr+"--"+contextPath);
		/*
		 * http://localhost:8080/Response_Request_test/RequestServlet01
		 * --0:0:0:0:0:0:0:1
		 * --/Response_Request_test
		 */
		System.out.println("--------------------------------------");
		//根据请求头中相应的name获得相应的请求值
		String header = request.getHeader("Host");
		System.out.println(header);
		/*
		 * localhost:8080
		 */
		//得到所有请求头的name值
		Enumeration headerNames = request.getHeaderNames();
		while(headerNames.hasMoreElements()){
			String nextElement = (String)headerNames.nextElement();
			System.out.println(nextElement);
		}
		/*	 
		accept
		referer
		accept-language
		user-agent
		content-type
		accept-encoding
		host
		content-length
		connection
		cache-control
		 */
		//根据用户表单的name获得相应的值
		String username = request.getParameter("username");
		System.out.println("username:"+username);
		/*username:123*/
		//得到我们提交表单的标签name的属性值
		Enumeration<String> names = request.getParameterNames();
		while(names.hasMoreElements()){
			String key = names.nextElement();
			System.out.println(key);
		}
		/*
		username
		userpass
		 */
		//将用户的请求的信息放到map里面
		Map<String,String[]> map = request.getParameterMap();
		String usrname = map.get("username")[0];
		System.out.println(usrname);
		/* 123*/
		//得到一个属性值对应多个的值(checkbox)
		String[] values = request.getParameterValues("hobby");
		for(String value:values){
			System.out.println(value);
		}
		/*
		
		soccer
		basketball
		table tennis
		 */
	}

}


易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!