(Portal 开发读书笔记)Spring Portlet MVC 常用注解大全

简介:

@Controller  ,标注在类级别,用于标注一个Portlet Handler,控制器类可以是任意的类。

----

@Autowired ,标注在构造器,setter方法,或者字段上,用于让Spring根据类型来注入依赖,所以如果在Spring上下文中如果有某个类的多个bean实例,则会抛出异常,此时我们应该配合@Qualifier 一起使用。

比如我们有

 
 
  1. <bean id="bookservice1" class="foo.bar.service.BookService/> 
  2.  
  3. <bean id="bookservice2" class="foo.bar.service.BookService"/> 
  4.  
  5. <bean id="bookservice3" class="foo.bar.service.BookService"/> 

我们想让我们的Controller注入bookservice1 ,则必须联合使用@Autowired和@Qualifier:

 
 
  1. @Controller(value="addBookController") 
  2. public class AddBookController { 
  3. @Autowired 
  4. @Qualifier("bookservice1") 
  5. private BookService bookService; 
  6. ... 
  7. } 

-----

@Resource,标注在类,字段,setter方法,但是不可以标注在构造器上,用于让Spring根据名字来注入依赖。

 
 
  1. @Controller(value="addBookController") 
  2. public class AddBookController { 
  3. @Resource(name="myBookService") 
  4. private BookService bookService; 
  5. ... 
  6. } 

 

在Portlet Controller的内部,我们还可以用以下的注解:

@RequestMapping,标注在类和方法上,Portlet常用的映射策略是:将一种Portlet模式映射到控制器类上,然后将请求参数映射到各个处理器方法上。

当用于类级时,它可以将对portlet的请求根据当前portlet的mode和请求参数来映射到Handler上,例如:

 
 
  1. @Controller(value="someController") 
  2. @RequestMapping(value="VIEW", 
  3. params="action=showSomething") 
  4. public class SomeController { 
  5. public String showSomething(...) { 
  6. return "addBookForm"; 
  7. } 
  8. public void doSomething(...) { 
  9. } 
  10. } 

当用于方法级时,它可以将对portlet的请求根据当前portlet的mode和请求参数映射到Handler的某个方法上,例如:

 
 
  1. @Controller(value="someController") 
  2. public class SomeController { 
  3. @RequestMapping(value="VIEW", 
  4. params="action=showSomething") 
  5. public String showSomething(...) { 
  6. } 
  7. @RequestMapping(value="ACTION", params="action=doSomeWork") 
  8. public void doSomething(...) { 
  9. } 
  10. } 

注意,类级别的@RequestMapping的模式和方法级别的@RequestMapping的模式必须匹配,否则会产生错误。

 

也可以根据方法的签名来让Spring自动判断某个方法是render处理方法还是action处理方法,比如:

 
 
  1. @Controller(value="someController") 
  2. @RequestMapping(value="VIEW") 
  3. public class SomeController { 
  4. ... 

  5. //下面的处理方法是一个render请求的处理方法
  6. @RequestMapping(params="action=showSomething") 
  7. public String showSomething(Model model) { 
  8. } 
  9. //下面的处理方法是一个action请求的处理方法
  10. @RequestMapping(params="action=doSomeWork") 
  11. public void doSomething(ActionRequest request) { 
  12. } 
  13. } 

action请求的处理方法总是返回void

---- 

为了让请求类型映射更加清晰,我们不用@RequestMapping,而是用更加具体的标注比如 @RenderMapping ,@ActionMapping:

----

@RequestMapping 

@RenderMapping:标注在方法上,用于将一个render类型的portlet 请求映射到处理器的render方法上,其中value也可以不指定,如果不指定则表示渲染到NOMAL+MAXIMIZED+MINIMIZED上。

 
 
  1. @Controller(value="someController") 
  2. @RequestMapping(value="VIEW") 
  3. public class SomeController { 
  4. @RenderMapping(value="NORMAL", 
  5. params="action=showSomething") 
  6. public String showSomething(Model model) { 
  7. } 
  8. } 

注意,@RenderMapping必须和@RequestMapping联合使用,因为@RequestMapping可以指定Portlet Mode,而@RenderMapping无法指定Portlet Mode.

 -----

@ActionMapping:

@ActionMapping标注在方法上,用于将一个action类型的portlet请求映射到处理器的action方法上,其中value也可以不指定。

 
 
  1. @Controller(value="someController") 
  2. @RequestMapping("VIEW") 
  3. public class SomeController { 
  4. @ActionMapping(value="doSomeWork", 
  5. params={"work=laundry","time=enough"}) 
  6. public String doSomething(ActionRequest request) { 
  7. ... 
  8. } 
  9. ... 
  10. } 

