2012-01-07 25 views
5

Gerçekten basit bir Spring MVC uygulaması yazdım. Özür dilerim Spring MVC’de oldukça yeniyim, benimle birlikte. İlk sorumSpringMVC servlet eşleştirmesi

<?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> 

, Aşağıdaki kod ile oturum açmak için bir jsp sayfası vardır aşağıdaki gibi

web.xml

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

Bu bir 404 ama verir ve ... benim Kontrolör, ben

@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"; 
     } 

    } 

} 

benim anlayış @requestm olduğunu ... aşağıdaki kod ile/giriş için denetleyici eşlediyseniz apping web.xml yerine servlet haritalamayı yapmalı, bu doğru mu? Gerekirse, /WEB-INF/spring/appServlet/servlet-context.xml değeri de aşağıda gösterilmiştir.

<?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> 

Yani benim ilk soru: servlet haritalama web.xml''deki veya denetleyici sınıfında @ RequestMapping yapılır?

İkinci soru: Daha fazla sayfaya sahip olmak için bunu yapmanın en iyi yolu nedir, webxml'e eklemeye devam etmeli miyim? Her URL için bir denetleyici oluşturmalı mıyım? Her URL için bir sunucu bağlamı oluşturmalı mıyım? Okumak için

Thanks :) <url-pattern> tanımladınız

+0

Sana verdi şeyi kontrol etmedi, ama ilk görünümünde denetleyicinizdeki istek yöntemi form POST yöntemini kullanır nerede, GET olduğunu. Bir hata gibi görünüyor ... – Omnaest

+0

ah, teşekkür ederim ama yine de aynı sorunu, bu yansıtmak için yukarıda düzenlenmiş kodu. – david99world

cevap

5

senin appServlet yalnızca kök url istekleri alacağı anlamına gelir / olmak. /*'a değiştirerek, appServlet tüm gelen istekleri alacaktır. Bu işe yarayacak, ancak URL /login/* ile eşlenebilecek belirli bir loginServlet oluşturmayı da düşünebilirsiniz.

  1. Tek bir web.xml numaralı belgede tanımlanmış birden fazla sunucu uygulamasına sahip olabilirsiniz. Daha fazla <servlet-mapping> etiketi ekleyerek her bir sunucuya hangi istekte bulunulur?
  2. Bir sunucuda birçok denetleyici bulunabilir. Tipik olarak, bir denetleyici, etki alanınızın belirli bir bölümünü sunar, örn. PersonController, AddressController, vb
  3. Her denetleyici genellikle, mantıksal olarak gruplandırılmış birkaç URL'yi işler; /persons/{id}, /persons/search, /persons/add vb
+0

Ah tamam, yani sunucu eşlemesi web.xml'de yapıldıysa, denetleyici sınıfındaki @RequestMapping (value = "/ login", method = RequestMethod.POST) 'un amacı nedir? Teşekkür ederiz :) – david99world

+1

Farklı isteklerin nasıl ele alınacağına dair ince taneli bir denetim uygulamak için hem sınıf hem de yöntem düzeyinde '@ RequestMapping 'öğesini kullanabilirsiniz. Farklı işlem, url (yukarıdaki madde 3), HTTP yöntemi ve/veya farklı istek parametrelerini temel alabilir. İstek eşlemesi hakkında daha fazla bilgi [Bahar el kitabı] 'nda bulunabilir (http://static.springsource.org/spring/docs/3.1.x/spring-framework-reference/html/mvc.html#mvc-ann-requestmapping) – matsev

+0

tamam, üzgünüm muhtemelen kafamı karıştırmıştım, ancak web’de giriş yapmam varsa.xml, bir servlet bağlamına eşlenmiş ve sonra @RequestMapping'de oturum açmış, bu denetleyiciye ulaşmak demek istediğim/login/login yapmak zorunda mıyım? Yardım ettiğin için teşekkür ederim. – david99world