2010-07-28 6 views
15

मैं एक जेएसएफ संदेश में एक लिंक एम्बेड करना चाहता हूं, क्या यह संभव है?एक जेएसएफ संदेश में एक लिंक (या अन्य एचटीएमएल) एम्बेड करना

जब मैं इसे आज़माता हूं, एच के प्रस्तुत एचटीएमएल: संदेश टैग एचटीएमएल अक्षरों से बच निकलता है। मैंने एच के एस्केप विशेषता को सेट करने का प्रयास किया: संदेश टैग को झूठी, लेकिन इससे मदद नहीं मिली।

उत्तर

19

दुर्भाग्यवश, मानक जेएसएफ कार्यान्वयन में यह संभव नहीं है। घटक और रेंडरर आधिकारिक तौर पर इस विशेषता का समर्थन नहीं करता है। हालांकि आप एक रेंडरर को होमग्रो कर सकते हैं जो इसे संभालता है।

चूंकि यह एक बहुत ही सामान्य आवश्यकता/इच्छा है, इसलिए मैंने यह देखने के लिए सोचा कि क्या संभव है।

पहले कुछ पृष्ठभूमि जानकारी: डिफ़ॉल्ट रूप से जेएसएफ टैग बॉडी लिखने के लिए ResponseWriter#writeText() का उपयोग करता है, जो डिफ़ॉल्ट रूप से HTML से बचता है। हम इसे का उपयोग करने की बजाय <h:outputText escape="false" /> के साथ उपयोग करना चाहते हैं। हम मानक जेएसएफ कार्यान्वयन के MessagesRenderer का विस्तार करना चाहते हैं और तदनुसार encodeEnd() विधि को ओवरराइड करना चाहते हैं। लेकिन चूंकि MessagesRenderer#encodeEnd() में बहुत सारे कोड (~ 180 लाइनें) हैं, जिन्हें हम कॉपी करने के लिए प्रतिलिपि बनाना पसंद नहीं करते हैं, बस एक या दो लाइनों को बदलने के बाद, मुझे की मदद से कस्टम कार्यान्वयन के साथ ResponseWriter को प्रतिस्थापित करना बेहतर लगता है जिसमें writeText() भागने को संभालने के लिए अतिरंजित किया गया है।

तो, मैं इस के साथ समाप्त हो गया:

package com.example; 

import java.io.IOException; 

import javax.faces.component.UIComponent; 
import javax.faces.context.FacesContext; 
import javax.faces.context.ResponseWriter; 
import javax.faces.context.ResponseWriterWrapper; 
import javax.faces.render.FacesRenderer; 

import com.sun.faces.renderkit.html_basic.MessagesRenderer; 

@FacesRenderer(componentFamily="javax.faces.Messages", rendererType="javax.faces.Messages") 
public class EscapableMessagesRenderer extends MessagesRenderer { 

    @Override 
    public void encodeEnd(FacesContext context, UIComponent component) throws IOException { 
     final ResponseWriter originalResponseWriter = context.getResponseWriter(); 

     try { 
      context.setResponseWriter(new ResponseWriterWrapper() { 

       @Override 
       public ResponseWriter getWrapped() { 
        return originalResponseWriter; 
       } 

       @Override 
       public void writeText(Object text, UIComponent component, String property) throws IOException { 
        String string = String.valueOf(text); 
        String escape = (String) component.getAttributes().get("escape"); 
        if (escape != null && !Boolean.valueOf(escape)) { 
         super.write(string); 
        } else { 
         super.writeText(string, component, property); 
        } 
       } 
      }); 

      super.encodeEnd(context, component); // Now, render it! 
     } finally { 
      context.setResponseWriter(originalResponseWriter); // Restore original writer. 
     } 
    } 
} 

@FacesRenderer एनोटेशन के बावजूद, यह डिफ़ॉल्ट MessagesRenderer कार्यान्वयन द्वारा ओवरराइड मिलता है। मुझे यहां एक बग पर संदेह है, इसलिए मैंने issue 1748 की सूचना दी। यह वैसे भी काम करने के लिए प्राप्त करने के लिए, हम faces-config.xml में वापस आने का है:

<render-kit> 
    <renderer> 
     <component-family>javax.faces.Messages</component-family> 
     <renderer-type>javax.faces.Messages</renderer-type> 
     <renderer-class>com.example.EscapableMessagesRenderer</renderer-class> 
    </renderer> 
</render-kit> 

फिर, यह गति प्रदान करने के लिए, बस कार्य करें:

<h:messages escape="false" /> 

और यह काम करता है! :)


नोट: उपर्युक्त केवल <h:messages> को प्रभावित करता है। <h:message> के लिए ऐसा करने के लिए, बस वही करें, लेकिन कहीं भी"Messages""Message" (घटक परिवार, रेंडरर प्रकार और श्रेणीनाम) द्वारा प्रतिस्थापित करें।

+0

धन्यवाद बलुस, मैं आज भी उसी समाधान पर पहुंचा (और उसी बग को दायर किया https://javaserverfaces.dev.java.net/issues/show_bug.cgi?id=1750) मैंने प्रतिनिधिमंडल पैटर्न का उपयोग किया मेरा प्रतिक्रिया लेखक, लेकिन मुझे लगता है कि मैं रैपर के साथ क्या किया है पसंद करते हैं। धन्यवाद! –

+0

रिपोर्ट किए गए मुद्दे के लिए एक नया लिंक: http://java.net/jira/browse/JAVASERVERFACES-1750 –

+0

यह पूरी तरह से BalusC काम करता है, धन्यवाद! –

1

escape="false" जिम्मेदार आपको ओमनीफेस <o:messages> component द्वारा प्रदान किया गया है। OmniFaces उपयोगिता लाइब्रेरी जेएसएफ 2 के लिए उपलब्ध है।

मैंने इस समाधान को @ बलुस की टिप्पणी द्वारा उत्तर के रूप में वर्णित किया है क्योंकि यह सबसे सरल समाधान है।

संबंधित मुद्दे