Создать XML с JSF - PullRequest
       17

Создать XML с JSF

6 голосов
/ 25 августа 2009

Мне нужно отправить XML в браузер с моим приложением JSF. Этот XML генерируется приложением. Я пытаюсь создать его, но мое приложение JSF каждый раз отправляет HTML.

Как изменить тип содержимого для отправки xml?

Спасибо за вашу помощь.

Ответы [ 5 ]

7 голосов
/ 25 августа 2009

Есть несколько способов сделать это. Делать это в JSP немного неприятно.

Как уже упоминалось, вы можете использовать Servlet и вводить / загружать туда свои переменные. Например, доступ к контексту сеанса:

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>.

3 голосов
/ 25 августа 2009

Вы можете установить тип контента в вашем 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-компонентов из вашего базового компонента, как это обычно делается для JSP с выводом HTML.

0 голосов
/ 11 сентября 2014

Вот вам пример кода для этого в лицевой стороне :

<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 так, как они есть.

0 голосов
/ 25 августа 2009

Вам необходимо указать тип контента (с. 14.17) возвращаемой страницы как text/xml. В настоящее время он будет установлен как text/html.

Браузеры использовали различные механизмы для определения типа возвращаемых данных, но правильный, самый надежный способ - установить заголовок HTTP Content-type.

Извините, я не знаком с JSF, поэтому не могу посоветовать, как это исправить, но сейчас у вас есть что посмотреть!

0 голосов
/ 25 августа 2009

Я бы хотел, чтобы сервлет возвращал XML, а не JSF. Я принимаю JSF (и JSP и любой другой уровень пользовательского интерфейса) как возвращающий «читаемый человеком» контент. XML является машиночитаемым.

RE: Данные сессий - я никогда не делал этого, не использовал JSF, просто знаю, что это слой пользовательского интерфейса, но Google быстро возвращает: http://blogs.oracle.com/chrisf/entry/retrieving_jsf_session_variables_in

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...