SpringMVC--返回不同类型的数据

SpringMVC目录:

页面与控制器交换数据的方式:

  • Spring MVC页面传值到控制器
    (1)使用Request进行页面传值到控制器(不建议使用)
    (2)使用属性进行页面传值到控制器
    (3)使用Bean对象进行页面传值到控制器

  • Spring MVC控制器传值到页面
    (1)使用Request、Session进行控制器传值到页面(不建议使用)
    (2)使用ModelAndView进行控制器传值到页面
    (3)使用ModelMap进行控制器传值到页面(建议使用)

不同的响应数据类型

新建一个控制器类:UserController

@Controller
@RequestMapping("/user")
public class UserController {
    ......
}

响应字符串
controller 方法返回字符串可以指定逻辑视图名,通过视图解析器解析为物理视图地址,实现界面跳转。
jsp配置

<a href="user/testReturnString">ReturnString</a></br>

控制器配置

//指定逻辑视图名,经过视图解析器解析为 jsp 物理路径:/WEB-INF/pages/success.jsp
@RequestMapping("/testReturnString")
public String testReturnString() {
	System.out.println("AccountController 的 testReturnString 方法执行了。。。。");
	return "success"; 
}

通过Mode绑定处理后所得的数据

@RequestMapping("/testString")
public String testString(Model model){
    System.out.println("testString方法执行了...");
    //模拟从数据库中查询出User对象
    User user=new User();
    user.setUsername("lll");
    user.setPassword("666");
    user.setAge(20);
    //model对象
    model.addAttribute("user",user);
    return "success";
}

success.jsp页面展示响应数据:注意配置isELIgnored="false"不忽略EL表达式

<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
	success
	${user.username}
	${user.password}
</body>
</html>

返回类型为void

当返回类型为void时,方法会默认请求请求路径名称的jsp页面,Servlet 原始 API 可以作为控制器中方法的参数,因此我们可以在方法中进行请求转发或重定向

请求转发:

/**
 * 返回值类型是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;

}

重定向:

/**
 * 返回值类型是void,重定向
 */
@RequestMapping("/testVoid")
public void testVoid(HttpServletRequest request, HttpServletResponse response) throws Exception {
    System.out.println("testVoid方法执行了...");
    //重定向
    response.sendRedirect(request.getContextPath()+"/index.js");
	return;
}

直接响应:

/**
 * 返回值类型是void,直接响应
 */
@RequestMapping("/testVoid")
public void testVoid(HttpServletRequest request, HttpServletResponse response) throws Exception {
    System.out.println("testVoid方法执行了...");

    //设置中文乱码
    response.setCharacterEncoding("UTF-8");
    response.setContentType("text/html;charset=UTF-8");
    //直接会进行响应
    response.getWriter().print("你好");
	return;
}

Spring MVC的转发和重定向

  • 转发:对于Spring MVC中的请求转发,在日常开发中运用是比较多的。在Controller中,处理完表单传递过来的数据,一般会返回一个字符串,或者是ModelandView,然后经过Spring MVC的视图解析器进行解析。拼接成返回视图的路径,然后将数据通过model.addAttribute放在model中传递到页面上进行渲染。这里实际的本质还是将要返回的数据保存在Response中,然后经过转发的页面能够通过EL表达式来获取对应的数据。
  • 重定向:一般情况下,在Controller中处理相关数据之后会直接返回到对应的页面,但是有些时候需要在Controller中处理完数据之后,需要跳转到另一个Controller中进行相关操作,这是我们可能就会用到请求重定向,而这里的重定向可以细分为:无参重定向,通过URL拼接带参重定向,和RedirectAttributes带参重定向。对于无参重定向跳转,直接在返回的字符串中直接跳转,也可以用ModelAndView来进行重定向,和直接返回字符串是类似的。

在 controller 方法形参上可以定义 request 和 response,使用 request 或 response 指定响应结果:

  • 1、使用 request 转向页面,如下:
    request.getRequestDispatcher("/WEB-INF/pages/success.jsp").forward(request, response);
  • 2、也可以通过 response 页面重定向:
    response.sendRedirect(“testRetrunString”) 3、也可以通过 response 指定响应结果,例如响应 json 数据:
    response.setCharacterEncoding(“utf-8”);
    response.setContentType(“application/json;charset=utf-8”);
    response.getWriter().write(“json 串”);

