1.返回ModelAndView
--controller方法中定义ModelAndView对象并返回,对象中可添加model数据、指定view
/*
* 返回ModelAndView 这种返回的视图名称会参与拼接(至于为什么拼接请看Tips1) ,所以要简写
如果你想跳转到 /WEB-INF/list.jsp 那么视图名称是:list
*/
@RequestMapping("test1.do")
public ModelAndView test1()
{
//1.实例化一个ModelAndView
ModelAndView mav=new ModelAndView();
//2.添加model数据
List<User> list=new ArrayList<>();
User user1=new User(100,"zhangsan");
User user2=new User(101,"lisi");
list.add(user1);
list.add(user2);
//3.指定view
mav.addObject("userList", list);
mav.setViewName("list");
//4.返回ModelAndView对象
return mav;
}
Tips1:
在InternalResourceViewResolver类继承的父类帮我们拼接了url,所以所以前端控制器实际上获得的视图名为 prefix配置的值
+ returnStr(方法返回值)
+ suffix配置的值
,即 /WEB-INF/list.jsp
,所以页面最终会跳转到WEB-INF目录下的list.jsp。
protected AbstractUrlBasedView buildView(String viewName) throws Exception {
AbstractUrlBasedView view = (AbstractUrlBasedView) BeanUtils.instantiateClass(getViewClass());
view.setUrl(getPrefix() + viewName + getSuffix());//这里帮我们拼接url
}
2.返回字符串
--表示返回逻辑视图名
/**
* 返回String :会参与前缀后缀的拼凑 所以是简写
* 模拟需求:查询单个商品信息,然后到页面展示信息
*/
@RequestMapping("queryProduct.do")
public String queryProduct(Integer id,Model model)
{
Product p=new Product(id, "酸菜鱼", 59.00);
//把以上商品信息给到页面
model.addAttribute("product", p);
return "product";//返回/WEB-INF/product.jsp
}
--redirect重定向
/**
* 那么如果希望重定向,springMVC提供了什么方式?返回String 只是写法: redirect:list.do
* 注意:使用String的重定向写法,地址栏发生变化且返回的字符串不会参与前缀后缀的拼接
* 环境模拟:先修改update.do然后重定向到list请求list.do
*/
@RequestMapping("update.do")
public String update()
{
System.out.println("update.do");
return "redirect:list.do";
}
@RequestMapping("list.do")
public String list()
{
System.out.println("come list.do");
return "productList";
}
--forword页面转发
/**
* 返回String之跳转
* 模拟一下:对商品添加完成之后,跳转到用户列表功能
* 注意:使用String的跳转写法,地址栏不发生变化且返回的字符串不会参与前缀后缀的拼接
*/
@RequestMapping("add.do")
public String add()
{
System.out.println("come add.do");
return "forward:/user/test1.do";
}
Tips2:
放在 WEB-INF
文件夹下的页面没有办法通过地址栏直接访问的(直接访问就会出现404的错误,不信你试试),只能通过后台的跳转来间接的访问,所以就需要请求 SpingMVC 来返回相应的页面。所以一般我们会
WebContent 这一层目录下只留一个引导页面(index.jsp)作为跳转。
重定向和跳转的区别:
重定向后地址栏发生改变,且速度慢,因为重定向的本质是客户端发送了两次请求
跳转后地址栏不发生改变,且速度快,跳转只发送一次请求
3.返回void
/**
* 返回void
* 必须在方法的参数中添加HttpServletRequest和HttpServletResponse来进行页面跳转
*/
@RequestMapping("responseJSON.do")
public void responseJSON(HttpServletRequest request,HttpServletResponse response) throws IOException
{
List<User> list=new ArrayList<>();
User user1=new User(100,"zhangsan");
User user2=new User(101,"lisi");
list.add(user1);
list.add(user2);
//把java对象转化为json串
String josn_str=JSON.toJSONString(list);
response.setCharacterEncoding("utf-8");
response.setContentType("application/json;charset=utf-8");
response.getWriter().write(josn_str);
}