Springmvc入门基础(五) ---controller层注解及返回类型解说
0.@Controller注解
作用:通过@Controller注解,注明该类为controller类,即控制器类,需要被spring扫描,然后注入到IOC容器中,作为Spring的Bean来管理,这样,Spring就能找到Controller类,通过@RequestMapping注解处理对应的请求。
1.@RequestMapping注解
作用:通过@RequestMapping注解可以定义不同的处理器映射规则。
1.1 注解位置
放在class类上
在class上添加@RequestMapping(url)指定通用请求前缀, 限制此类下的所有方法请求url必须以请求前缀开头,则前端访问url则是localhost:8080/springmvc/item/itemlist.action
放在controller方法上,注明访问该controller方法的uri是什么。
@Controller
@RequestMapping("/item")
public class ItemController {
@Autowired
private ItemService itemService;
@RequestMapping(value = {"/itemlist.action","/samePage.action"})
public String itemList(Model model,
HttpServletRequest request,
HttpServletResponse response,
HttpSession session
) throws Exception{
model.addAttribute("itemList", list);
return "itemList";
}
}
1.2 请求方法限定
除了可以对url进行设置,还可以限定请求进来的方法
1.2.1.限定GET方法
@RequestMapping(value = "/itemList",method = RequestMethod.GET)
如果通过POST访问则报错:
HTTP Status 405 - Request method 'POST' not supported
1.2.2.限定POST方法
@RequestMapping(value = "/itemList",method = RequestMethod.POST)
如果通过GET访问则报错:
HTTP Status 405 - Request method 'GET' not supported
1.2.3.GET和POST都可以
@RequestMapping(value = "/itemList",method = {RequestMethod.GET,RequestMethod.POST})
或者不注明method,则默认接收任何类型的请求
@RequestMapping(value = "/itemList")
注意:@RequestMapping(value = "/itemList"),也可写成@RequestMapping("/itemList")
假如项目路径后面加了/,即/springmvc/,则需要写成@RequestMapping(value = "itemList"),或者@RequestMapping("itemList")
2.@RequestBody和@ResponseBody注解
2.1@RequestBody注解
作用:@RequestBody注解用于读取http请求的内容(字符串),通过springmvc提供的HttpMessageConverter接口将读到的内容(json数据)转换为java对象并绑定到Controller方法的参数上。
2.2 @ResponseBody注解
作用:@ResponseBody注解用于将Controller的方法返回的对象,通过springmvc提供的HttpMessageConverter接口转换为指定格式的数据如:json,xml等,通过Response响应给客户端
前端请求body部分json字符串,不管前端是以什么样的方式给服务的发送,服务端接收到的只要是json格式字符串即可-params
var params = '{"id": 1,"name": "测试商品","price": 99.9,"detail": "测试商品描述","pic": "123456.jpg"}';
//json数据交互
@RequestMapping(value = "/json.action")
public @ResponseBody
Items json(@RequestBody Items items){
return items;
}
pojo类
public class Items {
private Integer id;
private String name;
private Float price;
private String pic;
private String detail;
此处省略get,set方法}
注意:前端请求的body中的json字符串中的key值,即上图所示的id,name等,必须要与controller方法形参中使用@RequestBody注解封装的pojo类的属性值一样。
至于使用 @ResponseBody,把controller方法的返回值给封装到item对象中,前端接收到的也是个json
字符串,至于如何从json字符串取出展示啥的,此处不做多处讨论,举个简单例子即可
比如前端是通过ajax方式向服务端发起请求
$.ajax({
url : "${pageContext.request.contextPath }/json.action",
data : params,
contentType : "application/json;charset=UTF-8",//发送数据的格式
type : "post",
dataType : "json",//回调
success : function(data){
alert(data.id);
alert(data.name);
}
});
只需要在回调函数中通过data.属性值即可取出具体value值
3.@RequestParam,@PathVariable等
3.1 @RequestParam注解
作用:@RequestParam主要是用来解决前端页面的name属性值与服务端controller方法中定义的形参值名称不一样,比如下图所示,把前端页面name为itemId的值给注入到controller方法定义的形参id中去
@RequestMapping("/itemEdit")
public String queryItemById(@RequestParam(value = "itemId", required = true, defaultValue = "1") Integer id,
ModelMap modelMap) {
// 根据id查询商品数据
Item item = this.itemService.queryItemById(id);
// 把商品数据放在模型中
modelMap.addAttribute("item", item);
return "itemEdit";
}
3.2 PathVariable注解
我们需要从url上获取商品id,步骤如下:
1.使用注解@RequestMapping("item/{id}")声明请求的url
{xxx}叫做占位符,请求的URL可以是“item /1”或“item/2”
2.使用(@PathVariable() Integer id)获取url上的数据
/**
* 使用RESTful风格开发接口,实现根据id查询商品
*
* @param id
* @return
*/
@RequestMapping("item/{id}")
@ResponseBody
public Item queryItemById(@PathVariable() Integer id) {
Item item = this.itemService.queryItemById(id);
return item;
}
注意@PathVariable和@RequestParam区别
- @PathVariable是获取url上数据的。@RequestParam获取请求参数的(包括post表单提交)
3.3 @RequestHeader、@CookieValue
@RequestHeader 注解,可以把Request请求header部分的值绑定到方法的参数上。
@CookieValue 可以把Request header中关于cookie的值绑定到方法的参数上。
@RequestMapping("/iteamList.action")
public void editList(@RequestHeader("Accept-Encoding") String encoding,
@CookieValue("JSESSIONID") String cookie) {
System.out.println(encoding);
System.out.println(cookie);
}
3.4 @SessionAttributes, @ModelAttribute
@SessionAttributes-该注解用来绑定HttpSession中的attribute对象的值,便于在方法中的参数里使用,该注解有value、types两个属性,可以通过名字和类型指定要使用的attribute 对象;
若希望在多个请求之间共用数据,则可以在控制器类上标注一个 @SessionAttributes,配置需要在session中存放的数据范围,Spring MVC将存放在model中对应的数据暂存到 HttpSession 中。
注意:@SessionAttributes只能使用在类定义上。
@Controller
@RequestMapping("/item")
@SessionAttributes(value={"username","password")
@SessionAttributes(types=User.class)
@SessionAttributes(types={User.class,Item.class},value={"username","password"})
public class ItemController{
@RequestMapping("/editIteam.action")
public String editItem(Model model){
User user = new User("jack","123456");
model.addAttribute("user", user);
model.addAttribute("username","jack");
return "success";
}
}
处理方法editItem在model中存放了属性名为user和username的数据,
处理结束后,model里的数据会被放入到request中,页面通过request域可以获取到。
而这里使用了@SessionAttributes(value={“user”})将model中属性名为user的数据copy一份进了session域中.
页面获取:
<h1>user requestScope:${requestScope.user}</h1>
<h1>user sessionScope:${sessionScope.user}</h1>
@ModelAttribute
该注解有两个用法,一个是用于方法上,一个是用于参数上;
用于方法上时: 通常用来在处理@RequestMapping之前,为请求绑定需要从后台查询的model;
被@ModelAttribute注释的方法会在此controller每个方法执行前被执行,因此对于一个controller映射多个URL的用法来说,要谨慎使用。
用于参数上时: 用来通过名称对应,把相应名称的值绑定到注解的参数bean上;要绑定的值来源于:
A) @SessionAttributes 启用的attribute 对象上;
B) @ModelAttribute 用于方法上时指定的model对象;
C) 上述两种情况都没有时,new一个需要绑定的bean对象,然后把request中按名称对应的方式把值绑定到bean中。
备注:由于很少很少用到,详细用法就不在此介绍了,有需要请自行网上查找具体用法。
4.controller方法返回值类型
4.1 返回ModelAndView
controller方法中定义ModelAndView对象并返回,对象中可添加model数据、指定view。
@RequestMapping(value = "/itemEdit.action")
public ModelAndView toEdit(Integer id,
HttpServletRequest request,HttpServletResponse response
,HttpSession session,Model model){
//查询一个商品
Items items = itemService.selectItemsById(id);
ModelAndView mav = new ModelAndView();
//数据
mav.addObject("item", items);
mav.setViewName("editItem");
return mav;
}
4.2 返回void
在Controller方法形参上可以定义request和response,使用request或response指定响应结果:
4.2.1、使用request转发页面,如下:
request.getRequestDispatcher("页面路径").forward(request, response);
request.getRequestDispatcher("/WEB-INF/jsp/success.jsp").forward(request, response);
4.4.2、通过response页面重定向:
response.sendRedirect("url")
response.sendRedirect("/springmvc-web2/itemEdit.action");
4.4.3 通过response指定响应结果
可以通过response指定响应结果,例如响应json数据如下:
response.getWriter().print("{\"abc\":123}");
4.5 返回字符串
4.5.1 返回逻辑视图名
controller方法返回字符串可以指定逻辑视图名,通过视图解析器解析为物理视图地址。
//指定逻辑视图名,经过视图解析器解析为jsp物理路径:/WEB-INF/jsp/itemList.jsp
@RequestMapping(value = "/itemlist.action")
public String itemList(Model model,
HttpServletRequest request,
HttpServletResponse response,
HttpSession session
) throws Exception{
List<Items> list = itemService.selectItemsList();
model.addAttribute("itemList", list);
return "itemList";
}
4.5.2 通过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();
}
4.5.3 forward转发
Controller方法执行后继续执行另一个Controller方法
如下商品修改提交后转向到商品修改页面,修改商品的id参数可以带到商品修改方法中。
@RequestMapping("/updateItem")
public String updateItemById(Item item) {
// 更新商品
this.itemService.updateItemById(item);
// 修改商品成功后,继续执行另一个方法
// 使用转发的方式实现。转发后浏览器地址栏还是原来的请求地址,
// 转发并没有执行新的request和response,所以之前的请求参数都存在
return "forward:/itemEdit.action";
}
哈喽,各位亲,觉得还不错请在评论处来个某某来此一游!
Springmvc入门基础(五) ---controller层注解及返回类型解说的更多相关文章
- springMVC中controller的几种返回类型
==网文1,还不错,感觉比较老旧springMVC中controller的几种返回类型 - CSDN博客http://blog.csdn.net/qq_16071145/article/details ...
- spring Controller 层注解获取 properties 里面的值
前言:最近在做一个项目,想要在 controller 层直接通过注解 @Value("")来获取 properties 里面配置的属性. 这个其实和 springmvc.sprin ...
- PowerMock+SpringMVC整合并测试Controller层方法
PowerMock扩展自Mockito,实现了Mockito不支持的模拟形式的单元测试.PowerMock实现了对静态方法.构造函数.私有方法以及final方法的模拟支持,对静态初始化过程的移除等强大 ...
- springMVC入门(五)------统一异常处理
简介 系统中异常包括两类:预期异常和运行时异常RuntimeException,前者通过异常捕获获取异常信息,后者需通过规范代码.提高代码路绑定减少运行时异常的发生 异常处理思路:无论dao层.ser ...
- Springmvc入门基础(二) ---架构详解
1.框架结构图 架构流程文字说明 用户发送请求至前端控制器DispatcherServlet DispatcherServlet收到请求调用HandlerMapping处理器映射器. 处理器映射器根据 ...
- MVC教程五:Action方法的返回类型
MVC中的Action方法的返回值一般有以下几种: 类型 s说明 EmptyResult 不进行任何操作 ContentResult 将指定内容作为文本输出 JsonResult 输出JSON字符串 ...
- springmvc入门基础之注解和参数传递
一.SpringMVC注解入门 1. 创建web项目2. 在springmvc的配置文件中指定注解驱动,配置扫描器 <!-- mvc的注解驱动 --> <mvc:annotation ...
- Springmvc入门基础(一) ---基于idea创建demo项目
Springmvc是什么 Springmvc和Struts2都属于表现层的框架,它是Spring框架的一部分,我们可以从Spring的整体结构中看得出来,如下图: Springmvc处理流程 ---- ...
- Springmvc入门基础(四) ---参数绑定
1.默认支持的参数类型 处理器形参中添加如下类型的参数处理适配器会默认识别并进行赋值. 除了ModelAndView以外,还可以使用Model来向页面传递数据, Model是一个接口,在参数里直接声明 ...
随机推荐
- Spring Boot 学习-基础
一.Spring Boot 概述 SpringBoot 定义 Spring Boot 并不是用来替代 Spring 的新框架,而是和 Spring 框架紧密结合用于提升 Spring 开发者体验的工具 ...
- 什么是jQuery?
目录 一:jQuery 1.jQuery介绍 2.jQuery的宗旨 3.有了jQuery那我们还使用BOM与DOM吗? 4.jQuery的优势 5.python与jQuery导入(复习) 6.jQu ...
- 基于IPv6的RIPng路由协议测试——信而泰网络测试仪实操
关键词 IPv6; RIPng; 协议测试; 内部网关协议; 外部网关协议 前言:在国际性网络中,如因特网,拥有很多应用于整个网络的路由选择协议.形成网络的每一个自治系统(AS),都有属于自己的路由选 ...
- 如何让测试RFC2544更便捷——RFC2544测试实操
关键词:RFC2544:吞吐量测试:时延测试:丢包率:背靠背. 作为一名网络测试人员,大家肯定熟知一个测试标准,那就是RFC2544,RFC2544通过提供一个测试网络设备的测试标准,并规定了一系列测 ...
- 开源报表工具太复杂?不如用这款免费web报表工具
随着信息系统的高速发展,报表平台逐渐成为了信息系统当中最为核心和重要的功能模块.报表工具有助于将原始数据可视化显示,使决策者或者相关人员能够一览整体的数据趋势,完整的报表解决方案会提供多样的表格数据展 ...
- Oracle之关系型数据库
什么是关系型数据库? (1)关系型数据库是依据关系模型来创建的数据库. (2)所谓关系模型就是"一对一.一对多.多对多"等关系模型,关系模型就是指二维表格模型,因而一个关系型数据库 ...
- 一个C#程序的执行过程
可能很多人都知道我们把程序打包成dll就丢出去了,但是里面的具体的执行过程是怎么样的呢. 程序集是由元数据和IL组成的.IL是和CPU无关的语言,是微软的几个专家请教了外面的编译器的作则,开发出来的. ...
- 数仓建模—ID Mapping
早晨起床的时候,发现自己尿分叉,我没有多想,简单洗洗就匆忙出门.路过早餐店,我看到师傅熟练的拉扯一小块面团,拉至细长条,然后放入油锅中,不一会功夫,一根屎黄色的油条便出锅了,卖相不错.我在想,小到炸屎 ...
- Python:Scrapy(三) 进阶:额外的一些类ItemLoader与CrawlSpider,使用原理及总结
学习自:Python Scrapy 爬虫框架实例(一) - Blue·Sky - 博客园 这一节是对前两节内容的补充,涉及内容为一些额外的类与方法,来对原代码进行改进 原代码:这里并没有用前两节的代码 ...
- Vue 源码解读(11)—— render helper
前言 上一篇文章 Vue 源码解读(10)-- 编译器 之 生成渲染函数 最后讲到组件更新时,需要先执行编译器生成的渲染函数得到组件的 vnode. 渲染函数之所以能生成 vnode 是通过其中的 _ ...