Создание 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-теги для использования в их нынешнем виде.