Web阶段(day08,部分request,response)

功能三:获取请求参数
getParameter(String name) —String通过name获得值。
getParameterValues(String name) —String[]通过name获得多值checkbox
getParameterMap() —Map<String,String[]>key:name value:多值,将查询的参数保存在一个Map中。
getParameterName() —Enumeration 获得所有name。
请求参数乱码,
乱码产生的原因:编码和解码的字符集不统一。
浏览器发送数据,所以为编码部分,浏览器在发送数据时会采用当前页面加载时使用的字符集。当前页面使用utf-8加载页面,所以编码字符集为utf-8。
服务器接收数据,所以为解码部分。服务器在接收数据时,会采用服务器默认的字符集接收,默认字符集为ISO8859-1。当前字符集中没有中文,所以会出现乱码。
因为UTF-8中包含中文,所以将编解码统一为UTF-8字符集。
get提交乱码处理:由于get提交参数是在地址栏中传输,所以要在获取到参数之后重新编解码,才能将乱码处理。
处理过程:获取参数,重新使用iso8859-1编码,得到二进制数组。
将二进制数组使用utf-8解码成对应的字符,得到正确的中文结果。
在这种形式,不论get还是post都可以进行乱码的处理。
功能四:请求转发
请求转发特点:一次请求一次响应
一个请求对象,一个响应对象
服务器内部的资源跳转方式。
浏览器中的访问地址不会发生改变。
请求转发是一种资源跳转方式,是一个服务器内部的资源跳转(其实请求转发只能够在web应用内部进行跳转)。
请求转发时的注意事项:
在请求转发之前如果向缓冲区写入数据,那么在请求转发的时候会将缓冲区中的数据清空。
在请求转发之前如果强行冲刷缓冲区,则会导致请求转发抛出异常。原因:冲刷缓冲区会造成一次响应操作,请求转发只会出现一次响应。
请求转发前后的语句都可以正常执行。
请求转发可以多重转发,不可以在同一个servlet中多次请求转发,会造成响应已经提交,无法再次请求转发的异常。
功能五:作为域对象。
域对象:如果一个对象有一个可以被看见的范围,在这个范围内利用对象身上的map实现数据的共享,这样一个对象就称之为域对象。
域对象API:
setAttribute(String name,Object value) —设置域属性
getAttribute(String name); —根据域属性获取域属性的值。
removeAttribute(String name); —删除域属性
getAttributeNames() —获取全部域属性的名称。
生命周期:请求链开始,request对象创建,请求链结束,request对象销毁。
作用范围:整个请求链。
主要功能:在整个请求链中共享数据。
请求包含
特点一:一次请求,一响应。
一个请求对象,一个响应对象。
浏览器地址栏不发生变化。
将两个servlet的结果组合成一个结果发送,作为响应内容发送到浏览器中。

