栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

SpringMVC——处理响应数据

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

SpringMVC——处理响应数据

文章目录

1.SpringMVC的数据响应方式2. 页面跳转

2.1 返回字符串2.2 通过ModelAndView返回

2.2.1 了解Map,Model,MapModel2.2.2 ModelAndView 3.回写数据

3.1 返回字符串

3.1.1 使用原生API3.1.2 使用@ResponseBody注解 3.2 返回对象或集合 4.转发和重定向

1.SpringMVC的数据响应方式
    页面跳转

    返回字符串(视图拼接)通过ModelAndView对象返回页面 回写数据

    返回字符串返回对象或集合

2. 页面跳转 2.1 返回字符串
@RequestMapping("/login")
public String login(String phone, String code) {
    return "success";
}

发生字符串拼接是因为我们之前配置了视图控制器


    
    
    
    

在SpringMVC的源码中,视图控制器中会自动拼接地址

protected AbstractUrlbasedView buildView(String viewName) throws Exception {
    AbstractUrlbasedView view = instantiateView();
    //视图的真正拼接的地方
    view.setUrl(getPrefix() + viewName + getSuffix());
    view.setAttributesMap(getAttributesMap());

    String contentType = getContentType();
    if (contentType != null) {
        view.setContentType(contentType);
    }

    String requestContextAttribute = getRequestContextAttribute();
    if (requestContextAttribute != null) {
        view.setRequestContextAttribute(requestContextAttribute);
    }

    Boolean exposePathVariables = getExposePathVariables();
    if (exposePathVariables != null) {
        view.setExposePathVariables(exposePathVariables);
    }
    Boolean exposeContextBeansAsAttributes = getExposeContextBeansAsAttributes();
    if (exposeContextBeansAsAttributes != null) {
        view.setExposeContextBeansAsAttributes(exposeContextBeansAsAttributes);
    }
    String[] exposedContextBeanNames = getExposedContextBeanNames();
    if (exposedContextBeanNames != null) {
        view.setExposedContextBeanNames(exposedContextBeanNames);
    }

    return view;
}
2.2 通过ModelAndView返回 2.2.1 了解Map,Model,MapModel

在SpringMVC中,除过在方法上传入原生API,如request,session外,还可以通过将数据放在Map,Model,MapModel中。给这些参数里面保存的所有数据都会放在请求域中,可以在页面获取。

@RequestMapping("/test01")
public String test01(Map map) {
    map.put("haha", "你好强");
    return "success";
}

@RequestMapping("/test02")
public String test02(Model model) {
    model.addAttribute("haha", "你好棒");
    return "success";
}

@RequestMapping("/test03")
public String test03(ModelMap modelMap) {
    modelMap.addAttribute("haha", "你好大");
    return "success";
}

success.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>

    
        h
    
    
        success
        pageScope : ${pageScope.haha} 
requestScope : ${requestScope.haha}
sessionScope : ${sessionScope.haha}
applicationScope : ${applicationScope.haha}

结果也如上诉所说,只有requestScope中可以获取到haha的值.


这里就存在一个疑问,为什么这三个类都可以给页面存放数据呢?我们来获取一下他们的类型,发现类型都是BindingAwareModelMap,我们查看一下这个类的继承关系

class org.springframework.validation.support.BindingAwareModelMap

发现BindingAwareModelMap是这三个类的继承和实现子类.

那传进去的这些map,model, model是怎么自动转为为BindingAwareModelMap的呢?

在初始化页面的视图ModelAndView时,会先生成ModelAndViewContainer容器
ModelAndViewContainer mavContainer = new ModelAndViewContainer();

在这个ModelAndViewContainer容器中,默认的实现类就是BindingAwareModelMap();这里也就可以解释为什么这三个类进来,都是BindingAwareModelMap了.
private final ModelMap defaultModel = new BindingAwareModelMap();
2.2.2 ModelAndView

返回一个ModelAndView对象,既包含视图信息(页面地址),也包含模型数据(给页面带的数据)

@RequestMapping("/test04")
public ModelAndView test04 (){
    //新建一个模型视图对象,也可以直接传入名字
    ModelAndView mv = new ModelAndView();
    //封装要显示到视图中的数据
    //相当于req.setAttribute("haha",HelloWorld!);
    mv.addObject("msg","HelloWorld!");
    //设置视图的名字,相当于之前的return "success";
    mv.setViewName("success");
    return mv;
}
3.回写数据 3.1 返回字符串 3.1.1 使用原生API

通过在方法参数上加上HttpServletResponse对象,使用response.getWriter().print()在要跳转的页面上回写数据

@RequestMapping("/test04")
public void test04(HttpServletResponse response) throws IOException {
    response.getWriter().println("你好猛");
}
3.1.2 使用@ResponseBody注解
@RequestMapping("/test05")
@ResponseBody
public String test045(){
    return "success";
}
3.2 返回对象或集合

在Springmvc.xml中进行如下配置




    

    
    

    
        
        
        
        
    

@RequestMapping("/test06")
@ResponseBody
public User test06(){
    User user = new User("lcp", 20);
    return user;
}

页面输出

{"name":"lcp","age":20}
4.转发和重定向

在SpringMVC中,控制器方法返回字符串类型的值会被当成逻辑视图名处理,默认是转发.

**转发:**在返回的字符串前面加上 “forward:/路径地址”。

**重定向:**在返回字符串的前面加上 “redirect:/路径地址”。

@Controller
public class Login {
    @RequestMapping("/test04")
    public void test04(HttpServletResponse response) throws IOException {
        response.getWriter().println("你好猛");
    }


    @RequestMapping("/test06")
    @ResponseBody
    public User test06(){
        User user = new User("lcp", 20);
        return user;
    }

     //测试重定向
    @RequestMapping("/test07")
    public String test07(){
        return "redirect:/test04";
    }

    //测试转发
    @RequestMapping("/test08")
    public String test08(){
        return "forward:/test06";
    }
}

注意:

通过SpringMVC来实现转发和重定向。

直接 return “success”,会走视图解析器进行拼串转发:return “forward:/succes.jsp”;直接写绝对路径,/表示当前项目下,不走视图解析器重定向:return “redirect:/success.jsp”;不走视图解析器使用原生的ServletAPI时要注意,/路径需要加上项目名才能成功

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/708994.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号