2009-08-25 25 views
5

Tôi cần gửi XML tới trình duyệt bằng ứng dụng JSF của mình. XML này được tạo ra bởi ứng dụng. Tôi cố tạo nó nhưng ứng dụng JSF của tôi gửi HTML mỗi lần.Tạo XML với JSF

Tôi làm cách nào để thay đổi loại nội dung để gửi xml?

Cảm ơn sự giúp đỡ của bạn.

Trả lời

7

Có một số cách để thực hiện việc này. Làm điều đó trong JSP là một chút khó chịu.

Như đã đề cập, bạn có thể sử dụng Servlet và tiêm/tải các biến của bạn trong đó. Ví dụ như bằng cách truy cập bối cảnh phiên:

MyBean myBean = (MyBean)FacesContext.getCurrentInstance() 
         .getExternalContext().getSessionMap().get("myBean"); 

Hoặc bạn có thể đầu ra nó vào HTTP Response từ một phương pháp trong Sao bạn Bean. Ví dụ:

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(); 
} 

Hoặc nếu bạn đang sử dụng Facelets bạn có thể thiết lập các loại phản ứng trong thẻ <f:view>.

+0

Tại sao thẻ JSP "khó chịu"? Nếu bạn có một trang cung cấp XML thì nó có vẻ giống như điều hợp lý để làm? Tôi đoán nó sẽ tóm tắt xem liệu anh ta muốn xuất ra một luồng XML như trong ví dụ của bạn hay liệu anh ta muốn xác định cấu trúc XML trong JSP và sử dụng bean sao lưu của mình để điền vào các phần tử dữ liệu. –

+0

Đúng. Có thể có một số tình huống khi hiển thị nó trên trang có thể "hữu ích" nhưng IMO thường khó chịu. Cũng tương tự khi thực hiện nó thông qua Facelets hoặc bất kỳ khung nhìn "view" nào khác. – Damo

0

Tôi sẽ có một servlet trả về XML thay vì các công cụ JSF. Tôi lấy JSF (và JSP và bất kỳ lớp UI nào khác) khi trả lại nội dung "có thể đọc được". XML là máy có thể đọc được.

RE: phiên dữ liệu - Tôi chưa bao giờ làm điều này, không được sử dụng JSF chỉ biết nó như là một lớp giao diện người dùng, nhưng một cách nhanh chóng trở lại google: http://blogs.oracle.com/chrisf/entry/retrieving_jsf_session_variables_in

0

Bạn cần phải xác định content-type của (giây 14,17). trang trở về là text/xml. Nó hiện sẽ được đặt là text/html.

Trình duyệt đã sử dụng nhiều cơ chế khác nhau để xác định loại dữ liệu được trả về, nhưng cách phù hợp, đáng tin cậy nhất là đặt tiêu đề HTTP Content-type.

Tôi xin lỗi - Tôi không hiểu biết về JSF, vì vậy tôi không thể tư vấn về cách khắc phục điều này, nhưng nó cung cấp cho bạn một cái gì đó để tìm kiếm ngay bây giờ!

+0

Có Tôi muốn đặt loại nội dung này nhưng tôi không biết làm điều này trong trang JSF. – Kiva

3

Bạn có thể đặt loại nội dung trong JSP của mình. Tôi cho rằng bạn đang sử dụng JSP và tạo nội dung xml từ bean sao lưu? Một JSP như sản lượng sẽ XML này:

<%@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> 

Bạn có thể sau đó dễ dàng thay đổi các giá trị mã hóa cứng là giá trị đậu từ sự ủng hộ-đậu của bạn theo cách bạn thường làm cho JSP HTML xuất ra.

+0

Ok tôi sẽ thử điều này;) – Kiva

0

đây bạn đã có một số mẫu mã để làm điều đó trong một 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> 

Giống như cách nó khi vẽ HTML, JSF đánh giá thẻ riêng của mình và làm cho thẻ xml của bạn để sử dụng như họ đang.