2013-07-09 106 views
2

我正在使用一個Web應用程序,其中有一個Java Applet,可將來自wacom設備的圖像捕獲到RenderedImage對象中。該applet本身嵌入到JSF 2.0頁面中。如何將圖像從Applet傳遞給JSF支持bean

我需要將創建的RenderedImage從Applet傳遞給JSF支持bean,以便它成爲User對象的一部分。我的支持bean是視圖範圍。

我真的迷失了這個。我一直在尋找一個很好的例子來說明如何實現這個目標。我應該使用JSObject,還是應該將圖像發送給servlet?

你能否就如何解決這個問題提供一些建議?

+0

您是否設法使解決方案正常工作? – skuntsel

回答

7

您的問題可以分爲以下幾個子步驟:

  1. 創建從BufferedImage所持有其數據的字節數組;
  2. 對數據進行正確編碼,以便在將其作爲字符串發送到服務器時不會被損壞/修改,例如使用Apache Commons Base64 codec;
  3. 通過Applet-to-JavaScript通信將數據保存爲隱藏的表單域;
  4. 通過例如觸發<h:commandButton>onclick向服務器發送POST請求;
  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 */ 
} 

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

} 
+0

+1爲您的努力。 :) –

+0

@AndrewThompson謝謝!讓我感到有趣的是,在發佈一個問題後,OP有時似乎完全失去了對它的興趣,根本沒有提供任何反饋。儘管如此,在stackoverflow上瀏覽幾乎沒有任何結果關於這個話題,所以我認爲這將是很好的有一個小案例,解決了這個問題:) – skuntsel

+0

謝謝!!!!!!!!直到今天我會測試你的解決方案,我的wacom dll的:\失敗了,我無法從pad加載圖像,導致dll的加載失敗,原因不明,直到今天我解決了這個問題,再次感謝。 –

相關問題