SpringMVC的返回值类型
Springmvc 支持如下的返回方式:
一种是返回页面的数据,另外一种是通过@ResponseBody注解返回的数据不是html标签的页面,而是其他某种格式的数据(如json、xml等)。本文主要讲返回的是页面数据类型。下一遍会讲@ResponseBody注解返回的数据
- ModelAndView
- Model
- ModelMap
- Map
- View
- String
- void
1.返回ModelAndView
@RequestMapping(method = RequestMethod.GET) public ModelAndView index() { ModelAndView modelAndView = new ModelAndView("/user/index"); modelAndView.addObject("xxx", "xxx"); return modelAndView; }
PS:对于ModelAndView构造函数可以指定返回页面的名称,也可以通过setViewName方法来设置所需要跳转的页面;
PPS:返回的是一个包含模型和视图的ModelAndView对象,建议返回ModeAndView
@RequestMapping(method = RequestMethod.GET) public ModelAndView index() { ModelAndView modelAndView = new ModelAndView(); modelAndView.addObject("xxx", "xxx"); modelAndView.setViewName("/user/index"); return modelAndView; }
对于ModelAndView类的属性和方法
2.返回void
当返回类型为Void的时候,则响应的视图页面为对应着的访问地址
- /*
- * 返回值是void类型的,由于没有返回值
- * 它默认的展示逻辑视图名和url中的一段是一样的即returnVoid.jsp
- */
- @RequestMapping("/returnVoid")
- public void returnVoid(Model model){
- model.addAttribute("test", "return void!!!");
- }
返回的结果页面还是:/returnVoid.jsp,如果项目底下没有这个页面就会报404
PS:这个时候我们一般是将返回结果写在了HttpServletResponse 中了,如果没写的话,spring就会利用RequestToViewNameTranslator 来返回一个对应的视图名称。如果这个时候需要模型的话,和返回字符串的情况处理模型是相同的。例如:model.addAttribute("test", "return void!!!")
在Controller类方法形参上可以定义request和response,使用request或response指定响应结果:
-
使用request转向页面,如下:
request.getRequestDispatcher("页面路径").forward(request, response);
之前我们实现商品列表的查询,返回的是ModelAndView,如果现在该方法的返回值是void,那么就应使用request跳转页面,如下:
@RequestMapping("/itemList2") public void itmeList2(HttpServletRequest request, HttpServletResponse response) throws Exception { // 查询商品列表 List<Items> itemList = itemService.getItemList(); // 向页面传递参数 request.setAttribute("itemList", itemList); // 如果使用原始的方式做页面跳转,必须给的是jsp的完整路径 request.getRequestDispatcher("/WEB-INF/jsp/itemList.jsp").forward(request, response); }
注意:如果使用原始的方式做页面跳转,那么必须给定jsp页面的完整路径。
-
也可以通过response实现页面重定向:
response.sendRedirect("url")
-
也可以通过response指定响应结果,例如响应json数据如下:
response.setCharacterEncoding("utf-8"); response.setContentType("application/json;charset=utf-8"); response.getWriter().write("json串");
例如,将以上itmeList2方法修改为:
@RequestMapping("/itemList2") public void itmeList2(HttpServletRequest request, HttpServletResponse response) throws Exception { PrintWriter writer = response.getWriter(); response.setCharacterEncoding("utf-8"); response.setContentType("application/json;charset=utf-8"); writer.write("{\"id\":\"123\"}"); }
此时,在浏览器地址栏中输入url访问地址:
http://localhost:8080/springmvc-web2/item/itemList2.action
进行访问,我们可在浏览器看到如下效果:
3.返回String
逻辑视图名
Controller类方法返回字符串可以指定逻辑视图名,通过视图解析器解析为物理视图地址。
Redirect重定向
Contrller类方法返回结果重定向到一个url地址,如下商品信息修改提交后重定向到商品查询方法,参数无法直接带到商品查询方法中。
@RequestMapping(value="/updateitem",method={RequestMethod.POST,RequestMethod.GET})
public String updateItems(Items items) {
itemService.updateItem(items);
// '/'是不包含工程名的根目录,即http://localhost:8080/springmvc-web2/item/itemList.action
return "redirect:/item/itemList.action";
}
redirect方式相当于“response.sendRedirect()”,转发后浏览器的地址栏变为转发后的地址,因为转发即执行了一个新的request和response。由于新发起一个request,原来的参数在转发时就不能传递到下一个url,如果要传参数可以在/item/itemList.action
后边加参数,如下:
return "redirect:/item/itemList.action?id=xxx&name=xxx";
但如果你使用的是Model接口,那么SpringMVC框架会自动将Model中的数据拼装到/item/itemList.action
后面。
forward转发
Controller类方法执行后继续执行另一个Controller类方法,如下商品修改提交后转向到商品修改页面,修改商品的id参数可以直接带到商品修改方法中。
@RequestMapping(value="/updateitem",method={RequestMethod.POST,RequestMethod.GET})
public String updateItems(Items items) throws UnsupportedEncodingException {
itemService.updateItem(items);
return "forward:/item/itemList.action";
}
forward方式相当于“request.getRequestDispatcher().forward(request,response)”,转发后浏览器地址栏还是原来的地址。转发并没有执行新的request和response,而是和转发前的请求共用一个request和response。所以转发前请求的参数在转发后仍然可以读取到。
4.返回Model /ModeMap
- /*
- * 返回值是Model或者ModeMap类型的,由于没有指定视图名
- * 它默认的展示视图名和url中的一段是一样的即returnModel.jsp
- */
- @RequestMapping("/returnModel")
- public Model returnModel(Model model){
- model.addAttribute("test", "return Model!!!");
- return model;
- }
PS: 返回的结果页面还是:/returnModel.jsp,如果项目底下没有这个页面就会报404,这时候的模型数据就是返回的model或者modeMap对象。
5.返回Map
- /*
- * 返回值是void类型的,由于没有指定视图名
- * 它默认的展示视图名和url中的一段是一样的即returnVoid.jsp
- */
- @RequestMapping("/returnMap")
- public Map returnMap(Model model){
- Map map = new HashMap<String,String>();
- map.put("test", "return map!!!");
-
//map.put相当于request.setAttribute方法
- return map;
- }
PS: 返回的结果页面还是:/returnMap.jsp,如果项目底下没有这个页面就会报404,在jsp页面中可直通过${key1}获得到值, map.put()相当于request.setAttribute方法。
6.返回View
可以返回pdf,excel等,暂时没详细的了解
小结:
1.使用 String 作为请求处理方法的返回值类型是比较通用的方法,这样返回的逻辑视图名不会和请求
URL 绑定,具有很大的灵活性,而模型数据又可以通过 ModelMap 控制。
2.使用void,map,Model 时,返回对应的逻辑视图名称真实url为:prefix前缀+方法请求url +suffix后缀组成。
3.使用String,ModelAndView返回视图名称可以不受请求的url绑定,ModelAndView可以设置返回的视图名称。
package com.wangbiao.springMVC;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.View;
import org.springframework.web.servlet.mvc.multiaction.MultiActionController;
@Controller
@RequestMapping("/return")
public class HelloWorld extends MultiActionController{
/*
* 返回值为ModelAndView类型的
*/
public ModelAndView sayHelloWorld(HttpServletRequest request, HttpServletResponse response) {
String param = request.getParameter("param");
System.out.println("springMVC测试:helloWorld;"+param);
ModelAndView mv = new ModelAndView();
User user = (User) this.getApplicationContext().getBean("user");
mv.addObject("content", "springMVC HelloWorld:"+param);
mv.setViewName("springMVC/helloWorld");
ServletContext ctx = this.getServletContext();
return mv;
}
/*
* 返回值为String类型的,视图名就是返回值
*/
@RequestMapping(value="/returnString",method=RequestMethod.GET)
public String returnString(Model model) {
model.addAttribute("test", "return string!!!");
System.out.println("springMVC测试:helloWorld;");
return "return/returnString";
}
/*
* 返回值是void类型的,由于没有返回值
* 它默认的展示视图名和url中的一段是一样的即returnVoid.jsp
*/
@RequestMapping("/returnVoid")
public void returnVoid(Model model){
model.addAttribute("test", "return void!!!");
}
/*
* 返回值是Model类型的,由于没有指定视图名
* 它默认的展示视图名和url中的一段是一样的即returnVoid.jsp
*/
@RequestMapping("/returnModel")
public Model returnModel(Model model){
model.addAttribute("test", "return Model!!!");
return model;
}
/*
* 返回值是Map类型的,由于没有指定视图名
* 它默认的展示视图名和url中的一段是一样的即returnVoid.jsp
*/
@RequestMapping("/returnMap")
public Map returnMap(Model model){
Map map = new HashMap<String,String>();
map.put("test", "return map!!!");
return map;
}
}
上一篇: 选择排序原理及代码实现
下一篇: 服务计算||docker