springmvc返回值类型及响应数据类型

2022-03-23 17:13:40 浏览数 (1)

返回值分类

字符串 controller 方法返回字符串可以指定逻辑视图名,通过视图解析器解析为物理视图地址 例: jsp

代码语言:javascript复制
		<a href="user/testString" >testString</a>

控制层

代码语言:javascript复制
   /**
     * 返回值类型是字符串
     * @param model
     * @return
     */
     //指定逻辑视图名,经过视图解析器解析为 jsp 物理路径:/WEB-INF/pages/success.jsp
    @RequestMapping("/testString")
    public String testString(Model model){
        System.out.println("testString方法执行了");
        //模拟从数据库中查寻出user对象
        User user=new User();
        user.setUsername("喜洋洋");
        user.setPassword("123456");
        user.setAge(23);
        //model对象存入数据
        model.addAttribute("user",user);
        return "success";
    }

void Servlet 原始 API 可以作为控制器中方法的参数 jsp

代码语言:javascript复制
		<a href="user/testVoid" >testVoid</a>

控制层

代码语言:javascript复制
 /**
     * 返回值类型是void
     * 请求转发一次请求,不用编写项目名称
     * 重定向两次请求 写项目名字
     */
    @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);
        //不让后面的代码继续执行 返回一个return

        //编写重定向 response请求不能直接访问WEB-INF下的文件 request可以
        //request.getContextPath()获取当前项目名
        //response.sendRedirect(request.getContextPath() "/index.jsp");

        //设置中文乱码
        response.setCharacterEncoding("UTF-8");
        //设置浏览器打开解析的编码
        response.setContentType("text/html;charset=UTF-8");

        //直接进行响应(第二种)  通过输出流   response.getWriter()获取输出流
        response.getWriter().print("张三");

        return;
    }

ModelAndView ModelAndView 是 SpringMVC 为我们提供的一个对象,该对象也可以用作控制器方法的返回值 jsp

代码语言:javascript复制
		<a href="user/testModelAndView" >testModelAndView</a>

控制层

代码语言:javascript复制
  /**
     * 返回ModelAndView对象
     * @return
     */
    @RequestMapping("/testModelAndView")
    public ModelAndView testModelAndView(){
        //创建ModelAndView对象
        ModelAndView mv=new ModelAndView();
        System.out.println("testModelAndView方法执行了");
        //模拟从数据库中查寻出user对象
        User user=new User();
        user.setUsername("喜洋洋");
        user.setPassword("123456");
        user.setAge(23);
        //把user对象存储到mv中  也会把user对象存入到request对象中
        mv.addObject("user",user);
        //设置跳转到哪个页面  用视图解析器
        mv.setViewName("success");
        return mv;
    }

success.jsp

代码语言:javascript复制
    ${ user.username}
      ${ user.password}
      ${ user.age}
   <%--取出数据--%>

转发和重定向 controller 方法在提供了 String 类型的返回值之后,默认就是请求转发 jsp

代码语言:javascript复制
		a href="user/testForwardOrRedirect" >testForwardOrRedirect</a>

控制层

代码语言:javascript复制
 /**
     * 使用关键字方式进行转发和重定向   手动转发不能用视图解析器 所以要写全路径
     * @return
     */
    @RequestMapping("/testForwardOrRedirect")
    public String testForwardOrRedirect(){
        System.out.println("testForwardOrRedirect方法执行了");
        //请求转发 forward: 页面 固定写法
//        return "forward:/WEB-INF/pages/success.jsp";
        //重定向   redirect: 页面 固定写法 /WEB-INF/pages/重定向请求不到
        //不用加项目名称 关键字默认为我们加好了
        return "redirect:/index.jsp";
    }

需要注意的是,如果用了 formward:则路径必须写成实际视图 url,不能写逻辑视图。 它相当于“request.getRequestDispatcher(“url”).forward(request,response)”。使用请求 转发,既可以转发到 jsp,也可以转发到其他的控制器方法。 ResponseBody 响应 json 数据 作用: 该注解用于将 Controller 的方法返回的对象,通过 HttpMessageConverter 接口转换为指定格式的 数据如:json,xml 等,通过 Response 响应给客户端 注对 json 数据进行转换,需要加入jackson jar包 坐标

代码语言:javascript复制
 <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>

配置不拦截静态资源 springmvc.xml

代码语言:javascript复制
 <!--配置前端控制器 哪些静态资源 图片 js文件等不拦截 location=目录下的文件 mapping请求带js的都不拦截-->
    <!-- 设置静态资源不过滤 -->
    <mvc:resources location="/css/" mapping="/css/**"/> <!-- csss样式 -->
    <mvc:resources location="/images/" mapping="/images/**"/> <!-- 图片 -->
    <mvc:resources location="/js/" mapping="/js/**"/> 

jsp代码 发送ajax异步请求

代码语言:javascript复制
<head>
    <title>Title</title>
    <script src="js/jquery.min.js"></script>
    <script>
        // 页面加载,绑定单击事件
        $(function(){
            $("#btn").click(function(){
             //发送ajax请求
            $.ajax({
              //编写json格式 设置属性和值  url:"user/testAjax",后台的方法
                url:"user/testAjax",
                // contentType:"application/json;charset=UTF-8",发送至服务器时内容编码类型
                contentType:"application/json;charset=UTF-8",
                //data 发送到服务器的数据     json数据
                data:'{"username":"hehe","password":"123456","age":"30"}',
                //dataType 预期服务器返回的类型
                dataType:"json",
                //type请求方式 默认是get
                type:"post",
                //success 请求成功后的回调函数
                success:function (data) {
                   //data指服务器端返回的json数据,进行解析
                 alert(data);
                 alert(data.username);
                 alert(data.password);
                 alert(data.age);
                }
            });
        });
});

    </script>

</head>



<button id="btn">发送ajax的请求</button>

控制层

代码语言:javascript复制
/**
     * 模拟异步请求 响应
     * RequestBody取到请求体接收json数据
     * @ResponseBody 响应 把对象数据转成json
     */
    @RequestMapping("/testAjax")
    public @ResponseBody User testAjax(@RequestBody User user){
        System.out.println("testAjax方法执行了");
        //客户端发送ajax的请求,传的是json字符串,后端把json字符串封装到user对象中
        System.out.println(user);
        //作出响应,模拟查询了数据库
        user.setUsername("haha");
        user.setAge(40);
        //作响应
        return user;
    }

0 人点赞