注意,@ActionMapping必须和@RequestMapping联合使用,因为@RequestMapping可以指定Portlet Mode,而@ActionMapping无法指定Portlet Mode.

----

@RequestParam 是方法参数级的注解,用于绑定请求参数到方法参数

 
 
  1. @RequestMapping 
  2.  public void advancedSearch( 
  3.    @RequestParam("queryStr") String queryStr, 
  4.    @RequestParam("showFlag") String showFlag, 
  5.    @RequestParam("totalnumber") String totalNumber, 
  6.    @RequestParam("upType") String upType, 
  7.    @RequestParam("jmesareq") String jmesaReq, 
  8.    @RequestParam("isExportOper") String isExportOper, 
  9.    RenderResponse response, final RenderRequest request, 
  10.    ModelMap model) { 
  11.   // get query structure and query type from page 
  12.   List<Long> cd_ids = new ArrayList<Long>(); 
  13.   if(StringUtils.equals("invoke", jmesaReq)){ 
  14.    cd_ids = (List<Long>)request.getSession().getAttribute(Constants.RESULT_IDS); 
  15.   } 
  16.  .... 
  17.  } 

 

-----

@ModelAttribute ,标注在方法或者方法参数中,用于从Model对象中添加或者移除属性。

如果用于方法级别,那么方法的返回值被添加到Model对象中,value属性表明存放到Model中的key.例如:

 
 
  1. @Controller(value="bookController") 
  2. @RequestMapping("VIEW") 
  3. public class BookController { 
  4. @Autowired 
  5. @Qualifier("myBookService") 
  6. private BookService bookService; 
  7. ... 
  8. @ModelAttribute(value="books") 
  9. public List<Book> getBooks() { 
  10. return bookService.getBooks(isbnNumber); 
  11. } 
  12. ... 
  13. } 

注意,被@ModelAttribute标注的方法的调用时间总是早于被@RenderMapping或者@ActionMapping所标注的方法.

注意,@ModelAttribute标注也必须和@RequestMapping联合使用。

 

如果用于方法参数级别,那么它用于绑定模型中的属性到方法参数,例如:

 
 
  1. @RequestMapping(value = "VIEW") 
  2. @Controller(value="addBookController") 
  3. public class AddBookController { 
  4. @Autowired 
  5. @Qualifier("myBookService") 
  6. private BookService bookService; 
  7. ... 
  8. @ActionMapping(params = "myaction=addBook") 
  9. public void addBook(@ModelAttribute(value="book") 
  10. Book book, ...) { 
  11. ... 
  12. bookService.addBook(book); 
  13. } 
  14. } 

-----

@SessionAttributes ,标注在类级别,用于让模型的属性存储于控制器的会话状态中。直到Session结束(详细说来是调用了SessionStatus的setComplete()方法)。这样做的好处就是可以在一个作用域更大的区域上共享对象,用法是将@SessionAttributes和@ModelAttribute 联合使用,并且他们的value值设成一样。例如:

 
 
  1. @Controller 
  2. @RequestMapping(value="VIEW") 
  3. @SessionAttributes(value="book") 
  4. public class EditBookController { 
  5. @Autowired 
  6. @Qualifier("myBookService") 
  7. private BookService bookService; 
  8. @ModelAttribute("book") 
  9. public Book getBook(@RequestParam Long isbnNumber) { 
  10. return bookService.getBook(isbnNumber); 
  11. } 
  12. @ActionMapping(params="myaction=editBook") 
  13. public void editBook 
  14. (@ModelAttribute("book")Book book,...){ 
  15. ... 
  16. bookService.editBook(book); 
  17. ... 
  18. } 
  19. } 
  20. @RenderMapping(params="myaction=editBookForm") 
  21. public String showEditBookForm(){ 
  22. return "editBookForm"; 
  23. } 
  24. } 

对于共享PortletSession上相同类型的多个属性,也可以用如下的写法:

 
 
  1. @SessionAttributes(types=XXXClass.class) 

这样所有XXClass类型的属性都会被设置到PortletSession域上。

-----

@InitBinder 标注在方法级,为什么要用这个注解呢?

因为请求类型的参数都是String类型的, 所以要让某个属性编辑器(比如自定义的属性编辑器),格式化器或者校验器来处理某个请求参数,就必须用WebDataBinder进行绑定,而@InitBinder就负责初始化WebDataBinder,比如:

 
 
  1. @Controller 
  2. public class MyFormController { 
  3.  
  4.     @InitBinder 
  5.     public void initBinder(WebDataBinder binder) { 
  6.         SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); 
  7.         dateFormat.setLenient(false); 
  8.         binder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, false)); 
  9.     } 
  10.     … 
  11. } 

这个例子就是Date类型绑定到自定义的Date编辑器。





