我正在提交带有字符串的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:
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"/>
看来您需要<s:url可以在<img标签中替换为href属性的from 动作,以检索图像,类似于在/images文件夹中使用静态图像。
<s:url
<img
href
/images
叫它ImageAction。这是将响应写出的简单操作。要使用它,您需要将带有图像的文件放入会话中。因为图像是由单独的线程检索的。在execute方法中写
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();
并返回NONE结果,因为此操作仅写入响应
return NONE; }
做完了
然后在从您的动作转发的JSP中使用<img src="<s:url action="image"/>" style="width:100%;"/>。如果需要添加路径,则在URL中的操作和属性上使用名称空间注释。
<img src="<s:url action="image"/>" style="width:100%;"/>
我觉得您熟悉Struts2中的会话概念,即如何将会话注入您的动作并在其中映射对象。返回结果之前,请在操作中映射文件对象。
祝好运。