大纲:
一、response重定向
二、response相对路径和绝对路径
三、response输出数据
四、response验证码
五、ServletContext对象
六、文件下载
response对象:
**功能:**设置响应消息
1.设置响应行
(1)格式:HTTP/1.1 200 OK
(2)设置状态码:setStatus(int sc)
2.设置响应头
setHeader(String name,String value)
3.设置响应体
使用步骤:
(1)获取输出流
①字符输出流:PrintWriter getWriter()
②字节输出流:ServletOutputStream getOutputStream()
(2)使用输出流,将数据输出到客户端浏览器
一、response重定向
1.完成重定向
(1)告诉浏览器重定向,状态码302
(2)告诉浏览器B资源的路径,响应头lcation:B资源的路径
第一种
//1设置状态吗为302
resp.setStatus(302);
//2设置响应头location
resp.setHeader("location","pro2/responsedemo2");
第二种
resp.sendRedirect("/pro2/responsedemo2");
重定向特点:(redirect)
1.地址栏发生变化
2.重定向可以访问其他站点的资源
3.重定向是两次请求。不能使用requst对象共享数据
转发的特点:(forward)
1.地址栏路径不变
2.转发只能访问当前服务器下的资源
3.转发是一次请求,可以使用requst对象共享数据
二、response相对路径和绝对路径
1.路径分类:
(1)相对路径:通过相对路径不能确定唯一资源(以.开头的路径)
规则:找到当前资源和目标资源之间的相对关系
./ 表示当前目录
../表示后退一级目录
(2)绝对路径:通过绝对路径可以确定唯一资源(以/开头的路径)
规则:判断定义的路径是给谁用的,
①给客户端浏览器使用,需要加虚拟目录(项目的访问路径)
a.建议虚拟目录动态获取:request.getContextPath()
b.<a>,<form>重定向
②给服务器使用:不需要加虚拟目录
转发路径
三、response输出数据
1.服务器输出字符数据到浏览器
(1)获取字符输出流
(2)输出数据
//获取字符输出流
PrintWriter pw = resp.getWriter();//获取的流默认编码是ISO-8859-1
//输出数据
pw.write("hello...");
注意
中文出现乱码:
原因:编解码使用的字符集不一致
方法1:
//告诉浏览器,服务器发送的消息体数据的编码,建议浏览器使用该编码解码
response.setHeader("content-type","text/html;charset=utf-8");
方法2:简化
//告诉浏览器,服务器发送的消息体数据的编码,建议浏览器使用该编码解码
response.setHeader("content-type","text/html;charset=utf-8");
2.服务器输出字节数据到浏览器
//获取字节输出流
ServletOutputStream sos = resp.getOutputStream();
//输出数据
sos.write("hello".getBytes());
方法
resp.setContentType("text/html;charset=utf-8");
//获取字节输出流
ServletOutputStream sos = resp.getOutputStream();
//输出数据
sos.write("hello".getBytes("utf-8"));
四、response验证码
分析
验证码案例分析:
本质:图片
目的:防止恶意表单注册
步骤:
1创建对象,在内存图片(验证码图片对象)
2.美化图片
3.将图片输出到页面展示
代码:
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
int width = 100;
int height = 50;
//1创建对象,在内存图片(验证码图片对象)
BufferedImage image = new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
//2.美化图片
//2.1填充背景色
Graphics g = image.getGraphics();//画笔对象
g.setColor(Color.PINK);//设置画笔颜色
g.fillRect(0,0,width,height);
//2.2话边框
g.setColor(Color.BLUE);
g.drawRect(0,0,width-1,height-1);
String str= "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
//生成随机角标
Random ran = new Random();
for (int i = 1; i <= 4; i++) {
int index = ran.nextInt(str.length());
//获取字符
char ch = str.charAt(index);
//2.3写验证码
g.drawString(ch+"",width/5*i,height/2);
}
//画干扰线
g.setColor(Color.GREEN);
//随机生成坐标点
for (int i = 0; i < 8; i++) {
int x1 = ran.nextInt(width);
int x2 = ran.nextInt(width);
int y1 = ran.nextInt(height);
int y2 = ran.nextInt(height);
g.drawLine(x1,y1,x2,y2);
}
/*
这是固定的要随机的
//2.3写验证码
g.drawString("A",20,25);
g.drawString("B",40,25);
g.drawString("C",60,25);
g.drawString("D",80,25);
*/
//3.将图片输出到页面展示
ImageIO.write(image,"jpg",resp.getOutputStream());
}
在使用时需要看不清的时候需要改变它,看页面 和js交互
<head>
<meta charset="UTF-8" >
<title>regist</title>
<script>
/*分析:
点击超链接或者图片,需要换一张
1.给超链接和图片绑定单击事件
2.重新设置图片的src属性值
*/
window.onload = function () {
//1.获取图像对象
var img = document.getElementById("checkCode");
//2.绑定单机事件
img.onclick = function () {
//加时间戳,时间戳永不重复
var date = new Date().getTime();
img.src = "/pro3/checkcode?"+date
}
}
</script>
</head>
<body>
<img id = "checkCode" src = "/pro3/checkcode"/>
<a id = "change" href = "">看不清 换一张</a>
</body>
效果
五、ServletContext对象
1.概念
代表整个web应用,可以和程序的容器(服务器)来通信
2.获取
(1)通过request对象获取request.getServletContext();
(2)通过HttpServlet获取this.getServletContext();
代码示例
//servletcontext对象的获取
//(1)通过request对象获取`request.getServletContext();`
ServletContext servletContext1 = req.getServletContext();
//(2)通过HttpServlet获取`this.getServletContext();`
ServletContext servletContext2 = this.getServletContext();
System.out.println(servletContext1);//org.apache.catalina.core.ApplicationContextFacade@de3306e
System.out.println(servletContext2);//org.apache.catalina.core.ApplicationContextFacade@de3306e
System.out.println(servletContext1 == servletContext2);//true
3.功能:
(1)获取MIME类型:
①MIME类型: 在互联网通信过程中定义的一种文件数据类型
格式:大类型/小类型 text/html image/jpeg
②获取:String getMimeType(String file);
代码示例
//servletcontext功能
//获取:String getMimeType(String file);
//1.通过HttpServlet获取`this.getServletContext();`
ServletContext servletContext2 = this.getServletContext();
//2.定义文件名称
String fileName = "a.jpg";
//3.获取MIME类型
String mimeType = servletContext2.getMimeType(fileName);
System.out.println(mimeType);
(2)域对象:共享数据
1.setAttribute(String name,Object value)
2.getAttribute(String name);
3.removeAttribute(String name)
servletContext对象范围:所有用户请求的数据
servletcontextdemo3
//1.通过HttpServlet获取`this.getServletContext();`
ServletContext servletContext2 = this.getServletContext();
//3.获取MIME类型
servletContext2.setAttribute("msg","haha");
servletcontextdemo4
//1.通过HttpServlet获取`this.getServletContext();`
ServletContext servletContext2 = this.getServletContext();
Object msg = servletContext2.getAttribute("msg");
System.out.println(msg);
效果:
(3)获取文件的真实(服务器)路径
方法:String getRealPath(String path)
代码示例
public class ServletContextDemo5 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1.通过HttpServlet获取`this.getServletContext();`
ServletContext servletContext2 = this.getServletContext();
//获取文件的真实路径
String realPath = servletContext2.getRealPath("/b.txt");//web目录下资源访问
System.out.println(realPath);
//File file = new File(realPath);
String realPath1 = servletContext2.getRealPath("/WEB-INF/c.txt");//WEB-INF目录下资源访问
System.out.println(realPath1);
String realPath2 = servletContext2.getRealPath("/WEB-INF/classes/a.txt");//src目录下资源访问
System.out.println(realPath2);
}
文件存放位置
打印结果
六、文件下载
文件下载需求:
1.页面显示超链接
2.点击超链接后弹出下载提示框
3.完成图片下载
分析:
1.超链接指向的资源如果能够被浏览器解析,则在浏览器中展示,如果不能解析,则弹出下载提示框,不满足需求
2.任何资源都必须弹出下载提示框
3.使用响应设置资源的打开方式
content-disposition:attachment,filename = xxx
步骤
1.定义页面,编辑超链接href属性,指向servlet,传递资源名称filename
2.定义servlet
(1)获取文件名称
(2)使用字节输入流加载文件进内存
(3)指定response的响应头,content-disposition:attachment;filename=xxx
(4)将数据写出到response输出流
问题:中文文件问题
解决思路:
1.获取客户端使用的浏览器版本信息
2.根据不同的版本信息,设置filename的编码方式不同