如何从动作类发送和显示QR码图像JSP中的Struts 2(How to send and disp

2019-07-21 03:48发布

我提出一个JSP形式的字符串,并在提交我打电话一个Struts 2的动作。 在这一行动我创建使用QRGen库作为下方的QR码图像

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>

我的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"/>

Answer 1:

看来你需要操作的<s:url从,你可以在替换<img标记的href属性检索类似于使用静态图像就像在图像/images文件夹中。

让我们把它ImageAction 。 这是一个简单的行动,写出来的响应。 要使用它,你需要把文件与图像到会话中。 因为图像通过单独的线程检索。 在执行方法写

@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();

和返回无结果,因为这个动作只写入响应

return NONE;
}

DONE

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

我觉得你是熟悉Struts2的会话概念,即如何注入到会话中它的作用和地图对象。 地图在您操作的文件对象之前返回结果。

祝好运。



Answer 2:

你需要使用“org.apache.struts2.dispatcher.StreamResult”在Struts2。 基本上,在你的行动中读取的图像和填充的InputStream。 你也需要设置的其他变量正确配置“流”的结果。 使用这些在动作映射到属性来配置这将是类型“流”的结果



文章来源: How to send and display QRCode image from action class to JSP in Struts 2