JSF + JSON:在servlet中输出“plain”文本?

时间:2011-12-02 14:45:02

标签: javascript json jsf facelets

我正在尝试将Mootools( Request.JSON )与JSF一起使用 - 主要是因为我前段时间在CakePHP中编写了一个类似的应用程序,并希望重用大部分JS部分。 / p>

有没有办法使用类似无标记facelet的请求返回纯文本(“application / json”)?

我提出的唯一解决方案是使用 HttpServlet 并将其注册到web.xml中的服务URL。这种方法可以正常返回一个没有任何标记的文件,但我宁愿使用我注入Spring的ManagedProperties而不是限制在WebApplicationContextUtils。

我错过了什么或是推荐的方式吗?

2 个答案:

答案 0 :(得分:5)

有一种方法。但是使用错误的工具就像使用JSF / Facelets一样丑陋且基本上滥用它。

E.g。

<ui:composition
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:ui="http://java.sun.com/jsf/facelets">
    <f:event type="preRenderView" listener="#{bean.renderJson}" />
</ui:composition>

public void renderJson() throws IOException {
    FacesContext facesContext = FacesContext.getCurrentInstance();
    ExternalContext externalContext = facesContext.getExternalContext();
    externalContext.setResponseContentType("application/json");
    externalContext.setResponseCharacterEncoding("UTF-8");
    externalContext.getResponseOutputWriter().write(someJsonString);
    facesContext.responseComplete();
}

使用JAX-RS Web服务要好得多。我不确定Spring托管bean是否可以注入,但是新的Java EE 6 CDI允许您在@Named之前的所有地方注入@Inject个bean,即使在简单的@WebServlet中也是如此。

另见:

答案 1 :(得分:2)

如果你想使用facelets,你可以这样做。 (我不知道Spring注入的bean是否有效,但是如果添加@named或@managedBean,那么它应该可以在facelet中访问)

<f:view contentType="application/json" xmlns:f="http://java.sun.com/jsf/core" >
{ test : 'value' ,
 some : #{someBean.someValue} }
 </f:view>