JSF + JSON: Вывести «простой» текст в сервлете? - PullRequest
3 голосов
/ 02 декабря 2011

Я пытаюсь использовать Mootools ( Request.JSON ) вместе с JSF - главным образом потому, что некоторое время назад я написал подобное приложение на CakePHP и хотел бы повторно использовать большую часть JS.

Есть ли способ вернуть простой текст ("application / json"), используя запрос от чего-то вроде безлицензионной лицевой стороны?

Единственное решение, которое я придумалиспользовал HttpServlet и регистрировал его на URL службы в web.xml.Этот подход работает и действительно возвращает файл без какой-либо разметки, но я бы предпочел использовать свои ManagedProperties, внедренные Spring, а не ограничиваться WebApplicationContextUtils.

Я что-то пропустил или это рекомендуемый способ?

Ответы [ 2 ]

5 голосов
/ 02 декабря 2011

Есть способ. Но это уродливо и по сути злоупотребление JSF / Facelets, как при использовании неправильного инструмента для работы.

* 1003 Е.Г. *

<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. Я не уверен, что управляемые bean-компоненты Spring могут быть внедрены там, но новый Java EE 6 CDI позволяет вводить bean-компоненты @Named везде @Inject, даже в простой @WebServlet.

Смотри также:

2 голосов
/ 24 июля 2012

Если вы хотите использовать Facelets, вы можете сделать это следующим образом.(Я не знаю, работают ли бины с инжекцией пружины, но если вы добавите @ named или @managedBean, тогда они должны быть доступны в лицевой стороне)

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