将图像从JSF bean传递给Applet

时间:2013-07-16 14:31:53

标签: java jsf applet

我打算在this question发表评论,但我没有足够的代表,除了提出一个新问题之外我没有别的办法(虽然看起来有点多余)。

无论如何,我尝试了解决方案 skuntsel 写了,但后退:我编码了图像并将其从bean发送到javascript方法(我使用icefaces所以我这样调用它{{ 1}})。我在Applet中得到编码的字符串就好了,但是当我尝试解码它时,没有任何反应,其后面的代码无法访问。

我错过了什么吗?提前谢谢!

编辑:这是我正在使用的代码。

在bean中:(通过按钮点击触发的方法)

JavascriptContext.addJavascriptCall(FacesContext.getCurrentInstance(), functionCall)

在Javascript中:

BufferedImage originalImage = acquireImage();
byte[] imageInByte = null;
ByteArrayOutputStream baos = new ByteArrayOutputStream();
try {
      ImageIO.write( originalImage, "png", baos );
      baos.flush();
      imageInByte = baos.toByteArray();
      baos.close();
} catch (IOException e) {
    e.printStackTrace();
   }

String imageAsString = Base64.encodeBase64String(imageInByte);
JavascriptContext.addJavascriptCall(FacesContext.getCurrentInstance(), functionCall);

在小程序中:

function getEncodedImage(image){
      var applet = document.getElementById("Applet");
      applet.decodeImage(image);
}

1 个答案:

答案 0 :(得分:0)

唯一可疑的部分是JavascriptContext.addJavascriptCall(FacesContext.getCurrentInstance(), functionCall);:我没有看到任何functionCall定义。尽管如此,请将functionCall替换为"getEncodedImage(" + image + ")",它应该有效。

我还没有与ICEfaces合作,对JavascriptContext#addJavascriptCall()的工作方式有什么新的说法,但是有一个标准的JSF解决方案:有一个隐藏的输入,包含在一个动作方法中设置的编码字符串并添加一个JS通过AJAX回调。

即bean部分:

private String imageAsString;//getter + setter
public void encodeImage() {
    ...
    this.imageAsString = Base64.encodeBase64String(imageInByte);
}

观点:

<script>
    function update(data){
        if(data.status == "success") {
            var applet = document.getElementById("Applet");
            var image = document.getElementById("form:image").value;
            applet.decodeImage(image);
        }
    }
</script>
...
<h:form id="form">
    ...
    <h:inputHidden id="image" value="#{bean.imageAsString}" />
    <h:commandButton value="Submit" action="#{bean.encodeImage}">
        <f:ajax render="image" onevent="update" />
    </h:commandButton>
</h:form>