2011-08-07 16 views
20

में वसंत एमवीसी अनुरोध यूआरएल मैं स्प्रिंग एमवीसी का उपयोग कर एक वेब एप्लिकेशन लिख रहा हूं। मैं नियंत्रकों के लिए एनोटेशन का उपयोग कर रहा है, आदि सब कुछ ठीक काम कर रहा है जब यह वर्तमान आवेदन में वास्तविक लिंक (प्रपत्र कार्रवाई, <a> टैग, आदि) के लिए आता है, सिवाय इसके कि मैं इस (स्पष्ट रूप से संक्षिप्त) है:जेएसपी

//In the controller 
@RequestMapping(value="/admin/listPeople", method=RequestMethod.GET) 

//In the JSP 
<a href="/admin/listPeople">Go to People List</a> 

जब मैं सीधे "http: // localhost: 8080/MyApp/admin/listPeople" जैसे यूआरएल दर्ज करता हूं, तो पृष्ठ सही ढंग से लोड होता है। हालांकि, उपरोक्त लिंक काम नहीं करता है। यह एप्लिकेशन नाम "MyApp" खो देता है।

क्या किसी को पता है कि वहां पर एप्लिकेशन नाम पर फेंकने के लिए स्प्रिंग को कॉन्फ़िगर करने का कोई तरीका है या नहीं?

मुझे बताएं कि आपको मेरी किसी भी स्प्रिंग कॉन्फ़िगरेशन को देखने की आवश्यकता है या नहीं। मैं एक व्यू रिज़ॉल्यूवर के साथ मानक प्रेषक सर्वलेट का उपयोग कर रहा हूं, आदि

+1

इस के साथ वसंत 3.0 में संभव है '">People' –

उत्तर

43

आपको अपने लिंक के संदर्भ पथ को पूर्ववत करने की आवश्यकता है।

// somewhere on the top of your JSP 
<c:set var="contextPath" value="${pageContext.request.contextPath}"/> 

... 
<a href="${contextPath}/admin/listPeople">Go to People List</a> 
+0

+1 धन्यवाद, मैंने इसके बारे में सोचा लेकिन मैं इसे किसी भी तरह वसंत के साथ करना चाहूंगा। –

+2

ऐसा करने का कोई "वसंत" तरीका नहीं है :) केवल एक विकल्प जो आपको $ {contextPath} को अपने लिंक पर प्रीपेड करने से बचाता है, यह है कि आप अपने आवेदन को रूट के रूप में तैनात करते हैं, ताकि इसका संदर्भ पथ "/" हो (जैसा केविन ने वर्णित किया है); लेकिन मैं इस दृष्टिकोण की अनुशंसा नहीं करता क्योंकि यह आपके आवेदन को इसकी तैनाती पर निर्भर करेगा। – craftsman

+0

अगर मैं सही से याद करता हूं तो server.xml के साथ भी एक तरीका है। – Kevin

0

मैं आम तौर पर "/" के संदर्भ रूट का उपयोग करने के लिए टोमकैट को कॉन्फ़िगर करता हूं या युद्ध को ROOT.war के रूप में तैनात करता हूं। किसी भी तरह से युद्ध का नाम यूआरएल का हिस्सा नहीं बनता है।

<a href="admin/listPeople">Go to People List</a> 
6

मैं आधार टैग का उपयोग करना पसंद करते हैं। उदाहरण के लिए:

<c:url value="/admin/listPeople"/> 

वैकल्पिक रूप से, मैं भी एप्लिकेशन मेरी वसंत MVC में जितना संभव हो उतना सापेक्ष URL का उपयोग करने के लिए पसंद करते हैं। तो यदि पृष्ठ /MyApp/index पर है, तो लिंक <a href="admin/listPeople"> मुझे listPeople पृष्ठ पर ले जाएगा।

यह भी काम करता है यदि आप यूआरएल पदानुक्रम में गहरे हैं। आप एक स्तर का बैक अप लेने के लिए .. का उपयोग कर सकते हैं। तो /MyApp/admin/people/aPerson पर पृष्ठ पर, <a href="../listPeople"> का उपयोग करके सूची पृष्ठ

+0

मैं बेस टैग का उपयोग करने से पहले इसे पढ़ने की सलाह देता हूं: http://stackoverflow.com/questions/1889076/is-it-recommended-to-use-the-base-html-tag –

13

c:url टैग अपने यूआरएल के लिए संदर्भ पथ जोड़ देगा:

<base href="${pageContext.request.scheme}://${pageContext.request.serverName}:${pageContext.request.serverPort}${pageContext.request.contextPath}/" /> 

फिर, अपने सभी लिंक की तरह हो सकता है:

