文章目录
- Spring常用注解
- SpringMVC常用注解
- 1. @Controller
- 2.@RequestMapping
- 3. @Autowired
- 4. @ResponseBody
- 5. @RequestBody
- 6. @RequestParam
- 7. @PathVariable
- 8. @MatrixVariable
- 9. @CrossOrigin
- 10. @RequestHeader
- 11. @CookieValue
- 12. @RequestAttribute
- 13. @SessionAttribute
- 14. @SessionAttributes
- 15. @ModelAttribute
- 16. @RestController
- 17. @ResponseStatus
- 18. @ExceptionHandle
- 19. @ControllerAdvice
- 20. @RestControllerAdvice
Spring常用注解
@Component
:标注一个普通的Spring Bean类。@Controller
:标注一个控制器组件类。@Service
:标注一个业务层组件类。@Repository
:标注一个dao持久层组件类
SpringMVC常用注解
- @Controller
- @RequestMapping
- @Autowired
- @ResponseBody
- @RequestBody
- @RequestParam
- @PathVariable
- @MatrixVariable
- @CrossOrigin
- @RequestHeader
- @CookieValue
- @RequestAttribute
- @SessionAttribute
- @SessionAttributes
- @ModelAttribute
- @RestController
- @ResponseStatus
- @ExceptionHandle
- @ControllerAdvice
- @RestControllerAdvice
1. @Controller
@Controller
声明该类为SpringMVC中的Controller
控制器Controller 负责处理由DispatcherServlet
分发的请求,它把用户请求的数据经过业务处理层处理之后封装成一个Model ,然后再把该Model 返回给对应的View 进行展示。
在SpringMVC 中使用@Controller
,就无需继承特定的类或实现特定的接口,只需使用@Controller
标记一个类是Controller,然后使用@RequestMapping
和@RequestParam
等一些注解用以定义URL 请求和Controller 方法之间的映射,这样的Controller 就能被外界访问到。
@Controller
用于标记在一个类上,使用它标记的类就是一个SpringMVC Controller 对象。分发处理器将会扫描使用了该注解的类的方法,并检测该方法是否使用了@RequestMapping
注解。
@Controller
只是定义了一个控制器类,而使用@RequestMapping
注解的方法才是真正处理请求的处理器。单单使用@Controller
标记在一个类上还不能真正意义上的说它就是SpringMVC 的一个控制器类,因为这个时候Spring 还不认识它。
那么要如何做Spring 才能认识它呢?这个时候就需要我们把这个控制器类交给Spring 来管理。有两种方式:
- 在SpringMVC 的配置文件中定义MyController 的bean 对象。
- 在SpringMVC 的配置文件中告诉Spring 该到哪里去找标记为
@Controller
的Controller 控制器。
<!--方式一-->
<bean class="com.host.app.web.controller.MyController"/>
<!--方式二-->
<context:component-scan base-package = "com.host.app.web" />//路径写到controller的上一层
2.@RequestMapping
RequestMapping详解
@RequestMapping
的作用是建立请求URL和处理方法之间的对应关系
@RequestMapping
可以作用在方法和类上
- 作用在类上:第一级的访问目录
- 作用在方法上:第二级的访问目录
@RequestMapping
的属性
属性 | 作用 |
---|---|
path | 指定请求路径的URL |
value | 属性和path属性是一样的 |
mthod | 指定该方法的请求方式 |
params | 指定限制请求参数的条件 |
headers | 发送的请求中必须包含的请求头 |
3. @Autowired
作用:spring可以自动帮你把bean里面引用的对象的 setter/getter 方法省略,它会自动帮你set/get。
正常情况下,你在userService里面要做一个userDao的setter/getter方法,但如果你用了@Autowired,你就不需要写getter/setter方法了,只需要在UserService的实现类中声明即可,之所以不用写,秘诀就在于java的“反射机制”。
通常我们都得这么写:
@Controller
public class UserController {
public void setUserService (UserService injectedService){
this.userService = injectedService;
}
}
使用@Autowired注解后:
@Controller
public class UserController {
@Autowired
UserService userService;
}
4. @ResponseBody
作用:@ResponseBody注解通常使用在控制层的方法上,用于将Controller的方法返回的对象,通过springmvc提供的HttpMessageConverter
接口转换为指定格式的数据如:json、xml等,通过Response响应给客户端。
假如是字符串则直接将字符串写到客户端;
假如是一个对象,此时会将对象转化为json串然后写到客户端。
这里需要注意的是,如果返回对象,按utf-8编码。如果返回String,页面可能出现乱码。因此在注解中我们可以手动修改编码格式,例如@RequestMapping(value="/cat/query",produces="text/html;charset=utf-8")
,前面是请求的路径,后面是编码格式。
5. @RequestBody
作用:用于获取请求体的内容
RequestBody 注解用于接收前端传来的实体,接收参数也是对应的实体,比如前端通过 JSON 提交传来两个参数 username 和 password,此时我们需要在后端封装一个实体来接收。在传递的参数比较多的情况下,使用 @RequestBody 接收会非常方便。例如:
@PostMapping("/user")
public String test(@RequestBody User user) {
System.out.println(user.getUsername(),user.getPassword());
return "success";
}
可以看出,@RequestBody 注解用于 POST 请求上,接收 JSON 实体参数。它和上面我们介绍的表单提交有点类似,只不过参数的格式不同,一个是 JSON 实体,一个是表单提交。在实际项目中根据具体场景和需要使用对应的注解即可
6. @RequestParam
与@RequestBody类似,用于将指定的请求参数赋值给方法中的形参
@PostMapping("/user")
public String test(@RequestParam String username, @RequestParam String password) {
System.out.println(username, password);
return "success";
}
7. @PathVariable
请求URL中的动态参数
@RequestMapping("/pathVariableTest/{id}")
public void pathVariableTest(@PathVariable Integer id)
// 如果url后面最后id传过来的值为"666",那么通过@PathVariable绑定,方法中id形参的值就被赋值为"666"
8. @MatrixVariable
此注解扩展了URL请求地址的功能,可以接收多个变量,用”;“
(分号)分隔,可以用于多条件查询
默认在SpringMVC中是不启用的,需要手动启用
<!-- 启用@MatrixVariable注解 -->
<mvc:annotation-driven enable-matrix-variables="true"/>
// 映射地址 /test/{id};name=wang;age=21/{randNum};q=1;w=2
@RequestMapping("/test/{id}")
public void test(@PathVariable Integer id,
@MatrixVariable(name="name",pathVar="id") String name,
@MatrixVariable(name="age",pathVar="id") Integer age,
@PathVariable Integer randNum,
@MatrixVariable(name="q",pathVar="randNum") Integer q,
@MatrixVariable(name="w",pathVar="randNum") Integer w)
// @MatrixVariable注解
// name属性:指定请求参数绑定的名称,省略则绑定同名参数
// pathVar属性:所在同级路径变量的名称
9. @CrossOrigin
用于处理SpringMVC中跨域请求问题
// 超时时间 单位/秒
@CrossOrigin(maxAge=3600)
@Controller
public class Test{
@CrossOrigin(origins="http://www.baidu.com")
@RequestMapping("/hello")
public String hello(){
// ......
}
}
@CrossOrigin注解分别用于类上和方法上,SpringMVC会合并两个一起使用
现在Test控制器的hello方法可以处理来自”http://www.baidu.com”
的跨域请求
也可以把“@CrossOrigin(origins=“http://www.baidu.com”)”
这个写在类上,说明这个Test控制器的所有方法都可以处理来自”http://www.baidu.com”
的跨域请求
10. @RequestHeader
用于将请求的头信息数据映射到功能处理的方法的参数上
@RequestMapping("/test")
public void test(@RequestHeader("User-Agent") String userAgent,
@RequestHeader("Accept") String[] accepts){
//......
}
11. @CookieValue
用于将请求的Cookie数据映射到功能处理的方法参数上
// 请求方法时 @CookieValue注解将cookie中名为message的值 传入到 message变量中
// 如果cookie中没有message时 则使用defalutValue配置的值
public void test(@CookieValue(name="message",defalutValue="") String message){
//......
}
12. @RequestAttribute
由请求方法、过滤器或拦截器创建或预先存在于request作用域中的属性,将该属性传到方法的参数上
public void test(@RequestAttribute(name="username") String username)
13. @SessionAttribute
由请求方法、过滤器或拦截器创建或预先存在于session作用域中的属性,将该属性传到方法的参数上
public void test(@SessionAttribute(name="username") String username)
14. @SessionAttributes
只能用于类上,无法用于方法上
用于让我们有选择地指定Model中的那些属性转存到HttpSession对象当中
// 写法一
@SessionAttributes("demo")
public class test{
// ......
}
// 写法二
@SessionAttributes(type={Demo.class}, value="user")
public class test{
// ......
}
// 写法三
@SessionAttributes(type={Demo.class, DemoOne.class}, value={"user", "demoOne"})
public class test{
// ......
}
15. @ModelAttribute
用于将请求参数绑定到对象。
-
@ModelAttribute(name=“”) 用于返回具体类的方法
用此注解的方法会先于请求的方法执行,用注解方法的返回值就赋给Model属性的值@Controller public class test{ // 此方法会先于请求的方法执行 @ModelAttribute(name="username") public String testOne(@RequestParam("username") String username){ // 返回值直接给Model对象的username属性赋值 return username; } @RequestMapping("/hello") public String hello(){ // 当访问/hello链接时 会先访问testOne方法,然后才访问hello方法 } }
-
@ModelAttribute 用于返回具体类的方法
注解没有指定name,取返回值类型(首字符小写)做为name,属性值为方法返回值@ModelAttribute public User testOne(@RequestParam("loginname") String username, @RequestParam("password") String password){ // User类自行创建 此处举例 User user = new User(); user.setUsername(username); user.setPassword(password); // 此处注解没有指定name,那么返回值是User类型,那么model的属性就是user return user; } @RequestMapping(value="/hello") public String hello() { // 当访问/hello链接时 会先访问testOne方法,然后才访问hello方法 }
-
@ModelAttribute用于void返回值的方法
无返回值,无法自动给model对象设置属性名称和值,只能通过
model.addAttribute()
实现@ModelAttribute public void testOne(@RequestParam("username") String username, @RequestParam("password") String password, Model model){ model.addAttribute("username", username); model.addAttribute("password", password); } @RequestMapping(value="/hello") public String hello() { // 当访问/hello链接时 会先访问testOne方法,然后才访问hello方法 }
-
@ModelAttribute和@RequestMapping同时用于一个方法
方法返回的不是视图名,而是model的属性值,视图名是@RequestMapping注解的name值
@RequestMapping(name="/testOne") @ModelAttribute(name="username") public String testOne() { return "admin"; // 这里返回的并不是一个视图名 而是model属性的值 // 视图名称是@RequestMapping注解中的testOne // 执行完此方法会跳转到 testOne.jsp 页面 }
-
@ModelAttribute用于一个方法的参数
此方法最为常用,可以将前台页面的值回传到另一个页面
@RequestMapping(value="/testOne") public String testOne(@ModelAttribute User user) { // 加了@ModelAttribute注解的参数值会自动加入到model对象的同名属性中 return "hello"; // 此处hello为视图名 }
16. @RestController
使用此注解的类首先是一个Controller类,类中所有使用了@RequestMapping
注解的方法都默认使用了@ResponseBody
注解
17. @ResponseStatus
此注解是处理异常的的最简单的方式,可以用于类上或者方法上,用于类上时,该类通常为异常类
使用时,先声明一个自定义异常类,在类上加上@ResponseStatus注解。当抛出该自定义异常时,@ResponseStatus注解的code属性(http状态码)和reason属性(异常信息)将返回给浏览器。
// 如果没有使用code属性,说明该异常可以被http任何状态调用
@ResponseStatus(reason="自定义异常具体信息")
public class MyException extends RuntimeException{
// ...
}
@Controller
public class test{
@RequestMapping("/hello")
public String hello() throws Exception{
try{
int i = 5 / 0;
return "success";
} catch(Exception e){
throw new MyException();
// 当访问/hello方法时 如果出现异常 则抛出MyException自定义异常
// 如果抛出MyException该自定义异常 将注解中的reason属性值返回给浏览器
}
}
}
18. @ExceptionHandle
此注解用于方法之上
定义一个BaseController类,让所有Controller继承此类,用此类处理所有Controller的异常
public class BaseController {
// value属性可以指定 异常类型
// value值为Exception 说明此方法可以处理所有Exception类型的异常
@ExceptionHandler(value = Exception.class)
public ModelAndView defaultErrorHandler(Exception e) throws Exception {
ModelAndView mav = new ModelAndView();
// 设置异常信息
mav.addObject("ex", e);
// 设置跳转异常处理页面
mav.setViewName("error");
return mav;
}
}
定义一个UserController,继承BaseController
@Controller
public class UserController extends BaseController{
// 访问/login链接
@RequestMapping("/login")
public String login(String username) throws Exception{
if(username == null ){
throw new NullPointerException("用户名不存在!");
}
return "success";
}
}
访问/login链接,如果username为空,则抛出NullPointerException
,会被父类中带有@ExceptionHandler注解的方法根据指定异常类型处理。
19. @ControllerAdvice
该注解使用了@Component注解,可以被Spring容器扫描到。扫描到之后会将用此注解的类的内部使用@ExceptionHandler、@InitBinder、@ModelAttribute
注解的方法应用到所有的请求处理方法上。最常用@ExcetionHandler,其他两个作用不大。
// 此类会被Spring容器扫描
@ControllerAdvice
public class MyExceptionHandler {
// 处理Exception类型异常
@ExceptionHandler(value = Exception.class)
public ModelAndView errorHandler1(Exception e) throws Exception {
ModelAndView mav = new ModelAndView();
mav.addObject("ex", e);
mav.setViewName("error");
return mav;
}
// 处理MyException自定义异常
@ExceptionHandler(value = MyException.class)
@ResponseBody
public Object errorHandler2(Exception e) throws Exception {
// 创建返回对象Map并设置属性,会被@ResponseBody注解转换为JSON返回
Map<String, Object> map = new HashMap<>();
map.put("code", 100);
map.put("message", e.getMessage());
map.put("data", "请求失败");
return map;
}
}
// 自定义异常类
public class MyException extends RuntimeException {
}
// Controller类
@Controller
public class TestController{
@RequestMapping("/hello")
public String hello() throws Exception{
// 此异常将被MyExceptionHandler类的errorHandler1方法捕获
int i = 5 / 0;
return "hello";
}
@RequestMapping("/world")
public String world() throws Exception{
try {
int i = 5 / 0;
return "world";
} catch (Exception e) {
e.printStackTrace();
// 此异常将被MyExceptionHandler类的errorHandler2方法捕获
throw new MyException("呀,出异常了!");
}
}
}
20. @RestControllerAdvice
该注解使用@ControllerAdvice和@ResponseBody注解,使用此注解的类会被看作是一个ControllerAdvice,而该类中所有使用@ExceptionHandler注解的方法都默认使用了@ResponseBody注解。