2013-07-16 5 views
0

this question에 주석으로 게시하려했으나 충분한 담당자가 없으며 다른 방법을 찾지 못했지만 새로운 질문을 던집니다.이미지를 JSF 빈에서 Applet으로 전달하십시오.

어쨌든, 난 skuntsel 쓴 솔루션을 시도했지만 뒤로 : (나는이 JavascriptContext.addJavascriptCall(FacesContext.getCurrentInstance(), functionCall)처럼라고 그래서 내가 icefaces를 사용하고) 나는 이미지를 인코딩 및 자바 스크립트 방법 빈에서 보냈습니다. 애플릿에서 인코딩 된 문자열을 얻었지만 해독하려고하면 아무 일도 일어나지 않고 그 뒤에 오는 코드는 도달 할 수 없습니다.

나는 뭔가를 놓친가요? 미리 감사드립니다!

편집 : 여기에 제가 사용하고있는 코드가 있습니다. 빈에서

: (버튼 클릭에 의해 트리거 방법) 자바 스크립트에서

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

:

public void decodeImage(String image) { 
    System.out.println(image); //works 
    byte[] imageByteArray = Base64.decodeBase64(image); 
    System.out.println("something"); //doesn't print anything 
    InputStream is = new ByteArrayInputStream(imageByteArray); 

    try { 
     BufferedImage img = ImageIO.read(is); 
     ImageIO.write(img, "png", new File("D:/image.png")); 
      is.close(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
      } 

} 
+0

당신의 문제는 명확하지 않다. 컨텍스트를 확장하고 질문에 코드를 추가하십시오. 그리고 네, 당신이 언급 한 대답에서 논리를 되돌립니다. – skuntsel

+0

코드 추가 : – v30

답변

0

유일한 의심스러운 부분은 JavascriptContext.addJavascriptCall(FacesContext.getCurrentInstance(), functionCall);입니다. 나는 functionCall 정의가 보이지 않습니다. 그럼에도 불구하고 functionCall"getEncodedImage(" + image + ")"으로 바꾸면 제대로 작동합니다.

내가 어떻게 JavascriptContext#addJavascriptCall() 작품에 대한 새로운 아무 말도 ICEfaces와 함께 일하지 않은,하지만 표준 JSF 솔루션이 : 작업 방법에 설정되어있는 인코딩 된 문자열을 포함하는 숨겨진 입력을 가지고 AJAX를 통해 JS 콜백을 추가합니다.

즉, 빈 부분 :

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

숨겨진 입력을 시도했는데 그 결과가 같았 기 때문에 이것이'addJavascriptCall()'을 선택한 이유입니다. functionCall은 javascript 호출을 작성하는 함수의 결과이며, 결과는'getEncodedImage (imageAsString);'와 같습니다 (여기서 imageAsString은 실제 인코딩 된 이미지 임). 어쨌든, 나는 다른 접근법을 사용하라는 말을 들었지만, 왜 이것이 효과가 없는지에 대해서는 여전히 궁금합니다. – v30

관련 문제