zoukankan      html  css  js  c++  java
  • 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;
        }
  • 相关阅读:
    SQL CREATE TABLE 语句
    SQL CREATE DATABASE 语句
    SQL INSERT INTO SELECT 语句
    SQL SELECT INTO 语句
    Why is chkconfig no longer available in Ubuntu?
    drag-html
    js利用offsetWidth和clientWidth来计算滚动条的宽度
    procomm plus
    很多shell命令后面的单横杠和双横杠,原来这个意思
    angular md-toast 颜色
  • 原文地址:https://www.cnblogs.com/zsben991126/p/12690663.html
Copyright © 2011-2022 走看看