JavaWeb总结(二)—HttpServletResponse对象
Web服务器收到客户端的http请求,会针对每一次的请求,分别创建一个用于代表请求的request对象和response对象。我们要获取客户端提交的数据,只需要找request对象。要向客户端输出数据,只需要找response对象。
一、常用方法
HttpServletResponse对象代表服务器的响应。这个对象中封装了向客户端发送数据、发送响应头,发送响应状态码的方法。查看HttpServletResponse的API,可以看到这些相关的方法。
(1)负责向客户端发送数据的方法
(2)负责向客户端发送响应头的方法
(3)负责向客户端发送响应状态码的方法
(4)响应状态码的常量
HttpServletResponse定义了很多状态码的常量(具体可以查看Servlet的API),当需要向客户端发送响应状态码时,可以使用这些常量,避免了直接写数字,常见的状态码对应的常量:
二、使用OutputStream流向客户端浏览器输出中文数据
使用OutputStream流输出中文注意问题:
在服务器端,数据是以哪个码表输出的,那么就要控制客户端浏览器以相应的码表打开,比如:outputStream.write("中国".getBytes("UTF-8"));使用OutputStream流向客户端浏览器输出中文,以UTF-8的编码进行输出,此时就要控制客户端浏览器以UTF-8的编码打开,否则显示的时候就会出现中文乱码,那么在服务器端如何控制客户端浏览器以以UTF-8的编码显示数据呢?可以通过设置响应头控制浏览器的行为,例如:response.setHeader("content-type", "text/html;charset=UTF-8");通过设置响应头控制浏览器以UTF-8的编码显示数据。
private void dealReq(HttpServletRequest req,HttpServletResponse resp) throws IOException{ resp.setHeader("Content-type","text/html;charset=UTF-8"); String data = "中国";
OutputStream out = resp.getOutputStream(); //data.getBytes()是一个将字符转换成字节数组的过程,这个过程中一定会去查码表。
//如果是中文的操作系统环境,默认就是查找查GB2312的码表, 将字符转换成字节数组的过程就是将中文字符转换成GB2312的码表上对应的数字
out.write(data.getBytes("UTF-8"));
}
}
三、使用PrintWriter流向客户端浏览器输出中文数据
使用PrintWriter流输出中文注意问题:
在获取PrintWriter输出流之前首先使用"response.setCharacterEncoding(charset)"设置字符以什么样的编码输出到浏览器,如:response.setCharacterEncoding("UTF-8");设置将字符以"UTF-8"编码输出到客户端浏览器,然后再使用response.getWriter();获取PrintWriter输出流,这两个步骤不能颠倒,如下:
private void dealReq(HttpServletRequest req,HttpServletResponse resp) throws IOException{ //设置Response使用的码表,以控制response以什么码表向浏览器写出数据
resp.setCharacterEncoding("UTF-8"); //指定浏览器以什么码表打开服务器发送的数据
resp.setHeader("Content-type","text/html;charset=UTF-8"); String data = "今天小雨吖";
PrintWriter out = resp.getWriter();
out.write(data);
out.flush();
out.close();
}
}
四、文件的下载
文件下载功能是web开发中经常使用到的功能,使用HttpServletResponse对象就可以实现文件的下载
文件下载功能的实现思路:
1.获取要下载的文件的绝对路径。
2.获取要下载的文件名。
3.设置content-disposition响应头控制浏览器以下载的形式打开文件。
4.获取要下载的文件输入流。
5.创建数据缓冲区。
6.通过response对象获取OutputStream流。
7.将FileInputStream流写入到buffer缓冲区。
8.使用OutputStream将缓冲区的数据输出到客户端浏览器。
/*
* 实现文件的下载
*/
public class DownloadServlet extends HttpServlet{ private OutputStream fos;
private FileInputStream fis; public void doGet(HttpServletRequest req,HttpServletResponse resp) throws
ServletException,IOException{
///1.获取要下载的文件的绝对路径
String realPath = this.getServletContext().getRealPath("/download/1.jpg");
//2.获取要下载的文件名
String fileName = realPath.substring(realPath.lastIndexOf("\\") + 1) ; /*
* 1.设置content-disposition响应头控制浏览器以下载的形式打开文件
* 2.下载中文文件,中文文件下载时,文件名要经过URL编码,否则会出现文件名乱码
*/
resp.setHeader("content-disposition","attachment;filename=" +
URLEncoder.encode(fileName,"UTF-8"));
try{
fos = resp.getOutputStream();
fis = new FileInputStream(realPath);
int len = 0;
byte[] buffer = new byte[1024];
while((len = fis.read(buffer)) != -1){
//使用OutputStream将缓冲区的数据输出到客户端浏览器
fos.write(buffer,0,len);
}
}finally{
if(fis != null){
try{
fis.close();
}catch(Exception e){
e.printStackTrace();
}
} if(fos != null){
try{
fos.close();
}catch(Exception e){
e.printStackTrace();
}
}
}
} public void doPost(HttpServletRequest req,HttpServletResponse resp) throws
ServletException,IOException{
}
}
五、随机验证码
<html>
<head> <title>验证信息</title> <script type="text/javascript">
function changeImg() {
document.getElementById("validateCodeImg").src = "RandomImgServlet?"
+ Math.random();
}
</script>
</head> <body>
<form action="ValidateServlet" method="post"> 请输入验证码:<input type="text" name="validateCode"> <img alt="验证码看不清,换一张" src="RandomImgServlet" id="validateCodeImg"
onclick="changeImg()">
<a href="javascript:void(0)" onclick="changeImg()">看不清,换一张</a>
<br />
<input type="submit" value="提交">
</form>
</body>
</html>
public class RandomImgServlet extends HttpServlet{ public static final int AUTHCODE_LENGTH = 5; // 验证码长度
public static final int SINGLECODE_WIDTH = 15; // 单个验证码宽度
public static final int SINGLECODE_HEIGHT = 30; // 单个验证码高度
public static final int SINGLECODE_GAP = 4; // 单个验证码之间间隔
public static final int IMG_WIDTH = AUTHCODE_LENGTH * (SINGLECODE_WIDTH + SINGLECODE_GAP);
public static final int IMG_HEIGHT = SINGLECODE_HEIGHT; private static String randString = "01234456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
private static int srtLen = randString.length(); public void doGet(HttpServletRequest request,HttpServletResponse response) throws
ServletException,IOException{ String authCode = getAuthCode(); // 将验证码保存到session中,便于以后验证
request.getSession().setAttribute("checkCode",authCode); try{
// 发送图片
ImageIO.write(getAuthImg(authCode),"JPEG",response.getOutputStream());
}catch(IOException e){
e.printStackTrace();
}
} public void doPost(HttpServletRequest req,HttpServletResponse resp) throws
ServletException,IOException{
doGet(req,resp);
} public static String getAuthCode(){ String authCode = "";
for(int i = 0;i < AUTHCODE_LENGTH;i++){
int randNum = new Random().nextInt(srtLen);
authCode += randString.substring(randNum,randNum + 1);
}
return authCode;
} public static BufferedImage getAuthImg(String authCode){
// 设置图片的高、宽、类型
// RGB编码:red、green、blue
BufferedImage img = new BufferedImage(IMG_WIDTH,IMG_HEIGHT,BufferedImage.TYPE_INT_BGR);
// 得到图片上的一个画笔
Graphics g = img.getGraphics();
// 设置画笔的颜色,用来做背景色
g.setColor(Color.white);
// 用画笔来填充一个矩形,矩形的左上角坐标,宽,高
g.fillRect(0,0,IMG_WIDTH,IMG_HEIGHT);
// 将画笔颜色设置为黑色,用来写字
g.setColor(Color.BLACK);
// 设置字体:宋体、不带格式的、字号
g.setFont(new Font("宋体",Font.PLAIN,SINGLECODE_HEIGHT + 5)); // 输出数字
char c;
for(int i = 0;i < authCode.toCharArray().length;i++){
// 取到对应位置的字符
c = authCode.charAt(i);
// 画出一个字符串:要画的内容,开始的位置,高度
g.drawString(c + "",i * (SINGLECODE_WIDTH + SINGLECODE_GAP) + SINGLECODE_GAP / 2,IMG_HEIGHT);
}
Random random = new Random();
// 干扰素
for(int i = 0;i < 20;i++){
int x = random.nextInt(IMG_WIDTH);
int y = random.nextInt(IMG_HEIGHT);
int x2 = random.nextInt(IMG_WIDTH);
int y2 = random.nextInt(IMG_HEIGHT);
g.drawLine(x,y,x + x2,y + y2);
}
return img;
}
}
public class ValidateServlet extends HttpServlet{ public void doGet(HttpServletRequest req,HttpServletResponse resp) throws
ServletException,IOException{
String clientCode = req.getParameter("validateCode");
String serverCode = (String)req.getSession().getAttribute("checkCode"); if(clientCode.equals(serverCode)){// 将客户端验证码和服务器端验证比较,如果相等,则表示验证通过
this.getServletContext().getRequestDispatcher("/success.jsp").forward(req,resp);
}else{
this.getServletContext().getRequestDispatcher("/error.jsp").forward(req,resp);
}
} public void doPost(HttpServletRequest req,HttpServletResponse resp) throws
ServletException,IOException{
doGet(req,resp);
}
}
JavaWeb总结(二)—HttpServletResponse对象的更多相关文章
- JAVAWEB学习总结 HttpServletResponse对象(一)
Web服务器收到客户端(浏览器)的http请求,会针对每一次请求,分别创建一个用于代表请求的request对象,和代表响应的response对象. request和response对象既然代表请求和响 ...
- JavaWeb学习 (七)————HttpServletResponse对象(一)
一.HttpServletResponse对象介绍
- JAVAWEB学习总结 HTTPSERVLETRESPONSE对象(二)
一.HttpServletResponse常见应用--生成验证码 1.1.生成随机图片用作验证码 生成图片主要用到了一个BufferedImage类 步骤: 1. 在内存中创建一张图片 2.得到图片 ...
- JavaWeb学习 (八)————HttpServletResponse对象(二)
一.HttpServletResponse常见应用——生成验证码 1.1.生成随机图片用作验证码 生成图片主要用到了一个BufferedImage类,
- JavaWeb温习之HttpServletResponse对象
以下内容均根据"方立勋JavaWeb视频教程"进行总结 1. HttpServletResponse常见应用——设置响应头控制浏览器的行为 1.1 设置http响应头控制浏览器禁止 ...
- javaweb学习总结(七)——HttpServletResponse对象(一)
Web服务器收到客户端的http请求,会针对每一次请求,分别创建一个用于代表请求的request对象.和代表响应的response对象.request和response对象即然代表请求和响应,那我们要 ...
- javaweb学习总结(七)——HttpServletResponse对象(一)(转)
Web服务器收到客户端的http请求,会针对每一次请求,分别创建一个用于代表请求的request对象.和代表响应的response对象. request和response对象即然代表请求和响应,那我们 ...
- javaweb学习总结(七)——HttpServletResponse对象(一)(转)
转载自 http://www.cnblogs.com/xdp-gacl/p/3789624.html Web服务器收到客户端的http请求,会针对每一次请求,分别创建一个用于代表请求的request对 ...
- javaweb(七)——HttpServletResponse对象(一)
Web服务器收到客户端的http请求,会针对每一次请求,分别创建一个用于代表请求的request对象.和代表响应的response对象.request和response对象即然代表请求和响应,那我们要 ...
随机推荐
- 从Angular2路由引发的前后端路由浅谈
笔者的学习进度比较慢,直到两年以前写的网站都还是以服务端为主导的,即网站的所有视图都由服务器视图模板来渲染,笔者使用的是 DotNet MVC,开发套路就是在Controller里面写Action,在 ...
- Linux系统(五)负载均衡LVS集群之DR模式
序言 DR模式是lvs集群中三种负载均衡模式的其中一种,那么上一篇中我写啦关于NAT模式的搭建与原理,为什么还要有DR模式与IP隧道模式呢? 首先我们来看3张图.LVS/NAT模式如下图: LVS/I ...
- VS2012 百度云下载 开发工具
百度云下载地址:链接: http://pan.baidu.com/s/1qWDIDPi密码: 5nr0 ASP.NET MVC4.0+ WebAPI+EasyUI+KnockOutJS快速开发框架 通 ...
- async/await与promise(nodejs中的异步操作问题)
此文只是粗略介绍使用方法,欲了解核心概念请参考官方文档或其他资料. 举例写文章详情页面的时候的一个场景:首先更改文章详情中的 PV,然后读取文章详情,然后根据文章详情中文章 Id 查阅该文章评论和该文 ...
- java 完全二叉树的构建与四种遍历方法
本来就是基础知识,不能丢的太干净,今天竟然花了那么长的时间才写出来,记一下. 有如下的一颗完全二叉树: 先序遍历结果应该为:1 2 4 5 3 6 7 中序遍历结果应该为:4 2 5 ...
- Maven 搭建SpringMvc+Spring+Mybatis详细记录
总觉得,看比人写的总是那么好,每次搭建框架时都会找博客,找教程来跟着一步一步走,虽然很快搭建成功了,但是经常情况是我并不知道我干了什么,也不记得具体步骤,到底为什么要这么做,今天我详细记录了一下自己搭 ...
- iOS 推送全解析,你不可不知的所有 Tips!
本文旨在对 iOS 推送进行一个完整的剖析,如果你之前对推送一无所知,那么在你认真地阅读了全文后必将变成一个推送老手,你将会对其中的各种细节和原理有充分的理解.以下是 pikacode 使用 iOS ...
- 《学习记录》ng2-bootstrap中的component使用教程
前序: 现在angular2已经除了集成的angular-cli,建议大家可以基于这个来快速开发ng2的项目,不用自己再搭建环境: 相关内容请前往:https://angular.cn/docs/ts ...
- 算法模板——splay区间反转 2
实现功能:同splay区间反转 1(基于BZOJ3223 文艺平衡树) 这次改用了一个全新的模板(HansBug:琢磨了我大半天啊有木有),大大简化了程序,同时对于splay的功能也有所完善 这里面没 ...
- 1821: [JSOI2010]Group 部落划分 Group
1821: [JSOI2010]Group 部落划分 Group Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 1308 Solved: 627[Su ...