校验码的出现主要的任务是解决表单的重复提交问题。
public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException { // 0. 通知浏览器不能缓存图片数据 response.setHeader("expires", "-1"); response.setHeader("cache-control", "no-cache"); response.setHeader("pragma", "no-cache"); // 1. 在内存中创建一个图片对象 BufferedImage img = new BufferedImage(80,20,BufferedImage.TYPE_INT_RGB); ServletOutputStream out = response.getOutputStream(); // 2. 获取图片 Graphics pic = img.getGraphics(); // 3. 设置背景是白色 pic.setColor(Color.WHITE); pic.fillRect(0, 0, 80, 20); // 4. 设置图片 pic.setColor(Color.RED); pic.setFont(new Font(null,Font.BOLD,12)); // 5. 添加数据 pic.drawString(makeString(4), 5, 15); // 6. 输出图片到浏览器 ImageIO.write(img, "jpeg", out); }
字符流做响应体的输出
public class Demo3 extends HttpServlet { String str = null; public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException { // 设置字符流的编码方式 response.setCharacterEncoding("utf-8"); // 通知浏览以指定的编码方式进行解码 response.setContentType("text/html;charset=utf-8"); // 获取响应对象的字符流对象 PrintWriter out = response.getWriter(); // 定义输出数据 String data = "hello<br/>"; // 输出字符串数据 out.write(data); // 输出页面数据 data = "<h2>this is a h2</h2>"; out.write(data); // 输出中文数据 data = "中国"; out.write(data); out.write("<br/>"); // 输出数字 out.write(65); // A out.write("<br/>"); // 调用打印方法 out.println(65); // 65 out.println(true); // true out.println(34.567); // 34.567 out.write(str); // 空指针异常 out.println(str); // 输出null } }
write()和prinln()的区别?
输出数字不同: write()输出数字转换为字符,println原样输出。
输出null不同: write()输出引用类型的时候调用的toString转换为String数据,因此如果对象为null那么直接抛出空指针异常。Println直接输出null。