我打算在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);
}
答案 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>