JavaWeb笔记005 request和response的常用方法

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lizhengwei1989/article/details/88411694

request:请求

操作请求行

格式:
	请求方式 请求资源 协议/版本
常用方法:HttpServletRequest
	掌握
		String getMethod():获取请求方式
		String getRemoteAddr():获取ip地址
		String getContextPath() :在java中获取项目名称  (例如/demo1)

	
	了解:
		getRequestURI():获取的是 从项目名到参数之前的内容  /demo1/regist
		getRequestURL():获取的带协议的完整路径   http://localhost/demo1/regist
		String getQueryString():get请求的所有参数   username=tom&password=123
		String getProtocol():获取协议和版本
		
例如:请求行
	GET /demo1/row?username=tom&password=123 HTTP/1.1
	
	
	
	    //获取 请求方式
		String m=request.getMethod();
		System.out.println("方式:"+m);
		
		//获取请求资源
		String uri = request.getRequestURI();
		String url = request.getRequestURL().toString();
		System.out.println("uri:"+uri);
		System.out.println("url:"+url);
		
		//获取请求参数的字符串
		String s = request.getQueryString();
		System.out.println("get请求参数:"+s);
		
		//获取协议版本
		String p = request.getProtocol();
		System.out.println("协议:"+p);
		
		System.out.println("-------重要的----");
		
		//获取请求的ip
		String ip = request.getRemoteAddr();
		System.out.println("ip:"+ip);
		
		//获取项目名
		String path = request.getContextPath();
		System.out.println("项目路径:"+path);
		
		
		输出:
		方式:GET
        uri:/demo1/row
        url:http://localhost/demo1/row
        get请求参数:username=tom&password=123
        协议:HTTP/1.1
        -------重要的----
        ip:0:0:0:0:0:0:0:1
        项目路径:/demo1

操作请求头

		格式:key/value(value可以是多个值)
		常用方法:
			★String getHeader(String key):通过key获取指定的value (一个)
			
			了解:
				Enumeration getHeaders(String name) :通过key获取指定的value(多个)
				Enumeration getHeaderNames() :获取所有的请求头的名称
				int getIntHeader(String key):获取整型的请求头
				long getDateHeader(String key):获取时间的请求头
		重要的请求头:
			user-agent:浏览器内核 msie firefox chrome
			referer:页面从那里来 防盗链
			
			
			
	    //获取浏览器内核
		String agent = request.getHeader("user-agent");
		System.out.println(agent);
		
		

操作请求参数

操作请求参数 ★
		username=tom&password=123&hobby=drink&hobby=sleep
		常用方法:
			String getParameter(String key):获取一个值
			String[] getParameterValues(String key):通过一个key获取多个值
			Map<String,String[]> getParameterMap():获取所有的参数名称和值
			
			
			
			
				//获取username
		String username = request.getParameter("username");
		System.out.println("username:"+username);
		
		//获取爱好 多个值
		String[] hobby = request.getParameterValues("hobby");
		System.out.println("hobby:"+Arrays.toString(hobby));
		
		//获取所有
		System.out.println("============");
		Map<String, String[]> map = request.getParameterMap();
		for(String key:map.keySet()){
			System.out.println(key+"::"+Arrays.toString(map.get(key)));
		}
		
		输出:
		username:tom
		---------values---------
		hobby:[drink, sleep]
		=====map=======
		username::[tom]
		password::[123]
		hobby::[drink, sleep]

请求乱码

请求的中文乱码:
	对于get请求:参数追加到地址栏,会使用utf-8编码,服务器(tomcat7)接受到请求之后,使用iso-8859-1解码,所以会出现乱码
	对于post请求,参数是放在请求体中,服务器获取请求体的时候使用iso-8859-1解码,也会出现乱码
	
	通用的方法:
		new String(参数.getBytes("iso-8859-1"),"utf-8");
	针对于post请求来说:只需要将请求流的编码设置成utf-8即可
		request.setCharacterEncoding("utf-8");

请求转发

