跳转到目录
当对前端控制器设置为拦截资源的路径( url-pattern )为/
时,此时出现不能访问静态资源的问题。
导致原因 :
在Tomcat中处理静态资源的servlet ( default )所映射路径为就是/。在启动项目的时候,在Tomcat中的web.xml是先加载,项目的web.xml是后加载,如果配置了相同的映射路径,项目中的web.xml会覆盖Tomcat中web.xml相同的配置。
也就是说, SpringMVC中的DispatcherServlet的映射路径覆盖了Tomcat默认对静态资源的处理的路径
。此时SpringMVC会把静态资源当做是Controller ,寻找并访问,当然结果肯定是找不到。
为了效果明显,可以在web根目录新建一个test.html ,在images文件夹里面包含一张图片。
跳转到目录
当没有在springmvc-servlet.xml中配置
的测试如下:
在springmvc-servlet.xml中配置
配置后:
跳转到目录
在springmvc-servlet.xml中配置
该配置把web下的目录都为根目录, /**表示多级目录;这种方式相比第一种更强大一下,开发中使用的也比较多;
效果如下:
<mvc:resources location="/" mapping="/**"/>
跳转到目录
跳转到目录
*.do、*.htm
是最传统方式,不会导致静态文件(jpg、js、Css )被拦截,但不支持RESTful风格。/
,可以支持流行的RESTfull 风格,但会导致静态文件(jpg、js、 CSS )被拦截后不能正常显示。/*
,是错误的方式,可以请求到Controller 中,但调转到jsp时被拦截,不能渲染jsp视图。跳转到目录
跳转到目录
@Controller
// 窄化处理: 比如想访问/test1,必须在url中输入 /response/test1
@RequestMapping("/response")
public class HandleResponseController {
//返回void类型,此时可以把Controller方法当做Servlet来使用
@RequestMapping("/test1")
public void test1(HttpServletRequest request, HttpServletResponse response) throws Exception {
//请求转发:
request.getRequestDispatcher("").forward(request, response);
//URL重定向
response.sendRedirect("");
//设置共享数据
request.setAttribute("", "");
//输出JSON格式
response.setContentType("text/json;charset=utf-8");
response.getWriter().println("");
}
注意: 在开发中如果要使用到Servlet API对象,此时就可以直接以参数的形式传递进去,或者以DI注解方式注入; 使用DI注解不推荐,因为Controller是单例的会造成线程不安全问题;
跳转到目录
//返回ModelAndView
@RequestMapping("/test2")
public ModelAndView returnMv() {
ModelAndView mv = new ModelAndView();
//设置共享数据的key和value
mv.addObject("msg", "返回ModelAndView");
//设置共享数据value,此时会把value类型的首字母作为key:string
mv.addObject("你好桂朝阳");
mv.setViewName("welcome");
return mv;
}
跳转到目录
// 返回String,逻辑视图名称,此时需要结合Model类型的参数一起使用
@RequestMapping("test3")
public String returnStr(Model model) {
model.addAttribute("msg", "返回String");
model.addAttribute("朝阳你好String");
// 返回的就是视图名称
return "welcome";
}
跳转到目录
跳转到目录
// 请求转发,浏览器地址栏不改变,可以共享请求的数据
//原理:request.getRequestDispatcher("").forward(request, response);
@RequestMapping("test4")
public String test4(Model model) {
return "forward:/hello.html";
}
跳转到目录
// URL重定向,浏览器地址栏会改变,不能共享请求中的数据
// 原理: response.sendRedirect("");
@RequestMapping("/test5")
public String test5(Model model) {
return "redirect:/hello.html";
}
跳转到目录
请求转发 | URL重定向 | |
---|---|---|
地址栏 | 不会 | 会变 |
共享数据 | 可以 | 不能?(可能会哟) |
表单重复提交 | 导致 | 不会 |
请求资源的路径问题(转发、重定向都一样): 以后访问资源的时候,都使用/开头.
-重定向 redirect:/hello.html 和 redirect:hello.html
访问资源的时候前面带上/,表示绝对路径,从根路径开始去寻找资源.
访问资源的时候签名不加/,表示相对路径,从上一级上下文路径中去寻找资源.
/response/test5----->“redirect:/hello.html”;—>localhost:/hello.html
/response/test5----->“redirect: hello.html”;—>localhost:/response/hello.html
跳转到目录
传统的方式,在URL重定向的时候,因为是两次不同的请求
,所以不能共享请求中的数据.在开发中有的时候,真的需要重定向跳转后共享数据.
spring3.1开始 提供了Flash属性.,只能使用从Controller重定向到Controller,不能到JSP.
@RequestMapping("/a")
public String a(RedirectAttributes ra) {
ra.addAttribute("msg1", "gzy");
ra.addFlashAttribute("msg2", "gzy");
return "redirect:/response/b";
}
@RequestMapping("/b")
public String b(String msg1, @ModelAttribute("msg2")String msg2) {
System.out.println("msg1:" + msg1);
System.out.println("msg2:" + msg2);
return null;
}