(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. ... 

-----

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

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

 

在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. public void doSomething(...) { 

当用于方法级时,它可以将对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. @RequestMapping(value="ACTION", params="action=doSomeWork"
  7. public void doSomething(...) { 

注意,类级别的@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. //下面的处理方法是一个action请求的处理方法
  9. @RequestMapping(params="action=doSomeWork"
  10. public void doSomething(ActionRequest request) { 

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) { 

注意,@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. ... 

注意,@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. ... 

注意,被@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); 

-----

@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. @ActionMapping(params="myaction=editBook"
  12. public void editBook 
  13. (@ModelAttribute("book")Book book,...){ 
  14. ... 
  15. bookService.editBook(book); 
  16. ... 
  17. @RenderMapping(params="myaction=editBookForm"
  18. public String showEditBookForm(){ 
  19. return "editBookForm"

对于共享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.classnew CustomDateEditor(dateFormat, false)); 
  9.     } 
  10.     … 

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





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

目录
相关文章
|
4月前
|
XML Java 测试技术
Spring IOC—基于注解配置和管理Bean 万字详解(通俗易懂)
Spring 第三节 IOC——基于注解配置和管理Bean 万字详解!
322 26
|
3月前
|
JSON 前端开发 Java
Spring MVC常用的注解
@RequestMapping:用于处理请求 url 映射的注解,可用于类或方法上。用于类上,则表示类中 的所有响应请求的方法都是以该地址作为父路径。 @RequestBody:注解实现接收http请求的json数据,将json转换为java对象。 @ResponseBody:注解实现将conreoller方法返回对象转化为json对象响应给客户。 @Controller:控制器的注解,表示是表现层,不能用用别的注解代替 @RestController : 组合注解 @Conntroller + @ResponseBody @GetMapping , @PostMapping , @Put
|
3月前
|
Java Spring
Spring Boot的核心注解是哪个?他由哪几个注解组成的?
Spring Boot的核心注解是@SpringBootApplication , 他由几个注解组成 : ● @SpringBootConfiguration: 组合了- @Configuration注解,实现配置文件的功能; ● @EnableAutoConfiguration:打开自动配置的功能,也可以关闭某个自动配置的选项 ● @ComponentScan:Spring组件扫描
|
3月前
|
Java 测试技术 Spring
SpringBoot+@Async注解一起用,速度提升
本文介绍了异步调用在高并发Web应用性能优化中的重要性,对比了同步与异步调用的区别。同步调用按顺序执行,每一步需等待上一步完成;而异步调用无需等待,可提升效率。通过Spring Boot示例,使用@Async注解实现异步任务,并借助Future对象处理异步回调,有效减少程序运行时间。
|
2月前
|
人工智能 缓存 自然语言处理
保姆级Spring AI 注解式开发教程,你肯定想不到还能这么玩!
这是一份详尽的 Spring AI 注解式开发教程,涵盖从环境配置到高级功能的全流程。Spring AI 是 Spring 框架中的一个模块,支持 NLP、CV 等 AI 任务。通过注解(如自定义 `@AiPrompt`)与 AOP 切面技术,简化了 AI 服务集成,实现业务逻辑与 AI 基础设施解耦。教程包含创建项目、配置文件、流式响应处理、缓存优化及多任务并行执行等内容,助你快速构建高效、可维护的 AI 应用。
|
4月前
|
监控 Java Spring
SpringBoot:SpringBoot通过注解监测Controller接口
本文详细介绍了如何通过Spring Boot注解监测Controller接口,包括自定义注解、AOP切面的创建和使用以及具体的示例代码。通过这种方式,可以方便地在Controller方法执行前后添加日志记录、性能监控和异常处理逻辑,而无需修改方法本身的代码。这种方法不仅提高了代码的可维护性,还增强了系统的监控能力。希望本文能帮助您更好地理解和应用Spring Boot中的注解监测技术。
120 16
|
3月前
|
XML Java 数据库连接
微服务——SpringBoot使用归纳——Spring Boot集成MyBatis——基于注解的整合
本文介绍了Spring Boot集成MyBatis的两种方式:基于XML和注解的形式。重点讲解了注解方式,包括@Select、@Insert、@Update、@Delete等常用注解的使用方法,以及多参数时@Param注解的应用。同时,针对字段映射不一致的问题,提供了@Results和@ResultMap的解决方案。文章还提到实际项目中常结合XML与注解的优点,灵活使用两者以提高开发效率,并附带课程源码供下载学习。
70 0
|
设计模式 前端开发 Java
了解 Spring MVC 架构、Dispatcher Servlet 和 JSP 文件的关键作用
Spring MVC 是 Spring 框架的一部分,是一个 Web 应用程序框架。它旨在使用 Model-View-Controller(MVC) 设计模式轻松构建Web应用程序。
186 0
|
8月前
|
存储 设计模式 前端开发
什么是SpringMVC?简单好理解!什么是应用分层?SpringMVC与应用分层的关系? 什么是三层架构?SpringMVC与三层架构的关系?
文章解释了SpringMVC的概念和各部分功能,探讨了应用分层的原因和具体实施的三层架构,以及SpringMVC与三层架构之间的关系和联系。
195 1
什么是SpringMVC?简单好理解!什么是应用分层?SpringMVC与应用分层的关系? 什么是三层架构?SpringMVC与三层架构的关系?
|
12月前
|
安全 前端开发 Java
挑战5分钟内基于Springboot+SpringMVC+Mybatis-plus快速构建web后端三层架构
挑战5分钟内基于Springboot+SpringMVC+Mybatis-plus快速构建web后端三层架构
139 1