你未看此花时,则此花与汝心同归于寂, 你来看此花时,此花颜色一时明白起来,便知此花不在你的心外。
上一章简单介绍了SpringMVC的请求乱码解决和接收前端常用类型(五),如果没有看过,请观看上一章。
一.SpringMVC的方法返回值
SpringMVC 的方法返回值有多种, ModelAndView, Model,ModelMap,Map,View, String, void , 但是常用的,只有3个,ModelAndView,void 和String. 这里,详细的介绍一下。
下面讲解一下,跳转方法返回值类型
二 返回ModelAndView 对象。 (最常用的之一)
ModelAndView, 实际上就是 Model 模型和View 视图, 将数据模型和返回视图放置在一个类里面。
public class ModelAndView
{
private Object view; //视图
private ModelMap model; //数据
private boolean cleared = false;
}
二.一 后台处理:
@RequestMapping(value="/toLogin")
public ModelAndView toLogin(){
//放置对象还可以放其他的类型,下面会重点讲解。这里先只返回简单的字符串。
ModelAndView model=new ModelAndView();
//添加数据
model.addObject("name","两个蝴蝶飞ModelAndView形式");
//设置视图
model.setViewName("user/login");
return model;
}
ModelAndView ,利用 addObject() 来放置数据, 利用setViewName() 来设置要跳转的视图的名称。 这是是最常用的。
二.二 前端视图展示。 (接下来的视图展示也是用这个代码)
<body>
<h3>${name}欢迎你来到这个页面</h3>
</body>
运行之后,前端展示
常看见,将ModelAndView 放置在方法的参数里面,这样也是可行的。 不用再次实例化了。
@RequestMapping(value="/toLogin")
public ModelAndView toLogin(ModelAndView model){
//放置对象还可以放其他的类型,下面会重点讲解。这里先只返回简单的字符串。
//添加数据
model.addObject("name","两个蝴蝶飞ModelAndView形式");
//设置视图
model.setViewName("user/login");
return model;
}
其实,SpringMVC的方法参数里面可以放置很多对象,如ModelAndView,Model ,HttpServletRequest 等。 会专门收集讲一下的。
##三. 返回Model 类型
返回的是Model,数据模型,可以填充数据了, 那么如何指定要跳转到哪儿呢,即指定视图名。 猜想,可以在方法名或者是访问路径url上做文章。是在url 上进行的。 可以验证一下。
三.一 Model接口
Model 是一个接口,故最好放置在方法参数里面,而不是进行手动的实例化。
package org.springframework.ui;
import java.util.Collection;
import java.util.Map;
public abstract interface Model
{
public abstract Model addAttribute(String paramString, Object paramObject);
public abstract Model addAttribute(Object paramObject);
public abstract Model addAllAttributes(Collection<?> paramCollection);
public abstract Model addAllAttributes(Map<String, ?> paramMap);
public abstract Model mergeAttributes(Map<String, ?> paramMap);
public abstract boolean containsAttribute(String paramString);
public abstract Map<String, Object> asMap();
}
三.二 URL 形式的后台指定跳转视图名
@RequestMapping(value="/login")
public Model login(Model model){
model.addAttribute("name","两个蝴蝶飞Model形式");
return model;
}
前台传入的路径url 是login,那么就会跳转到login.jsp 页面。
三.三 将URL 与方法名设置不一致,主要是将url 进行改变,看跳转到哪一个页面。
@RequestMapping(value="/toLogin")
public Model login(Model model){
model.addAttribute("name","两个蝴蝶飞Model形式");
return model;
}
运行服务器, 进行访问之后,会报404错误,说要跳转到toLogin.jsp(url控制),而不是login.jsp(方法名控制).
这样,就需要将url 访问路径与页面的视图名称保持一致,不太友好。
四. 返回Map 形式
Map 与Model 一样,也是可以收集数据,但不知道如何控制视图名,所以用URL 来进行相应的控制。
@RequestMapping(value="/login")
public Map<String,String> toLogin(){
Map<String,String>map=new HashMap<String,String>();
map.put("name","两个蝴蝶飞的Map形式");
return map;
}
五. 返回ModelMap 形式
ModelMap, 是一个Map,但又具有Model 类的某些特性。 是Model和Map的结合体。
当然,ModelMap 也是通过 url来控制跳转的视图名的。
@RequestMapping(value="/login")
public ModelMap toLogin(ModelMap modelMap){
//可以用model的形式
modelMap.addAttribute("name","两个蝴蝶飞ModelMap的model形式");
//也可以用map的形式赋值
//modelMap.put("name","两个蝴蝶飞ModelMap的map形式");
return modelMap;
}
用model的形式填充的话,
用map的形式填充的话,将下面的那行代码去除注释,上面的添加注释
六. 返回View 形式
返回的是 PDF,Excel 格式的内容。 暂不讲解。
##七. 返回String 类型 (最常用之一)
返回一个字符串。 其中这个字符串,可以单纯的指将要返回的视图名称,也可以是转发和重定向。 当然,设置的数据模型的形式也是多种多样。
常见的用 Model,ModelMap 和request 域,但是,不能用ModelAndView填充,会出错。
七.一 表示单纯的将要返回的视图名称
1 .request域或者是session 域 填充值。
@RequestMapping(value="/toLogin")
public String toLogin(HttpServletRequest request){
request.setAttribute("name","两个蝴蝶飞返回String的request设置值");
return "user/login";
}
。
2 . Model 填充值
@RequestMapping(value="/toLogin")
public String toLogin(Model model){
model.addAttribute("name","两个蝴蝶飞返回String的model设置值");
return "user/login";
}
3 .ModelMap 填充值
@RequestMapping(value="/toLogin")
public String toLogin(ModelMap map){
map.put("name","两个蝴蝶飞返回String的modelMap设置值"); //也可以用addAttribute
return "user/login";
}
4 .ModelAndView 填充值,会展示不出数据。
@RequestMapping(value="/toLogin")
public String toLogin(){
ModelAndView model=new ModelAndView();
model.addObject("name","两个蝴蝶飞返回String的modelAndView设置值");
return "user/login";
}
前台展示,并不会展示出数据。
常常喜欢用Model 来进行填充值。
七.二 表示转发 (request域可以接收到) 用forward
@RequestMapping(value="/toLogin")
public String toLogin(HttpServletRequest request){
request.setAttribute("name","两个蝴蝶飞返回String的转发设置值");
return "forward:forwardLogin.action"; //forward 这个表示的是转发,注意路径。后面要加上.action
}
@RequestMapping(value="/forwardLogin")
public String forwardLogin(HttpServletRequest request,Model model){
System.out.println("获取值:"+request.getAttribute("name").toString());
model.addAttribute("name",request.getAttribute("name").toString());
return "user/login"; //这个就是单纯的返回视图名称。
}
控制台打印输出:
前台展示输出:
注意观察地址栏,没有发现改变。 而且接收到了request域的内容。
转发时的路径, 如果是同一个Action 中的不同的方法,可以直接写路径,不用带/user 。
七.三 表示重定向 (request域接收不到) 用 redirect
@RequestMapping(value="/toLogin")
public String toLogin(HttpServletRequest request){
request.setAttribute("name","两个蝴蝶飞返回String的重定向设置值");
return "redirect:forwardLogin.action"; //redirect 这个表示的是重定向,注意路径。后面要加上.action
}
@RequestMapping(value="/forwardLogin")
public String forwardLogin(HttpServletRequest request,Model model){
if(null==request.getAttribute("name")){
model.addAttribute("name","两个蝴蝶飞返回String的重定向未获取request域值");
}else{
model.addAttribute("name",request.getAttribute("name").toString());
}
return "user/login"; //这个就是单纯的返回视图名称。
}
前台展示输出
。
重定向时,地址栏发生了改变,不能接收到request域的内容。
##八. 返回 void 类型 (最常用之一)
返回void 类型时,可以用Model 来设置值,那如何来设置视图名称呢?
八.一 与返回Model 和返回ModelMap 一样,也是url 来控制的。
@RequestMapping(value="/login")
public void toLogin(Model model){
model.addAttribute("name","两个蝴蝶飞返回void设置值");
}
前台展示:
这个时候,如何在方法中强行用request 域设置转发或者是重定向呢?
八.二 强行转发或者是重定向
@RequestMapping(value="/toLogin")
public void toLogin(Model model,HttpServletRequest request,HttpServletResponse response){
model.addAttribute("name","两个蝴蝶飞返回void设置值");
try {
request.getRequestDispatcher("/login").forward(request, response);
} catch (ServletException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
} catch (IOException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
前台展示:
发现,这样操作是不行的。
需要把全部的路径都带上。
@RequestMapping(value="/toLogin")
public void toLogin(HttpServletRequest request,HttpServletResponse response){
try {
request.setAttribute("name","两个蝴蝶飞返回void设置request值");
request.getRequestDispatcher("/WEB-INF/jsp/user/login.jsp").forward(request, response);
} catch (ServletException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
} catch (IOException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
而且,注意,这个时候就不能用 Model 来设置值了, 只能用request 来设置值。 完全变成了Servlet+JSP的阶段了。
前台展示:
可以在里面继续写, 上面是转发, 也可以进行重定向, 当然也可以返回JSON 数据。
九. JSON 方法返回值
前面可以看到,可以返回多种形式,如Model,ModelAndView,String,void 等,但它们都是跳转的页面,有相应的视图名称, SpringMVC 中也可以进行 JSON的数据形式传输,那么这个时候,就可以采用其他的形式了。
需要用 @ResponseBody 注解或者是 ResponseEntity
返回的形式是: 自定义的实体对象 或者是ResponseEntity . 这个会在JSON 章节来详细讲解。
也可以返回 void.
十. SpringMVC 中参数的类型
可以简单分为几大类。 只说一下常用的。
十.一 与Web,Servlet 有关的
javax.servlet.ServletRequest 或者是 javax.servlet.http.HttpServletRequest
javax.servlet.ServletResponse 或者是 javax.servlet.http.HttpServletResponse
javax.servlet.http.HttpSession
springmvc 又扩展了两个。
org.springframework.web.context.request.WebRequest
或者是 org.springframework.web.context.request.NativeWebRequest
十.二 读写与打印的
java.io.InputStream或java.io.Reader
java.io.OutputStream或java.io.Writer
java.security.Principal
HttpEntity<?>
十.三 国际化
java.util.Locale
十.四 SpringMVC 封装数据
java.util.Map
org.springframework.ui.Model
org.springframework.ui.ModelMap
十.五 SpringMVC 提供的其他工具
org.springframework.web.servlet.mvc.support.RedirectAttributes
org.springframework.validation.Errors
org.springframework.validation.BindingResult
org.springframework.web.bind.support.SessionStatus
org.springframework.web.util.UriComponentsBuilder
十.六 SpringMVC 参数所用注解
@PathVariable、@@MatrixVariable
@RequestParam、@RequestHeader、@RequestBody、@RequestPart
谢谢!!!