SpringMVC的数据响应方式
1) 页面跳转
直接返回字符串【1】
通过ModelAndView对象返回【2】
2) 回写数据
直接返回字符串【1】
返回对象或集合【2】
下面详解:
页面跳转:直接返回字符串:【也就是上面我们说的那个】
这是结构图 其中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>
所以你看到的是这样的:
所以呢 你可以单单返回视图不设置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 的参数 因为你跳转了嘛 所以我猜测呢是 跳转后域中才生效了,而且是仅在页面生效,所以呢我们要注意他的命名哟 别搞混即可,只是猜测