提交 Spring 表单时未出现上下文根 - url 模式存在问题
Context root not coming while submitting Spring form - issues with url pattern
下面是我的控制器、网页 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);
}
}
网络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 中定义的 class 级别 url 模式,如果我导航到下面 url
http://localhost:9080/ExampleSpring or http://localhost:9080/ExampleSpring/
controll 将转到我的 jsp 页面并询问详细信息。输入详细信息后,如果我提交带有表单操作的表单
action="submitDetails.htm" 如 action 中所述,它抛出 404 错误。地址栏中的 url 显示为
localhost:9080/submitDetails.htm
它缺少项目的上下文根。我的问题是我在请求映射 url 部分做错了什么?
据我了解
1.the 表单是使用 post 提交的,它对模式进行数学运算
2. /submitDetails.htm 匹配 class 级别 url 模式映射中的模式 /* 因此请求应该进入控制器,
3. 最后是控制器方法中的方法级映射
url 模式和请求方法与动作和方法相同
在 jsp 所以它应该进入控制器方法并在
console--- 没有发生。
谁能帮我理解一下?
据我了解,您在表单的操作属性中缺少上下文路径。尝试将其定义如下:
<form:form commandName="myUser" modelAttribute="myUser" method="POST" action="${pageContext.servletContext.contextPath}/submitDetails.htm" >
你的问题在将 /* 更改为 / 后解决了,因为,
每个url包含两部分
1)Servlet Path
2)Path info
考虑以下代码
<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喜欢
/abc 然后它会调用 ExactMatchServlet
Servlet Path -> /abc
Path info -> null
/abc/pqr 它将调用 PathInfoServlet
Servlet Path -> /abc
Path info -> /pqr
/something/random 它将调用 PathInfoServlet
Servlet Path -> null
path info -> /something/random
当你更换时
<url-pattern>/*</url-pattern>
和
<url-pattern>/</url-pattern>
然后调用/something/random然后
Servlet Path -> /something/random
path info -> null
所以基本上改变 /* 与 / 改变你的 url 部分的映射(Servlet 路径和路径信息)
对于该区域容器无法为您的 url 找到 servlet,它给出 404 错误。
下面是我的控制器、网页 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);
}
}
网络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 中定义的 class 级别 url 模式,如果我导航到下面 url http://localhost:9080/ExampleSpring or http://localhost:9080/ExampleSpring/
controll 将转到我的 jsp 页面并询问详细信息。输入详细信息后,如果我提交带有表单操作的表单 action="submitDetails.htm" 如 action 中所述,它抛出 404 错误。地址栏中的 url 显示为 localhost:9080/submitDetails.htm 它缺少项目的上下文根。我的问题是我在请求映射 url 部分做错了什么?
据我了解
1.the 表单是使用 post 提交的,它对模式进行数学运算 2. /submitDetails.htm 匹配 class 级别 url 模式映射中的模式 /* 因此请求应该进入控制器, 3. 最后是控制器方法中的方法级映射 url 模式和请求方法与动作和方法相同 在 jsp 所以它应该进入控制器方法并在 console--- 没有发生。
谁能帮我理解一下?
据我了解,您在表单的操作属性中缺少上下文路径。尝试将其定义如下:
<form:form commandName="myUser" modelAttribute="myUser" method="POST" action="${pageContext.servletContext.contextPath}/submitDetails.htm" >
你的问题在将 /* 更改为 / 后解决了,因为, 每个url包含两部分
1)Servlet Path
2)Path info
考虑以下代码
<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喜欢
/abc 然后它会调用 ExactMatchServlet
Servlet Path -> /abc
Path info -> null
/abc/pqr 它将调用 PathInfoServlet
Servlet Path -> /abc
Path info -> /pqr
/something/random 它将调用 PathInfoServlet
Servlet Path -> null
path info -> /something/random
当你更换时
<url-pattern>/*</url-pattern>
和
<url-pattern>/</url-pattern>
然后调用/something/random然后
Servlet Path -> /something/random
path info -> null
所以基本上改变 /* 与 / 改变你的 url 部分的映射(Servlet 路径和路径信息)
对于该区域容器无法为您的 url 找到 servlet,它给出 404 错误。