小言_互联网的博客

JavaWeb核心技术系列教程(10)——HttpServletResponse应用示例

182人阅读  评论(0)

C语言自学完备手册(33篇)

Android多分辨率适配框架

JavaWeb核心技术系列教程

HTML5前端开发实战系列教程

MySQL数据库实操教程(35篇图文版)

推翻自己和过往——自定义View系列教程(10篇)

走出思维困境,踏上精进之路——Android开发进阶精华录

讲给Android程序员看的前端系列教程(40集免费视频教程+源码)


版权声明

  • 本文原创作者:谷哥的小弟
  • 作者博客地址:http://blog.csdn.net/lfdfhl

在本节教程中,通过示例的方式介绍HttpServletResponse常见应用场景及其使用方式。

响应文本

index.html代码如下:

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>Servlet</title>
	</head>
	<body>
		<h1>本文作者:谷哥的小弟</h1>
		<h1>博客地址:http://blog.csdn.net/lfdfhl</h1>
	</body>
</html>

index.html页面如下:

web.xml代码如下:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns="http://java.sun.com/xml/ns/javaee"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
	id="WebApp_ID" version="3.0">
	<display-name>ServletResponse01</display-name>
	<welcome-file-list>
		<welcome-file>index.html</welcome-file>
		<welcome-file>index.htm</welcome-file>
		<welcome-file>index.jsp</welcome-file>
		<welcome-file>default.html</welcome-file>
		<welcome-file>default.htm</welcome-file>
		<welcome-file>default.jsp</welcome-file>
	</welcome-file-list>
	<servlet>
		<servlet-name>testServletResponse</servlet-name>
		<servlet-class>cn.com.TestServletResponse</servlet-class>
	</servlet>
	<servlet-mapping>
		<servlet-name>testServletResponse</servlet-name>
		<url-pattern>/testServletResponse</url-pattern>
	</servlet-mapping>
</web-app>

TestServletResponse代码如下:

package cn.com;

import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
 * 本文作者:谷哥的小弟 
 * 博客地址:http://blog.csdn.net/lfdfhl
 * 
 * HttpServletResponse示例:
 * HttpServletResponse返回文本
 */
public class TestServletResponse extends HttpServlet {
	private static final long serialVersionUID = -5677585996916888916L;

	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		PrintWriter writer = response.getWriter();
		writer.write("Hello Servlet");
	}

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

}

该示例非常简单,在doGet( )中通过PrintWriter返回文本。

结果如下:

中文乱码问题

接下来,我们将刚才示例中的代码

writer.write("Hello Servlet");

修改为

writer.write("您好 Servlet");

结果如下:

此时,由于响应文本中有汉字出现了乱码。

导致乱码的原因分析

1、HttpServletResponse默认编码为ISO-8859-1,即response.getCharacterEncoding( )返回值为ISO-8859-1;该编码并不兼容中文

2、浏览器使用的是GBK或者其它编码

解决乱码的方式

第一步:设置HttpServletResponse的编码方式为UTF-8
即:response.setCharacterEncoding(“UTF-8”);

第二步:通知浏览器使用UTF-8解码接收到的响应内容
即:response.setHeader(“Content-Type”, “text/html;character=UTF-8”);

通过该方式将HttpServletResponse的编码方式和浏览器的解码为统一为同一种编码从而解决乱码问题。

代码如下:

@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setCharacterEncoding("UTF-8");
		response.setHeader("Content-Type", "text/html;character=UTF-8");
		PrintWriter writer = response.getWriter();
		writer.write("您好  Servlet");
	}

结果如下:

在实际开发中,通常使用更加简洁的写法解决乱码问题,即response.setContentType(“text/html;charset=UTF-8”)

代码如下:

@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html;charset=UTF-8");
		PrintWriter writer = response.getWriter();
		writer.write("您好  Servlet");
	}

返回文件

利用HttpServletResponse返回图片至客户端浏览器并直接显示。

项目结构如下:

在WEB-INF文件夹下存放美景.jpg文件。

index.html代码如下:

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>Servlet</title>
	</head>
	<body>
		<h1>本文作者:谷哥的小弟</h1>
		<h1>博客地址:http://blog.csdn.net/lfdfhl</h1>
	</body>
</html>

index.html页面如下:

