1. 程式人生 > >Spring4.x中常用註解如@RequestMapping的使用

Spring4.x中常用註解如@RequestMapping的使用

SpringMVC常用以下幾個註解:

[email protected]

    表明這個類是SpringMVC裡的Controller,將其宣告為Spring的一個bean,Dispatcher Servlet會自動掃描註解了此註解的類,並將web請求對映到註解了@RequestMapping的方法上。

[email protected]

    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體內,而不是直接連結在地址後面。如下:


[email protected]

    @PathVariable用來接收路勁引數。如/news/001,可接收001作為引數,此註解放在引數前。

[email protected]

    這是個組合註解,組合了@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)

[email protected]的控制器類

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";
	}

}

[email protected]的控制器類

@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
	}

}