如何在Struts 2中将动作类的QRCode图像发送和显示到JSP
我正在提交一个带有字符串的JSP表单,并且在提交时我正在调用Struts 2操作。 在该操作中,我使用QRGen库创建QRCode图像,如下所示
File QRImg=QRCode.from("submitted String").to(ImageType.PNG).withSize(100, 100).file();
我的JSP表单:
我的操作映射struts.xml
:
displayQR.jsp
我的动作类:
import java.io.File; import net.glxn.qrgen.QRCode; import net.glxn.qrgen.image.ImageType; import com.opensymphony.xwork2.ActionSupport; public class CreateQRAction extends ActionSupport{ private File QRImg; Private String userName; public String execute() { QRImg=QRCode.from(userName).to(ImageType.PNG).withSize(100, 100).file(); return SUCCESS; } public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public File getQRImg() { return QRImg; } public void setQRImg(File QRImg) { this.QRImg = QRImg; } }
现在,如果结果成功,我想在我的JSP上显示这个图像。
您似乎需要标记中替换为
href
属性来检索类似于使用静态图像的图像,如/images
文件夹中所示。
我们称之为ImageAction
。 这是一个写入响应的简单操作。 要使用它,您需要将带有图像的文件放入会话中。 因为图像是由单独的线程检索的。 在execute方法中写
@Action(value = "image", interceptorRefs = @InterceptorRef("basicStack")) public class ImageAction extends ActionSupport { public String execute() {
从会话中获取文件
File file = session.get("file");
那你需要读取文件
FileInputStream fis = new FileInputStream(file); byte[] data = new byte[fis.available()]; fis.read(data); fis.close();
然后写出响应
response.setContentType("image/png"); BufferedImage bi; OutputStream os = response.getOutputStream(); bi = ImageIO.read(new ByteArrayInputStream(data)); ImageIO.write(bi, "PNG", os); os.flush();
并返回NONE结果,因为此操作仅写入响应
return NONE; }
DONE
然后在从你的动作转发的JSP中只使用" style="width:100%;"/>
。 如果需要添加路径,请在url中的action和attribute上使用名称空间注释。
我觉得你熟悉Struts2中的会话概念,即如何将会话注入你的动作并在其中映射对象。 在返回结果之前映射操作中的文件对象。
祝你好运。
你需要在struts2中使用’org.apache.struts2.dispatcher.StreamResult’。 基本上在您的操作中读取图像并填充InputStream。 还设置了正确配置“流”结果所需的其他变量。 使用这些操作映射到属性配置结果类型为’stream’