Springmvc中处理器Controller返回值简析

返回ModelAndView

controller方法中定义ModelAndView对象并返回,对象中可添加model数据、指定view,例如:

@RequestMapping("/itemList.action")

public ModelAndView queryItemList() {

// 创建页面需要显示的商品数据

List<Item> list = new ArrayList<>();

list.add(new Item(1, "1华为 荣耀8", 2399, new Date(), "质量好!1"));

list.add(new Item(2, "2华为 荣耀8", 2399, new Date(), "质量好!2"));

list.add(new Item(3, "3华为 荣耀8", 2399, new Date(), "质量好!3"));

list.add(new Item(4, "4华为 荣耀8", 2399, new Date(), "质量好!4"));

list.add(new Item(5, "5华为 荣耀8", 2399, new Date(), "质量好!5"));

list.add(new Item(6, "6华为 荣耀8", 2399, new Date(), "质量好!6"));

// 创建ModelAndView,用来存放数据和视图

ModelAndView modelAndView = new ModelAndView();

// 设置数据到模型中

modelAndView.addObject("itemList", list);

// 设置视图jsp,需要设置视图的物理地址

// modelAndView.setViewName("/WEB-INF/jsp/itemList.jsp");

// 配置好视图解析器前缀和后缀,这里只需要设置逻辑视图就可以了。

// 视图解析器根据前缀+逻辑视图名+后缀拼接出来物理路径

modelAndView.setViewName("itemList");

return modelAndView;

}

返回字符串

逻辑视图名

controller方法返回字符串可以指定逻辑视图名,通过视图解析器解析为物理视图地址。

//指定逻辑视图名,经过视图解析器解析为jsp物理路径:/WEB-INF/jsp/itemList.jsp

return "itemList";

除了ModelAndView以外,还可以使用Model来向页面传递数据,Model是一个接口,在参数里直接声明model即可。

如果使用Model则可以不使用ModelAndView对象,Model对象可以向页面传递数据,View对象则可以使用String返回值替代。

不管是Model还是ModelAndView,其本质都是使用Request对象向jsp传递数据。

代码实现:

//根据id查询商品,使用Model

@RequestMapping("/itemEdit")

public String queryItemById(HttpServletRequest request, Model model) {

// 从request中获取请求参数

String strId = request.getParameter("id");

Integer id = Integer.valueOf(strId);

// 根据id查询商品数据

Item item = this.itemService.queryItemById(id);

// 把商品数据放在模型中

model.addAttribute("item", item);

return "itemEdit";

}

Redirect重定向

Contrller方法返回字符串可以重定向到一个url地址

如下商品修改提交后重定向到商品编辑页面。

//更新商品

@RequestMapping("updateItem")

public String updateItemById(Item item) {

// 更新商品

this.itemService.updateItemById(item);

// 修改商品成功后,重定向到商品编辑页面

// 重定向后浏览器地址栏变更为重定向的地址,

// 重定向相当于执行了新的request和response,所以之前的请求参数都会丢失

// 如果要指定请求参数,需要在重定向的url后面添加 ?itemId=1 这样的请求参数

return "redirect:/itemEdit.action?itemId=" + item.getId();

}

forward转发

Controller方法执行后继续执行另一个Controller方法

如下商品修改提交后转向到商品修改页面,修改商品的id参数可以带到商品修改方法中。

//更新商品

@RequestMapping("updateItem")

public String updateItemById(Item item) {

// 更新商品

this.itemService.updateItemById(item);

// 修改商品成功后,继续执行另一个方法

// 使用转发的方式实现。转发后浏览器地址栏还是原来的请求地址,

// 转发并没有执行新的request和response,所以之前的请求参数都存在

return "forward:/itemEdit.action";

}

//结果转发到editItem.action,request可以带过去

return "forward: /itemEdit.action";

返回void

在Controller方法形参上可以定义request和response,使用request或response指定响应结果:

1、使用request转发页面,如下:

request.getRequestDispatcher("页面路径").forward(request, response);

request.getRequestDispatcher("/WEB-INF/jsp/success.jsp").forward(request, response);

2、可以通过response页面重定向:

response.sendRedirect("url")

response.sendRedirect("/springmvc-web2/itemEdit.action");

可以通过response指定响应结果,例如响应json数据如下:

response.getWriter().print("{\"abc\":123}");

代码演示

以下代码一次测试,演示上面的效果

//返回void测试

@RequestMapping("queryItem")

public void queryItem(HttpServletRequest request, HttpServletResponse response) throws Exception {

// 1 使用request进行转发

// request.getRequestDispatcher("/WEB-INF/jsp/success.jsp").forward(request,

// response);

// 2 使用response进行重定向到编辑页面

// response.sendRedirect("/springmvc-web2/itemEdit.action");

// 3 使用response直接显示

response.getWriter().print("{\"abc\":123}");

}

猜你喜欢

转载自blog.csdn.net/weixin_41477980/article/details/86640261
今日推荐