2010-05-27 2 views
0

tapestry5에 Java 소켓을 구현하려면 어떻게해야합니까? 내가 원하는 무엇 내가 자바 스크립트 코드의 조각을 통해, 통해 XMLHttpRequest의를 보낼 수있는 소켓을 만드는 것입니다.tapestry5에서 Java 소켓을 사용하는 방법은 무엇입니까?

function sendPost(url, postdata, callback) { 

xmlHttp=GetXmlHttpObject() 

if (xmlHttp==null) { 
    alert ("Browser does not support HTTP Request") 
    return 
} 

xmlHttp.onreadystatechange=callback 
xmlHttp.open("POST",url,true) 
xmlHttp.send(postdata); 

} 

여기서 URL은 방금 만든 소켓입니다. 소켓의

+0

달성하고자하는 것에 대해 더 자세히 설명 할 수 있습니까? – mdma

답변

0

를 사용하여 웹 애플리케이션보기 프레임 워크의 독립적 인 - 당신이보기 코딩 방법에 관계없이 거의 같은 방법으로 그것을 할 것입니다. 소켓을 사용하는 코드를 구현하면 변경되는 유일한 방법은 호출 방법입니다.

난 태피 스프링을 사용하고 있으므로, 스프링 컨텍스트에 서비스를 분사하는 가장 자연스러운 방법이다.

태피스트리의 서브 패키지는 주로 인코더, 속성 도관 및 바인딩 팩토리와 같이 태피스 트리에 연결되는 구현을 만드는 데 사용됩니다. 그래서 당신이 이것을 사용하든 사용하지 않든간에 당신이 성취하고자하는 것에 달려 있습니다.

예를 들어, 소켓에서 읽고 데이터를 렌더링하는 구성 요소를 만드는 경우 components 하위 패키지에 일반 구성 요소로 만들 수 있습니다.

+0

내가하고 싶은 것은 자바 스크립트 코드를 통해 XmlHttpRequest를 보낼 수있는 소켓을 만드는 것이다. 다음 기능 sendPost (URL, POSTDATA, 콜백) 등 { \t xmlHttp.open ("POST", MYSOCKET, TRUE); \t xmlHttp.send (postdata); } 여기서 MYSOCKET은 내가 만든 Java 소켓입니다! 도움이 될 것입니다! – shane87

+0

사용자의 브라우저에서 소켓을 열려고합니까? 그것은 당신의 질문에서 분명하지 않다. 자신 만의 구성 요소를 구현할 수 있습니다. 자바 스크립트를 비롯하여 그 공간에서 거의 모든 것을 렌더링 할 수 있습니다. 자바 스크립트를 출력하는 태피스트리 구성 요소를 만드는 방법은 http://wiki.apache.org/tapestry/Tapestry5AndJavaScriptExplained를 참조하십시오. – mdma

+0

죄송합니다. 아마 문구를 제대로 사용하지 않았으므로 그 이후로 내 질문을 수정했습니다. – shane87

0

는 XMLHttpRequest가. 당신이 태피스트리를 실행하는 데 사용하는 어떤에 의해 완벽하게 잘 처리 할 수있는 웹 서버 요청을 단지 것이다 소켓과 물건을 열 필요가 없습니다.

XmlHttpRequest를 수락하고 핸들러, 서블릿, 컨트롤러 등을 사용하여 필요한 데이터를 수집하고이를 xml로 변환 한 다음 Javascript 구성 요소로 보내도록 wep 애플리케이션의 경로를 정의하면됩니다.

나는 예를 들어

1

그래서 당신은 서버에 클라이언트 코드에서 AJAX 요청을 할 응답을받을 어떤 방법으로 그것을 처리 할 here 발견? 소켓이 필요 없습니다. 대신 Tapestry에 내장 된 AJAX 기능을 사용하십시오. 당신은 자바 스크립트를 통해 페이지 내 추가 콘텐츠를로드하는 경우

는, 기회는 당신이 모든 코드를 작성할 필요가 없습니다 것입니다. AJAX section from the Tapestry docs을 읽었으며 Zone의 정의와 작동 방식을 이해하십시오.

여기에 기본적인 예입니다. 틀 :

<div id="myZone" t:type="Zone" t:id="myZone"> 
     ... [Initial content, if any] ... 
