【问题标题】:JSF + JSON: Output "plain" text in servlet?JSF + JSON:在servlet中输出“纯”文本?
【发布时间】:2012-01-11 13:57:18
【问题描述】:

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

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

我想出的唯一解决方案是使用 HttpServlet 并将其注册到 web.xml 中的服务 URL。这种方法有效,并且确实返回了一个没有任何标记的文件,但我宁愿使用我的 Spring 注入的 ManagedProperties,也不愿被限制在 WebApplicationContextUtils 中。

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

【问题讨论】:

    标签: javascript json jsf facelets


    【解决方案1】:

    有办法。但这是丑陋的,本质上是滥用 JSF/Facelets,因为使用了错误的工具来完成这项工作。

    例如

    <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 允许您通过 @Inject 在任何地方注入 @Named bean,即使是简单的 @WebServlet

    另见:

    【讨论】:

    • 我想我可以添加 JAX-RS Web 服务,因为我已经在使用 JAX-WS,但是您的解决方案对我来说也没有那么难看。 Spring 的 HttpRequestHandlerServlet 也允许我注入 bean。像往常一样猜测没有真正的解决方案,我将不得不根据性能和可维护性进行选择。
    • 我忘了提到我无法在 JAX-RS Web 服务中访问 JSF ManagedProperties。我对所有这些组件仍然不够了解,但我尤其是 JS 和 JSON 确实需要会话(-objects),所以这很奇怪。
    【解决方案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>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-02-03
      • 2013-04-01
      • 2013-03-31
      • 1970-01-01
      • 2013-09-27
      • 1970-01-01
      • 1970-01-01
      • 2011-08-20
      相关资源
      最近更新 更多