您的问题可以分为以下子步骤:
BufferedImage
从您的保存数据的字节数组中创建;
- 正确编码数据,使其在作为字符串发送到服务器时不会被损坏/修改,例如使用Apache Commons Base64 编解码器;
- 通过 Applet 到 JavaScript 的通信将数据保存为隐藏的表单字段;
- 向服务器发送 POST 请求,例如触发
<h:commandButton>
's onclick
;
- 以标准 JSF 方式将编码字符串写入 java bean 属性;
- 将字符串解码,得到代表图像的字节数组;
- 从字节数组重新创建图像并将其注入您的视图范围 bean。
也就是说,让我们继续实施该议程。
在您的小程序中,您将有一个方法可以执行第 (1) - (4) 点。获取图像后,以通常的方式调用它:
Java小程序方法:
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 页面(表单和 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>
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;
}
}