Как отправить и отобразить изображение QRCode из класса действий в JSP в Struts 2

Я отправляю форму JSP со строкой, а при отправке вызываю действие Struts 2. В этом действии я создаю изображение QRCode, используя библиотеку QRGen, как показано ниже.

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

person Sandeep vashisth    schedule 07.03.2013    source источник
comment
Прежде всего, вы показываете изображения с тегом img. Во-вторых, вы либо отправляете его обратно из файла, либо в виде необработанных байтов.   -  person Dave Newton    schedule 07.03.2013
comment
Вы знаете путь, где хранятся изображения?   -  person Roman C    schedule 07.03.2013


Ответы (2)


Кажется, вам нужно действие <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();

и вернуть результат NONE, потому что это действие записывает только ответ

return NONE;
}

Выполнено

затем в JSP, перенаправленном из вашего действия, просто используйте <img src="<s:url action="image"/>" style="width:100%;"/>. Если вам нужно добавить путь, используйте аннотацию пространства имен для действия и атрибута в URL-адресе.

Я чувствую, что вы знакомы с концепцией сеанса в Struts2, то есть с тем, как внедрить сеанс в ваше действие и сопоставить в нем объекты. Сопоставьте файловый объект в своем действии, прежде чем возвращать результат.

Удачи.

person Roman C    schedule 07.03.2013
comment
Struts2 имеет результат stream для отправки необработанных данных. - person Aleksandr M; 07.03.2013

вам нужно использовать «org.apache.struts2.dispatcher.StreamResult» в struts2. В основном в вашем действии прочитайте изображение и заполните InputStream. также настройте другие переменные, необходимые для правильной настройки результата «потока». Используйте их в сопоставлении действий, чтобы настроить свойство результата, который будет иметь тип «поток».

person Dev Blanked    schedule 08.03.2013