2012-07-08 40 views
1

到目前为止,我已成功地使用Apache Wink设置基本的Web服务。这包括根据提供的样本返回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作为参数。我知道我在这里错过了一些东西,因为我认为Apache Wink可以与基于JSP的Web服务进行互操作。 Wink文档通常很好,但我找不到任何关于此的内容。感谢您的任何帮助,理想情况下,链接到一个工作示例。

回答

0

没有内置的机制来传递POJO作为参数。您需要自己构建URI。另外,我想你想发送重定向到你的jsp,而不仅仅是200 OK。所以,你可以做这样的事情:

@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建立一个查询字符串:key=value&key1=value

您还可以使用UriBuilder.queryPatam一个添加参数之一。

+0

嗨,谢谢你的回复。在URI中返回输出意味着我们将被迫公开URI字符串中的所有输出参数(即,显示在用户的浏览器位置栏中),而不是将该信息隐藏在Web服务和JSP。这看起来并不是很平静,更重要的是,我们希望纯粹在服务和JSP之间保留一些隐私信息。 – 2012-07-08 23:14:08

+0

你也可以从头文件返回它并从jsp访问头文件。所以私人信息不会出现在网址中。 – Tarlog 2012-07-09 07:19:20

0

最后我通过玩弄通过观察表情的DefectAsset例如获得一些想法找到了解决办法。线索是HtmlDescriptor类,它可以在Wink的内部API中找到。

我提供我的豆作为一个资产的构造函数中的参数(即一类注明“@Asset”),然后直接通过资产通过对JSP作为响应实体:

MyBean mybean = service.getBean(id); 
return Response.seeOther(new URI(baseurl+"Output.jsp")) 
     .entity(new MyAsset(bean)) 
     .type(MediaType.APPLICATION_XHTML_XML).build(); 

这需要MyAsset.java的方法:

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

和output.jsp的,我获得通过作为HtmlDescriptor的构造函数的第三个参数提供的属性名称访问Bean:

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

在JSP中,我使用HTML表单中的返回值,所以我使用Apache Commons Lang的StringEscapeUtils.escapeHtml()方法将它们转义。返回的URI不包括除了用于指定媒体类型的“?alt=application%2Fxhtml%2Bxml”之外的RESTful路径。

这似乎说明如何通过一个POJO到通过Apache表情输出JSP。

+0

只有当jsp和您的REST应用程序在同一台服务器上是同一个Web应用程序时,此解决方案才能工作。 – Tarlog 2012-07-09 07:25:10

+0

在这个项目中,JSP是同一个Web应用程序的一部分,但我理解你的观点。我可能会尝试使用上面提到的HTTP标头方法来看看它是如何工作的。谢谢你的帮助! – 2012-07-09 21:48:38