简体   繁体   中英

How to send and display QRCode image from action class to JSP in Struts 2

I am submitting a JSP form with a string and on submit I am calling a Struts 2 action. In that action I am creating a QRCode image using QRGen library as below

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

my JSP form:

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

My action Mapping struts.xml :

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

My Action class:

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;
}
}

Now if result is success that I want to display this image on my JSP.

<s:property value="QRImg"/>

It seems you need the action the <s:url from that you could substitute in the <img tag as href attribute to retrieve the image similar to use static images like in the /images folder.

Let's call it ImageAction . This is a simple action that writes to the response out. To use it you need to put the file with image into the session. Because images are retrieved by the separate threads. In the execute method write

@Action(value = "image",  interceptorRefs = @InterceptorRef("basicStack"))
public class ImageAction extends ActionSupport {

public String execute() {

Get the file from the session

File file = session.get("file");

then you need to read file

FileInputStream fis = new FileInputStream(file);
byte[] data = new byte[fis.available()];
fis.read(data);
fis.close();

then write to the response out

response.setContentType("image/png");

BufferedImage bi;
OutputStream os = response.getOutputStream();
bi = ImageIO.read(new ByteArrayInputStream(data));
ImageIO.write(bi, "PNG", os);
os.flush();

and return NONE result because this action only writes to the response

return NONE;
}

done

then in the JSP forwarded from your action just use <img src="<s:url action="image"/>" style="width:100%;"/> . If you need to add path then use namespace annotation on the action and attribute in the url.

I feel you are familiar with the session concept in the Struts2, ie how to inject the session into your action and map objects in it. Map the file object in your action before return the result.

Good luck.

you need to use the 'org.apache.struts2.dispatcher.StreamResult' in struts2. Basically in your action read the image and populate an InputStream. also setup other variables you require to correctly configure the 'stream' result. Use these in action mapping to property configure the result which would be of type 'stream'

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM