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

时间:2013-07-09 15:28:15

标签: java jsf jsf-2 applet bufferedimage

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

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

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

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

1 个答案:

答案 0 :(得分:7)

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

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

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

    Java Applet方法:

    onclick

    JSF页面(表单和JavaScript):

    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 */
    }
    

    JSF托管bean:

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