本文转自 charles_wang888 51CTO博客,原文链接:http://blog.51cto.com/supercharles888/845706,如需转载请自行联系原作者

目录
相关文章
|
缓存 监控 Java
SpringBoot @Scheduled 注解详解
使用`@Scheduled`注解实现方法周期性执行,支持固定间隔、延迟或Cron表达式触发,基于Spring Task,适用于日志清理、数据同步等定时任务场景。需启用`@EnableScheduling`,注意线程阻塞与分布式重复问题,推荐结合`@Async`异步处理,提升任务调度效率。
1853 128
|
Java 测试技术 数据库
使用Spring的@Retryable注解进行自动重试
在现代软件开发中,容错性和弹性至关重要。Spring框架提供的`@Retryable`注解为处理瞬时故障提供了一种声明式、可配置的重试机制,使开发者能够以简洁的方式增强应用的自我恢复能力。本文深入解析了`@Retryable`的使用方法及其参数配置,并结合`@Recover`实现失败回退策略,帮助构建更健壮、可靠的应用程序。
1314 1
使用Spring的@Retryable注解进行自动重试
|
前端开发 Java 微服务
《深入理解Spring》:Spring、Spring MVC与Spring Boot的深度解析
Spring Framework是Java生态的基石,提供IoC、AOP等核心功能;Spring MVC基于其构建,实现Web层MVC架构;Spring Boot则通过自动配置和内嵌服务器,极大简化了开发与部署。三者层层演进,Spring Boot并非替代,而是对前者的高效封装与增强,适用于微服务与快速开发,而深入理解Spring Framework有助于更好驾驭整体技术栈。
|
XML Java 数据格式
常用SpringBoot注解汇总与用法说明
这些注解的使用和组合是Spring Boot快速开发和微服务实现的基础,通过它们,可以有效地指导Spring容器进行类发现、自动装配、配置、代理和管理等核心功能。开发者应当根据项目实际需求,运用这些注解来优化代码结构和服务逻辑。
826 12
|
XML Java 应用服务中间件
【SpringBoot(一)】Spring的认知、容器功能讲解与自动装配原理的入门,带你熟悉Springboot中基本的注解使用
SpringBoot专栏开篇第一章,讲述认识SpringBoot、Bean容器功能的讲解、自动装配原理的入门,还有其他常用的Springboot注解!如果想要了解SpringBoot,那么就进来看看吧!
996 2
|
传感器 Java 数据库
探索Spring Boot的@Conditional注解的上下文配置
Spring Boot 的 `@Conditional` 注解可根据不同条件动态控制 Bean 的加载,提升应用的灵活性与可配置性。本文深入解析其用法与优势,并结合实例展示如何通过自定义条件类实现环境适配的智能配置。
823 0
探索Spring Boot的@Conditional注解的上下文配置
|
智能设计 Java 测试技术
Spring中最大化@Lazy注解,实现资源高效利用
本文深入探讨了 Spring 框架中的 `@Lazy` 注解,介绍了其在资源管理和性能优化中的作用。通过延迟初始化 Bean,`@Lazy` 可显著提升应用启动速度,合理利用系统资源,并增强对 Bean 生命周期的控制。文章还分析了 `@Lazy` 的工作机制、使用场景、最佳实践以及常见陷阱与解决方案,帮助开发者更高效地构建可扩展、高性能的 Spring 应用程序。
520 0
Spring中最大化@Lazy注解,实现资源高效利用
|
Java 测试技术 编译器
@GrpcService使用注解在 Spring Boot 中开始使用 gRPC
本文介绍了如何在Spring Boot应用中集成gRPC框架,使用`@GrpcService`注解实现高效、可扩展的服务间通信。内容涵盖gRPC与Protocol Buffers的原理、环境配置、服务定义与实现、测试方法等,帮助开发者快速构建高性能的微服务系统。
2083 0
|
开发框架 前端开发 .NET
ASP.NET CORE 3.1 MVC“指定的网络名不再可用\企图在不存在的网络连接上进行操作”的问题解决过程
ASP.NET CORE 3.1 MVC“指定的网络名不再可用\企图在不存在的网络连接上进行操作”的问题解决过程
1085 0
|
存储 开发框架 前端开发
[回馈]ASP.NET Core MVC开发实战之商城系统(五)
经过一段时间的准备,新的一期【ASP.NET Core MVC开发实战之商城系统】已经开始,在之前的文章中,讲解了商城系统的整体功能设计,页面布局设计,环境搭建,系统配置,及首页【商品类型,banner条,友情链接,降价促销,新品爆款】,商品列表页面,商品详情等功能的开发,今天继续讲解购物车功能开发,仅供学习分享使用,如有不足之处,还请指正。
737 0