web.xml代码如下:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns="http://java.sun.com/xml/ns/javaee"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
	id="WebApp_ID" version="3.0">
	<display-name>ServletResponse03</display-name>
	<welcome-file-list>
		<welcome-file>index.html</welcome-file>
		<welcome-file>index.htm</welcome-file>
		<welcome-file>index.jsp</welcome-file>
		<welcome-file>default.html</welcome-file>
		<welcome-file>default.htm</welcome-file>
		<welcome-file>default.jsp</welcome-file>
	</welcome-file-list>
	<servlet>
		<servlet-name>testServletResponse</servlet-name>
		<servlet-class>cn.com.TestServletResponse</servlet-class>
	</servlet>
	<servlet-mapping>
		<servlet-name>testServletResponse</servlet-name>
		<url-pattern>/testServletResponse</url-pattern>
	</servlet-mapping>
</web-app>

TestServletResponse代码如下:

package cn.com;

import java.io.FileInputStream;
import java.io.IOException;
import java.net.URLEncoder;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
 * 本文作者:谷哥的小弟 
 * 博客地址:http://blog.csdn.net/lfdfhl
 * 
 * HttpServletResponse示例: 
 * 1、返回图片至客户端浏览器展示
 * 2、返回图片给客户端以供浏览器下载
 */
public class TestServletResponse extends HttpServlet {
	private static final long serialVersionUID = -5677585996916888916L;
	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
		showImage(response);
	}
	
	//将图片返回至客户端浏览器并直接显示
	public void showImage(HttpServletResponse response) throws IOException {
		// 获取文件全路径
		String path = getServletContext().getRealPath("/WEB-INF/美景.jpg");
		System.out.println("path=" + path);
		// 利用IO流读写文件
		FileInputStream fileInputStream = new FileInputStream(path);
		ServletOutputStream outputStream = response.getOutputStream();
		int len = 0;
		byte[] b = new byte[1024];
		while ((len = fileInputStream.read(b)) != -1) {
			outputStream.write(b, 0, len);
		}
		outputStream.close();
		fileInputStream.close();
	}
	
	@Override
	protected void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
		this.doGet(request, response);
	}

}

结果如下:

有时,我们希望客户端不展示图片而是下载图片,这又该怎么做呢?

TestServletResponse代码如下:

package cn.com;

import java.io.FileInputStream;
import java.io.IOException;
import java.net.URLEncoder;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
 * 本文作者:谷哥的小弟 
 * 博客地址:http://blog.csdn.net/lfdfhl
 * 
 * HttpServletResponse示例: 
 * 1、返回图片至客户端浏览器展示
 * 2、返回图片给客户端以供浏览器下载
 */
public class TestServletResponse extends HttpServlet {
	private static final long serialVersionUID = -5677585996916888916L;
	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
		attachImage(response);
	}
	
	//将图片返回至客户端浏览器并提醒用户下载
	public void attachImage(HttpServletResponse response) throws IOException {
		// 获取文件全路径
		String path = getServletContext().getRealPath("/WEB-INF/美景.jpg");
		System.out.println("path=" + path);
		// 从文件全路径中截取文件名称
		String fileName = path.substring(path.lastIndexOf("\\") + 1);
		System.out.println("fileName=" + fileName);
		// 对文件名进行UTF-8编码
		fileName = URLEncoder.encode(fileName, "UTF-8");
		// 设置响应头content-type
		response.setHeader("content-type", "image/jpeg");
		// 设置响应头content-disposition
		response.setHeader("content-disposition", "attachment;filename=" + fileName);
		// 利用IO流读写文件
		FileInputStream fileInputStream = new FileInputStream(path);
		ServletOutputStream outputStream = response.getOutputStream();
		int len = 0;
		byte[] b = new byte[1024];
		while ((len = fileInputStream.read(b)) != -1) {
			outputStream.write(b, 0, len);
		}
		outputStream.close();
		fileInputStream.close();
	}

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

}

结果如下:

页面定时刷新和跳转

index.html代码如下:

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>Servlet</title>
	</head>
	<body>
		<h1>本文作者:谷哥的小弟</h1>
		<h1>博客地址:http://blog.csdn.net/lfdfhl</h1>
	</body>
</html>

index.html页面如下:

web.xml代码如下:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns="http://java.sun.com/xml/ns/javaee"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
	id="WebApp_ID" version="3.0">
	<display-name>ServletResponse04</display-name>
	<welcome-file-list>
		<welcome-file>index.html</welcome-file>
		<welcome-file>index.htm</welcome-file>
		<welcome-file>index.jsp</welcome-file>
		<welcome-file>default.html</welcome-file>
		<welcome-file>default.htm</welcome-file>
		<welcome-file>default.jsp</welcome-file>
	</welcome-file-list>
	<servlet>
		<servlet-name>testServletResponse</servlet-name>
		<servlet-class>cn.com.TestServletResponse</servlet-class>
	</servlet>
	<servlet-mapping>
		<servlet-name>testServletResponse</servlet-name>
		<url-pattern>/testServletResponse</url-pattern>
	</servlet-mapping>
