2012-01-07 10 views
5

मैंने वास्तव में एक साधारण स्प्रिंग एमवीसी ऐप लिखा है। मैं क्षमा चाहता हूं कि मैं स्प्रिंग एमवीसी के लिए नया हूं इसलिए मेरे साथ भालू।स्प्रिंगएमवीसी सर्वलेट मानचित्रण

web.xml के रूप में इस प्रकार है

<?xml version="1.0" encoding="UTF-8"?> 
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> 

    <!-- The definition of the Root Spring Container shared by all Servlets and Filters --> 
    <context-param> 
     <param-name>contextConfigLocation</param-name> 
     <param-value>/WEB-INF/spring/root-context.xml</param-value> 
    </context-param> 

    <!-- Creates the Spring Container shared by all Servlets and Filters --> 
    <listener> 
     <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 
    </listener> 

    <!-- Processes application requests --> 
    <servlet> 
     <servlet-name>appServlet</servlet-name> 
     <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
     <init-param> 
      <param-name>contextConfigLocation</param-name> 
      <param-value>/WEB-INF/spring/appServlet/servlet-context.xml</param-value> 
     </init-param> 
     <load-on-startup>1</load-on-startup> 
    </servlet> 

    <servlet-mapping> 
     <servlet-name>appServlet</servlet-name> 
     <url-pattern>/</url-pattern> 
    </servlet-mapping> 

</web-app> 

मेरा पहला सवाल यह है कि, मैं निम्नलिखित कोड के साथ प्रवेश के लिए एक jsp पृष्ठ है है ...

<form action="/login" method="post" > 
Username : <input name="username" type="text" /> 
Password : <input name="password" type="password" /> 
<input type="submit" /> 
</form> 

यह एक 404 लेकिन में देता है मेरे नियंत्रक, मैंने नियंत्रक को नीचे दिए गए कोड के साथ लॉग इन/मैप किया है ...

@Controller 
public class LoginController { 

    private static final Logger logger = LoggerFactory.getLogger(LoginController.class); 

    /** 
    * Simply selects the home view to render by returning its name. 
    */ 
    @RequestMapping(value = "/login", method = RequestMethod.POST) 
    public String home(Locale locale, Model model, String username, String password) { 

     if(username.equalsIgnoreCase("david")) 
     { 
      logger.info("Welcome home! the client locale is "+ locale.toString()); 

      Date date = new Date(); 
      DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG, locale); 

      String formattedDate = dateFormat.format(date); 

      model.addAttribute("serverTime", formattedDate); 

      return "home"; 
     } 
     else 
     { 
      return "void"; 
     } 

    } 

} 

मेरी समझ @requestm है ऐपिंग web.xml की बजाय सर्वलेट मैपिंग करना चाहिए, क्या यह सही है? यदि आवश्यक हो तो /WEB-INF/spring/appServlet/servlet-context.xml का मान भी नीचे दिखाया गया है।

<?xml version="1.0" encoding="UTF-8"?> 
<beans:beans xmlns="http://www.springframework.org/schema/mvc" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:beans="http://www.springframework.org/schema/beans" 
    xmlns:context="http://www.springframework.org/schema/context" 
    xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd 
     http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
     http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd"> 

    <!-- DispatcherServlet Context: defines this servlet's request-processing infrastructure --> 

    <!-- Enables the Spring MVC @Controller programming model --> 
    <annotation-driven /> 

    <!-- Handles HTTP GET requests for /resources/** by efficiently serving up static resources in the ${webappRoot}/resources directory --> 
    <resources mapping="/resources/**" location="/resources/" /> 

    <!-- Resolves views selected for rendering by @Controllers to .jsp resources in the /WEB-INF/views directory --> 
    <beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
     <beans:property name="prefix" value="/WEB-INF/views/" /> 
     <beans:property name="suffix" value=".jsp" /> 
    </beans:bean> 

    <context:component-scan base-package="org.david.myapp" /> 



</beans:beans> 

तो मेरा पहला सवाल है: सर्वलेट मानचित्रण web.xml में या नियंत्रक कक्षा में @requestmapping पर किया जाता है?

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

पढ़ने के लिए धन्यवाद :)

+0

मैं पूरी बात आपके द्वारा दिया गया चेक था, लेकिन एक पहली बार देखने पर नियंत्रक पर आपके अनुरोध विधि प्राप्त है, जहां आपके प्रपत्र एक POST विधि का उपयोग करता है। लगता है कि एक गलती हो रही है ... – Omnaest

+0

आह, धन्यवाद, लेकिन आप अभी भी एक ही समस्या है, इसे प्रतिबिंबित करने के लिए उपरोक्त संपादित कोड। – david99world

उत्तर

5

आप <url-pattern> परिभाषित किया है /, जिसका अर्थ है कि आपके appServlet केवल रूट यूआरएल के लिए अनुरोध प्राप्त होगी। इसे /* पर बदलकर appServlet सभी आने वाले अनुरोध प्राप्त होंगे। यह काम करेगा, लेकिन आप एक विशिष्ट loginServlet बनाने पर भी विचार कर सकते हैं जिसे यूआरएल /login/* पर मैप किया जा सकता है।

  1. आपके पास एक ही web.xml में परिभाषित एकाधिक सर्लेट हो सकते हैं। कौन सा अनुरोध प्रत्येक सर्वलेट को <servlet-mapping> टैग जोड़कर निर्दिष्ट किया जाएगा।
  2. एक सर्वलेट में कई नियंत्रक हो सकते हैं। आम तौर पर, एक नियंत्रक आपके डोमेन के एक विशिष्ट भाग परोसता है, उदा। PersonController, AddressController, आदि
  3. प्रत्येक नियंत्रक आमतौर पर कई यूआरएल को संभालता है जो तर्कसंगत रूप से समूहबद्ध होते हैं, उदा। /persons/{id}, /persons/search, /persons/add, आदि
+0

आह ठीक है, तो अगर servlet-mapping web.xml में किया जाता है, तो नियंत्रक वर्ग में @RequestMapping (value = "/ login", method = RequestMethod.POST) का उद्देश्य क्या है? धन्यवाद :) – david99world

+1

आप वर्ग स्तर और विधि स्तर पर '@ अनुरोध मैपिंग' दोनों का उपयोग कर सकते हैं ताकि जुर्माने वाले नियंत्रण को लागू करने के लिए विभिन्न अनुरोधों को कैसे प्रबंधित किया जा सके। अलग-अलग हैंडलिंग यूआरएल (उपरोक्त सीएफ आइटम 3), HTTP विधि, और/या विभिन्न अनुरोध पैरामीटर पर आधारित हो सकती है। अनुरोध मैपिंग के बारे में अधिक जानकारी [स्प्रिंग मैनुअल] में मिल सकती है (http://static.springsource.org/spring/docs/3.1.x/spring-framework-reference/html/mvc.html#mvc-ann-requestmapping) – matsev

+0

ठीक है, क्षमा करें मैंने शायद खुद को भ्रमित कर दिया है, लेकिन अगर मेरे पास वेब में लॉगिन/लॉगिन है।xml एक सर्वलेट-संदर्भ में मैप किया गया है और उसके बाद @RequestMapping में लॉगिन/लॉगिन करता है, क्या इसका मतलब यह है कि इस नियंत्रक तक पहुंचने के लिए मुझे/लॉगिन/लॉगिन करना होगा? आपकी सहायता के लिए धन्यवाद. – david99world

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