2009-08-25 11 views
5

के साथ एक्सएमएल बनाएं मुझे अपने जेएसएफ एप्लिकेशन के साथ ब्राउज़र में एक्सएमएल भेजने की जरूरत है। यह एक्सएमएल एप्लिकेशन द्वारा उत्पन्न होता है। मैं इसे बनाने का प्रयास करता हूं लेकिन मेरा जेएसएफ एप्लिकेशन हर बार एचटीएमएल भेजता है।जेएसएफ

मैं xml भेजने के लिए सामग्री-प्रकार कैसे बदल सकता हूं?

आपकी मदद के लिए धन्यवाद।

उत्तर

7

ऐसा करने के कई तरीके हैं। जेएसपी में ऐसा करना थोड़ा बुरा है।

जैसा कि पहले ही उल्लेख किया है आप एक सर्वलेट का उपयोग करें और इंजेक्षन कर सकते हैं/वहाँ में अपने चर लोड। सत्र संदर्भ एक्सेस करके उदाहरण के लिए: अपने बैकअप बीन में एक विधि से HTTP प्रतिक्रिया को

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

या आप कर सकते हैं उत्पादन यह। उदाहरण के लिए:

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> टैग में प्रतिक्रिया प्रकार सेट कर सकते उपयोग कर रहे हैं।

+0

जेएसपी टैग "बुरा" क्यों है? यदि आपके पास एक पृष्ठ है जो एक्सएमएल वितरित करता है तो ऐसा लगता है कि यह तार्किक बात है? मुझे लगता है कि यह आपके उदाहरण में एक एक्सएमएल स्ट्रीम आउटपुट करना चाहता है या फिर वह जेएसपी में एक्सएमएल संरचना को परिभाषित करना चाहता है और डेटा तत्वों को भरने के लिए अपने बैकिंग-बीन का उपयोग करना चाहता है। –

+0

सच है। ऐसी कुछ स्थितियां हो सकती हैं जहां पृष्ठ पर इसे प्रस्तुत करना "उपयोगी" हो सकता है लेकिन आईएमओ आमतौर पर बुरा होता है। फेसलेट या किसी अन्य "व्यू" फ्रेमवर्क के माध्यम से ऐसा करने के लिए भी यही है। – Damo

0

मेरे पास जेएसएफ सामान की बजाय एक सर्वलेट रिटर्न एक्सएमएल होगा। मैं "मानव पठनीय" सामग्री लौटने के रूप में जेएसएफ (और जेएसपी और कोई अन्य यूआई परत) लेता हूं। एक्सएमएल मशीन पठनीय है।

उत्तर: सत्र डेटा - मैंने कभी नहीं यह कर लें, JSF इस्तेमाल नहीं किया सिर्फ एक यूआई परत के रूप में यह पता है, लेकिन एक त्वरित गूगल रिटर्न: http://blogs.oracle.com/chrisf/entry/retrieving_jsf_session_variables_in

0

आप content-type निर्दिष्ट करने की आवश्यकता की (सेकंड 14.17।) वापसी पृष्ठ text/xml के रूप में। इसे वर्तमान में text/html के रूप में सेट किया जाएगा।

ब्राउज़रों ने डेटा के प्रकार को निर्धारित करने के लिए विभिन्न तंत्रों का उपयोग किया है, लेकिन उचित, सबसे विश्वसनीय तरीका HTTP Content-type शीर्षलेख सेट करना है।

मुझे खेद है - मैं जेएसएफ जानकार नहीं हूं, इसलिए मैं इसे ठीक करने के बारे में सलाह नहीं दे सकता, लेकिन यह आपको अभी देखने के लिए कुछ देता है!

+0

हां, मैं इस सामग्री-प्रकार को सेट करना चाहता हूं लेकिन मुझे यह जेएसएफ पृष्ठ में नहीं करना है। – Kiva

3

आप सामग्री-प्रकार को अपने जेएसपी में सेट कर सकते हैं। मुझे लगता है कि आप एक जेएसपी का उपयोग कर रहे हैं और बैकिंग बीन से एक्सएमएल सामग्री बना रहे हैं? इस होगा उत्पादन एक्सएमएल तरह एक JSP:

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

फिर आप आसानी से जिस तरह से आप सामान्य रूप से एचटीएमएल-outputting JSPs के लिए क्या करना होगा में अपने समर्थन बीन से सेम मूल्यों होने के लिए इन हार्डकोडेड मूल्यों को बदल सकता है।

+0

ठीक है, मैं इसे आजमाउंगा;) – Kiva

0

यहाँ आप एक 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> 

तरह जब एचटीएमएल प्रतिपादन यह होता है की तरह, JSF अपनी ही टैग मूल्यांकन करता है और के रूप में उपयोग करने के लिए अपने xml टैग renders वो हैं।