如何将图像从Applet传递给JSF支持bean

Her*_*nal 2 java jsf applet bufferedimage jsf-2

我正在使用一个Web应用程序,其中有一个Java Applet,用于将图像从wacom设备捕获到RenderedImage对象中.applet本身嵌入到JSF 2.0页面中.

我需要将创建RenderedImage的Applet传递给JSF支持bean,以便它成为User对象的一部分.我的支持bean是视图范围.

我真的迷失了.我一直在寻找一个如何实现这一目标的好例子.我应该使用JSObject,还是应该将图像发送到servlet?

你能就如何解决这个问题提出一些建议吗?

sku*_*sel 7

您的问题可以分为以下几个子步骤:

  1. 从BufferedImage保存其数据的数据创建一个字节数组;
  2. 正确编码数据,以便在将数据作为字符串发送到服务器时不会被损坏/修改,例如使用Apache Commons Base64编解码器 ;
  3. 通过Applet-to-JavaScript通信将数据保存为隐藏表单字段;
  4. 发送POST请求到服务器,例如,触发<h:commandButton>'s onclick;
  5. 以标准JSF方式将编码字符串写入java bean属性;
  6. 解码字符串以获取表示图像的字节数组;
  7. 从字节数组重新创建图像并将其注入视图范围的bean中.

也就是说,让我们继续实施该议程.

在你的applet中,你将有一个方法可以做点(1) - (4).获得图像后,以通常的方式调用它:

Java Applet方法:

public void processImage() throws IOException, JSException {
    BufferedImage image = createBufferedImage();//the way you get the image
    /* point 1 */
    ByteArrayOutputStream bs = new ByteArrayOutputStream();
    ImageIO.write(image, "png", bs);
    bs.flush();
    byte[] imageByteArray = bs.toByteArray();
    bs.close();
    /* point 1 */
    String imageAsString = Base64.encodeBase64String(imageByteArray);//point 2
    /* points 3-4 */
    JSObject window = JSObject.getWindow(this);
    window.call("writeImageValue", new Object[] {imageAsString});
    /* points 3-4 */
}
Run Code Online (Sandbox Code Playgroud)

JSF页面(表单和JavaScript):

<script>
    function writeImageValue(imageValue) {
        document.getElementById('image').value = imageValue;//point 3
        document.getElementById('image-form:submit').click();//point 4
    }
</script>
<h:form id="image-form">
    <input type="hidden" id="image" name="image" />
    <h:commandButton id="submit" action="#{imageSubmitBean.submitImage}" style="display:none" />
</h:form>
Run Code Online (Sandbox Code Playgroud)

JSF托管bean:

@ManagedBean
@RequestScoped
public class ImageSubmitBean {

    @ManagedProperty("#{param.image}")//point 5
    private String imageAsString;//getter+setter
    @ManagedProperty("#{userBean}")//your view scoped bean
    private UserBean userBean;//getter+setter

    public String submitImage() throws IOException {
        byte[] imageByteArray = Base64.decodeBase64(imageAsString);//point 6
        /* point 7 */
        InputStream is = new ByteArrayInputStream(imageByteArray);
        BufferedImage image = ImageIO.read(is);
        is.close();
        userBean.setUserImage(image);//update your view scoped bean
        /* point 7 */
        return null;
    }

}
Run Code Online (Sandbox Code Playgroud)