SpringMVC响应方式介绍

页面跳转:

  1. 返回字符串逻辑视图
  2. void原始ServletAPI
  3. ModelAndView

返回数据:

  1. 直接返回字符串数据
  2. 将对象或集合转为json返回

返回字符串逻辑视图

直接返回字符串:这种方式会将返回的字符串与视图解析器的前后缀拼接,然后跳转到指定页面。

@RequestMapping("/returnString")
public String returnString() {
    return "success";
}

void原始ServletAPI

通过request、response对象实现响应。

@RequestMapping("/returnVoid")
public void returnVoid(HttpServletRequest request, HttpServletResponse response) throws Exception {
    
    // 1. 通过response直接响应数据
    response.setContentType("text/html;charset=utf-8");
    response.getWriter().write("输出的信息");

    // ----------------------------------------

    request.setAttribute("username", "测试");
    // 2. 通过request实现转发
    request.getRequestDispatcher("/WEB-INF/pages/success.jsp").forward(request, response);

    // ----------------------------------------

    // 3. 通过response实现重定向
    response.sendRedirect(request.getContextPath() + "/index.jsp");
}

转发 & 重定向

forward转发

在实际开发中,一般使用返回字符串逻辑视图实现页面的跳转,这种方式其实就是请求转发。

  • 也可以写成:forward转发
  • 如果用了forward:则路径必须写成实际视图url,不能写逻辑视图。它相当于:
request.getRequestDispatcher("url").forward(request,response)
  • 使用请求转发,既可以转发到jsp,也可以转发到其他的控制器方法。
@RequestMapping("/forward")
public String forward(Model model) {
    model.addAttribute("username", "转发测试");
    return "forward:/WEB-INF/pages/success.jsp";
}

Redirect重定向

我们可以不写虚拟目录,SpringMVC框架会自动拼接,并且将Model中的数据拼接到url地址上。

@RequestMapping("/redirect")
public String redirect(Model model) {
    model.addAttribute("username", "重定向测试");
    return "redirect:/index.jsp";
}

ModelAndView

方式一

在Controller中创建并返回ModelAndView对象,并设置视图名称。

@RequestMapping("/returnModelAndView1")
public ModelAndView returnModelAndView1() {

    // Model:模型 封装数据
    // View :视图 展示数据

    ModelAndView modelAndView = new ModelAndView();
    // 设置模型数据
    modelAndView.addObject("username", "test");
    // 设置视图名称
    modelAndView.setViewName("success");
    return modelAndView;
}

方式二【推荐】

在Controller方法的形参上直接声明ModelAndView,无需在方法中自己创建,在方法中直接使用该对象设置视图。

@RequestMapping("/returnModelAndView2")
public ModelAndView returnModelAndView2(ModelAndView modelAndView) {
    // 设置模型数据 
    modelAndView.addObject("username", "test");
    // 设置视图名称 
    modelAndView.setViewName("success");
    return modelAndView;
}

@SessionAttributes

如果在多个请求之间共用数据,则可以在控制器类上标注 @SessionAttributes,配置需要在session中存放的数据范围,SpringMVC会将存放在model中对应的数据暂存到 HttpSession 中。

注意事项:@SessionAttributes能且只能定义在类上。

@Controller
@SessionAttributes("username")      // 向request域存入的key为username时,同步到session域中
public class UserController {

    @RequestMapping("/forward")
    public String forward(Model model) {
        model.addAttribute("username", "测试");
        return "forward:/WEB-INF/pages/success.jsp";
    }

    @RequestMapping("/returnString")
    public String returnString() {
        return "success";
    }
}
Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