我创建了一个页面,我想从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>
答案 0 :(得分:38)
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服务。使用正确的工具完成工作。
答案 1 :(得分:4)
我甚至使用contentType =&#34; text / xhtml&#34;使用JSF 2.2,效果很好。 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电话:
$.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 () {
...
}
})
答案 2 :(得分: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>
答案 3 :(得分:2)
你为什么要使用jsf?使用servlet提供JSON。我的建议是使用jaxrs实现,比如cxf。