1.验证码:
步骤:
html:
1.当页面加载时,开始方法
2.给图片设置点击事件
3.给连接设置点击事件
Servlet:
1.创建img输出对象,在内存中的图片(验证码图片对象)
2.美化图片
3.将图片输出到页面展示
代码展示:
Servlet:
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.创建img输出对象,在内存中的图片(验证码图片对象)
//设置高度
int width = 100;
//设置宽度
int height = 50;
BufferedImage image = new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
//2.美化图片
//获取画笔对象
Graphics draw = image.getGraphics();
//设置画笔颜色
draw.setColor(Color.BLUE);
//填充背景颜色
draw.fillRect(0,0,width,height);
//设置画笔颜色
draw.setColor(Color.RED);
//设置边框颜色
draw.drawRect(0,0,width-1,height-1);
//编写验证码
//1.定义一个自负串包括A-Z,a-z,0-9
String str = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
//创建随机对象
Random ran = new Random();
for (int x = 0 ; x < 4 ; x++){
//生成随机角标
int index = ran.nextInt(str.length());
//通过随机角标获得字符
char ch = str.charAt(index);
//写验证码
draw.drawString(ch+"",width/5*x,height/2);
}
//画干扰线
for (int x = 0 ; x<10 ; x++){
int x1 = ran.nextInt(width);
int y1 = ran.nextInt(height);
int x2 = ran.nextInt(width);
int y2 = ran.nextInt(height);
draw.drawLine(x1,y1,x2,y2);
}
//3.将图片输出到页面展示
ImageIO.write(image,"jpg",response.getOutputStream());
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request,response);
}
html:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script>
window.onload = function () {
var img = document.getElementById("checkCode");
img.onclick = function () {
var date =new Date().getTime();
img.src = "/javaEETomcat/CodeServlet?"+date;
}
var change = document.getElementById("change");
change.onclick = function () {
var date = new Date().getTime();
img.src = "/javaEETomcat/CodeServlet?"+date;
}
}
</script>
</head>
<body>
<img id="checkCode" src="/javaEETomcat/CodeServlet" >
<a id="change" href="">看不起,点击切换</a>
</body>
</html>
2.文件下载
步骤:
1.定义页面,编辑超链接href属性,指向Servlet,传递资源名称filename
2.定义Servlet
2.1获取文件名称
2.2使用字节输出流加载文件进内存
2.3指定response的响应头:content-disposition:attachment;filename=xxx
2.4将数据写到response输出流
问题:
文件中文问题解决思路:
1.获取客户端使用的浏览器版本消息
2.根据不同的版本消息,设置filename编码方式不同
代码实现:
Servlet:
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
/*获取文件名称*/
String filename = request.getParameter("filename");
/*使用字节输入流加载文件进内存*/
//获取ServletContext对象,也就是获取整个web
ServletContext context = this.getServletContext();
//根据获取到的文件名称找到文件的真实路径
String realPath = context.getRealPath("/img/" + filename);
System.out.println(realPath);
//用字节流保存文件
FileInputStream fi = new FileInputStream(realPath);
/*设置响应头*/
//获取ServletContext对象的MIME类型
String mimeType = context.getMimeType(filename);
//通过获取到的MIME类型,设置响应头类型:content-type
response.setHeader("content-type",mimeType);
/*解决中文文件名编码问题*/
//获取user-agent请求头
String agent = request.getHeader("user-agent");
//使用工具类方法编码文件名即可
filename = DownLoadUtils.getFileName(agent,filename);
//设置响应头打开方式:content-disposition:"attachment;attachment是用浮窗口展示
// filename"+filename(动态获取对应的文件名称)
response.setHeader("content-disposition","attachment;filename"+filename);
/*将输入流的数据写出到输出流中*/
//获取文件输出流
ServletOutputStream outputStream = response.getOutputStream();
//自定义字节数组用来把文件保存为字节格式
byte[] buff = new byte[1024*8];
//字节数组长度
int len = 0;
//使用循环输出流
while ((len = fi.read(buff)) != -1){
//输出从0到len的长度
outputStream.write(buff,0,len);
}
//关闭资源输入流
fi.close();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request,response);
}
html:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>下载</title>
</head>
<body>
<!--1.jpg或者时1.avi都是要下载的文件,Servlet通过该filename的值去服务器中获取该文件-->
<a href="/javaEETomcat/DownServlet?filename=1.jpg">图片</a>
<a href="/javaEETomcat/DownServlet?filename=1.avi">视频</a>
</body>
</html>