在本教程中,我们向您展示如何通过自定义结果类型在Struts 2中生成动态图像。 例如,
<img src="<s:url action='ImageAction?imageId=darksouls.jpg' />" />
imageId
的值是服务器路径中的图像名称。 在上述情况下, ImageAction
类将基于imageId参数输出图像文件。
本教程中使用的工具和Struts:
- 支撑杆2.3.1.2
- Eclipse 3.7
- Maven 3
1.目录结构
本教程的目录结构。 查看图像文件路径。
2.动作课
File:DisplayAction.java –正常操作,什么也不做。
package com.mkyong.image.action;
import com.opensymphony.xwork2.ActionSupport;
public class DisplayAction extends ActionSupport {
}
File:ImageAction.java –核心操作类,用于基于提供的imageId
参数获取图像并将其转换为bytes数组。
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.自定义结果类型
自定义结果类型,然后将图像输出到浏览器。
文件: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
了解所有内容如何链接在一起。
档案: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页面
一个JSP页面,用于通过ImageAction
显示动态图像。
文件: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.演示
查看输出。
http:// localhost:8080 / Struts2Example / Image / Display.action
下载源代码
下载它– Struts2-Dynamic-Image-Example.zip (26kb)
参考文献
翻译自: https://mkyong.com/struts2/struts-2-dynamic-image-example/