域对象:
	request:
		创建:一次请求来的时候
		销毁:响应生成的时候
		作用:
			一次请求里面的数据
		请求转发(请求链,请求串)
			request.getRequestDispatcher("内部路径").forward(request,response);


<a href="/demo1/dis1?money=10">g_请求转发借钱</a><br>			
			
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	System.out.println("我说:稍等");
	
	//将借钱人的姓名放入reuqest中
	request.setAttribute("username", "++");
	
	//请求转发
	request.getRequestDispatcher("/dis2").forward(request, response);
}

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

// /dis2 servlet代码
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	System.out.println("老师曰:需要多少? 我答:"+request.getParameter("money"));
	System.out.println("老师又曰:干嘛用啊? 我答:借给"+request.getAttribute("username"));
}

response:响应

作用:
	往浏览器写东西
组成部分:
	响应行 响应头 响应体

操作响应行

	格式:
		协议/版本 状态码 状态码说明
	状态码:
		1xx:已发送请求
		2xx:已完成响应
			200:正常响应
		3xx:还需浏览器进一步操作
			302:重定向 配合响应头:location
			304:读缓存
		4xx:用户操作错误
			404:用户操作错误.
			405:访问的方法不存在
		5xx:服务器错误
			500:内部异常
	常用方法:
		setStatus(int 状态码):针对于 1 2 3 
		了解 :
			sendError(int 状态码):针对于 4xx和5xx
			

操作响应头


格式:key/value(value可以是多个值)
常用的方法:
	setHeader(String key,String value):设置字符串形式的响应头
	了解:setIntHeader(String key,int value):设值整形的响应头
	了解:setDateHeader(String key,long value):设值时间的响应头
	
	addHeader(String key,String value):添加置字符串形式的响应头 之前设置过则追加,若没有设置过则设置
	了解:addIntHeader(String key,int value):添加整形的响应头
	了解:addDateHeader(String key,long value):添加时间的响应头
常用的响应头:
	location:重定向
	refresh:定时刷新
	content-type:设置文件的mime类型,设置响应流的编码及告诉浏览器用什么编码打开
	content-disposition:文件下载
	
	重定向:	
		方式1:
			★response.sendRedirect("/demo1/loc2");
		方式2:
			response.setStatus(302);
			respooen.setHeader("location","/demo1/loc2");
			
	定时刷新:
		方案1:设置头 refresh 昨天做过
			respooen.setHeader("refresh","秒数;url=跳转的路径");
		方案2:http的meta标签
			<meta http-equiv="refresh" content="3;url=/demo1/refresh2.html">
			
// 重定向		
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	System.out.println("我说:借钱~~");
	
	System.out.println("我又说:找A老师");
	
	//方式1:理解
	//设状态码 302
	//response.setStatus(302);
	
	//设置响应头
	//response.setHeader("location", "/demo1/loc2");
	
	//方式2:重要,访问完这个servlet后,浏览器会跳转到/demo2/loc2
	response.sendRedirect("/demo2/loc2");
}

操作响应体 处理响应中文乱码:

页面上要展示的内容
常用方法:
	Writer getWriter():字符流
	ServletOutputStream getOutputStream() :字节流
	
	自己写的东西用字符流,其他一概用字节流.
	
处理响应中文乱码:
	方式1:★
		response.setContentType("text/html;charset=utf-8");
	方式2:理解
		response.setHeader("content-type", "text/html;charset=utf-8");

注意:
	两个流互斥
	当响应完成之后,服务器会判断一下流是否已经关闭,若没有关闭,服务器会帮我们关闭.(底层使用的缓冲流)

请求转发和重定向区别

	重定向发送两次请求,请求转发一次请求
	
	重定向地址栏发生该表,请求转发不变
	
	重定向是从浏览器发送,请求转发是服务器内部
	
	重定向不存在request域对象,请求转发可以使用request域对象
	
	重定向是response的方法,请求转发是request的方法
	
	重定向可以请求站外资源,请求转发不可以	

猜你喜欢

转载自blog.csdn.net/lizhengwei1989/article/details/88411694