18

我创建了一个页面,我想从 JSF 页面获取 JSON 响应,但是当我尝试获取页面时,它会显示整个 html 页面。

<html xmlns="http://www.w3.org/1999/xhtml"><head>
        <title>Facelet Title</title></head><body>
[{"value": "21", "name": "Mick Jagger"},{"value": "43", "name": "Johnny Storm"},{"value": "46", "name": "Richard Hatch"},{"value": "54", "name": "Kelly Slater"},{"value": "55", "name": "Rudy Hamilton"},{"value": "79", "name": "Michael Jordan"}]

</body></html>
4

4 回答 4

41

JSF 是一个生成 HTML 的 MVC 框架,而不是某种 REST Web 服务框架。您本质上是在将 JSF 作为 Web 服务来滥用。您的具体问题只是由您自己<html>在视图文件中放置标签等引起的。

如果你真的坚持,那么你总是可以通过使用<ui:composition>代替来实现这一点<html>。您还需要确保使用了正确的内容类型application/json,这在 JSF 中默认为text/html.

<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 或 JAX-WS,而不是将 JSF 用作 JSON Web 服务。为工作使用正确的工具。

也可以看看:

于 2012-06-11T15:16:15.520 回答
4

我什至在 JSF 2.2 中使用 contentType="text/xhtml" 并且效果很好。从上面的 BalusC 的答案中不需要 renderJson()

<f:view encoding="UTF-8" contentType="text/html"
    xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://xmlns.jcp.org/jsf/html"
    xmlns:f="http://xmlns.jcp.org/jsf/core">
 <h:outputText value="#{stationView.getClosestStationen(param.longitude, param.latitude)}" escape="false"/>
</f:view>

阿贾克斯调用:

        $.ajax({
            url: requestContextPath + '/rest/stationen.xhtml',
            type: "GET",
            data: {
               "longitude": x,
               "latitude": y
            },
            dataType: "json",
            success: function (data) {
              $.each(data, function (i, station) {
                 ...
              });
            },
            error: function () {
                ...
            }
        })
于 2014-07-11T09:46:20.543 回答
3

我只使用了一个 facelet 作为输出(但 JSF 1.2)

<f:view contentType="application/json" xmlns:f="http://java.sun.com/jsf/core" xmlns:h="http://java.sun.com/jsf/html">
<h:outputText value="#{someBean.getJson()}" escape="false"/>
</f:view>
于 2013-07-18T09:10:40.767 回答
2

你为什么要使用 jsf 呢?使用 servlet 为您的 JSON 提供服务。我的建议是使用 jaxrs 实现,例如 cxf。

于 2012-06-11T15:16:39.770 回答