话不多说,直接开始
(我用的是原始的创建Servlet去做一下这个小功能)
首先当然是在web.xml中注册一个Servlet
因为下面要创建随机几个数字,所以写了个静态方法生成,后面直接插入图片就行
package com.sc.dao;
import java.util.Random;
public class Yzmdao {
//随机产生数字的方法
public static String RanNum(){
Random random = new Random();
int n = random.nextInt(99999);
//把数字转换为字符串
String num = "";
try{
num = String.valueOf(n);
}catch (NumberFormatException e){
e.printStackTrace();
}
//判断一下有多少位数,不满足就追加
StringBuffer stringBuffer = new StringBuffer();
for (int i = 0; i < 5-num.length(); i++) {
stringBuffer.append("1");
}
return stringBuffer.append(num).toString();
}
}
然后创建个Servlet:
代码如下,步骤见代码:
import com.sc.dao.Yzm;
import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Random;
@WebServlet(name = "yzm",urlPatterns = "/yzm.dd")
public class YzmServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//先在内存中生成一张图片,使用BufferedImage
BufferedImage bufferedImage = new BufferedImage(80,30,BufferedImage.TYPE_INT_RGB);
//获取这张图片,创建好
Graphics graphics = bufferedImage.getGraphics();
//设置图片背景颜色
graphics.fillRect(0,0,80,30);
//设置图片的颜色
graphics.setColor(Color.orange);
graphics.setFont(new Font(null,Font.BOLD,20));
//在图片上写几个数字(使用了dao层写的一个静态方法),并设置坐标
graphics.drawString(Yzmdao.RanNum(),10,25);
//图片画好,现在传到浏览器
resp.setHeader("ContentType","jpeg");
//使用java给我们提供的图片流,传图片
ImageIO.write(bufferedImage,"jpg",resp.getOutputStream());
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req,resp);
}
}
注意:使用@WebServlet(name = “yzm”,urlPatterns = “/yzm.dd”)注解需要导入两个servlet依赖或jar包
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
</dependency>
<!--引入Servlet结束-->
<!--引入jsp相关开始-->
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.2</version>
</dependency>
然后我为了直观,创建了个html页面:
启动tomcat,点击查看按钮,就可以出来生成好的图片
总结:
一、我们经常用到注册登录有提示要输入验证码,而在Servlet中可以通过HttpServletResponse去写到浏览器。
二、生成图片,就要用到Java的 BufferedImage的类,再用Graphics 去生成背景图片并画出想要的风格(Graphics 有很多画图方法,具体百度)
三、最后通过Java的ImageIO这个图片流,将生成好的图片传入浏览器。
四、最后可以根据你生成的已经数字的字符串与用户写入的对比,相等就返回true,否则,返回false。如果要生成中文的字符,就找中文映射表即可!