开发者学堂课程【高校精品课-厦门大学 -JavaEE 平台技术:SpringMVC示例】学习笔记,与课程紧密联系,让用户快速学习知识
课程地址:https://developer.aliyun.com/learning/course/80/detail/15914
SpringMVC示例
内容介绍
一、SpringMVC的注解使用方式
二、运行流程
三、三种方法
一、SPringMVC的注解使用方式
1.电子商城中商品可选多个规格组合
首先看一下 SpringMVC 的注解是怎样使用的,这个例子是电子商城中间商品和商品规格的例子,在电子商城中间一个商品是有多个规格的,这种规格是可以组合式来选的。
2.商品举例
比如红米的4x手机有颜色,有内存,有寄生存储这三个选项可以选。所以用户当选了三个选项以后就形成了红米4x手机的一个具体规格,这个手机的价格、重量等都和规格有密切的关系的,所以我们在 SpringMVC 上居于这样的一个商品和商品规格实现了一些简单的新增商品查询商品的功能,通过这些功能可以看到 SpringMVC的标签是怎样来使用的。
二、运行流程
1.如何标识controller
这个例子是在 JAVA1proforma 的3SpringMVC 侧幕底下,侧幕下有一个restherdeom,这个例子我们先不去看它的配置和总体的内容,我们先看SpringMVC 的标签是怎么用来去标识一个 controller。这个例子很简单,我们只做了一个 controller,它在 resthdemo 这个包底下 controller 的包里面,点开这个包里面可以看到它里面有一个 GoodController,点开这个类里有很多标签。先讲在SpringMVC 中的 autowired 以及五个 mapping。
在类前面我们可以看到 restcontroller,这个标签告诉 SpringMVC 容器这个类是一个controller,而且还是一个 restcontroller,意味着顺过来的参数是可以被以 json的方式送过来,而它的返回值可以用json的方式回去,那它的这个每一个方法映射到一个 URL 的 htvp 的操作上面,所以它对于整个类定义了一个根的路径,叫做requestmapping。因为在这个类中间既有 get,put,post 所以说他在目的上没有
去指定请求类型,用了@requestmapping 标签。
2.goods的用法
value 定义的 goods 说明这个类底下的所有的方法,如果自己不指定绝对路径的话会从 goods 开始往后接就是它的相对路径,其后面有一个 produce 内容是“application/json;charset=UFT-8”这个是在描述说这个方法返回的 response它的 contest 的内容类型的类型是什么,因为现在全是 restful 风格的 api,所以它返回的类型全是 json 的格式,因为 json 是有中文的所以我们需要特被设定它的
charset是utf-8否则中文会出现乱码,这是 produce 的作用。
三、三种方法
1.post方法
接下来我们看底下的每一个方法首先看到第一个方法 getmapping(“{id}”),这个方法前面是有一个 getmapping,它表示这个方法是一个get的请求上。写的{id}表示它在类的路径的后面加上了一级id,id用花括号表示的说明它是一个变量,所以在它的方法的参数里看到了一个标签 pathvariable,它的作用是从路径上拿到变量,把值赋到参数的 id 里去,比如 goods/5这样的一个资源,这是定了一到在系统中间的id为5的一个商品,其中的5用花括号表示的id会被
映射到 integer id 上面去。
这是第一个方法,第二个方法我们看到的也是 getmapping 映射的是 goods的search。第三个方法是新建一个新的商品,它用的是 post mapping,这里没有post mapping/goods 会使得 create goods的方法被映射到goods上,因为它的新建的商品的内容是在 requestbody上传过来的,所以看它的参数里有一个标签叫做@requestBody,说明后面这个是一个对象,称之为 vo 对象,它是用来接收前端送来的数据的,前端送来的是一个商品对象的信息,这个 vo 的对象在 controller底下一个子包,点开看 vo 的对象,定义了从前端发来的新建商品里头有什么样的属性我们可以看到里头有商品名称、商品描述、商品单位、可取规格、颜色、运行内存、寄生存储还有多少的规格可以选。
根据可选的规格最后组合出来到底有多少的商品,不同规格的具体的产品每个规格的产品用 producevo 去表示,producevo 里描述每一个产品有一个序号,这个序号来自可取规格的组合按照一定规格组成的序号,第二个是规格的描述,在每个规格的促销价和零售价是不一样的还有重量不一样,所以写了一个 producevo 这样一个方法,所以以这个用 prepost 的方法来说前端时会把一个商品的可选规格以及有可选规格所产生的所有可能的规格的组合把他建成了一个这样的对象 goodsvo 和 producevo 的一对多关联的一个对象,然后把它传到方法里头@RequestBody GoodVo goodvo 这个方法里头,那我们的传过来的方式是通过 RequestBody,所以要在方法先加一个 RequestBody,我们能看到上面还有一个注解,叫做ResponseUtill,前面说过 post 的方法如果处理成的话它返回的类型不是200,是201,可以看前面的 get 方法中间不用特别去标出返回的 http 的返回码是什么,不标默认成功都会返回200,对于 post 方法因为 http 的返还码要返回201,所以专门写了一个注解 ResponseUtill,使得这个方法在执行完后返回的 http 的返回码是201,也就是 HttpStatus.CREATED。这是 post 的方法。
@PostMapping(“")
aResponseStatus(HttpStatus.CREATED)
public Object createGood(@Validated @RequestBody GoodsVogoodsVo){
Goods new_goods=goodsService.createGoods(goodsVo); return ResponseUtil.ok(new_goods);
}
@ApiOperation(value="修改商品",
produces="application/json")
@ApiImplicitParams({
})
@ApiResponses({
@ApiResponse(code=8,message =“成功"),})
2.Put方法
再看一个 Put 方法,它是用来修改对象的,从路径里头用 putmapping 再把 id 放在里头把路径里头的值放在第一个参数(@pathvarable integer id)里去,可以看到@pathvarable没有去写它的值,这时候认为参数的名称和 post 里头变量的名称是一致的。同样put要修改对象的属性@RequestBody 里的所以同样用一个
goodsvo 来接前端送过来的需要修改的对象的属性,这是 put 的方法
@PutMapping("{id}")
public Object modiGood(@PathVariable Integer idRequestBody GoodsVo goodsVo){
goodsService.modifyGoods(id,goodsVo);
return ResponseUtil.ok();
}
@ApiOperation(value="删除商品",
produces="application/ison")
@ApiImplicitParams({
@ApiImplicitParam(paramType ="path",dataType ="Integer",name = "id",value ="商品对象id",required = true)
})
@ApiResponses({
})
3.delete方法
Delete的方法,它是用来删除一个商品的,同样id是写在路径里的我们把它映射到参数里去@pathvarable 这样一个变量,实现一个 delete 的请求怎么映射到 delete的 goods 里去。
这是在 springMVC 中的几个主要的标签,实现了我们从对于一个 url 的请求通过hardlemapping
来看这个标签把它对应到 controller 的方法上。
@DeleteMapping("{id}")
public Object delGoods(@PathVariable("id") Integer id) {
goodsService.delGoods(id);
return ResponseUti.ok();