【Jsp】第三课 Servlet常用对象(三)

在Servlet技术的学习过程中,需要用到很多的常用对象,而且其用法也非常重要,这里介绍第二个常用对象,HttpServletResponse

概述

1. Servlet 收到浏览器的http请求后,会针对每一次请求,分别创建一个用于代表请求的request对象、和代表响应的response对象
2. request和response对象即代表了请求和响应,那我们要获取浏览器提交过来的数据,只需要找request对象就可以了,Servlet要想将数据发送给浏览器上显示,只需要找response即可

1.response对象使用OutputStream发送数据给浏览器

} 使用OutputStream流向客户端浏览器输出中文数据
1. 设置编码格式
2. 通过HttpServletResponse对象获取流
3.通过流往页面写数据

新建一个项目,在src文件夹中新建com.servlet包,然后创建一个Servlet,命名为Servlet1。在doGet方法中定义一个字符串,然后通过response对象获得OutputStream输出流,将字符串的数据写出给浏览器。这里OutputStream写出数据需要将数据转换成字节数组才能完成。代码如下:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		//因为浏览器发送请求的时候,默认是get请求,所有Servlet对应于doget方法接收浏览器的请求
		//假设当浏览器给该Servlet发送请求的时候
		String info="hello china";
		
		//从response对象中获得输出流
		OutputStream os= response.getOutputStream();
		//输入流:将数据从外部读取进来
		//输出流:将数据从自己写出去
		os.write(info.getBytes());
		
		
	}

 访问运行效果如下:

 一次请求访问的流程图如下:

如果需要发送中文数据给浏览器,需要设置编码格式。

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//设置servlet要发给浏览器的数据要支持html文本格式
		//因为浏览器只能识别html代码
		response.setContentType("text/html");
		//设置servlet要发给浏览器的数据的编码格式一定要是UTF-8,因为UTF-8是国际编码格式
		response.setCharacterEncoding("UTF-8");
		//因为浏览器发送请求的时候,默认是get请求,所有Servlet对应于doget方法接收浏览器的请求
		//假设当浏览器给该Servlet发送请求的时候
		//String info="hello china";
		String info1="你好,<span style='color:red;'>中国</span>";
		//从response对象中获得输出流
		OutputStream os= response.getOutputStream();
		//输入流:将数据从外部读取进来
		//输出流:将数据从自己写出去
		os.write(info1.getBytes());
	}

 运行效果如下:

 2.response对象使用PrintWrite发送数据给浏览器

创建Servlet2类,在doGet方法中定义一个字符串,使用response对象获得PrintWrite对象。

} 使用PrintWriter流向客户端浏览器输出中文数据
1. 设置编码格式
2.通过HttpServletResponse对象获取流
3.通过流往页面写数据
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		String info="abc";
		
		//从response中获得写的权限
		PrintWriter pw=response.getWriter();
		pw.print(info1);
		
	}

 这里就不展示运行效果,初学者可自行运行,观察运行效果。

PrintWrite对象可输出的数据类型多样化

如果使用PrintWrite发送中文数据给浏览器,与OutputStream执行代码类似,需要提前设置编码格式。

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html");
		response.setCharacterEncoding("UTF-8");
		
		String info1="软件1班";
		//从response中获得写的权限
		PrintWriter pw=response.getWriter();
		pw.print(info1);
		
		
	}

 3.使用OutputStream对象完成文件下载功能

创建Servlet3,并准备好一张图片存放至项目的WebContent文件夹下或者WebApp文件夹下。

} 文件下载
1.获取要下载的文件的绝对路径
2.获取要下载的文件名
3.设置content-disposition, attachment 响应头控制浏览器以下载的形式打开文件
4.获取要下载的文件输入流
5.创建数据缓冲区
6.通过response对象获取OutputStream流
7.将FileInputStream流写入到buffer缓冲区
8.使用OutputStream将缓冲区的数据输出到客户端浏览器

代码如下:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//要求servlet将图片以文件下载的方式发送给浏览器
		//设置响应头
		response.setHeader("content-disposition", "attachment;filename=flower.jpg");
		//1.servlet先要从磁盘中找到这张图片的绝对路径
		//先获得ServletContext对象
		ServletContext sc=getServletContext();
		String path=sc.getRealPath("/images/1.jpg");
		System.out.println(path);
		//2.将图片读取至servlet,输入流  字节流
		InputStream is=new FileInputStream(path);
		byte[] bytes=new byte[1024];
		int count=-1;
		OutputStream os=response.getOutputStream();
		while ((count=is.read(bytes))!=-1) {
			//读取了一部分图片的字节就把这部分发送出去
			os.write(bytes, 0, count);
		}
	}

 运行效果如下:

 打开已下载的图片,可观察到就是我们下载的图片

 4.使用response对象完成生成6位数随机验证码,并定时刷新

创建Servlet4,使用Math.random()产生【0-1】之间的随机数,因我们需要生成6位数的随机数,那么也就是需要【100000-1000000】之间产生随机数。其代码如下:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html");
		response.setCharacterEncoding("UTF-8");
		
		//设置浏览器每隔3秒钟自动刷新浏览器页面
		response.setHeader("refresh", "3");
		
		//生成随机6位数的验证码  100000--1000000
		int i=(int)(Math.random()*900000+100000);//0--1:1以下的小数 0.123456789900
		//0-1 *900000=0--900000+100000=100000--1000000
		PrintWriter pw=response.getWriter();
		pw.print("您支付宝收到1000万到账,需要的验证码为:<span style='color:red'>"
				+i+"</span>,打死也不要告诉别人!!!!");
		
	}

运行效果如下:

 

 

 5.使用response对象完成Servlet之间的跳转

创建Servlet5,我们学习到目前为止,浏览器都是访问单独Servlet,并没有做过多个Servlet之间的跳转,那么这里开始学习第一种Servlet打开另一个Servlet的方法,这里称为重定向。

访问流程图如下:

代码如下:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//能不能使用servlet跳转到另一个servlet
		//改变浏览器的访问地址,称为重定向:重新制定访问的方向
		//当浏览器访问Servlet5的时候,可以使用response回复一个消息给浏览器,要求浏览器别再访问我,访问servlet1
		response.sendRedirect("Servlet1");
		//重定向的跳转方式:
		//servlet指挥浏览器改变访问地址去访问其他的servlet
		//地址会改变
		//跳转servlet的方式,借用浏览器改变地址的方式切换访问servlet
	}

 这里不展示运行效果,初学者可自行运行,观察浏览器地址的变化,以及页面内容的展示情况,并总结重定向方式实现Servlet的跳转,并非是直接跳转,而是借助于浏览器改变请求地址实现的间接性的页面跳转。

猜你喜欢

转载自blog.csdn.net/u010321564/article/details/120736132