SpringMVC常用以下几个注解:
1.@Controller
表明这个类是SpringMVC里的Controller,将其声明为Spring的一个bean,Dispatcher Servlet会自动扫描注解了此注解的类,并将web请求映射到注解了@RequestMapping的方法上。
2.@RequestMapping
SpringMVC的核心注解,负责访问的url与调用方法之间的映射;@RequestMapping可以放在类和方法上。注解在方法上的@RequestMapping路劲会继承注解在类上的路劲。@RequestMapping支持Servelt的request和response作为参数,也支持对request和response的媒体类型进行配置。
@RequestMapping的属性produces属性控制response返回的形式;如Content-Type:text/plain
; application/json等。
@RequestMapping的属性method属性控制接受访问的类型,不写不做限制
3.@ResponseBody
放在方法上或者返回值类型前,@ResponseBody支持将返回值放在response体内,而不是返回一个页面。我们在很多基于Ajax的程序的时候,可以以此注解返回数据而不是页面。
4.@RequestBody
放在方法参数前。@RequestBody允许请求的参数在request体内,而不是直接链接在地址后面。如下:
5.@PathVariable
@PathVariable用来接收路劲参数。如/news/001,可接收001作为参数,此注解放在参数前。
6.@RestController
这是个组合注解,组合了@Controller和@ResponseBody,这就意味着当你只开发一个和页面交互数据的控制器的时候,只需要使用此注解即可。
关于上面注解的使用,代码示例如下:
一:添加依赖(完整的pom)
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.flysun</groupId>
<artifactId>springmvc4</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>
<properties>
<!-- Generic properties -->
<java.version>1.7</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<!-- Web -->
<jsp.version>2.2</jsp.version>
<jstl.version>1.2</jstl.version>
<servlet.version>3.1.0</servlet.version>
<!-- Spring -->
<spring-framework.version>4.1.5.RELEASE</spring-framework.version>
<!-- Logging -->
<logback.version>1.0.13</logback.version>
<slf4j.version>1.7.5</slf4j.version>
</properties>
<dependencies>
<dependency>
<groupId>javax</groupId>
<artifactId>javaee-web-api</artifactId>
<version>7.0</version>
<scope>provided</scope>
</dependency>
<!-- Spring MVC -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring-framework.version}</version>
</dependency>
<!-- 其他web依赖 -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>${jstl.version}</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>${servlet.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>${jsp.version}</version>
<scope>provided</scope>
</dependency>
<!-- Spring and Transactions -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>${spring-framework.version}</version>
</dependency>
<!-- 使用SLF4J和LogBack作为日志 -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${slf4j.version}</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.16</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>jcl-over-slf4j</artifactId>
<version>${slf4j.version}</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>${logback.version}</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
<version>${logback.version}</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-access</artifactId>
<version>${logback.version}</version>
</dependency>
<!--对json和xml格式的支持 -->
<dependency>
<groupId>com.fasterxml.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-xml</artifactId>
<version>2.5.3</version>
</dependency>
<!-- file upload -->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.1</version>
</dependency>
<!-- 非必需,可简化IO操作 -->
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.3</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${spring-framework.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.3.2</version>
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>2.3</version>
<configuration>
<failOnMissingWebXml>false</failOnMissingWebXml>
</configuration>
</plugin>
</plugins>
</build>
</project>
pom中有个对json和xml都支持的jackson-dataformat-xml依赖,实际开发中,我们主要支持json格式数据就可以了,可以直接使用下面的依赖:
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.5.3</version>
</dependency>
二:传值类Vo
public class DemoObj {
private Long id;
private String name;
//jackson对对象和json做转换时一定需要此空构造
public DemoObj() {
super();
}
public DemoObj(Long id, String name) {
super();
this.id = id;
this.name = name;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
三:控制器类(分@Controller和@RestController)
1.@Controller的控制器类
import javax.servlet.http.HttpServletRequest;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import com.wisely.highlight_springmvc4.domain.DemoObj;
@Controller // 1声明此类为控制器
@RequestMapping("/anno") //2此类的访问路劲为/anno 根地址为http://localhost:8080/spring4/anno
public class DemoAnnoController {
//此方法未标注路劲,因此使用类级别的路劲/anno
@RequestMapping(produces = "text/plain;charset=UTF-8",method = RequestMethod.GET)//声明response的媒体类型和字符集
public @ResponseBody String index(HttpServletRequest request) { //参数可接收HttpServletRequest,当前也接收HttpServletResponse
//此处的@ResponseBody用在返回值前面
return "url:" + request.getRequestURL() + " can access";
}
//映射路劲http://.../anno/pathvar/123
@RequestMapping(value = "/pathvar/{str}", produces = "text/plain;charset=UTF-8")
public @ResponseBody String demoPathVar(@PathVariable String str, //接收路劲参数,参数名必须和{}中的保持一致
HttpServletRequest request) {
//上面的@PathVariable注解必须加上,否则str为空
return "url:" + request.getRequestURL() + " can access,str: " + str;
}
//接收路劲参数 映射路劲http://.../anno/requestParam?id=123
@RequestMapping(value = "/requestParam", produces = "text/plain;charset=UTF-8")
public @ResponseBody String passRequestParam(@RequestParam Long id,
HttpServletRequest request) {
//上面的@RequestParam可以加,也可以不加,都可以获得参数id的值
return "url:" + request.getRequestURL() + " can access,id: " + id;
}
//演示参数到对象 映射路劲http://.../anno/obj?id=123&name=flysun
@RequestMapping(value = "/obj", produces = "application/json;charset=UTF-8")
@ResponseBody //@ResponseBody也可以用在方法上,上面的例子用在返回值前
public String passObj(DemoObj obj, HttpServletRequest request) {
return "url:" + request.getRequestURL()
+ " can access, obj id: " + obj.getId()+" obj name:" + obj.getName();
}
//演示不同的路劲到相同的方法上 映射路劲http://.../anno/name1 或者http://.../anno/name2
@RequestMapping(value = { "/name1", "/name2" }, produces = "text/plain;charset=UTF-8")
public @ResponseBody String remove(HttpServletRequest request) {
return "url:" + request.getRequestURL() + " can access";
}
}
1.@RestController的控制器类
@RestController //声明是控制器,并且返回的数据不需要加@ResponseBody
@RequestMapping("/rest")
public class DemoRestController {
@RequestMapping(value = "/getjson",
produces={"application/json;charset=UTF-8"}) //返回的数据类型是json
public DemoObj getjson (@RequestBody DemoObj obj){
return new DemoObj(obj.getId()+1, obj.getName()+"yy");//直接返回对象,对象会自动转换为json
}
@RequestMapping(value = "/getxml",
produces={"application/xml;charset=UTF-8"})//返回的数据类型是xml
public DemoObj getxml(DemoObj obj){
return new DemoObj(obj.getId()+1, obj.getName()+"yy");//直接返回对象,对象会自动转换为xml
}
}