1.response概述
代表HTTP响应的对象。
2.response的组成
一个状态行
若干响应头 location
一个空行
响应实体内容
3.response继承结构
ServletResponse —response的最高级接口。
HttpServletResponse —包含HTTP协议和相关的API,善于HTTP相关开发。
4.HttpServletRespose的API
设置状态码
void setStatus(int sc);
void setStatus(int sc,String sm);
设置响应头的方法
void setHeader(String name,String value);
void setDateHeader(String name,String value);
void setIntHeader(String name,int value);
void addHeader(String name,String value);
void addDateHeader(String name, long date);
void addIntHeader(String name, int value);
设置响应内容的方法
ServletOutputStream()
!!getOutputStream()
PrintWriter getWriter()
5.response功能一:向浏览器发送数据
a.字节流
response.getOutputStream().writer(“abc”.getBytes());
调用字节流没有出现乱码,原因是getBytes()方法会采用默认的平台码,当前平台码为GBK,浏览器会使用来自系统的字符集,也是GBK,编码解码字符集统一,所以没有乱码。
如果服务器发送数据时使用utf-8字符集,那么浏览器接收数据时也要使用utf-8字符集。所以应该通知浏览器使用utf-8。
通知服务器使用utf-8字符集:response.setHeader(“Content-Type”,“text/html;charset=utf-8”);
b.字符流
response.getWriter().writer(“中国”);
在使用字符流发送数据的时候,tomcat服务器会自动采用字节流去发送数据,在编码过程中服务器默认的字符集iso5589-1。而浏览器在接收数据的时候使用GBK。两个字符不统一会出现乱码。
将浏览器和服务器都统一成utf-8字符集,所以需要通知浏览器和服务器两方面:
通知浏览器接收数据:
response.setHeader(“Content-Type”,“text/html;charset=utf-8”);
通知服务器发送数据:
response.setCharacterEncoding(“utf-8”);
在通知浏览器接收数据使用的字符集时,服务器会自动采用通知的字符集来发送数据,所以只需要通知浏览器使用utf-8即可:
此句还可以简写为:response.setHeader(“Content-Type”,“text/html;charset=utf-8”);
此句还可以简写为:
response.setContentType(“text/html;charset=utf-8”);
总结:不论是字节流还是字符流,都可以使用通知浏览器使用utf-8字符集来处理乱码。
注意:不要关闭字节或字符流可能会导致响应异常。字节流和字符流不能同时使用。将处理乱码的语句放在所有代码之前。
6.response功能二:请求重定向
特点:两次请求,两次响应(两个请求对象,两个响应对象)。
服务器之间的资源跳转方式。
浏览器地址栏会发生变化。
请求重定向是一种资源的跳转方式,可以在不同的服务器之间跳转。
请求重定向原理:
302状态码+location响应头。
代码实现(第一种方式)
response.setStatus(302);
response.setHeader(“location”, “/Day07_servlet/servlet/RequestDemo4”);
重定向可以在不同的服务器之间进行跳转,也以为这可以在不同的web应用之间进行跳转。所以在书写url地址的使用,至少要写到web应用的虚拟路径名称部分。否则无法完成正确的跳转。
第二种方式:
response.sendRedirect(“http://www.tmooc.cn”);
7.response功能三:定时刷新(refresh)
特点:两次请求 两次响应
两个请求对象,两个响应对象。
服务器之间的资源跳转方式。
浏览器地址栏会发生变化。
定时刷新原理:设置refresh响应头。
定时刷新是一种资源跳转方式,可以在不同服务器之间跳转。
请求重定向和定时刷新的区别:请求重定向是立即跳转,定时刷新是等待一段时间后。
8.response功能四:控制浏览器缓存
a.控制浏览器不使用缓存
设计在HTTP/1.0
response.setDateHeader(“Expires”,-1);表示在1970-01-01的基础之上减去1毫秒,这个时间值,仍然是一个无效值,所以不能使用缓存。
设计在HTTP/1.0
response.setDateHeader(“Pragma”,“no-cache”);
设计在HTTP/1.1
response.setHeader(“Cache-control”,“no-cache”);
b.控制浏览器使用缓存
response.setDateHeader(“Expires”,System.currentTimeMillis()+10006060*24);//24小时
response.setHeader(“Cache-control”,“max-age = 60”);//60秒

代码实现:
	//控制浏览器缓存
	public class ResponseDemo4 extends HttpServlet {
	    public void doGet(HttpServletRequest request, HttpServletResponse response)
	        throws ServletException, IOException {
	        //设置一个时间值
	        Date date = new Date();
	        String time = date.toLocaleString();
	        //控制浏览器不使用缓存
	        //每次应当显示最新的时间值
	    /*	response.setDateHeader("Expires", -1);
	        response.setHeader("Pragma","no-cache");
	        response.setHeader("Cache-control", "no-cache");*/
		    //控制浏览器使用缓存
		    //数据缓存24小时
			//response.setDateHeader("Expires", System.currentTimeMillis()+1000*60*60*24);
	       	//5秒之后使用最新资源
	        response.setHeader("Cache-control", "max-age=5");
	        response.getWriter().write("time:"+time);
	        }
	    public void doPost(HttpServletRequest request, HttpServletResponse response)
	            throws ServletException, IOException {
	            doGet(request, response);
	    }
	}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值