关于Spring MVC及常用的一些注解

本文详细介绍了SpringMVC框架中的核心注解及其应用场景,包括@Controller、@RequestMapping、@PathVariable、@RequestParam、@RequestBody、@ResponseBody、@RestController等,并探讨了它们在实际开发中的运用。
摘要由CSDN通过智能技术生成

Spring MVC常用的那些注解

前言

      无论是ssh、还是ssm,spring在java开发中的地位都是非常重要的,下文是关于关于Spring MVC及常用的一些注解的一点总结。

0. Spring MVC

☆1.参数绑定:(从请求中接收参数)
1)默认支持的类型:Request,Response,Session,Model
2)基本数据类型(包含String)
3)Pojo类型
4)Vo类型
5)Converter自定义转换器
6)数组
7)List


☆2.controller方法返回值(指定返回到哪个页面, 指定返回到页面的数据)
1)ModelAndView 
modelAndView.addObject("itemList", list); 指定返回页面的数据
modelAndView.setViewName("itemList"); 指定返回的页面
2)String(推荐使用)
返回普通字符串,就是页面去掉扩展名的名称, 返回给页面数据通过Model来完成
返回的字符串以forward:开头为请求转发
返回的字符串以redirect:开头为重定向
3)返回void(使用它破坏了springMvc的结构,所以不建议使用)
可以使用request.setAttribut 来给页面返回数据
可以使用request.getRquestDispatcher().forward()来指定返回的页面
如果controller返回值为void则不走springMvc的组件,所以要写页面的完整路径名称


相对路径:相对于当前目录,也就是在当前类的目录下,这时候可以使用相对路径跳转
绝对路径:从项目名后开始.
在springMvc中不管是forward还是redirect后面凡是以/开头的为绝对路径,不以/开头的为相对路径
例如:forward:/items/itemEdit.action 为绝对路径
forward:itemEdit.action为相对路径




3.架构级别异常处理:
主要为了防止项目上线后给用户抛500等异常信息,所以需要在架构级别上整体处理.hold住异常
首先自定义全局异常处理器实现HandlerExceptionResolver接口
在spirngMvc.xml中配置生效
4.上传图片:
1)在tomcat中配置虚拟图片服务器
2)导入fileupload的jar包
3)在springMvc.xml中配置上传组件
4)在页面上编写上传域,更改form标签的类型
5)在controller方法中可以使用MultiPartFile接口接收上传的图片
6)将文件名保存到数据库,将图片保存到磁盘中
5.Json数据交互:
需要加入jackson的jar包
@Requestbody:将页面传到controller中的json格式字符串自动转换成java的pojo对象
@ResponseBody:将java中pojo对象自动转换成json格式字符串返回给页面
6.RestFul支持:
就是对url的命名标准,要求url中只有能名词,没有动词(不严格要求),但是要求url中不能用问号?传参
传参数:
页面:${pageContext.request.contextPath }/items/itemEdit/${item.id}
方法: @RquestMapping("/itemEdit/{id}")
方法: @PathVariable("id") Integer idd
7.拦截器:
作用:拦截请求,一般做登录权限验证时用的比较多
1)需要编写自定义拦截器类,实现HandlerInterceptor接口
2)在spirngMvc.xml中配置拦截器生效


8.登录权限验证:
1)编写登录的controller, 编写跳转到登录页面的方法,  编写登录验证方法
2)编写登录页面
3)编写拦截器
运行过程:
1)访问随意一个页面,拦截器会拦截请求,会验证session中是否有登录信息
如果已登录,放行
如果未登录,跳转到登录页面
2)在登录页面中输入用户名,密码,点击登录按钮,拦截器会拦截请求,如果是登录路径放行
在controller方法中判断用户名密码是否正确,如果正确则将登录信息放入session

1. @Controller

      Controller控制器是通过服务接口定义的提供访问应用程序的一种行为,它解释用户的输入,将其转换成一个模型然后将试图呈献给用户。Spring MVC 使用 @Controller定义控制器,它还允许自动检测定义在类路径下的组件并自动注册。如想自动检测生效,需在XML头文件下引入 spring-context:

[html]  view plain  copy
 print ?
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <beans xmlns="http://www.springframework.org/schema/beans"  
  3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  4.     xmlns:p="http://www.springframework.org/schema/p"  
  5.     xmlns:context="http://www.springframework.org/schema/context"  
  6.     xsi:schemaLocation="  
  7.         http://www.springframework.org/schema/beans  
  8.         http://www.springframework.org/schema/beans/spring-beans.xsd  
  9.         http://www.springframework.org/schema/context  
  10.         http://www.springframework.org/schema/context/spring-context.xsd">  
  11. <context:component-scan  
  12. base-package="org.springframework.samples.petclinic.web"/>  
  13. <!-- ... --></beans>  

