2012-10-01 13 views
10

क्या किसी को पता है कि वेग के साथ विभिन्न पथों से टेम्पलेट प्राप्त करना संभव है? प्रारंभ करने के बाद वेग "file.resource.loader.path" को बदलने से इंकार कर देता है।वेग, विभिन्न टेम्पलेट पथ

public Generator(){   
    Properties p = new Properties(); 
     p.setProperty("resource.loader", "file"); 
     p.setProperty("file.resource.loader.class", "org.apache.velocity.runtime.resource.loader.FileResourceLoader"); 
     p.setProperty("file.resource.loader.path", ""); 

    Velocity.init(p); 
} 

टेम्पलेट्स विभिन्न स्थानों में स्थित हो सकता है (उपयोगकर्ता एक फ़ाइल संवाद के साथ एक को चुन सकते):

यह मेरा कोड है। तो मेरे पास टेम्पलेट को

private Template fetch (String templatePath) { 
    out_println("Initializing Velocity core..."); 
    int end = templatePath.lastIndexOf(File.separator); 

    Properties p = new Properties(); 
     p.setProperty("file.resource.loader.path", templatePath.substring(0, end)); 
    Velocity.init(p); 

    return Velocity.getTemplate(templatePath.substring(end+1)); 
} 

से टेम्पलेट लाने पर यह कोड है। यह काम नहीं कर रहा है। ऐसा लगता है कि एक बार वेग शुरू हो जाने पर इसे विभिन्न गुणों के साथ रीसेट नहीं किया जा सकता है। इस समस्या को हल करने के बारे में कोई सुझाव?

संभावित कार्यक्रम प्रवाह:

  1. उपयोगकर्ता समूह टेम्पलेट
  2. उपयोगकर्ता (HDD पर कहीं भी स्थित हो सकता है)
  3. उपयोगकर्ता प्रेस उपयोग करने के लिए एक टेम्पलेट का चयन करता है में भरे जाने की जरूरत है कि चयन करता है

उत्तर

18

वेग दो तरीकों से उपयोग किया जा सकता है: singleton model or the separate instance model। आप वर्तमान में सिंगलटन मॉडल का उपयोग कर रहे हैं जिसमें JVM में वेग इंजन के केवल एक उदाहरण की अनुमति है।

इसके बजाय, आपको अलग-अलग उदाहरण मॉडल का उपयोग करना चाहिए जो आपको विभिन्न टेम्पलेट निर्देशिकाओं का समर्थन करने के लिए एक ही JVM में वेग के कई उदाहरण बनाने की अनुमति देता है।

VelocityEngine ve = new VelocityEngine(); 
ve.setProperty(RuntimeConstants.FILE_RESOURCE_LOADER_PATH, "path/to/templates"); 
ve.init(); 
Template t = ve.getTemplate("foo.vm"); 
+0

मैंने पाया यह कुछ ही समय बाद .. यह है कि के रूप में सरल है में पहली और फिर path1 में टेम्पलेट के लिए दिखेगा। धन्यवाद! – Arninja

2

सिंगलटन Velocity कक्षा बनाने और नएको प्रारंभ करने के बजाय क्लाइंट का उपयोग करने पर विचार करें चरण 3 से पहले3.

0

मेरे मामले में मैं एक्लिप्स डायनेमिक वेब प्रोजेक्ट में सर्वलेट्स के साथ वेग का उपयोग कर रहा हूं।
मैं वास्तव में पथ को रीसेट नहीं कर सका, लेकिन मैं/वेबकंटेंट फ़ोल्डर के तहत एक उपनिर्देशिका डाल सकता हूं और फिर अपने टेम्पलेट्स को इस तरह व्यवस्थित कर सकता हूं ... और उपनिर्देशिका नेस्टेड भी किया है।

RequestDispatcher requestDispatcher = 
request.getRequestDispatcher("/velocity_templates/index.vm"); 

यह सरल उपाय सब मैं की जरूरत थी ... web.xml में velocity.properties साथ गड़बड़ या उन्हें प्रोग्राम के रूप में स्थापित करने की जरूरत नहीं थी (प्रत्येक मामले में, न तो दृष्टिकोण दुर्भाग्य से मेरे लिए काम किया जब मैं करने की कोशिश की) ।

ध्यान दें कि जब मैं टेम्पलेट करता हूं तो #parse (..) कमांड के साथ शामिल होता है, तो मुझे टेम्पलेट .vm फ़ाइल के अंदर उसी पथ उपसर्ग का उपयोग करने की आवश्यकता होती है जैसा मैंने अपने सर्वलेट के लिए उदाहरण कोड में किया था।

2

ऊपर अंक को जोड़ना:

यहां तक ​​कि अगर एक VelocityEngine वस्तु का उपयोग कर यानी गैर सिंगलटन मॉडल का उपयोग कर रहा है। संपत्ति को अल्पविराम से अलग मूल्य देकर एकाधिक पथ कॉन्फ़िगर किए जा सकते हैं।

[file.resource.loader.class=path1,path2] 

ऐसी स्थिति में वेग इंजन Path2

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