Создание XML с помощью JSF
Мне нужно отправить XML в браузер с моим приложением JSF. Этот XML генерируется приложением. Я пытаюсь создать его, но мое приложение JSF отправляет HTML каждый раз.
Как изменить тип контента для отправки xml ?
Спасибо за помощь.
5 ответов
есть несколько способов сделать это. Делать это в JSP немного неприятно.
как уже упоминалось, вы можете использовать сервлет и inject / load ваши переменные там. Например, путем доступа к контексту сеанса:
MyBean myBean = (MyBean)FacesContext.getCurrentInstance()
.getExternalContext().getSessionMap().get("myBean");
или вы можете вывести его на HTTP Response из метода в вашем бэк-бобов. Например:
try {
String xml = "<person>damian</person>";
FacesContext ctx = FacesContext.getCurrentInstance();
final HttpServletResponse resp = (HttpServletResponse)ctx.getExternalContext().getResponse();
resp.setContentType("text/xml");
resp.setContentLength(xml.length());
resp.getOutputStream().write(xml.getBytes());
resp.getOutputStream().flush();
resp.getOutputStream().close();
ctx.responseComplete();
} catch (IOException e) {
e.printStackTrace();
}
или если вы используете Facelets вы можете установить тип ответа в <f:view>
тег.
вы можете установить тип контента в своем JSP. Я предполагаю, что вы используете JSP и создаете xml-контент из резервного компонента? Такой JSP выводил бы XML:
<%@page contentType="text/xml"%><?xml version="1.0" encoding="UTF-8"?>
<portfolio>
<stock>
<symbol>SUNW</symbol>
<name>Sun Microsystems</name>
<price>17.1</price>
</stock>
<stock>
<symbol>AOL</symbol>
<name>America Online</name>
<price>51.05</price>
</stock>
<stock>
<symbol>IBM</symbol>
<name>International Business
Machines</name>
<price>116.10</price>
</stock>
<stock>
<symbol>MOT</symbol>
<name>MOTOROLA</name>
<price>15.20</price>
</stock>
</portfolio>
затем вы можете легко изменить эти жестко закодированные значения, чтобы они были значениями bean из вашего бэк-Бина, как это обычно делается для вывода HTML-JSPs.
необходимо указать контент-тип (sec. 14.17) возвращающейся страницы как text/xml
. В настоящее время он будет установлен как text/html
.
браузеры использовали различные механизмы для определения типа возвращаемых данных, но правильный, самый надежный способ-установить HTTP Content-type
заголовок.
извините - я не JSF хорошо осведомлен, поэтому я не могу посоветовать, как это исправить, но это дает вам что-то искать сейчас!
У меня был бы сервлет, возвращающий XML, а не материал JSF. Я принимаю JSF (и JSPs и любой другой уровень пользовательского интерфейса) как возвращающий "читаемый человеком" контент. XML является машиночитаемым.
RE: данные сеанса-я никогда этого не делал, не использовал JSF, просто знаю его как слой пользовательского интерфейса, но быстрый google возвращает:http://blogs.oracle.com/chrisf/entry/retrieving_jsf_session_variables_in
здесь у вас есть пример кода, чтобы сделать это в экземпляры facelet:
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:ui="http://java.sun.com/jsf/facelets">
<ui:define name="metadata">
<f:metadata>
<f:event type="preRenderView"
listener="#{clientManager.initialize}" />
</f:metadata>
</ui:define>
<f:view contentType="text/xml">
<ui:repeat var="client" value="#{clientManager.list}">
<client>#{client.name}</client>
</ui:repeat>
</f:view>
</ui:composition>
Как и при рендеринге HTML, JSF оценивает свои собственные теги и отображает ваши XML-теги для использования в их нынешнем виде.