2. @RequestMapping

      我们可以使用 @RequestMapping 注解将类似“/favsoft”这样的URL映射到整个类或特定的处理方法上。一般来说,类级别的注解映射特定的请求路径到表单控制器上,而方法级别的注解只是映射为一个特定的HTTP方法请求(“GET”,“POST”等)或HTTP请求参数。

[html]  view plain  copy
 print ?
  1. @Controller  
  2. @RequestMapping("/favsoft")  
  3. public class AnnotationController {  
  4.     @RequestMapping(method=RequestMethod.GET)  
  5.     public String get(){  
  6.         return "";  
  7.     }  
  8.     @RequestMapping(value="/getName"method = RequestMethod.GET)  
  9.     public String getName(String userName) {  
  10.         return userName;  
  11.     }  
  12.     @RequestMapping(value="/{day}"method=RequestMethod.GET)  
  13.     public String getDay(Date day){  
  14.         DateFormat df = new SimpleDateFormat("yyyy-MM-dd");  
  15.         return df.format(day);  
  16.     }  
  17.     @RequestMapping(value="/addUser"method=RequestMethod.GET)  
  18.     public String addFavUser(@Validated FavUser favUser,BindingResult result){  
  19.         if(result.hasErrors()){  
  20.             return "favUser";  
  21.         }  
  22.         //favUserService.addFavUser(favUser);  
  23.         return "redirect:/favlist";  
  24.     }  
  25.     @RequestMapping("/test")  
  26.     @ResponseBody  
  27.     public String test(){  
  28.         return "aa";  
  29.     }  
  30. }  

      @RequestMapping 既可以作用在类级别,也可以作用在方法级别。当它定义在类级别时,标明该控制器处理所有的请求都被映射到 /favsoft 路径下。@RequestMapping中可以使用 method 属性标记其所接受的方法类型,如果不指定方法类型的话,可以使用 HTTP GET/POST 方法请求数据,但是一旦指定方法类型,就只能使用该类型获取数据。

      @RequestMapping可以使用@Validated与BindingResult联合验证输入的参数,在验证通过和失败的情况下,分别返回不同的视图。

      @RequestMapping支持使用URI模板访问URL。URI模板像是URL模样的字符串,由一个或多个变量名字组成,当这些变量有值的时候,它就变成了URI。

3.@PathVariable

      在Spring MVC中,可以使用 @PathVariable 注解方法参数并将其绑定到URI模板变量的值上。如下代码所示:

