一尘不染

如何在Struts 2中从动作类向JSP发送和显示QRCode图像

jsp

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

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

我的JSP表格:

<form action="createQR">
Enter Your Name<input type="text" name="userName"/><br/>
<input type="submit" value="Create QRCode"/>
</form>

我的动作对应struts.xml

<action name="createQR" class="CreateQRAction">
 <result name="success">displayQR.jsp</result>
</action>

我的动作课:

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上显示此图像。

<s:property value="QRImg"/>

阅读 230

收藏
2020-06-08

共1个答案

一尘不染

看来您需要<s:url可以在<img标签中替换为href属性的from 动作,以检索图像,类似于在/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;
}

做完了

然后在从您的动作转发的JSP中使用<img src="<s:url action="image"/>" style="width:100%;"/>。如果需要添加路径,则在URL中的操作和属性上使用名称空间注释。

我觉得您熟悉Struts2中的会话概念,即如何将会话注入您的动作并在其中映射对象。返回结果之前,请在操作中映射文件对象。

祝好运。

2020-06-08