使用关键字实现请求转发和重定向
forward 转发:controller 方法在提供了 String 类型的返回值之后,默认就是请求转发。

/**
 * 使用关键字的方式进行转发或重定向
 * @return
 */
@RequestMapping("/testForward")
public String testForwardOrRedirect(){
    System.out.println("testForward方法执行了...");

    //请求转发
    return "forward:/WEB-INF/pages/success.jsp";    
}

需要注意的是,如果用了 formward:则路径必须写成实际视图 url,不能写逻辑视图。它相当于“request.getRequestDispatcher(“url”).forward(request,response)”。使用请求转发,既可以转发到 jsp,也可以转发到其他的控制器方法。

Redirect 重定向:contrller 方法提供了一个 String 类型返回值之后,它需要在返回值里使用:redirect:

/**
 * 使用关键字的方式进行转发或重定向
 * @return
 */
@RequestMapping("/testRedirect")
public String testForwardOrRedirect(){
    System.out.println("testRedirect方法执行了...");

    //重定向
    return "redirect:/index.jsp";
}

它相当于“response.sendRedirect(url)”,如果是重定向到 jsp 页面,则 jsp 页面不能写在 WEB-INF 目录中,否则无法找到。

返回ModelView对象
ModelAndView:模型视图对象,它是 SpringMVC 为我们提供的一个对象,该对象也可以用作控制器方法的返回值。Mode用来绑定处理后所得的数据,View视图名。ModeAndView有两种构造方法,第一个视图名,第二个需要绑定的数据。
Model 是 spring 提供的一个接口,该接口有一个实现类 ExtendedModelMap,该类继承了 ModelMap,而 ModelMap 就是 LinkedHashMap 子类。

<!-- 配置视图解析器 -->
ModeAndView(String viewName)
ModeAndView(String viewName ,Map data)
/**
 * 返回ModelAndView对象
 * @return
 */
@RequestMapping("/testModelAndView")
public ModelAndView testModelAndView(){
    //创建ModelAndView对象
    ModelAndView mv=new ModelAndView();
    System.out.println("testModelAndView方法执行了...");
    //模拟从数据库中查询出User对象
    User user=new User();
    user.setUsername("lll");
    user.setPassword("666");
    user.setAge(10);
    //把user对象存储到mv对象中,也会把user对象存入到request对象
    mv.addObject("user",user);

    //跳转到哪个页面
    mv.setViewName("success");
    return mv;
}

success.jsp页面展示响应数据:注意配置isELIgnored="false"不忽略EL表达式

<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
	success
	${user.username}
	${user.password}
</body>
</html>

我们在页面上上获取使用的是 requestScope.username 取的,所以返回 ModelAndView 类型时,浏览器跳转只能是请求转发。

ResponseBody 响应 json 数据

该注解用于将 Controller 的方法返回的对象,通过 HttpMessageConverter 接口转换为指定格式的数据如:json,xml 等,通过 Response 响应给客户端

使用@ResponseBody 注解实现将 controller 方法返回对象转换为 json 响应给客户端。

Springmvc 默认用 MappingJacksonHttpMessageConverter 对 json 数据进行转换,需要加入jackson 的包。(2.7.0 版本以上)
jsp 中的代码:

<%@ page contentType="text/html;charset=UTF-8" language="java"%>
<html>
<head>
    <title>Title</title>
    <script src="js/jquery-3.4.1.min.js" type="text/javascript"></script>
    <script>
        //页面加载,绑定单击事件
        $(function(){
           $("#btn").click(function(){
               //alert("hello btn");
               //发送ajax请求
               $.ajax({
                   //编写json格式,设置属性和值
                   url:"user/testAjax",
                   contentType:"application/json;charset=UTF-8",
                   data:'{"username":"呵呵","password":"123","age":30}',
                   dataType:"json",
                   type:"post",
                   success:function(data){
                       //data服务器端响应的json的数据,进行解析
                       alert(data);
                       alert(data.username);
                       alert(data.password);
                   }
               });

           });
        });
    </script>
</head>
<body>

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

</body>
</html>

控制器中的代码:

/**
 * 模拟异步请求和响应
 */
@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;
}
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

龙源lll

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值