[html]  view plain  copy
 print ?
  1.  String findOwner( String , Model model) {  
  2.     FavUser favUser = favUserService.findFavUser();  
  3.     model.addAttribute(  
  4.      ;  
  5. }  

      URI模板“favusers/{favUserId}"指定变量的名字 favUserId,当控制器处理这个请求的时候,favUserId的值会被设定到URI中。比如,当有一个像“favusers/favccxx”这样的请求时,favUserId的值就是 favccxx。

      @PathVariable 可以有多个注解,像下面这样:

[html]  view plain  copy
 print ?
  1. @RequestMapping(value="/owners/{ownerId}/pets/{petId}"method=RequestMethod.GET)  
  2. public String findPet(@PathVariable String ownerId, @PathVariable String petId, Model model) {  
  3.     Owner owner = ownerService.findOwner(ownerId);  
  4.     Pet pet = owner.getPet(petId);  
  5.     model.addAttribute("pet", pet);  
  6.     return "displayPet";  
  7. }  

      @PathVariable中的参数可以是任意的简单类型,如int,long,Date等等。Spring会自动将其转换成合适的类型或者抛出 TypeMismatchException异常。当然,我们也可以注册支持额外的数据类型。

      如果@PathVariable使用Map<String, String>类型的参数时, Map会填充到所有的URI模板变量中。

      @PathVariable支持使用正则表达式,这就决定了它的超强大属性,它能在路径模板中使用占位符,可以设定特定的前缀匹配,后缀匹配等自定义格式。 

      @PathVariable还支持矩阵变量,因为现实场景中用的不多,这就不详细介绍了,有需要的童鞋请查看官网的文档。

4.@RequestParam

      @RequestParam将请求的参数绑定到方法中的参数上,如下面的代码所示。其实,即使不配置该参数,注解也会默认使用该参数。如果想自定义指定参数的话,可以将RequestParam的required属性设置为false。(如@RequestParam(value="id",required=false))。

5.@RequestBody

      @RequestBody是指方法参数应该被绑定到HTTP请求Body上。

[html]  view plain  copy
 print ?
  1. @RequestMapping(value = "/something"method = RequestMethod.PUT)  
  2. public void handle(@RequestBody String body, Writer writer) throws IOException  {  
  3.     writer.write(body);  
  4.  }  

      如果觉得@RequestBody不如@RequestParam趁手,我们可以使用 HttpMessageConverter将request的body转移到方法参数上, HttMessageConverser将 HTTP请求消息在Object对象之间互相转换,但一般情况下不会这么做。事实证明,@RequestBody在构建REST架构时,比@RequestParam有着更大的优势。

6.@ResponseBody

      @ResponseBody与@RequestBody类似,它的作用是将返回类型直接输入到HTTP response body中。@ResponseBody在输出JSON格式的数据时,会经常用到,代码见下:

[html]  view plain  copy
 print ?
  1. @RequestMapping(value="/something"method=RequestMethod.PUT)  
  2. @ResponseBody  
  3. Public String helloWorld() {  
  4.     return "Hello World";  
  5. }  

7.@RestController

      我们经常见到一些控制器实现了REST的API,只为服务于JSON,XML或其它自定义的类型内容,@RestController用来创建REST类型的控制器。@RestController就是这样一种类型,它避免了你重复的写@RequestMapping与@ResponseBody。

[html]  view plain  copy
 print ?
  1. @RestController  
  2. public class FavRestfulController {  
  3. @RequestMapping(value="/getUserName",method=RequestMethod.POST)  
  4. public String getUserName(@RequestParam(value="name") String name){  
  5. return name;  
  6. }  
  7. }  

8.HttpEntity

      HttpEntity除了能获得request请求和response响应之外,它还能访问请求和响应头,如下所示:

[html]  view plain  copy
 print ?
  1. @RequestMapping("/something")  
  2. public ResponseEntity<String> handle(HttpEntity<byte[]> requestEntity) throws UnsupportedEncodingException {  
  3. String requestHeader =  
  4. requestEntity.getHeaders().getFirst("MyRequestHeader"));  
  5. byte[] requestBody = requestEntity.getBody();  
  6. // do something with request header and body  
  7. HttpHeaders responseHeaders = new HttpHeaders();  
  8. responseHeaders.set("MyResponseHeader", "MyValue");  
  9. return new ResponseEntity<String>("Hello World", responseHeaders, HttpStatus.CREATED);  
  10. }  

9.@ModelAttribute

      @ModelAttribute可以作用在方法或方法参数上,当它作用在方法上时,标明该方法的目的是添加一个或多个模型属性(model attributes)。该方法支持与@RequestMapping一样的参数类型,但并不能直接映射成请求。控制器中的@ModelAttribute方法会在@RequestMapping方法调用之前而调用,示例如下:

[html]  view plain  copy
 print ?
  1. @ModelAttribute  
  2. public Account addAccount(@RequestParam String number) {  
  3.     return accountManager.findAccount(number);  
  4. }  
  5. @ModelAttribute  
  6. public void populateModel(@RequestParam String number, Model model) {  
  7.     model.addAttribute(accountManager.findAccount(number));      
  8.     // add more ...  
  9. }  

      @ModelAttribute方法用来在model中填充属性,如填充下拉列表、宠物类型或检索一个命令对象比如账户(用来在HTML表单上呈现数据)。

      @ModelAttribute方法有两种风格:一种是添加隐形属性并返回它。另一种是该方法接受一个模型并添加任意数量的模型属性。用户可以根据自己的需要选择对应的风格。

@ModelAttribute作用在方法参数上

      当@ModelAttribute作用在方法参数上时,表明该参数可以在方法模型中检索到。如果该参数不在当前模型中,该参数先被实例化然后添加到模型中。一旦模型中有了该参数,该参数的字段应该填充所有请求参数匹配的名称中。这是Spring MVC中重要的数据绑定机制,它省去了单独解析每个表单字段的时间。

      @ModelAttribute是一种很常见的从数据库中检索属性的方法,它通过@SessionAttributes使用request请求存储。在一些情况下,可以很方便的通过URI模板变量和类型转换器检索属性。

      注解的出现终结了XML配置文件漫天飞的年代,它让程序拥有更高的可读性,可配置性与灵活性。当然,也有一些人说注解不如配置文件显的结构清晰,个人觉得所谓的结构应该是一个统一的规范,而不是将一堆文件结构糅合在一起。这就好比是面向对象与面向结构,你能说面向对象的逻辑不清晰吗?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值