Generating dynamic resources based on URI or parameters

You can dynamically generate responses based on e.g. query parameters by creating your own RequestHandler and registering it with the session.

In this way, you can for instance create an image that draws a text, given as a parameter to the image. This has been done in the example below:

public class DynamicImageUI extends UI {
  public static final String IMAGE_URL = "myimage.png";

  private final RequestHandler requestHandler = new RequestHandler() {
    @Override
    public boolean handleRequest(VaadinSession session,
          VaadinRequest request, VaadinResponse response)
          throws IOException {
      if (("/" + IMAGE_URL).equals(request.getPathInfo())) {
        // Create an image, draw the "text" parameter to it and output
        // it to the browser.
        String text = request.getParameter("text");
        BufferedImage bi = new BufferedImage(100, 30,
                BufferedImage.TYPE_3BYTE_BGR);
        bi.getGraphics().drawChars(text.toCharArray(), 0,
                text.length(), 10, 20);
        response.setContentType("image/png");
        ImageIO.write(bi, "png", response.getOutputStream());

        return true;
      }
      // If the URL did not match our image URL, let the other request
      // handlers handle it
      return false;
    }
  };

  @Override
  public void init(VaadinRequest request) {
    Resource resource = new ExternalResource(IMAGE_URL + "?text=Hello!");

    getSession().addRequestHandler(requestHandler);

    // Add an image using the resource
    Image image = new Image("A dynamically generated image", resource);

    setContent(image);
  }

  @Override
  public void detach() {
    super.detach();

    // Clean up
    getSession().removeRequestHandler(requestHandler);
  }
}