2015-03-04 8 views
6

में स्थिर पृष्ठों को संबोधित करने के लिए कैसे करें मेरे पास एक स्प्रिंग एमवीसी एप्लीकेशन है जो टाइल 3 का उपयोग कर रहा है। मेरे पास कई स्थिर पृष्ठ हैं जिन्हें उन्हें वर्तमान में टाइल 3 द्वारा प्रदान की गई वेबसाइट के टेम्पलेट में एम्बेड करने की आवश्यकता है। (मुझे सभी पृष्ठों पर एक ही पाद लेख और शीर्षलेख होना चाहिए, या तो गतिशील या स्थैतिक लेकिन स्थिर पृष्ठों के लिए एड्रेसिंग कैसे करें)।स्प्रिंग एमवीसी

स्थिर पृष्ठों के उदाहरण index.jsp और aboutus.jsp हैं। मैं इन स्थिर पृष्ठों तक कैसे पहुंच सकता हूं? क्या मुझे इसे नियंत्रक के माध्यम से करना चाहिए?

मुझे पता है कि मैं jsp का उपयोग कर सकता हूं: शामिल है लेकिन क्या यह एक अच्छा अभ्यास है? क्या कोई विकल्प नहीं है क्योंकि मैं टाइल्स का उपयोग कर रहा हूं? यह tutorial ने अलग नियंत्रक होने का सुझाव दिया लेकिन मुझे यकीन नहीं है कि यह एक इष्टतम समाधान होगा। चूंकि यह सर्वर को अनावश्यक अनुरोध भेजता है।

कृपया मुझे बताएं कि वहाँ टाइलें के अलावा कोई बेहतर विकल्प

web.xml

<?xml version="1.0" encoding="UTF-8"?> 

<web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 
     http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> 


    <listener> 
     <listener-class>org.apache.tiles.extras.complete.CompleteAutoloadTilesListener</listener-class> 
    </listener> 
    <listener> 
     <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 
    </listener> 
    <servlet> 
     <servlet-name>springapp</servlet-name> 
     <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
     <load-on-startup>1</load-on-startup> 
    </servlet> 

    <servlet-mapping> 
     <servlet-name>springapp</servlet-name> 
     <url-pattern>*.htm</url-pattern> 
    </servlet-mapping> 


    <context-param> 
     <param-name>contextConfigLocation</param-name> 
     <param-value>/WEB-INF/springapp-servlet.xml</param-value> 
    </context-param> 



</web-app> 

tiles.xml है जाने

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE tiles-definitions PUBLIC 
    "-//Apache Software Foundation//DTD Tiles Configuration 2.1//EN" 
    "http://tiles.apache.org/dtds/tiles-config_2_1.dtd"> 

<tiles-definitions> 
    <definition name="baseLayout" template="/WEB-INF/templates/baseLayout.jsp"> 
     <put-attribute name="title" value="Title is here (Tile)"/> 
      <put-attribute name="header" value="header.jsp"/> 
       <put-attribute name="menu" value="Title is here (Tile)"/> 
       <put-attribute name="body" value="Title is here (Tile)"/> 
       <put-attribute name="footer" value="footer.jsp"/> 

    </definition> 

    <definition name="hello" extends="baseLayout"> 
     <put-attribute name="title" value="HELERE"/> 
      <put-attribute name="body" value="/WEB-INF/pages/pages/ewfsdfsdf.jsp"/> 
    </definition> 

     <definition name="index" extends="baseLayout"> 
     <put-attribute name="title" value="HELERE"/> 
      <put-attribute name="body" value="/WEB-INF/pages/index.jsp"/> 
    </definition> 
</tiles-definitions> 

नियंत्रक

@Controller 
public class HelloController { 

    protected final Log logger = LogFactory.getLog(getClass()); 

    public HelloController() { 
     System.err.println("Constructor of HelloController"); 
    } 