0

पर आप एक सर्वलेट रिलेवेटिवेशन का उपयोग कर सकते हैं। मुझे यकीन नहीं है कि यह कौन सा संस्करण उपलब्ध है (मैं वर्तमान में 4.0.x का उपयोग कर रहा हूं) और मैंने इस पर अधिक दस्तावेज नहीं देखा है, लेकिन यदि आप वसंत रूप का समर्थन करने वाले कोड को देखते हैं तो आप शायद अनुमान लगा सकते हैं। बस सुनिश्चित करें कि जिस मार्ग को आप पास करते हैं वह "/" से शुरू होता है।

उदाहरण:

<form:form class="form-horizontal" name="form" servletRelativeAction="/j_spring_security_check" method="POST"> 

org.springframework.web.servlet.tags.form.FormTag देखें:

protected String resolveAction() throws JspException { 
    String action = getAction(); 
    String servletRelativeAction = getServletRelativeAction(); 
    if (StringUtils.hasText(action)) { 
     action = getDisplayString(evaluate(ACTION_ATTRIBUTE, action)); 
     return processAction(action); 
    } 
    else if (StringUtils.hasText(servletRelativeAction)) { 
     String pathToServlet = getRequestContext().getPathToServlet(); 
     if (servletRelativeAction.startsWith("/") && !servletRelativeAction.startsWith(getRequestContext().getContextPath())) { 
      servletRelativeAction = pathToServlet + servletRelativeAction; 
     } 
     servletRelativeAction = getDisplayString(evaluate(ACTION_ATTRIBUTE, servletRelativeAction)); 
     return processAction(servletRelativeAction); 
    } 
    else { 
     String requestUri = getRequestContext().getRequestUri(); 
     ServletResponse response = this.pageContext.getResponse(); 
     if (response instanceof HttpServletResponse) { 
      requestUri = ((HttpServletResponse) response).encodeURL(requestUri); 
      String queryString = getRequestContext().getQueryString(); 
      if (StringUtils.hasText(queryString)) { 
       requestUri += "?" + HtmlUtils.htmlEscape(queryString); 
      } 
     } 
     if (StringUtils.hasText(requestUri)) { 
      return processAction(requestUri); 
     } 
     else { 
      throw new IllegalArgumentException("Attribute 'action' is required. " + 
        "Attempted to resolve against current request URI but request URI was null."); 
     } 
    } 
} 
4

मैं सिर्फ इस सवाल का जवाब खोजने की कोशिश की है के रूप में है और इस पहला Google परिणाम है।

यह MvcUriComponentsBuilder

यह 4 का हिस्सा है का उपयोग करते हुए अब किया जा सकता है।

एक वसंत MVC नियंत्रक विधि के अनुरोध मानचित्रण के नाम से एक URL बनाएं: के वसंत MVC

http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/web/servlet/mvc/method/annotation/MvcUriComponentsBuilder.html

विधि की जरूरत 0 संस्करण fromMappingName

प्रलेखन से है। कॉन्फ़िगर किया गया हैंडलर MethodMappingNamingStrategy स्टार्टअप पर नियंत्रक विधि अनुरोध मैपिंग के नाम निर्धारित करता है। डिफ़ॉल्ट रूप से सभी मैपिंग को कक्षा के नाम के पूंजी अक्षरों के आधार पर नाम दिया जाता है, इसके बाद विभाजक के रूप में "#" और फिर विधि का नाम होता है। उदाहरण के लिए पर्सन कंट्रोलर नामक एक वर्ग के लिए "पीसी # गेटस्पर्सन" विधि getPerson के साथ। यदि नामकरण सम्मेलन अद्वितीय परिणामों का उत्पादन नहीं करता है, तो एक स्पष्ट नाम @RequestMapping एनोटेशन के नाम विशेषता के माध्यम से असाइन किया जा सकता है।

इसका मुख्य उद्देश्य मुख्य रूप से प्रस्तुतीकरण प्रौद्योगिकियों और ईएल अभिव्यक्तियों में उपयोग के लिए लक्षित है। स्प्रिंग यूआरएल टैग लाइब्रेरी इस विधि को "mvcUrl" नामक फ़ंक्शन के रूप में पंजीकृत करती है।

उदाहरण के लिए, इस नियंत्रक दिया:

@RequestMapping("/people") 
class PersonController { 

    @RequestMapping("/{id}") 
    public HttpEntity getPerson(@PathVariable String id) { ... } 

} 

एक JSP के रूप में इस नियंत्रक विधि के लिए एक URL तैयार कर सकते हैं:

<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %> 

<a href="${s:mvcUrl('PC#getPerson').arg(0,"123").build()}">Get Person</a>