2012-01-07 4 views
5

Я написал очень простое приложение Spring MVC. Я прошу прощения, что я довольно новичок в Spring MVC, так что медведь со мной.Отображение сервлетов SpringMVC

Файл 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"; 
     } 

    } 

} 

моего пониманием является @reques tmapping должен делать отображение сервлета, а не в 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 в классе контроллера?

Второй вопрос: какой лучший способ архитектовать это, чтобы иметь больше страниц, следует ли мне добавлять к webxml? Должен ли я создать контроллер для каждого URL-адреса? Должен ли я создавать сервлет-контекст для каждого URL-адреса?

Спасибо за чтение :)

+0

Я не проверить все, что вы дали, но на первый взгляд ваш метод запроса на контроллере GET, где ваша форма использует метод POST. Кажется, это ошибка ... – Omnaest

+0

ах, спасибо, вы изменили, но все еще ту же проблему, отредактированный код выше, чтобы отразить это. – david99world

ответ

5

Вы определили <url-pattern> быть /, что означает, что ваш appServlet будет получать только запросы на корневой URL. Изменив его на /*, appServlet получит все входящие запросы. Это будет работать, но вы также можете рассмотреть возможность создания определенного loginServlet, который может быть сопоставлен с адресом /login/*.

  1. У вас может быть несколько сервлетов, определенных в одном web.xml. Какой запрос попадет в каждый сервлет, указывается путем добавления более <servlet-mapping> тегов.
  2. Сервлет может иметь множество контроллеров. Как правило, один контроллер обслуживает определенную часть вашего домена, например. PersonController, AddressController и т. Д.
  3. Каждый контроллер обычно обрабатывает несколько URL-адресов, которые логически сгруппированы вместе, например. /persons/{id}, /persons/search, /persons/add и т.д.
+0

Ah ok, так что если сервлет-сопоставление выполняется в web.xml, в чем цель @RequestMapping (value = "/ login", method = RequestMethod.POST) в классе контроллера? Спасибо :) – david99world

+1

Вы можете использовать '@ RequestMapping' как на уровне класса, так и на уровне метода, чтобы реализовать мелкозернистый контроль того, как будут обрабатываться разные запросы. Различная обработка может основываться на URL-адресе (см. Пункт 3 выше), методе HTTP и/или разных параметрах запроса. Более подробную информацию о сопоставлении запросов можно найти в [Руководстве по весне] (http://static.springsource.org/spring/docs/3.1.x/spring-framework-reference/html/mvc.html#mvc-ann-requestmapping) – matsev

+0

ОК, извините, я, вероятно, смутил себя, но если у меня есть/login в сети.xml, сопоставленный с сервлет-контекстом, а затем/login в @RequestMapping, значит ли это для этого контроллера, я должен пойти в/login/login? Спасибо за вашу помощь. – david99world

Смежные вопросы