2015-05-15 1 views
4

Ниже приведены мои координаторы, веб-страницы xml и jsp, которые используют весеннюю форму.Корень контекста не приходит при отправке формы Spring - проблемы с шаблоном url

Контроллер

@Controller 
@RequestMapping(value = {"/*", "/login"}) 
public class HelloWorldController { 

    @RequestMapping(method = RequestMethod.GET) 
    public String helloWorld(final Model model) { 
     model.addAttribute("bodyPage", "body.jsp"); 
     User user = new User(); 
     Address address = new Address(); 

     user.setAddress(address); 

     model.addAttribute("myUser", user); 
     System.out.println("hello world"); 
     return "login"; 
    } 


    @RequestMapping(value = "/submitDetails", method = RequestMethod.POST) 
    public ModelAndView submitDetais(final Object command) { 

     System.out.println("inside submitDetais "); 
     User user = (User) command; 
     return new ModelAndView("result", "user", user); 
    } 
} 

Web Xml

<servlet> 
     <servlet-name>dispatcher</servlet-name> 
     <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
     <load-on-startup>1</load-on-startup> 
    </servlet> 
    <servlet-mapping> 
     <servlet-name>dispatcher</servlet-name> 
     <url-pattern>/*</url-pattern> 
    </servlet-mapping> 

Jsp Page

<form:form commandName="myUser" modelAttribute="myUser" method="POST" action="submitDetails.htm" > 
    <table> 
     <tr> 
      <td>First Name:</td> 
      <td><form:input path="firstName" /></td> 
     </tr> 
     <tr> 
      <td>Last Name:</td> 
      <td><form:input path="lastName" /></td> 
     </tr> 

     <tr> 
      <td>Address 1:</td> 
      <td><form:input path="address.address1" /></td> 
     </tr> 

     <tr> 
      <td>Address 2:</td> 
      <td><form:input path="address.address2" /></td> 
     </tr> 

     <tr> 
      <td colspan="2"><input type="submit" value="Save Changes" /></td> 
     </tr> 
    </table> 
</form:form> 

Dispathcher сервлет имеет только просматривать распознаватель. Теперь в соответствии с рисунком URL-адресов на уровне класса, определенного в если регулятора, перейдите по следующей ссылке http://localhost:9080/ExampleSpring или http://localhost:9080/ExampleSpring/

Controll собирается на мою страницу JSP и просить детали. После ввода данных, если я отправлю форму с помощью действия формы, как action = "submitDetails.htm" как указано в действии, его ошибка 404. И адрес в адресной строке поступает как localhost: 9080/submitDetails.htm , которому не хватает корня контекста для проекта. Мой вопрос заключается в том, что я делаю неправильно в разделе запроса URL-адреса?

Согласно моему пониманию

1.the формы представлена ​​с использованием поста, который Мэйтсом шаблон 2. /submitDetails.htm является соответствием шаблона/* в отображении шаблона URL уровня класса, так что запрос должен ввести контроллер, 3. и, наконец, сопоставление уровня метода в методе контроллера имеет тот же метод запроса url-шаблона amd, что и действие amd methood в jsp, поэтому он должен ввести метод контроллеров и распечатать в консоли --- который не является happeing.

Может ли кто-нибудь помочь мне разобраться в этом?

+0

Я даже пытался с помощью @RequestMapping (value = "/submitDetails.htm", method = RequestMethod.POST) .. все еще 404 eror. – Sambuddha

+0

try @RequestMapping (value = "/ submitDetails", method = RequestMethod.POST) и

+0

Вы можете попробовать / без * после/ –

ответ

2

Ваша проблема решена после изменения/* для/потому, Каждый URL состоит из двух частей

1) Servlet Path

2) Путь Информация

рассмотрим следующий код

<servlet-mapping> 
    <servlet-name>ExactMatchServlet</servlet-name> 
    <url-pattern>/abc</url-pattern> 
    </servlet-mapping> 
    <servlet-mapping> 
    <servlet-name>PathInfoServlet</servlet-name> 
    <url-pattern>/*</url-pattern> 
    </servlet-mapping> 
    <servlet-mapping> 
    <servlet-name>LongPathInfoServlet</servlet-name> 
    <url-pattern>/abc/*</url-pattern> 
    </servlet-mapping> 
</servlet-mapping> 

здесь, если вы звоните URL как

, то он будет вызывать ExactMatchServlet

Servlet Path ->/ABC

Пути информация -> нулевого

/abc/pqr он будет вызывать PathInfoServlet

Servlet Path ->/а Информация

Пути ->/PQR

/что-то/случайное он будет вызывать PathInfoServlet

Путь сервлета -> null

Информация о пути ->/что-то/случайное

при замене <url-pattern>/*</url-pattern> с

<url-pattern>/</url-pattern> 

и называем /что-то/случайное затем

Servlet Path - >/что-то/случайное

путь информация -> нулевой

Так в основном изменение/* с отображением/изменение ваших частей URL (Servlet путь и путь Info)

Для этого региона контейнер не может найти сервлет для URL и он дает ошибку 404.

+0

Спасибо .. приятное объяснение :) – Sambuddha

4

Из моего понимания вам не хватает контекста в атрибуте действия вашей формы.Попробуйте определить его следующим образом:

<form:form commandName="myUser" modelAttribute="myUser" method="POST" action="${pageContext.servletContext.contextPath}/submitDetails.htm" > 
+0

, но для сервлета нам не нужно указывать контекстный путь в действии .. это специально для весны? Явно, если мы укажем, что это сработает, я думаю. Но правильно ли использовать контекстный путь в действии? – Sambuddha

+0

Да, это обычная практика, чтобы поставить контекстный путь в действии формы – Stan

+0

Спасибо Стэн .. этот подход также отлично работал. – Sambuddha