`
yaerfeng1989
  • 浏览: 233079 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

springmvc注解配置详解及其demo代码下载

阅读更多

原创整理不易,转载请注明出处:springmvc注解配置详解及其demo代码下载

代码下载地址:http://www.zuidaima.com/share/1751864352705536.htm

一、概述

SpringMVC在2.5版本后新增了注解功能,2.5版本以前的基本通过继承Controller体系来开发业务控制器,2.5版本后Controller体系中

BaseCommandController及其子类AbstractCommandController、AbstractFormController、AbstractWizardFormController、

SimpleFormController、CancellableFormController等都已经被标示为@Deprecated,建议不再使用。


相比传统的继承Controller体系中某些类的方式,SpringMVC的注解具有以下优点:
1、Controller不再需要继承某个特定类,只是简单的POJO。
2、请求映射的配置非常方便灵活。
3、参数绑定机制非常方便丰富。
4、可以根据不同的http方法或者参数,细粒度处理不同的http请求

二、示例

下面通过对SpringMVC注解的详细介绍来看一下上述优点。

首先需要在应用的dispatcher-servlet.xml 启动注解机制

<context:annotation- config /> 
 <!-- 设置注解驱动 --> 
 <mvc:annotation - driven /> 
 <!-- 设置扫描的包 --> 
 <context:component - scan base - package=" com.demo.web.controller " /> 
 <bean class=" org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping " /> 
 <bean class= " org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter " />


注:虽然我们的Controller不需要再继承任何类,但出于规范,我们仍然命名为***Controller.java,并统一放在 com.demo.web.controller包中。

1、@Controller注解

 

简单示例

package com.demo.controller;

 import org.springframework.stereotype.Controller;
 import org.springframework.web.bind.annotation.RequestMapping;

@Controller
 class IndexController {
 @RequestMapping( " /index " )
 String index() {
 return " index " ;
 }
}


在一个POJO上面使用 @Controller 就可以标注该POJO是一个Controller,就这么简单。 @Controller注解定义在org.springframework.steretype包中。
使用方式: @Controller 或者 @Controller("indexController)。 org.springframework.steretype包中还包含 @Componenet @Service @Respository
三个注解。@Component是通用标注,@Controller标注web控制器,@Service标注Servicec层的服务,@Respository标注DAO层的数据访问。

2、使用@RequestMapping注解处理请求映射

    SpringMVC中注解基本都包含在 org.springframework.web.bind.annotation 包中。先看一下 @RequestMapping 注解的源码。

@Target({ ElementType.METHOD, ElementType.TYPE })
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Mapping
 public @ interface RequestMapping {

 /** 
 * 指定映射的URL.可以在类层次和方法层次使用。方式如下:
 * @RequestMapping("/add_")或 @RequestMapping(value="/add")
 * 支持Ant风格的URL映射,如 @RequestMapping("/myPath/*.htm")
 * 在类层次指定了映射后,可以在方法层次再指定相对路径
 */ 
 String[] value() default {};

 /** 
 * 指定HttpRequest的方法, 如:GET, POST, HEAD, OPTIONS, PUT, DELETE, TRACE.
 * 使用举例: @RequestMapping(value="/add_activity", method=RequestMethod.GET)
 */ 
 RequestMethod[] method() default {};

 /** 
 * 指定HttpRequest中包含的参数,使用方式如下:
 * @RequestMapping(value="/something",params="myParam")请求包含myParam参数
 * @RequestMapping(value="/something",params="myParam=myValue")请求包含myParam参数,并且该参数值为myValue
 * @RequestMapping(value="/something",params="!myParam")请求不包含myParam参数
 */ 
 String[] params() default {};

 /** 
 * 指定HttpRequest中包含的头部信息,使用方式如下:
 * @RequestMapping(value="/something", headers="content-type")请求包含该头部
 * @RequestMapping(value="/something", headers="content-type=text/*")请求包含特定值的头部
 * @RequestMapping(value="/something", headers="!content-type")请求不包含该头部
 */ 
 String[] headers() default {};

}

注:如果在类层次指定了映射,则方法层次上都将继承类层次的映射

3、获取HttpRequest中得参数

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->
@RequestMapping("active")
public @ResponseBody boolean active(Long accountId) {
    return accountService.activeAccount(accountId);
}

@RequestMapping("active")
public @ResponseBody boolean active(Account account) {
    return accountService.activeAccount(accountId);
}

@RequestMapping( " inactive " )
public  @ResponseBody  boolean  inactive(@RequestParam( " accountId " ) Long accountId,
            @RequestHeader( " User-Agent " ) String userAgent,
            @CookieValue( " loginId " ) String loginId) {
     return  accountService.inactiveAccount(accountId);
}

@RequestMapping(value  =   " list/{pageNo} " , method  =  RequestMethod.GET)
public  String list(@PathVariable  int  pageNo) {
      return   " /account/list " ;
}

@RequestMapping(value = "add", method = RequestMethod.GET)
public String add(@RequestBody String body) {
     return "/account/add";
}

 

active方法的入参 accountId,如果请求中有名为 accountId的参数,则会进行默认绑定,不仅基本类型,javabean的属性也可以默认进行绑定;
如果需要明确绑定,使用@RequestParam。 一般建议进行明确指定。
 

3.1 @RequestParam 绑定httpRequest中参数,@RequestParam("accountId") 完整形式为  @RequestParam(value="accountId",required=true,defaultValue=null)
3.2 @RequestHeader 绑定httpRequest头部信息,@RequestHeader("User-Agent") 完整形式为 @RequestHeader(value="User-Agebt",required=true, defaultValue=null)
3.3 @CookieValue 绑定一个Cookie值,@CookieValue("loginId") 完整形式为 @CookieValue(value="loginId",required=true,defaultValue=null)
3.4 @RequestBody 将httpRequest的body绑定到方法参数上
3.5 @ModelAttribute 有两种使用方式: 1)在方法级别,指定方法的返回值绑定到model中; 2)方法参数级别,指定model中的值绑定到方法的入参上 示例如下:

@ModelAttribute( " countryList " )
 public List <String> getCountries() {
 return new ArrayList <String> ();
 }

@RequestMapping(value= " search " , method= RequestMethod.POST)
 public String searchAccount(@ModelAttribute( " accountId " ) Long accountId) {
 return " /search " ;
 }

4、使用@ResponseBody 生成response

    适用于webservice的数据交换,或ajax异步请求,text、json或者xml格式的数据交换。
    例如访问: http://localhost:8080/accounts/info.htm

@RequestMapping(value= " info " )
 public @ResponseBody Account getAccount() {
 Account a= new Account();
 a.setId( 123L );
 a.setName( " zhangsan " );
 return a;
 }


返回数据如下:

{"name":"zhangsan","id":123}

从上面例子可以看出,使用@ResponseBody后,返回的javabean默认被序列化成json格式的数据并被写入到response body中。

@Request 和 @ReponseBody 使用了HttpMessageConverter机制。下面是HttpMessageConverter的继承体系。


常用的有如下几个:
StringHttpMessageConverter ---字符串
MappingJacksonHttpMessageConverter ----json
ByteArrayHttpMessageConverter ----字节数组

MarshallingHttpMessageConverter -----xml

 

5、使用模板技术生成response

    适用于一般页面请求。可以使用velocity freemarker等模板技术,在dispatcher-servlet.xml中需要设置viewResolver。
   

@RequestMapping( " /index " )
 public String index(ModelMap modelMap) {
 modelMap.put( " name " , " liucs " );
 return " index " ;
}

@RequestMapping( " /index " )
 public String index2(Model model) {
 model.addAttribute( " name " , " liucs " );
 return " index " 

如上面代码index1和index2所示,不使用@ResponseBody注解。 返回一个String类型,这个String是viewname, 如果是重定向,return "redirect:/index.htm".
入参可以包含ModelMap或者Model,其实这两者是一个东西,作用一样。也可以采用index3式的传统写法,返回一个ModelAndView对象。

6、数据验证

@InitBinder标注

@InitBinder
 public void myInitBinder(WebDataBinder binder){
 binder.setDisallowedFields( new String[]{ " id " });
 }

通过在方法中声明一个BindingResult参数来启动绑定和验证

@RequestMapping( " update " )
 public void update(@ModelAttribute( " account " ) Account account,BindingResult bindResult) {
 if (bindResult.hasErrors()){
 // …… 
 }
 }

需要注意以下限制:
1、BindingResult参数必须跟在一个JavaBean参数后面
2、错误会被自动的绑定到model中,便于渲染模板时使用
3、不支持@RequestBody等类型的参数形式

7、异常处理

@ExceptionHandler

2
3
分享到:
评论

相关推荐

    SpringMVC一些配置文件的demo

    8. **注解驱动**:SpringMVC支持使用注解进行配置,如`@Controller`、`@RequestMapping`、`@RequestParam`、`@PathVariable`等,这些注解简化了代码,提高了可读性和可维护性。 9. **转换器与格式化器**:SpringMVC...

    SpringMVC 注解和非注解demo

    注解在Spring MVC中扮演了关键角色,它们允许开发者无需编写大量的XML配置文件,从而提高代码的可读性和维护性。以下是一些核心的Spring MVC注解: 1. `@Controller`:标记一个类作为处理HTTP请求的控制器。 2. `@...

    SpringMVC+Mybatis demo

    1. **XML或注解配置**:定义SQL语句、存储过程以及复杂的映射,可以在XML配置文件中编写,也可以使用注解。 2. **动态SQL**:支持条件查询、if、choose、when、otherwise等元素,使SQL语句更灵活。 3. **Mapper接口*...

    SpringMVC demo 完整源码实例下载

    在这个"SpringMVC demo 完整源码实例下载"中,我们能够深入理解并学习SpringMVC的核心概念和实际应用。 首先,SpringMVC是Spring框架的一部分,它通过Model-View-Controller(MVC)设计模式来分离应用程序的业务...

    SpringMVCDemo

    **SpringMVC 框架详解** SpringMVC 是 Spring 框架的一部分,它是一个用于构建 Web 应用程序的轻量级、模型-视图-控制器(MVC)框架。SpringMVC 提供了丰富的功能,使开发者能够更高效地开发 Java Web 应用。以下是...

    注解式springMVC的demo

    在本文中,我们将深入探讨“注解式Spring MVC”的概念及其在实际开发中的应用。Spring MVC是Spring框架的一部分,主要用于构建Web应用程序。它利用注解简化了配置过程,提高了开发效率。 1. **注解基础** 在Spring...

    SpringMVC 原理及配置详解Demo

    这个“SpringMVC原理及配置详解Demo”旨在深入解析SpringMVC的工作机制和配置过程,帮助开发者更好地理解和应用这一强大的Web开发工具。 **SpringMVC核心组件** 1. **DispatcherServlet**: SpringMVC的前端控制器,...

    SpringMVC 增删改查demo

    在"SpringMVC 增删改查demo"中,我们可能使用了注解式编程来定义控制器类和方法,比如使用@Controller和@RequestMapping注解。这样可以更加简洁地配置处理请求的方法。例如,我们可能会有一个名为`UserController`的...

    SpringMVC两种配置的Demo

    Java配置允许你利用注解的力量,使得代码更具可读性。但XML配置在某些情况下可能更适合大型项目,因为它可以更灵活地控制配置。 在实际开发中,这两种方式可以根据团队习惯和项目需求来选择。通常,随着Spring框架...

    SpringMvc+Hibernate+MySql Demo 源码

    这个Demo源码应该包含了上述所有组件的配置文件、实体类、DAO、Service、Controller以及可能的视图文件。通过学习和运行这个示例,开发者可以深入理解Spring MVC、Hibernate和MySQL的集成原理,为实际项目开发打下...

    spring mvc demo下载地址

    1. **注解驱动开发**:Spring MVC允许使用注解来简化配置,例如@Controller、@RequestMapping、@Autowired等。 2. **视图解析**:理解如何配置视图解析器,例如使用InternalResourceViewResolver解析JSP页面。 3. ...

    Ext4+SpringMVC实例Demo源码

    8. **配置文件**:项目中可能包含SpringMVC的配置文件(如`spring-servlet.xml`),定义了bean、拦截器、视图解析器等配置。 9. **版本控制**:源代码可能使用Git或其他版本控制系统进行管理,这有助于团队协作和...

    《基于注解的SpringMVC增删改DEMO源码》Maven版

    《基于注解的SpringMVC增删改DEMO源码》是针对Maven构建的Java Web项目,旨在帮助开发者理解并实践SpringMVC框架中基于注解的控制器、数据访问和事务管理等核心功能。该项目提供了完整的源代码,使得学习者能够通过...

    java-mybatis、springmvc 整合demo源码(druid-demo)

    在"java-mybatis、springmvc 整合demo源码(druid-demo)"中,我们主要探讨的是如何将这两个框架进行无缝集成,并解决在使用@Transactional注解时遇到的事务管理问题。 首先,我们需要了解MyBatis与SpringMVC的整合...

    springMVC注解+ security + redis 实例

    综上所述,"springMVC注解+ security + redis 实例"的学习资料将涵盖这些技术的基本用法和整合方式,帮助开发者掌握如何构建一个安全、高效的Web应用。通过这个实例,你可以了解到如何在Spring MVC应用中使用注解...

    SpringMVC Demo_java_springmvc_DEMO_

    2. **SpringMVC配置**:在项目中,会有一个或多个配置文件,如`DispatcherServlet-servlet.xml`,用于配置SpringMVC的核心组件,包括视图解析器、处理器映射器、拦截器等。这些配置使得SpringMVC能够识别和处理HTTP...

    SpringMVC+Oracle数据源demo项目完整代码

    这个"SpringMVC+Oracle数据源demo项目完整代码"是一个很好的学习和实践平台,它涵盖了如何将两者集成到一个应用中的关键步骤。 首先,SpringMVC的核心组件包括DispatcherServlet、ModelAndView、Controllers和视图...

    SpringMVC文件上传Demo代码

    这个"SpringMVC文件上传Demo代码"是一个实例,演示了如何配置和使用SpringMVC来实现这一功能。 首先,我们需要在SpringMVC的配置文件(如`servlet-context.xml`)中启用多部分支持。这通常涉及到注册一个`...

    SpringMVC+MyBatis+MySql注解示例

    这个“SpringMVC+MyBatis+MySql注解示例”项目提供了一个完整的SSM整合实例,你可以下载并研究其代码结构和配置文件,从而深入理解这三个框架如何协同工作,为你的开发工作提供便利。通过这个示例,你可以学习到如何...

    demo_SpringMVC.rar_+SpringMVC demo_DEMO_spring mvc_spring mvc de

    通过这个 "demo_SpringMVC" 项目,开发者可以深入了解 Spring MVC 的基本工作原理和配置,从而更好地掌握这个强大的 Web 开发框架。无论是新手还是经验丰富的开发者,都可以从中获益,提升自己的技能。

Global site tag (gtag.js) - Google Analytics