文章目录
一、 返回值分类
1.1 返回字符串
-
Controller 方法返回字符串可以指定逻辑视图的名称,根据视图解析器为物理视图的地址。
@RequestMapping(value="/hello") public String sayHello() { System.out.println("Hello SpringMVC!!"); // 跳转到 success.js p页面 return "success"; }
-
具体的应用场景
jsp:
<a href="user/testString">testString</a>
Controller:
@Controller @RequestMapping(path = "/user") public class UserController { /** * 返回字符串 * @param model * @return */ @RequestMapping("/testString") public String testString(Model model){ System.out.println("testString方法执行了"); //模拟从数据库中查询出user对象 User user = new User(); user.setUsername("admin"); user.setPassword("111"); user.setAge(13); model.addAttribute("user", user); return "success"; } }
成功页面:
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %> <html> <head> <title>Title</title> </head> <body> <h3>成功页面</h3> ${user.username} ${user.password} ${user.age} </body> </html>
测试结果:
1.2 返回值是 void
-
如果控制器的方法返回值编写成 void,执行程序报404的异常(也有可能是空白页面),默认查找JSP页面没有找到。
原因:默认会跳转到 @RequestMapping(value=“/testVoid”) testVoid的页面。 -
可以使用请求转发或者重定向跳转到指定的页面
-
代码如下:
jsp:
<a href="user/testVoid">testVoid</a>
Controller:
@RequestMapping("/testVoid") public void testVoid(HttpServletRequest request, HttpServletResponse response)throws Exception{ System.out.println("testVoid方法执行了"); //跳转到其他页面 //请求转发 //request.getRequestDispatcher("/WEB-INF/pages/success.jsp").forward(request, response); request.getRequestDispatcher("/index.jsp").forward(request, response); //重定向不能访问wen-inf下面的文件 response.sendRedirect(request.getContextPath()+"/index.jsp"); //设置中文乱码 response.setCharacterEncoding("UTF-8"); response.setContentType("text/html;charset=UTF-8");//浏览器解析 //直接会进行响应 response.getWriter().print("你好"); return; }
注意:用转发和重定向用不了视图解析器,因此需要常规处理。
1.3 返回值是 ModelAndView 对象
-
ModelAndView对象是Spring提供的一个对象,可以用来调整具体的JSP视图
-
具体的代码如下
jsp:
<a href="user/testModelAndView">testModelAndView</a>
Controller:
@RequestMapping("/testModelAndView") public ModelAndView testModelAndView(){ System.out.println("testModelAndView方法执行了"); //创建 ModelAndView 对象 ModelAndView mv = new ModelAndView(); User user = new User(); user.setUsername("xiuyan"); user.setPassword("222222"); user.setAge(13); //把 user 对象存储到 mv 对象中,也会把 user 对象存入到 request 对象中 mv.addObject(user); //跳转 mv.setViewName("success"); return mv; }
测试结果:
二、SpringMVC框架提供的转发和重定向
2.1 forward 请求转发
controller 方法返回 String类型,想进行请求转发也可以编写成:
/**
* "forward:转发的JSP路径",不走视图解析器了,所以需要编写完整的路径
*/
@RequestMapping("/testForward")
public String testForward(){
System.out.println("testForwardOrRedirect方法执行了");
//请求转发
//转发到成功页面
//return "forward:/WEB-INF/pages/success.jsp";
//转到其他页面
//return "forward:/index.jsp";
//其他请求
return "forward:/user/testString";
}
2.2 redirect 重定向
@RequestMapping("/testRedirect")
public String testRedirect(){
System.out.println("testForwardOrRedirect方法执行了");
//重定向
//return "redirect:/user/testString";
return "redirect:/index.jsp";
}
注:重定向访问资源需要加项目的虚拟路径,但 return “redirect:/index.jsp”;
底层帮我们加好项目的虚拟路径了
三、响应 json 数据之过滤静态资源
DispatcherServlet 会拦截到所有的资源,导致一个问题就是静态资源(img、css、js)也会被拦截到,从而不能被使用。解决问题就是需要配置静态资源不进行拦截,在 springmvc.xml 配置文件添加如下配置。
mvc:resources标签配置不过滤
1. location 元素表示 webapp 目录下的包下的所有文件
2. mapping 元素表示以 /static 开头的所有请求路径,如 /static/a 或者/static/a/b
<!--告诉前端控制器,哪些资源不拦截-->
<mvc:resources location="/css/" mapping="/css/**"/> <!-- 样式 -->
<mvc:resources location="/images/" mapping="/images/**"/> <!-- 图片 -->
<mvc:resources location="/js/" mapping="/js/**" /><!--javascript-->