</div> 

<a t:type="ActionLink" t:id="updateContent" t:zone="myZone">Update</a> 

그리고 클래스 :

@Inject 
private Zone myZone; 

@Inject 
private Request request; 

@OnEvent(component = "updateContent") 
Object updateContent() { 
    ... [your code] .... 

    if (this.request.isXHR()) { 
     return this.myZone.getBody(); 
    } else { 
     return this; 
    } 
} 

태피스트리 링크에 적절한 이벤트 리스너를 등록하고 적절한 장소에 업데이트 된 콘텐츠를 삽입과 같은 다른 모든 것을 할 것입니다. if (this.request.isXHR())은 JavaScript가 활성화되지 않은 고객을 위해 degrade gracefully 페이지를 보장합니다.

JSON 객체를 반환하고 자신의 JavaScript 코드로 처리하는 것과 같이 완전히 다른 작업을 수행하려는 경우 these JSON classes 중 하나를 이벤트 처리기에서 반환 할 수 있습니다.

또한 클라이언트 측 코드를 직접 작성하려면 Tapestry와 함께 제공되는 내장형 크로스 브라우저 AJAX functionality of Prototype을 사용해야합니다.의견에 따라

편집 :

당신 때문에 same origin policy의 AJAX를 통해 다른 서버 (호스트 + 포트)에 액세스 할 수 없습니다. 그러나 Tapestry 앱을 통해 호출을 프록시 할 수 있습니다. 이것을 설명하기 위해 코드를 수정했습니다 (포트 2112에서 청취하는 것이 HTTP 서버라고 가정 할 경우 필요에 따라 변경).

@OnEvent(component = "updateContent") 
Object updateContent() throws IOException { 
    final URL url = new URL("http://localhost:2112"); 
    final HttpURLConnection con = url.openConnection(); 

    final String content; 

    InputSteam input = null; 
    try { 
     input = con.getInputStream(); 
     content = IOUtils.toString(input); 
    } finally { 
     IOUtils.closeQuietly(input); 
    } 

    return new StreamResponse() { 
     @Override 
     public String getContentType() { 
      return "text/javascript"; 
     } 

     @Override 
     public InputStream getStream() throws IOException { 
      return new ByteArrayInputStream(content.getBytes("UTF-8")); 
     } 

     @Override 
     public void prepareResponse(Response response) { 
      response.setHeader("Expires", "0"); 
      response.setHeader("Cache-Control", 
       "must-revalidate, post-check=0, pre-check=0"); 
     } 
    } 
} 
+0

@Henning : 다시 도움을 주셔서 감사합니다. 당신은 이전 질문으로 나를 도왔다. - http://stackoverflow.com/questions/2801879/how-do-i-create-a-custom-text-field-in-tapestry5-that-renders-some-javascript-ont - 텍스트 필드에 포커스가있을 때 실행되는 javascript mixin이 있습니다. javascript mixin은 페이지의 HTML canvas 요소에 디코드되고 그려진 XHR 응답을 반환하는 포트를 수신하는 jar에 요청을 보내야합니다. 수많은 요청과 응답이 필요합니다! AJAX 지원으로 제작 된 태피스 트리를 사용해야합니까? – shane87

+0

@shane : 다른 서버의 데이터를 폴링하고 표시하고 싶습니까? 작동하지 않을까 걱정됩니다. 동일한 도메인과 포트에서만 요청할 수 있습니다 (http://en.wikipedia.org/wiki/Same_origin_policy 참조). 두 번째 웹 서버에 액세스해야하는 경우 서버 측에서 처리해야합니다. 즉, Tapestry 앱이 요청하여 클라이언트에 전달하도록해야합니다. – Henning

+0

@Henning : 항아리가 있습니다. 실행하면 포트 2112에 reuests를 수신합니다. XHR 요청을 보내기 위해 항아리에 소켓 연결을 열고 싶습니다. 항아리는 XHR 응답으로 응답하고 자바 스크립트는이 응답을 디코딩하여 HTML 캔버스 요소 위에 그립니다. 죄송합니다. 제 질문을 선하게 표현하지는 않을 것입니다. 희망은 그것을 조금 더 분명하게한다! – shane87

관련 문제