我有:琐碎的Spring MVC示例应用。我将DispatcherServlet
配置为处理以dispatcher/
开头的所有请求。
问题:部署到Tomcat后,如果我尝试转到localhost:8080
页面,我会The requested resource (/) is not available.
。但我可以通过localhost:8080/dispatcher
路径。
问题:
simple
代替mockMvc.perform(get("/"))
,为什么mockMvc.perform(get("/dispatcher"))
测试有效?代码:
的web.xml:
<servlet>
<servlet-name>mvc-dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>mvc-dispatcher</servlet-name>
<url-pattern>/dispatcher/*</url-pattern>
</servlet-mapping>
控制器:
@Controller
@RequestMapping("/")
public class HelloController {
@RequestMapping(method = RequestMethod.GET)
public String printWelcome(ModelMap model) {
model.addAttribute("message", "Hello world!");
return "hello";
}
}
测试:
@Test
public void simple() throws Exception {
mockMvc.perform(get("/"))
.andExpect(status().isOk())
.andExpect(model().attribute("message", "Hello world!"))
.andExpect(view().name("hello"));
}
答案 0 :(得分:2)
问题:部署到Tomcat之后,如果我尝试转到localhost:8080 页面我得到请求的资源(/)不可用..但我可以去 通过localhost:8080 /调度程序路径。
从Servlet容器的角度访问您的控制器 - 当您键入localhost时,您正在执行的操作:8080 / dispatcher - 需要在url路径中提供大量信息。例如,您的HelloController
是
mvc-dispatcher
Servlet mvc-dispatcher
Servlet在Web应用程序中声明(由您的web.xml定义)当你考虑所有这些时,解决网址有很多含糊之处。正如@san krish指出的那样,并假设您已将应用程序部署到Tomcat的根上下文,您可以强制执行mvc-dispatcher
所有内容并将其映射到/ *作为默认值,并最终为您的HelloController
提供服务localhost:8080/
。
如果我们改为使用mockMvc.perform(get(“/”)),为什么简单测试会起作用 mockMvc.perform(get(“/ dispatcher”))?
在测试中从mockMvc访问您的控制器是非常本地化的。根据您的测试设置方式,可以从以下位置创建MockMvc实例:
mvc-dispatcher
及其“/ dispatcher”路径一无所知。@ContextConfiguration
注释,指向您的“mvc-dispatcher”xml或@Configuration类。在这种情况下,MockMvc将对“mvc-dispatcher”下的所有内容进行操作,因此无需在路径中引用“调度程序”。答案 1 :(得分:1)
在web.xml
地图中显示通配符
<servlet-mapping>
<servlet-name>mvc-dispatcher</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
它会将所有正在进行的请求传递给调度程序servlet