把学到的知识与实际应用相结合,到网上查资料做的练习
一 新建login.jsp
<%@page contentType="text/html; charset=gb2312" %>
<html>
<head><title>登录</title></head>
<script language='javascript'>
function switchImage() {
var image=document.getElementById('randomImage');
image.src="ServletDemo/servlet/ImageServlet";
return false;
}
</script>
<body>
<form action="servlet/LoginServlet" method="post">
姓名:<input type="test" name="UserName"><br>
密码:<input type="password" name="Pwd"><br>
验证码:<input type="text" size="10" name="ValCode">
<img src="ServletDemo/servlet/ImageServlet" name="randomImage"><!-- 插入验证码图片 -->
<a href="javascript:" onclick='return switchImage();'><font>看不清,换一张!</font></a>
<br><input type="submit">
</form>
</body>
</html>
二 建立ImageServlet.java
package com;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.*;
import javax.servlet.http.*;
import javax.servlet.*;
import java.util.Random;
import java.awt.*;
import java.awt.image.*;
import javax.imageio.*;
public class ImageServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("image/jpeg");
//设置浏览器不要缓存此图片
response.setHeader("Pragma","No-cache");
response.setHeader("Cache-control","no-cache");
response.setDateHeader("Expires",0);
//获得输出的管道,把BufferedImage里面的数据写到页面
OutputStream out=response.getOutputStream();
//定义缓存图片的高度与宽度
int width=80,height=20;
//分配一块内存存储图片
BufferedImage image=new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
//获得画笔
Graphics g=image.getGraphics();
//获得产生随机数对象
Random random=new Random();
//在分配的内存中画一个矩形
g.fillRect(0, 0, width, height);
//设置矩形内的字体格式
g.setFont(new Font("Times New Roman",Font.ITALIC,18));
//存储四位随机数
String sRand="";
for(int i=0;i<4;i++){
//在获得小于10的一个随机数
String rand=String.valueOf(random.nextInt(10));
sRand+=rand;
//设置随机数颜色
g.setColor(new Color(20+random.nextInt(110),20+random.nextInt(110),20+random.nextInt(110)));
//把产生的随机数画在矩形内, 20是高度,20*i+6 随机数的宽度
g.drawString(rand, 20*i+6, 20);
}
request.getSession().setAttribute("valCode", sRand);
g.dispose();
//将产生的随机数写到client端
ImageIO.write(image,"JPEG",out);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request,response);
}
}
三 配置web.xml
<servlet>
<servlet-name>ImageServlet</servlet-name>
<servlet-class>com.ImageServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ImageServlet</servlet-name>
<url-pattern>/ServletDemo/servlet/ImageServlet</url-pattern>
</servlet-mapping>
完毕!!!
四 网上有些关于效率的讨论
这句效率极低...
try{
com.sun.jimi.core.Jimi.putImage("image/jpeg", image4, out);
}catch(Exception e){
e.printStackTrace();
}
速度快,需要使用Sun提供的包,独立;
下载地址,不知道现在是否换有效:http://java.sun.com/products/jimi/