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;
    }

 

 

posted on 2020-04-13 12:42  zsben  阅读(483)  评论(0编辑  收藏  举报

导航