Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用JSP从ApacheWink返回XHTML输出?_Java_Jsp_Rest_Jax Rs_Apache Wink - Fatal编程技术网

Java 如何使用JSP从ApacheWink返回XHTML输出?

Java 如何使用JSP从ApacheWink返回XHTML输出?,java,jsp,rest,jax-rs,apache-wink,Java,Jsp,Rest,Jax Rs,Apache Wink,到目前为止,我已经成功地使用创建了一个基本的web服务。这包括根据提供的示例返回Atom、JSON、HTML、XHTML、XML和纯文本媒体类型。我还能够成功地使用MessageBodyWriter“手动”生成XHTML输出。到目前为止,很好。我很高兴通过现有的Wink机制返回大多数媒体类型 我现在要做的是让返回的XHTML内容使用JSP。也就是说,我想使用JSP作为输出模板,通过发送POJO作为参数来填充JSP中的字段。下面是我现在得到的一些伪代码 @Path("{id}") @GET @Pr

到目前为止,我已经成功地使用创建了一个基本的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作为参数传递。我知道这里缺少了一些东西,因为我假设ApacheWink可以与基于JSP的web服务进行互操作。Wink文档一般都很好,但是我找不到关于这个的任何东西。感谢您的帮助,最好是一个指向工作示例的链接。

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

@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
一个接一个地添加参数。

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

我将bean作为参数提供给资产的构造函数(即,一个带注释的类“
@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形式使用返回值,因此我使用ApacheCommonsLang的方法对其进行转义。返回的URI不包括任何内容,除了附加有“
?alt=application%2Fxhtml%2Bxml
”的RESTful路径,该路径用于指定媒体类型


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

您好,谢谢您的回复。在URI中返回输出意味着我们将被迫公开URI字符串中的所有输出参数(即,显示在用户的浏览器位置栏中),而不是在web服务和JSP之间的通信中隐藏该信息。这看起来不是很restful,更重要的是,它公开了一些我们希望仅在服务和JSP之间保留的私有信息。因此,私有信息不会出现在url中。只有当jsp和REST应用程序是同一服务器上的同一web应用程序时,此解决方案才有效。在本项目中,jsp是同一web应用程序的一部分,但我理解您的观点。我可能会尝试使用您上面提到的HTTP头方法,看看它是如何工作的。谢谢你的帮助!