SpringMVC的数据响应方式

1) 页面跳转

直接返回字符串【1】

通过ModelAndView对象返回【2】

2) 回写数据 

直接返回字符串【1】

返回对象或集合【2】

下面详解:

页面跳转:直接返回字符串:【也就是上面我们说的那个】

 

Spring mvc返回json spring mvc返回页面_spring

这是结构图 其中WEB-INF 我们说外界是不能直接访问的,但是他可以在这里转发访问:



@RequestMapping(value = "/go",method = RequestMethod.GET)
    public String GoUrl(){
        System.out.println("您成功访问了 根目录/aaa/go 网页!");
        return "s1";
    }



<bean id="ViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/jsp/"/>  <!--文件名前缀-->
        <property name="suffix" value=".jsp"/>      <!--文件名后缀-->
    </bean>



所以呢 这里路劲合起来就是访问了: 

/WEB-INF/jsp/s1.jsp

所以就完成了一个访问了

这就是直接返回字符串的方式。

页面跳转: 返回 ModelAndView 【很多种方式】:

1: 直接返回 new 一个 ModelAndView 然后 设置一下参数即可返回:

TestController.java:



@Controller
public class TestController {
    @RequestMapping(value = "/go",method = RequestMethod.GET)
    //返回的数据类型一定要是 ModeAndView哦~
    public ModelAndView GoUrl(){
        //实例化一个ModelAndView对象
        ModelAndView mad = new ModelAndView();
        //设置model  和 View名
        //设置Model 键值方式
        mad.addObject("name","BiHu");
        //设置View 名
        mad.setViewName("s1");  //因为配置里面设置了前缀和后缀 所以这里直接设置s1

        //返回ModelAndView
        return mad;
    }
}



Tips  这里的设置了 视图解析器的 前缀和后缀 所以这里直接返回了,注意啊。

因为设置了Model ,设置了个name = “bihu” 所以在s1.jsp 中可以直接用el表达式解析出来【如果无法解析 请头部添加<%@ page isELIgnored="false" %>】

s1.jsp:



<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page isELIgnored="false" %>
<html>
<head>
    <title>ok!</title>
</head>
<body>
    <h2>ok! 恭喜您! 您的ModelAndView的参数是: ${name} </h2>
</body>
</html>



所以你看到的是这样的:

Spring mvc返回json spring mvc返回页面_Spring mvc返回json_02

所以呢 你可以单单返回视图不设置Model也是Ok的啦~

2:直接返回 让SpringMVC自己帮我注入ModelAndView [形参ModelAndView]

当你不想自己new 你可以设置一个形参 让SpringMVC 自己帮你注入,这样也是完全可以的! 

例:



@Controller
public class TestController {
    @RequestMapping(value = "/go",method = RequestMethod.GET)
    //添加形参ModelAndView 
    public ModelAndView GoUrl(ModelAndView mad){
        mad.addObject("name","BiHu");
        mad.setViewName("s1");
        return mad;
    }
}



 3: Model 和 View 分离  [形参Model]

我们还可以将他们两分离,其中Model 做形参,但是返回的字符串类型【视图】。



@Controller
public class TestController {
    @RequestMapping(value = "/go",method = RequestMethod.GET)
    //Model 和 View 分离:返回String 添加形参Model
    public String GoUrl(Model model){
        //即使我是Model 我也可以携带参数[键-值]
        model.addAttribute("name","BiHu");
        return "s1";    //因为容器配了 前缀和后缀 所以咳咳
    }
}



4: 除了上面三个 还可以用原始的方式来【Request】:

你想的到的方法,SpringMVC的作者都想到了,所以:原始的Request也可以实现跳转【可以说是 视图 和 Request分离】



@Controller
public class TestController {
    @RequestMapping(value = "/go",method = RequestMethod.GET)
    public String GoUrl(HttpServletRequest request){
        request.setAttribute("name","BiHu");
        return "s1";    //因为容器配了 前缀和后缀 所以咳咳
    }
}



注意: modeandvie 他addobject 的参数 因为你跳转了嘛 所以我猜测呢是 跳转后域中才生效了,而且是仅在页面生效,所以呢我们要注意他的命名哟 别搞混即可,只是猜测