</web-app>

TestServletResponse代码如下:

package cn.com;

import java.io.IOException;
import java.util.Date;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
 * 本文作者:谷哥的小弟 
 * 博客地址:http://blog.csdn.net/lfdfhl
 * 
 * HttpServletResponse示例: 
 * 1、页面定时刷新
 * 2、页面定时刷新并跳转
 */
public class TestServletResponse extends HttpServlet {
	private static final long serialVersionUID = -5677585996916888916L;
	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
		//refresh(response);
		refreshAndForward(response);
	}
	
	//页面定时刷新
	public void refresh(HttpServletResponse response) throws IOException {
		//每隔两秒定时刷新
		response.setHeader("Refresh", "2");
		Date date=new Date();
		response.getWriter().println(date.toString());
	}

	//页面定时刷新并跳转
	public void refreshAndForward(HttpServletResponse response) throws IOException {
		//两秒钟后刷新并跳转至指定页面
		response.setHeader("Refresh", "2;URL=https://blog.csdn.net/lfdfhl");
	}

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

}

在此Servlet中实现两个功能:页面自动刷新和页面自动刷新并跳转。

结果如下:

禁止浏览器缓存页面

为了加快访问速度,很多浏览器会对访问过的页面进行缓存。但是,在某些特定的场合下,缓存页面影响到了交互的及时性。例如:查询剩余车票的页面应及时刷新而不是显示缓存页面。为此,需要禁止浏览器缓存页面。

index.html代码如下:

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>Servlet</title>
	</head>
	<body>
		<h1>本文作者:谷哥的小弟</h1>
		<h1>博客地址:http://blog.csdn.net/lfdfhl</h1>
	</body>
</html>

index.html页面如下:

web.xml代码如下:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns="http://java.sun.com/xml/ns/javaee"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
	id="WebApp_ID" version="3.0">
	<display-name>ServletResponse06</display-name>
	<welcome-file-list>
		<welcome-file>index.html</welcome-file>
		<welcome-file>index.htm</welcome-file>
		<welcome-file>index.jsp</welcome-file>
		<welcome-file>default.html</welcome-file>
		<welcome-file>default.htm</welcome-file>
		<welcome-file>default.jsp</welcome-file>
	</welcome-file-list>
	<servlet>
		<servlet-name>testServletResponse</servlet-name>
		<servlet-class>cn.com.TestServletResponse</servlet-class>
	</servlet>
	<servlet-mapping>
		<servlet-name>testServletResponse</servlet-name>
		<url-pattern>/testServletResponse</url-pattern>
	</servlet-mapping>
</web-app>

TestServletResponse代码如下:

package cn.com;

import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
 * 本文作者:谷哥的小弟 
 * 博客地址:http://blog.csdn.net/lfdfhl
 * 
 * HttpServletResponse示例: 
 * 禁止客户端浏览器缓存页面
 */
public class TestServletResponse extends HttpServlet {
	private static final long serialVersionUID = -5677585996916888916L;
	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
		forbidCache(response);
	}
	
	//禁止客户端浏览器缓存页面
	public void forbidCache(HttpServletResponse response) throws IOException {
		response.setContentType("text/html;charset=utf-8");
		//禁止浏览器缓存页面
		response.setDateHeader("Expires",0);
        response.setHeader("Cache-Control","no-cache"); 
        response.setHeader("Pragma","no-cache");
		PrintWriter writer = response.getWriter();
		writer.write("<!DOCTYPE html>");
		writer.write("<html>");
		writer.write("<head>");
		writer.write("<meta charset=\"UTF-8\">");
		writer.write("<title>Servlet</title>");
		writer.write("</head>");
		writer.write("<body>");
		writer.write("<H3>本次响应的随机数为:" + Math.random()+"</H3>");
		writer.write("<form action='formServlet'" + "method='POST'>");
		writer.write("姓 名:<input type='text' name='name'/><br/><br/>");
		writer.write("城 市:<input type='text' name='city'/><br/><br/>");
		writer.write("<input type='submit' value='提交'/>");
		writer.write("</form>");
		writer.write("</body>");
		writer.write("</html>");
	}

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

}

在IE浏览器中填写表单并提交再返回后发现表单中原数据被清空。
请注意:该方式仅在IE浏览器中可行,在某些版本的谷歌浏览器中无效。

