2012-01-07 17 views
5

Napisałem bardzo prostą aplikację Spring MVC. Przepraszam, że jestem raczej nowy w Spring MVC, więc nie przejmuj się mną.Mapowanie serwletu SpringMVC

web.xml wygląda następująco

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

Moje pierwsze pytanie brzmi, mam strony JSP do logowania z następującym kodem ...

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

Daje to 404, ale w mój kontroler, zmapowałem kontroler do/logowania z poniższym kodem ...

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

    } 

} 

Moje zrozumienie to @requestm apping powinien wykonać mapowanie serwletu, a nie web.xml, czy to prawda? Wartość /WEB-INF/spring/appServlet/servlet-context.xml jest pokazana poniżej również w razie potrzeby.

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

więc moje pierwsze pytanie brzmi: czy mapowanie servlet zrobić w web.xml lub na @requestmapping w klasie kontrolera?

Drugie pytanie: jaki jest najlepszy sposób zaprojektowania tego, aby mieć więcej stron, czy powinienem nadal dołączać do webxml? Czy powinienem utworzyć kontroler dla każdego adresu URL? Czy powinienem utworzyć kontekst serwletu dla każdego adresu URL?

Dziękuję za przeczytanie :)

+0

nie zrobił sprawdzić całość dałeś, ale na pierwszy rzut oka metoda żądania na kontrolerze jest GET, gdzie forma używa metody POST. Wydaje się być pomyłką ... – Omnaest

+0

ah, dziękuję, że zmieniliście, ale nadal ten sam problem, zmienili kod powyżej, aby to odzwierciedlić. – david99world

Odpowiedz

5

zdefiniowaniu <url-pattern> być /, co oznacza, że ​​appServlet otrzymają tylko wnioski do głównego adresu URL. Po zmianie na /* otrzyma wszystkie przychodzące żądania. To zadziała, ale możesz także rozważyć utworzenie specyficznego loginServlet, który można zmapować do adresu URL /login/*.

  1. Możesz zdefiniować wiele serwletów w jednym web.xml. Które żądanie trafi w każdy serwlet jest określone przez dodanie więcej tagów <servlet-mapping>.
  2. Serwlet może mieć wiele kontrolerów. Zazwyczaj jeden kontroler obsługuje określoną część Twojej domeny, np. PersonController, AddressController, itp.
  3. Każdy kontroler zwykle obsługuje kilka adresów URL, które są logicznie pogrupowane, np. /persons/{id}, /persons/search, /persons/add itp
+0

Ah ok, więc jeśli mapowanie serwletów odbywa się w web.xml, jaki jest cel @RequestMapping (value = "/ login", method = RequestMethod.POST) w klasie kontrolera? Dziękuję :) – david99world

+1

Możesz użyć '@ RequestMapping' zarówno na poziomie klasy i poziomie metody, aby zaimplementować drobnoziarnistą kontrolę nad sposobem obsługi różnych żądań. Różne sposoby obsługi mogą opierać się na adresie URL (np. Element 3 powyżej), metodzie HTTP i/lub innych parametrach żądania. Więcej informacji o mapowaniu żądań można znaleźć w [Spring manual] (http://static.springsource.org/spring/docs/3.1.x/spring-framework-reference/html/mvc.html#mvc-ann-requestmapping) – matsev

+0

ok, przepraszam, prawdopodobnie pomyliłem się, ale jeśli mam/zalogować się w sieci.xml zmapowany do kontekstu serwletu, a następnie/login w @RequestMapping, czy to znaczy, że do tego kontrolera muszę przejść do/login/login? Dzięki za pomoc. – david99world

Powiązane problemy