このチュートリアルでは、カスタム結果タイプを使用してStruts 2で動的イメージを生成する方法を説明します。例えば、

<img src="<s:url action='ImageAction?imageId=darksouls.jpg'/>"/>

`imageId`の値はあなたのサーバーパスのイメージ名です。上記の場合、 `ImageAction`クラスはimageIdパラメータに基づいて画像ファイルを出力します。

このチュートリアルで使用されているツールとStruts:

  1. Struts 2.3.1.2

  2. Eclipse 3.7

  3. Maven 3

1.ディレクトリ構造

このチュートリアルのディレクトリ構造。画像ファイルのパスを確認します。


struts2動的イメージディレクトリ構造、title = "struts2-dynamic-image-directory"、width = 526、height = 506

2.アクションクラス


File:DisplayAction.java

– 通常の動作です。何もしません。

package com.mkyong.image.action;

import com.opensymphony.xwork2.ActionSupport;

public class DisplayAction extends ActionSupport  {

}


File:ImageAction.java

– コアアクションクラス。提供された `imageId`パラメータに基づいてイメージを取得し、バイト配列に変換します。

package com.mkyong.image.action;

import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.servlet.http.HttpServletRequest;
import org.apache.struts2.interceptor.ServletRequestAware;
import com.opensymphony.xwork2.ActionSupport;

public class ImageAction extends ActionSupport implements ServletRequestAware {

    byte[]imageInByte = null;
    String imageId;

    private HttpServletRequest servletRequest;

    public String getImageId() {
        return imageId;
    }

    public void setImageId(String imageId) {
        this.imageId = imageId;
    }

    public ImageAction() {
        System.out.println("ImageAction");
    }

    public String execute() {
        return SUCCESS;
    }

    public byte[]getCustomImageInBytes() {

        System.out.println("imageId" + imageId);

        BufferedImage originalImage;
        try {
            originalImage = ImageIO.read(getImageFile(this.imageId));
           //convert BufferedImage to byte array
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            ImageIO.write(originalImage, "jpg", baos);
            baos.flush();
            imageInByte = baos.toByteArray();
            baos.close();
        } catch (IOException e) {
           //TODO Auto-generated catch block
            e.printStackTrace();
        }

        return imageInByte;
    }

    private File getImageFile(String imageId) {
        String filePath = servletRequest.getSession().getServletContext().getRealPath("/");
        File file = new File(filePath + "/Image/", imageId);
        System.out.println(file.toString());
        return file;
    }

    public String getCustomContentType() {
        return "image/jpeg";
    }

    public String getCustomContentDisposition() {
        return "anyname.jpg";
    }

    @Override
    public void setServletRequest(HttpServletRequest request) {
        this.servletRequest = request;

    }

}

3.カスタム結果の種類

カスタムの結果の種類、およびブラウザに画像を出力します。


File:CustomImageBytesResult.java

package com.mkyong.image.result;

import javax.servlet.http.HttpServletResponse;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.Result;
import com.mkyong.image.action.ImageAction;

public class CustomImageBytesResult implements Result {

    public void execute(ActionInvocation invocation) throws Exception {

        ImageAction action = (ImageAction) invocation.getAction();
        HttpServletResponse response = ServletActionContext.getResponse();

        response.setContentType(action.getCustomContentType());
        response.getOutputStream().write(action.getCustomImageInBytes());
        response.getOutputStream().flush();

    }

}

4. Struts.xml

すべてがどのようにリンクされているかをご覧ください。


File:struts.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">

<struts>

    <package name="image" namespace="/Image" extends="struts-default">

        <result-types>
            <result-type name="imageResult"
                class="com.mkyong.image.result.CustomImageBytesResult"/>
        </result-types>

        <action name="Display" class="com.mkyong.image.action.DisplayAction">
            <result>pages/display.jsp</result>
        </action>

        <action name="ImageAction" class="com.mkyong.image.action.ImageAction">
            <result name="success" type="imageResult">
            </result>
        </action>

    </package>

</struts>

5. JSPページ

`ImageAction`を使って動的イメージを表示するJSPページ。


File:display.jsp

<%@ page contentType="text/html; charset=UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<html>
<head></head>
<body>
    <h1>Struts 2 Dynamic Image Example</h1>

    <img src=" <s:url action='ImageAction?imageId=darksouls.jpg'/>"/>

</body>
</html>

6.デモ

出力を参照してください。


struts2動画像のデモ、タイトル= "struts2-dynamic-image-output"、width = 640、height = 395

ソースコードをダウンロードする

ダウンロードする – リンク://wp-content/uploads/2012/02/Struts2-Dynamic-Image-Example.zip[Struts2-Dynamic-Image-Example.zip](26kb)

参考文献

動的イメージをバイト配列として表示]。

http://balusc.blogspot.com/2007/04/imageservlet.html

[image servlet

  1. リンク://java/how-to-convert-byte-to-bufferedimage-in-java/[変換

Javaの配列のバイト数の画像]。

https://cwiki.apache.org/WW/stream-result.html

[Struts2 stream result

例]