以下是我的contoller,web xml和jsp页面,它们使用spring形式。
控制器
@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页面
<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 servlet仅具有视图解析器。现在,按照我在Contoller中定义的类级别url模式,如果我导航到以下url http:// localhost:9080 / ExampleSpring或http:// localhost:9080 / ExampleSpring /
controll转到我的jsp页面并询问详细信息。输入详细信息后,如果我提交了表单,该表单的动作为action提及的action =“ submitDetails.htm”,则抛出404错误。并且地址栏中的URL将作为localhost:9080 / submitDetails.htm进入,该项目缺少项目的上下文根。我的问题是我在requehst映射URL部分中做错了什么?
根据我的理解
1.表单使用数学模式2的post提交。/submitDetails.htm与类级别url模式映射中的模式/ *匹配,因此请求应进入控制器,3.最后,控制器方法中的方法级别映射与jsp中的action amd methood具有相同的url模式amd请求方法,因此它应进入controllers方法并在控制台中进行打印---这并不容易。
有人可以帮我理解吗?
将/ *更改为/后,您的问题得以解决,因为每个URL包含两部分
1)Servlet路径
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>
在这里,如果您像这样调用网址
/ abc,然后它将调用ExactMatchServlet
Servlet路径-> / abc
路径信息-> null
/ abc / pqr它将调用PathInfoServlet
Servlet路径-> / abc
路径信息-> / pqr
/ something / random它将调用PathInfoServlet
Servlet路径-> null
路径信息-> / something / random
当您替换<url-pattern>/*</url-pattern>
为
<url-pattern>/</url-pattern>
和呼叫/事/随机再
Servlet路径-> / something / random
路径信息-> null
所以基本上用/更改/ *来映射您的url部分(Servlet路径和路径信息)
对于该区域,容器找不到用于您的URL的servlet,并且显示404错误。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句