    @RequestMapping("/index.htm") 
    public String index(){ 
     System.err.println("in index method"); 
     return "index"; 
    } 

baseLayout.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" 
    pageEncoding="UTF-8"%> 
<%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles" %> 
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 
<html> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 
<title><tiles:insertAttribute name="title"/></title> 
</head> 
<body> 
     <div id="container"> 
     <tiles:insertAttribute name="header"/> 
     <tiles:insertAttribute name="menu"/> 
     <tiles:insertAttribute name="body"/> 
     <tiles:insertAttribute name="footer"/> 
     </div> 
</body> 
</html> 

index.jsp

<p> 

This is the body of index page 

</p> 

JSP का उपयोग करना: शामिल

pros 
    - No extra load neither on DB nor on server 
    cons 
    - To backup need to backup all static files 
    - Might have overwork as each page should be prepared separately rather than having a single template for all pages and just populate the template 
    - If need to add something to static pages need to change all pages. 
+0

पोस्ट अपने JSP फ़ाइल – Zeronex

+0

@Zeronex का एक उदाहरण मैं सिर्फ इनाम के लिए index.jsp – Jack

+1

धन्यवाद डैनियल के लिए एक नमूना डाल दिया। – Jack

उत्तर

4

मैं बस इसके लिए एक महान समाधान पाया है, नमूना कोड here और here है स्थैतिक पृष्ठों हम सर्वलेट में <mvc:view-controller> उपयोग कर सकते हैं संभाल करने के लिए, यह टाइलें साथ काम करता है और साथ ही बस सुनिश्चित करें कि आप प्रत्येक पथ के लिए एक definition कर अपने tiles.xml फ़ाइल।

<mvc:view-controller path="/index" /> 
<mvc:view-controller path="/" view-name="index"/> 
+1

धन्यवाद। तो आपने केवल इन पंक्तियों को जोड़ा या क्या अतिरिक्त संशोधन भी थे? – Gyan

+0

@ ज्ञानप्रिया कोई समस्या नहीं है वे एकमात्र पंक्तियां हैं जिन्हें मैंने जोड़ा है। बेशक, आपको एमवीसी नेमस्पेस की भी आवश्यकता होगी। यदि आप उन्हें पसंद करते हैं तो कृपया प्रश्न और उत्तर दें। – Jack

+1

अच्छी तरह से जैक किया, मैं यह देखने के लिए इंतजार कर रहा हूं कि बक्षीस देने से पहले कोई बेहतर समाधान होगा या नहीं। –

2

जिस तरह से आपने इसे किया है, उसे काम करना चाहिए, लेकिन प्रत्येक स्थैतिक पृष्ठ के लिए एक नया मैपर फ़ंक्शन बनाना एक अच्छा विचार नहीं है। आप अपने नियंत्रक

@RequestMapping("/page/{viewName}.htm") 
public String index(@PathVariable(value="viewName") String viewName, Model model){ 
    if(isValidView(viewName)){ 
     model.addAttribute("viewName", viewName); 
     return "page"; 
    } 

    return null; 
} 

पर आपको यह सुनिश्चित करना होगा कि व्यूनाम मान्य है अन्यथा यह सुरक्षा समस्या होगी।

इसके अलावा इस article

संपादित

isValidView समारोह को पढ़ने के लिए या तो एक ही कक्षा या BaseController वर्ग या एक सेवा कॉल डीबी againts जाँच करने के लिए जा सकते हैं होगा। यह जांचना कि फ़ाइल मौजूद है, यह एक अच्छा विचार नहीं है क्योंकि संसाधन लेता है लेकिन क्योंकि पथ उत्पादन सर्वर पर अलग हो सकता है।

स्थैतिक पृष्ठ के शरीर बस HTML रहा है, तो आप DB में सामग्री लोड कर सकते हैं और सिर्फ

<jsp:include page="/WEB-INF/pages/header.jsp"/> 
${htmlContent} 
<jsp:include page="/WEB-INF/pages/footer.jsp"/> 

या आप शरीर गतिशील रखना चाहते हैं।

टाइल्स के लिए।एक्सएमएल आप page.jsp

<jsp:include page="/WEB-INF/pages/header.jsp"/> 
<jsp:include page="/WEB-INF/pages/page/${viewName}.jsp"/> 
<jsp:include page="/WEB-INF/pages/footer.jsp"/> 
+0

धन्यवाद, क्या मेरे पास एक ही कक्षा में ValidView होना चाहिए? एक और समस्या यह है कि जब भी मैं एक नया स्थिर पृष्ठ जोड़ना चाहता हूं तो मुझे अपना नाम isValidName विधि में जोड़ना होगा। अगर मैं फाइल सिस्टम को जांचना चाहता हूं कि फ़ाइल मौजूद है या नहीं, तो यह एक अतिरिक्त आईओ होगा जो इतना महंगा है। – Jack

+0

क्या डीबी क्वेरी भेजने की बजाय कोई बेहतर समाधान नहीं है? मुझे लगता है कि पेज का उपयोग करने के लिए सबसे अच्छा विकल्प होगा। दूसरे शब्दों में, बस अन्य पृष्ठों को स्थिर पृष्ठों में शामिल करें और नियंत्रक का उपयोग किये बिना उन्हें दिखाएं। – Jack

+1

वैसे इस मामले में ** पेज ** नामक एक नया फ़ोल्डर ** ** वेब ** के रूप में एक ही फ़ोल्डर में बनाएं और फ़ाइल नामों के लिए एक्सटेंशन ** "html" ** का उपयोग करें और सीधे नियंत्रक या टाइल्स के बिना उन्हें एक्सेस कर सकते हैं। आपको प्रत्येक स्थैतिक फ़ाइल में हेडर और पाद लेख को कॉपी और पेस्ट करना होगा। – Zeronex

1

वैसे आप हमेशा baseLayout पृष्ठ पर सब कुछ लोड और एक उच्च स्तर बना सकते हैं के लिए

<definition name="pageLayout" extends="baseLayout"> 
    <put-attribute name="title" value="HELERE"/> 
     <put-attribute name="body" value="/WEB-INF/page.jpg"/> 
</definition> 

हो सकता है। loadPage(pageLink); और के लिए:

<div id=header> <tiles:insertAttribute name="header" /></div>
<div id=header> <tiles:insertAttribute name="menu" /></div> <iframe id='dynFrame' contenteditable="true"></iframe>' <div id=footer> <tiles:insertAttribute name="footer" /></div>

अब आप मेनू से इस iframe पर सामग्री लोड कर सकते हैं एक सरल स्क्रिप्ट है कि कहते हैं के साथ क्लिक करता है: क्या मेरा मतलब निम्नलिखित की तरह कुछ है फ़ंक्शन की सामग्री हो सकती है: $("#dynFrame").attr("src",pageLink);
मेनू क्लिक लोडपेज फ़ंक्शन पर यूआरएल पास कर सकते हैं और आपके पास किसी भी स्थिर की केवल एक प्रति होगी पेज जिसे आप लोड करना चाहते हैं।

मुझे उम्मीद है कि इससे मदद मिलती है।

+1

क्या कोई बेहतर विकल्प नहीं है? iframe का उपयोग फायदे से अधिक dis है। – Jack

+0

बात यह है कि उस केंद्र हिस्से को गतिशील और हमेशा बदलना है। आपको अलग-अलग आधार से विस्तार करने के लिए टाइल्स को कॉन्फ़िगर करने और शायद AJAX कॉल के माध्यम से HTML सामग्री को लोड करने का तरीका पता लगाना होगा। यदि नियंत्रक से आपका AJAX उत्तर केवल उस टाइल को लौटने के लिए कॉन्फ़िगर किया जा सकता है जिसे लोड करने की आवश्यकता है, तो आपको यह करने के तरीके पर अच्छा होना चाहिए। अद्यतन जैक के लिए – Gyan