2015-06-02 4 views
2

У меня есть стандартные файлы Spring 4.x в Netbeans 8.0.2. Я добавил контроллер, RegisterController.java в controllers -пакет. Я также добавил одну модель, User, с некоторой базовой информацией о пользователе. Затем я сделал 2 .jsp файлов, Registration.jsp и RegistrationSuccess.jsp.Весеннее отображение URL-адреса контроллера и просмотра

Вот мой RegisterController:

@Controller 
@RequestMapping(value="/register") 
public class RegisterController { 
    @RequestMapping(method=RequestMethod.GET) 
    public String viewRegistration(Model model){ 
     User user = new User(); 
     model.addAttribute("userForm", user); 

     List<String> professionList = new ArrayList<>(); 
     professionList.add("Developer"); 
     professionList.add("Designer"); 
     professionList.add("IT Manager"); 
     model.addAttribute("professionList", professionList); 

     return "Registration"; 
    } 

    @RequestMapping(method=RequestMethod.POST) 
    public String processRegistration(@ModelAttribute("userForm") User user, Map<String, Object> Model){ 
     System.out.println("username: " + user.getUsername()); 
     System.out.println("password: " + user.getPassword()); 
     System.out.println("email: " + user.getEmail()); 
     System.out.println("birth date: " + user.getBirthDate()); 
     System.out.println("profession: " + user.getProfession()); 

     return "RegistrationSuccess"; 
    } 
} 

Теперь, переходя к myProject/register результатов в 404. Я смущен, как Spring управляет маршрутизацией, хотя. Существует web.xml глядя, как это:

<?xml version="1.0" encoding="UTF-8"?> 
<web-app version="3.1" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"> 
    <context-param> 
     <param-name>contextConfigLocation</param-name> 
     <param-value>/WEB-INF/applicationContext.xml</param-value> 
    </context-param> 
    <listener> 
     <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 
    </listener> 
    <servlet> 
     <servlet-name>dispatcher</servlet-name> 
     <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
     <load-on-startup>2</load-on-startup> 
    </servlet> 
    <servlet-mapping> 
     <servlet-name>dispatcher</servlet-name> 
     <url-pattern>*.htm</url-pattern> 
    </servlet-mapping> 
    <session-config> 
     <session-timeout> 
      30 
     </session-timeout> 
    </session-config> 
    <welcome-file-list> 
     <welcome-file>redirect.jsp</welcome-file> 
    </welcome-file-list> 
</web-app> 

Я думаю это означает каждый URL с *.htm идет к диспетчерским-сервлету:

<?xml version='1.0' encoding='UTF-8' ?> 
<!-- was: <?xml version="1.0" encoding="UTF-8"?> --> 
<beans xmlns="http://www.springframework.org/schema/beans" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xmlns:p="http://www.springframework.org/schema/p" 
     xmlns:aop="http://www.springframework.org/schema/aop" 
     xmlns:tx="http://www.springframework.org/schema/tx" 
     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd 
     http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd 
     http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd"> 

    <bean class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping"/> 

    <!-- 
    Most controllers will use the ControllerClassNameHandlerMapping above, but 
    for the index controller we are using ParameterizableViewController, so we must 
    define an explicit mapping for it. 
    --> 
    <bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"> 
     <property name="mappings"> 
      <props> 
       <prop key="index.htm">indexController</prop> 
      </props> 
     </property> 
    </bean> 

    <bean id="viewResolver" 
      class="org.springframework.web.servlet.view.InternalResourceViewResolver" 
      p:prefix="/WEB-INF/jsp/" 
      p:suffix=".jsp" /> 

    <!-- 
    The index controller. 
    --> 
    <bean name="indexController" 
      class="org.springframework.web.servlet.mvc.ParameterizableViewController" 
      p:viewName="index" /> 

</beans> 

Но где Мне нужно вставить некоторые записи, чтобы мой RegisterController работал?

ответ

3

Поскольку вы дали * .htm в шаблон URL, диспетчер -сервер распознает только запросы * .htm. Меняйте web.xml

<servlet-mapping> 
     <servlet-name>dispatcher</servlet-name> 
     <url-pattern>/*</url-pattern> 
</servlet-mapping> 

И выше контроллера, нет необходимости давать RequestMapping. Ваши методы будут делать работу за вас

И выше ваш метод, вы должны дать значение, так что ваш метод может найти его

@RequestMapping(value="/register.htm" method=RequestMethod.GET) 
public String viewRegistration(Model model) 
+0

Не нужно ли мне также редактировать мой DispatcherServlet? Я получаю предупреждение «Нет сопоставления, найденного для HTTP-запроса с URI [/SpringTest/register.htm] в DispatcherServlet с именем« dispatcher » – jdepypere

+0

Удалите этот компонент« urlMapping »... Это тоже будет работать без этого. Вам даже не нужен этот «indexcontroller» Добавить эту строку. <контекст: компонент-сканирование base-package = "RegisterController" /> и InternalViewResolver. Это оно. Теперь запустите его –

+0

Я обновил свой вопрос с помощью моего нового 'dispatcher-servlet.xml', но, боюсь, я все еще делаю что-то не так:' Соответствующий шаблон является строгим, но для контекста элемента не найдено объявления : component-scan'.' – jdepypere

0

Согласно картографирования грузоотправитель Servlet, ваш RequestMapping будет идти к контроллеру с HttpRequest с расширением .htm .. В вашем случае, вы упомянули * .htm

<servlet-mapping> 
     <servlet-name>dispatcher</servlet-name> 
     <url-pattern>*.htm</url-pattern> 
</servlet-mapping> 

Так в контроллере, для соответствующего запрос, добавить, как это ..

@RequestMapping(value="/register.htm" method=RequestMethod.GET) 
    public String viewRegistration(Model model){ 

и В верхней части контроллера, добавить, как это,

@Controller 
@RequestMapping("/") 
public class RegisterController { 

добавить это в spring.xml,

<context:component-scan base-package="RegisterController" /> 

включая имя пакета контроллера должен быть там в компоненте сканирования базового пакета ...

+0

Что вы имеете в виду с 'spring.xml'-файлом? Кажется, у меня его нет - у меня есть «сеть».xml' и 'dispatcher-servlet.xml' – jdepypere

+0

В вашем случае это означает dispatcher-servlet.xml –

+0

Затем я получаю сообщение об ошибке, что инициализация контекста не удалась, контекст« префикс »« контекст элемента: компонент-сканирование »не является bound.' – jdepypere

0

Редактировать отображение сервлета в вас web.xml как:

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

А также добавить ниже фрагмент кода в файле конфигурации пружины:

<mvc:annotation-driven></mvc:annotation-driven> 
<context:component-scan base-package="your.packagename.RegisterController"></context:component-scan> 
+0

Добавьте их в мой 'web.xml' (который я Предположим, это мой конфигурационный файл Spring?) приводит к этой ошибке: 'Префикс« mvc »для элемента« mvc: annotation-driven »не связан.' – jdepypere

+0

Не в web.xml, в вашем конфигурационном файле Spring и да для «mvc ", вы должны добавить пространство имен mvc. Вы можете обратиться сюда: https://github.com/arpitaggarwal/Spring-Social/blob/master/src/main/webapp/WEB-INF/spring-dispatcher-servlet.xml – Arpit