spring mvc 控制器类的返回值,发送ajax和响应json
返回类型是String
controller 方法返回字符串可以指定逻辑视图名,通过视图解析器解析为物理视图地址。
//指定逻辑视图名,经过视图解析器解析为 jsp 物理路径:/WEB-INF/pages/success.jsp
/** * 返回String * @param model * @return */ @RequestMapping("/testString") public String testString(Model model){ System.out.println("testString..."); //模拟从数据库中查询出User对象 User user = new User(); user.setUsername("美美"); user.setPassword("123"); user.setAge(30); //model对象 model.addAttribute("user",user); return "success"; }
2.返回类型是void
Servlet 原始 API 可以作为控制器中方法的参数:因此使用原式servlet的request和response作为参数
/** * 返回void:如果没有返回值,也没有跳转,默认的页面是 请求路径.jsp * * @param */ @RequestMapping("/testVoid") public void testVoid(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println("testVoid..."); //请求转发 //request.getRequestDispatcher("/WEB-INF/pages/success.jsp").forward(request,response); //重定向:WEB-INF里的内容不能直接请求 //response.sendRedirect(request.getContextPath()+"/index.jsp"); //直接响应 response.setCharacterEncoding("UTF-8"); response.setContentType("text/html;charset=UTF-8"); response.getWriter().print("你好"); return; }
3.返回类型是ModelAndView
ModelAndView 是 SpringMVC 为我们提供的一个对象,该对象也可以用作控制器方法的返回值。
@RequestMapping("/testModelAndView") public ModelAndView testModelAndView(){ //创建ModelAndView对象 ModelAndView modelAndView = new ModelAndView(); System.out.println("testString..."); //模拟从数据库中查询出User对象 User user = new User(); user.setUsername("美美"); user.setPassword("123"); user.setAge(30); //把user对象存储到mv对象中,也会把user对象存入到response域对象中,即接受响应的浏览器页面可以直接获取到user对象 modelAndView.addObject("user",user); //跳转到哪个页面,用视图解析器进行解析 modelAndView.setViewName("success"); return modelAndView; }
发送ajax请求
首先会遇到的问题:
1. DispatcherServlet会拦截到所有的资源,导致一个问题就是静态资源(img、css、js)也会被拦截到,从而导致js通过src导入的.js(比如jquery.js)文件不能被使用。
解决问题就是需要配置静态资源不进行拦截,在springmvc.xml配置文件添加如下配置
1. mvc:resources标签配置不过滤
2. location元素表示webapp目录下的包下的所有文件
3. mapping元素表示以/static开头的所有请求路径,如/static/a 或者/static/a/b
对于该问题,只要在springmvc.xml加这么一行即可
<!--前端控制器,哪些静态资源不拦截--> <mvc:resources mapping="/js/**" location="/js/"/>
注意:可以通过另一种方法绕过拦截器的拦截,就是在web.xml配置里的最开始就配置一个servlet-mapping,这样就不会让springmvc的拦截器拦截了
<!--不拦截.js文件--> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.js</url-pattern> </servlet-mapping>
需要提前导入的jar坐标:这三个jar包是用来把json字符串和实体对象进行转化封装的
<dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.9.0</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-core</artifactId> <version>2.9.0</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-annotations</artifactId> <version>2.9.0</version> </dependency>
初始页面index.jsp
<%-- Created by IntelliJ IDEA. User: ASUS Date: 2020/4/13 Time: 10:47 To change this template use File | Settings | File Templates. --%> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> </head> <body> <button id="btn">发送ajax请求</button> </body> </html> <script src="js/jquery-3.5.0.js"></script> <script> // 页面加载,绑定单击事件 $(function () { $("#btn").click(function () { // 发送ajax请求 $.ajax({ // 编写json格式的请求 url: "user/testAjax", // 请求路径 contentType:"application/json;charset=utf-8", //请求参数格式 data:'{' + // 请求参数 '"username":"hehe",' + '"password":"123",' + '"age":30' + '}', dataType:"json", // 返回数据类型 type:"post", // 请求方式 success:function (data) { // 请求响应后的回调方法 // data:服务器响应的json数据,进行解析 alert(data); alert(data.username); } }); }); }) </script>
controller类对应的方法
/** * 处理ajax请求:获取请求体 * 客户端发送ajax请求,传的是json字符串,后端把json字符串封装到user对象中 * @param user */ @RequestMapping("/testAjax") public @ResponseBody User testAjax(@RequestBody User user){ // 此处已使用jacksonjar包进行封装 System.out.println("testAjax执行了..."); System.out.println(user); user.setAge(40); user.setUsername("haha"); // 做响应:只需要返回一个对象,注解自动将user转换成json字符串 return user; }