2012-07-08 2 views
1

Apache Wink을 사용하여 기본 웹 서비스를 설정하는 데 성공했습니다. 여기에는 제공되는 샘플에 따라 Atom, JSON, HTML, XHTML, XML 및 일반 텍스트 미디어 유형 반환이 포함됩니다. 또한 MessageBodyWriter를 사용하여 "수동으로"XHTML 출력을 생성 할 수있었습니다. 지금까지, 위대한. 기존 Wink 메커니즘을 통해 대부분의 미디어 유형을 반환하게되어 기쁩니다.JSP를 사용하여 Apache Wink에서 XHTML 출력을 리턴하는 방법은 무엇입니까?

내가 지금하려는 것은 반환 된 XHTML 콘텐츠가 JSP를 사용하도록하는 것입니다. 즉, 출력 템플릿으로 JSP를 사용하고 POJO를 매개 변수로 보내 JSP의 필드를 채우고 싶습니다. 아래는 내가 지금 가지고있는 것에 대한 의사 코드입니다.

@Path("{id}") 
@GET 
@Produces({MediaType.APPLICATION_XHTML_XML}) 
public Response getXhtml(@PathParam("id") String id) 
{ 
    try { 
     MyBean mybean = service.getBean(id); 
     return Response.ok(new MyAsset(mybean)) 
       .location(new URI(baseurl+"Output.jsp")) 
       .type(MediaType.APPLICATION_XHTML_XML).build(); 
    } catch (Exception e) { 
     throw new WebApplicationException(e,Status.INTERNAL_SERVER_ERROR); 
    } 
} 

그냥 JSP를 완전히 무시하는 것 같습니다. 그리고 마침내 어떻게하는지 알아 내면 POJO를 매개 변수로 전달하는 방법을 알아야합니다. 아파치 윙크가 JSP 기반 웹 서비스와 상호 운영 할 수 있다고 가정 할 때, 필자가 여기서 빠져있는 것이있다. Wink 문서는 일반적으로 훌륭하지만이 부분에 대해서는 아무 것도 찾을 수 없습니다. 도움을 주셔서 감사합니다. 이상적인 예로는 작동 예제에 대한 링크가 있습니다.

답변

0

POJO를 매개 변수로 전달하는 기본 제공 메커니즘이 없습니다. URI를 직접 만들어야합니다. 또한 200 OK뿐만 아니라 jsp로 리다이렉트를 보내고 싶습니다. 그래서 당신은 같은 것을 할 수 있습니다 key=value&key1=value

당신은 하나에 의해 매개 변수 하나를 추가 할 수 UriBuilder.queryPatam를 사용할 수 있습니다

@Path("{id}") 
@GET 
@Produces({MediaType.APPLICATION_XHTML_XML}) 
public Response getXhtml(@PathParam("id") String id) 
{ 
    try { 
     MyBean mybean = service.getBean(id); 
     return Response.seeOther(UriBuilder.fromUri(baseurl+"Output.jsp") 
       .replaceQuery(convertMyBeanToQuery(mybean)).build()) 
       .type(MediaType.APPLICATION_XHTML_XML).build(); 
    } catch (Exception e) { 
     throw new WebApplicationException(e,Status.INTERNAL_SERVER_ERROR); 
    } 
} 

당신은 쿼리 문자열을 구축 convertMyBeanToQuery를 구현해야합니다.

+0

안녕하세요. 회신 해 주셔서 감사합니다. URI에서 출력을 반환한다는 것은 웹 서비스와 웹 서비스 사이의 통신에서 해당 정보를 숨기지 않고 URI 문자열에 모든 출력 매개 변수를 표시해야한다는 것을 의미합니다 (예 : 사용자의 브라우저 위치 표시 줄에 표시됨). JSP. 이것은 매우 안심할 것 같지 않으며, 더 중요한 것은 우리가 서비스와 JSP 사이에 유지하고자하는 개인 정보를 노출한다는 것입니다. –

+0

또한 헤더로 리턴하고 jsp에서 헤더에 액세스 할 수 있습니다. 따라서 개인 정보는 URL에 나타나지 않습니다. 는 JSP와 REST 응용 프로그램이 동일한 서버에 동일한 웹 응용 프로그램 인 경우 – Tarlog

0

결국 윙크의 DefectAsset 예제를 살펴보면 몇 가지 아이디어를 가지고 해결책을 찾았습니다. 실마리는 HtmlDescriptor 클래스였습니다.이 클래스는 Wink의 내부 API에 있습니다.

MyBean mybean = service.getBean(id); 
return Response.seeOther(new URI(baseurl+"Output.jsp")) 
     .entity(new MyAsset(bean)) 
     .type(MediaType.APPLICATION_XHTML_XML).build(); 
: 다음 응답의 엔티티로 직접 JSP를 통해 자산을 통과, (즉, 클래스가 " @Asset를"주석) 내가 자산의 생성자의 인수로 내 빈을 제공하고있어

0 :
@Produces({MediaType.APPLICATION_XHTML_XML}) 
public HtmlDescriptor getHtml() 
{ 
    return new HtmlDescriptor(bean,"/Output.jsp","MyBeanPayload"); 
} 

및 Output.jsp에서

, 내가 HtmlDescriptor의 생성자에서 세 번째 인수로 제공되는 속성 이름을 통해 빈에 액세스 :

이 MyAsset.java의 방법이 필요

<% 
    MyBean bean = (MyBean)request.getAttribute("MyBeanPayload"); 
    String id = bean.getId(); 
%> 

JSP에서는 HTML 형식으로 반환 된 값을 사용하므로 Apache Commons Lang의 StringEscapeUtils.escapeHtml() 메서드를 사용하여 이스케이프 처리합니다. 반환 된 URI는 미디어 유형을 지정하는 데 사용되는 "?alt=application%2Fxhtml%2Bxml"이 추가 된 RESTful 경로를 제외하고는 아무 것도 포함하지 않습니다.

이것은 Apache Wink를 통해 POJO를 출력 JSP로 전달하는 방법을 보여줍니다.

+0

이 솔루션은 작동합니다. 이 프로젝트 JSP를에서 – Tarlog

+0

같은 웹 응용 프로그램의 일부입니다,하지만 난 당신의 점을 이해합니다. 위에서 언급 한 HTTP 헤더 접근 방식을 사용하여 어떻게 작동하는지 확인할 수 있습니다. 당신의 도움을 주셔서 감사합니다! –