1

到目前为止,我已经成功地使用Apache Wink设置了一个基本的 Web 服务。这包括根据提供的示例返回 Atom、JSON、HTML、XHTML、XML 和纯文本媒体类型。我还能够成功地使用 MessageBodyWriter 来“手动”生成 XHTML 输出。到目前为止,很棒。我很高兴通过现有的 Wink 机制返回大多数媒体类型。

我现在要做的是让返回的 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 文档通常很好,但我在这方面找不到任何东西。感谢您的帮助,最好是指向工作示例的链接。

4

2 回答 2

0

最后,我通过查看 Wink 的DefectAsset示例获得的一些想法,找到了解决方案。线索就是HtmlDescriptor类,它可以在 Wink 的内部 API 中找到。

我在 Asset 的构造函数中提供我的 bean 作为参数(即,注释为“ @Asset”的类),然后将 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 路径,用于指定媒体类型。

这似乎演示了如何通过 Apache Wink 将 POJO 传递到输出 JSP。

于 2012-07-09T03:48:00.397 回答
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用来一一添加参数。

于 2012-07-08T12:50:53.367 回答