如何在Struts 2中将动作类的QRCode图像发送和显示到JSP

我正在提交一个带有字符串的JSP表单,并且在提交时我正在调用Struts 2操作。 在该操作中,我使用QRGen库创建QRCode图像,如下所示

File QRImg=QRCode.from("submitted String").to(ImageType.PNG).withSize(100, 100).file(); 

我的JSP表单:

 
Enter Your Name

我的操作映射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’