返回动态验证码

在实际工作中,我们常需要将服务端生成的动态验证码返回至客户端浏览器;而且,浏览器刷新后重新生成验证码。

index.html代码如下:

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>Servlet</title>
	</head>
	<body>
		<script type="text/javascript">
			function changeCode() {
				var img = document.getElementById("validateImage");
				var time=new Date().getTime();
				img.src = "testServletResponse?time=" + time; 
			}
		</script>
		<form action="#" method="post">
			<p>用 户:<input type="text" name="username" />
			<p>密 码:<input type="password" name="password" />
			<p>验 证:<input type="text" name="validatecode" />
			   <img id="validateImage" src="testServletResponse" />
			   <a href="javascript:changeCode()">换一张</a>
			</p>
			<input type="submit" value="登录" />
		</form>
	</body>

</html>

代码解析:

  • img标签src属性指向servlet即:< img id=“validateImage” src=“testServletResponse” / >
  • 超链接中href指向JavaScript函数,即:< a href=“javascript:changeCode()” >换一张
  • 每次点击超链接后触发javascript中changeCode( )函数。在函数中每次将当前时间附加在src路径之后形成新的请求再向服务器请求资源。

页面如下:


web.xml代码如下:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns="http://java.sun.com/xml/ns/javaee"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
	id="WebApp_ID" version="3.0">
	<display-name>ServletResponse05</display-name>
	<welcome-file-list>
		<welcome-file>index.html</welcome-file>
		<welcome-file>index.htm</welcome-file>
		<welcome-file>index.jsp</welcome-file>
		<welcome-file>default.html</welcome-file>
		<welcome-file>default.htm</welcome-file>
		<welcome-file>default.jsp</welcome-file>
	</welcome-file-list>
	<servlet>
		<servlet-name>testServletResponse</servlet-name>
		<servlet-class>cn.com.TestServletResponse</servlet-class>
	</servlet>
	<servlet-mapping>
		<servlet-name>testServletResponse</servlet-name>
		<url-pattern>/testServletResponse</url-pattern>
	</servlet-mapping>
</web-app>

TestServletResponse代码如下:

package cn.com;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Random;
import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
 * 本文作者:谷哥的小弟 
 * 博客地址:http://blog.csdn.net/lfdfhl
 * 
 * HttpServletResponse示例: 
 * 生成验证码图片并返回至客户端浏览器
 */
public class TestServletResponse extends HttpServlet {
	private static final long serialVersionUID = -5677585996916888916L;

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

	@Override
	protected void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
		this.doGet(request, response);
	}
	
	//生成验证码图片并返回至客户端浏览器
	private void showValidateCode(HttpServletResponse response) throws IOException {
		int width = 110;
		int height = 25;
		// 在内存中创建图像对象
		BufferedImage bufferedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
		// 创建一个画笔
		Graphics graphics = bufferedImage.getGraphics();
		// 给图片添加背景色
		graphics.setColor(Color.PINK);
		graphics.fillRect(1, 1, width - 2, height - 2);
		// 给边框一个色
		graphics.setColor(Color.RED);
		// 设置边框的显示位置
		graphics.drawRect(0, 0, width - 1, height - 1);
		// 设置文本样式
		graphics.setColor(Color.BLUE);
		graphics.setFont(new Font("宋体", Font.BOLD | Font.ITALIC, 15));
		Random rand = new Random();
		int position = 20;
		for (int i = 0; i < 4; i++) {
			graphics.drawString(rand.nextInt(10) + "", position, 20);
			position += 20;
		}
		// 9条干扰线
		for (int i = 0; i < 9; i++) {
			graphics.drawLine(rand.nextInt(width), rand.nextInt(height), rand.nextInt(width), rand.nextInt(height));
		}
		// 将图片对象以流的方式输出至客户端
		ServletOutputStream outputStream = response.getOutputStream();
		ImageIO.write(bufferedImage, "jpg", outputStream);
	}
}

请求重定向

有时候,客户端发起请求;但是,服务端Servlet可能无法完成全部工作。这时, 我们需要使用请求重定向来完成后续的工作。所谓请求重定向,指的是Web服务器接收到客户端的请求后让客户端重新发送指向其它资源的请求。

为了实现请求重定向,在HttpServletResponse接口中定义了sendRedirect( ) 方法。该方法用于生成302响应码和Location响应头,从而通知客户端重新访问 Location响应头中指定的URL。

图示如下:

至于,代码的实现我们在学习完Request再详细讲解。


转载:https://blog.csdn.net/lfdfhl/article/details/101456045
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场