【Java.Web】Servlet —— 实例 之 动态生成图像


动态生成图像

在这个例子中,我们首先通过一个Servlet(ImageServlet)动态的生成一个图像,然后在另一个Servlet(ShowImageServlet)中通过设置<image>元素的src属性指向这个Servlet来动态地生成图像:


创建第一个Servlet用于生成图像,可以通过如下的url指定图像显示的文本内容:

http://localhost:8080/base-webapp/image?text=my image servlet
package com.gof.test.servlet;

import java.io.IOException;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import com.sun.image.codec.jpeg.JPEGImageEncoder;
import com.sun.image.codec.jpeg.JPEGCodec;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.ServletOutputStream;

public class ImageServlet extends HttpServlet {
    
	/**
	 * 
	 */
    private static final long serialVersionUID = 6311783263824452228L;
    private Font font = new Font("Courier", Font.BOLD,12);
    
	protected void doGet(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException{
	    String text = req.getParameter("text");
	    
	    if(text == null){
	    	text = "DEMO";
	    }
	    
	    int len = text.length();
	    
	    resp.setContentType("image/jpeg");
	    
	    ServletOutputStream out = resp.getOutputStream();
	    BufferedImage image = new BufferedImage(11*len, 16, BufferedImage.TYPE_INT_RGB);
	    
	    Graphics g = image.getGraphics();
	    g.setColor(Color.black);
	    g.fillRect(0, 0, 11*len, 16);
	    g.setColor(Color.white);
	    g.setFont(font);
	    char c;
	    for (int i = 0; i < len; i++){
	    	c = text.charAt(i);
	    	g.drawString(c + " ", i*11, 12);
	    }
	    
	    JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
	    encoder.encode(image);
	    out.close();
	}
}<span style="font-family:SimSun;font-size:10px;">
</span>


通过浏览器访问上面的URL:


下面创建第二个Servlet用于显示图像,其中图像通过在html正文中指定image的src属性,使其指向上面的servlet:

package com.gof.test.servlet;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


public class ShowImageServlet extends HttpServlet {
	/**
	 * 
	 */
	private static final long serialVersionUID = -6345607864598566037L;

	protected void doGet(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException{
	    resp.setContentType("text/html;charset=utf-8");
	    
	    PrintWriter out = resp.getWriter();
	    
	    out.println("<html><head><title>Show Image</title></head>");
	    out.println("<body>");
	    
	    String imageLink = "<img src='image?text=testing string'/>";
	    out.println("The image is: " + imageLink);
	    
	    out.println("</body></html>");
	    
	    out.close();
	}
}

通过浏览器访问上面的Servlet:

http://localhost:8080/base-webapp/showimage



可以看到浏览器在遇到<image>元素的时候,再次发出一个http request请求第一个servlet - image;通过两次http request完成上面页面的加载


配置servlet在web.xml:

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
	
  <display-name>Base Java Webapp</display-name>
  <description>A Basic Maven Java Webapp Application</description>
  
  <welcome-file-list>
      <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
  
  
  <!-- test url: http://localhost:8080/base-webapp/download?filename=testreport.txt -->
  <servlet>
  	<servlet-name>downloadtest</servlet-name>
  	<servlet-class>com.gof.test.servlet.DownloadServlet</servlet-class>
  </servlet>
  <servlet-mapping>
      <servlet-name>downloadtest</servlet-name>
      <url-pattern>/download</url-pattern>
  </servlet-mapping>
  
  <!-- test upload file: http://localhost:8080/base-webapp/uploadfile.html -->
  <servlet>
  	<servlet-name>uploadfiletest</servlet-name>
  	<servlet-class>com.gof.test.servlet.UploadFileServlet</servlet-class>
  	<init-param>
  	    <param-name>filePath</param-name>
  	    <param-value>/upload</param-value>
  	</init-param>
  	<init-param>
  	    <param-name>tempFilePath</param-name>
  	    <param-value>/tempupload</param-value>
  	</init-param>
  </servlet>
  <servlet-mapping>
      <servlet-name>uploadfiletest</servlet-name>
      <url-pattern>/uploadfile</url-pattern>
  </servlet-mapping>
  
  <!-- Image Servlet -->
  <!-- access to this servlet through url: i.e. http://localhost:8080/base-webapp/image?text=123  -->
  <servlet>
  	<servlet-name>image</servlet-name>
  	<servlet-class>com.gof.test.servlet.ImageServlet</servlet-class>
  </servlet>
  <servlet-mapping>
      <servlet-name>image</servlet-name>
      <url-pattern>/image</url-pattern>
  </servlet-mapping>
  
  <!-- Show Image Servlet -->
   <!-- access to this servlet through url: i.e. http://localhost:8080/base-webapp/showimage  -->
   <servlet>
  	 <servlet-name>showimage</servlet-name>
  	 <servlet-class>com.gof.test.servlet.ShowImageServlet</servlet-class>
   </servlet>
   <servlet-mapping>
      <servlet-name>showimage</servlet-name>
      <url-pattern>/showimage</url-pattern>
   </servlet-mapping>
  
</web-app>




你可能感兴趣的:(java,Web)