spring MVC使用及新特性說明

1、      spring MVC使用簡述html

配置部分:前端

jar包和依賴jar包

​
<?xml version="1.0" encoding="UTF-8"?>
<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/maven-v4_0_0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>org.springframework.samples</groupId>
	<artifactId>test</artifactId>
	<name>test</name>
	<packaging>war</packaging>
	<version>1.0.0-BUILD-SNAPSHOT</version>
	<properties>
		<java-version>1.7</java-version>
		<org.springframework-version>4.2.2.RELEASE</org.springframework-version>
		<org.springframework.security-version>4.0.1.RELEASE</org.springframework.security-version>
		<org.mybatis-version>3.3.0</org.mybatis-version>
		<org.aspectj-version>1.8.1</org.aspectj-version>
		<org.slf4j-version>1.7.12</org.slf4j-version>
	</properties>
	<dependencies>
		<!-- Spring -->
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-context</artifactId>
			<version>${org.springframework-version}</version>
			<exclusions>
				<!-- Exclude Commons Logging in favor of SLF4j -->
				<exclusion>
					<groupId>commons-logging</groupId>
					<artifactId>commons-logging</artifactId>
				</exclusion>
			</exclusions>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-webmvc</artifactId>
			<version>${org.springframework-version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-tx</artifactId>
			<version>${org.springframework-version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-jdbc</artifactId>
			<version>${org.springframework-version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-aspects</artifactId>
			<version>${org.springframework-version}</version>
		</dependency>
          <dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-test</artifactId>
			<version>${org.springframework-version}</version>
		</dependency>
		
		<dependency>
			<groupId>org.springframework.session</groupId>
			<artifactId>spring-session</artifactId>
			<version>1.1.1.RELEASE</version>
		</dependency>

		<!-- AspectJ -->
		<dependency>
			<groupId>org.aspectj</groupId>
			<artifactId>aspectjrt</artifactId>
			<version>${org.aspectj-version}</version>
		</dependency>
		<!-- mybatis -->
		<dependency>
			<groupId>org.mybatis</groupId>
			<artifactId>mybatis</artifactId>
			<version>${org.mybatis-version}</version>
		</dependency>

		<!-- mybatis-spring -->
		<dependency>
			<groupId>org.mybatis</groupId>
			<artifactId>mybatis-spring</artifactId>
			<version>1.2.3</version>
		</dependency>
		<!-- mybatis-mysql -->
		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
			<version>5.1.38</version>
		</dependency>
		<!-- druid -->
		<dependency>
			<groupId>com.alibaba</groupId>
			<artifactId>druid</artifactId>
			<version>1.0.17</version>
		</dependency>
		<dependency>
		  <groupId>net.sourceforge.jtds</groupId>
		  <artifactId>jtds</artifactId>
		  <version>1.2.4</version>
		</dependency>

		<!-- kryo -->
		<dependency>
			<groupId>com.esotericsoftware</groupId>
			<artifactId>kryo</artifactId>
			<version>3.0.3</version>
		</dependency>

		<dependency>
			<groupId>com.esotericsoftware</groupId>
			<artifactId>kryo-shaded</artifactId>
			<version>3.0.3</version>
		</dependency>

		<!-- Logging -->
		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>slf4j-api</artifactId>
			<version>${org.slf4j-version}</version>
		</dependency>
		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>jcl-over-slf4j</artifactId>
			<version>${org.slf4j-version}</version>
			<scope>runtime</scope>
		</dependency>
		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>slf4j-log4j12</artifactId>
			<version>${org.slf4j-version}</version>
			<scope>runtime</scope>
		</dependency>
		<dependency>
			<groupId>log4j</groupId>
			<artifactId>log4j</artifactId>
			<version>1.2.16</version>
			<scope>runtime</scope>
		</dependency>

		<!-- @Inject -->
		<dependency>
			<groupId>javax.inject</groupId>
			<artifactId>javax.inject</artifactId>
			<version>1</version>
		</dependency>

		<!-- Servlet -->
		<dependency>
			<groupId>org.apache.tomcat</groupId>
			<artifactId>tomcat-servlet-api</artifactId>
			<version>7.0.30</version>
			<scope>provided</scope>
		</dependency>
		<dependency>
			<groupId>javax.servlet.jsp</groupId>
			<artifactId>jsp-api</artifactId>
			<version>2.1</version>
			<scope>provided</scope>
		</dependency>
		<dependency>
			<groupId>javax.servlet.jsp.jstl</groupId>
			<artifactId>jstl-api</artifactId>
			<version>1.2</version>
			<exclusions>
				<exclusion>
					<groupId>javax.servlet</groupId>
					<artifactId>servlet-api</artifactId>
				</exclusion>
			</exclusions>
		</dependency>
		<dependency>
			<groupId>org.glassfish.web</groupId>
			<artifactId>jstl-impl</artifactId>
			<version>1.2</version>
			<exclusions>
				<exclusion>
					<groupId>javax.servlet</groupId>
					<artifactId>servlet-api</artifactId>
				</exclusion>
			</exclusions>
		</dependency>
		<!-- commons-lang -->
		<dependency>
			<groupId>commons-lang</groupId>
			<artifactId>commons-lang</artifactId>
			<version>2.6</version>
		</dependency>
		<!-- commons-codec -->
		<dependency>
			<groupId>commons-codec</groupId>
			<artifactId>commons-codec</artifactId>
			<version>1.10</version>
		</dependency>

		<!-- redis -->
		<dependency>
			<groupId>org.springframework.data</groupId>
			<artifactId>spring-data-redis</artifactId>
			<version>1.6.4.RELEASE</version>
		</dependency>

		<dependency>
			<groupId>redis.clients</groupId>
			<artifactId>jedis</artifactId>
			<version>2.8.1</version>
		</dependency>
		<!-- Gson -->
		<dependency>
		    <groupId>com.google.code.gson</groupId>
		    <artifactId>gson</artifactId>
		    <version>2.7</version>
		</dependency>

		<!-- Jackson JSON Processor -->
		<dependency>
			<groupId>com.fasterxml.jackson.core</groupId>
			<artifactId>jackson-databind</artifactId>
			<version>2.5.3</version>
		</dependency>

		<!-- Rome Atom+RSS -->
		<dependency>
			<groupId>com.rometools</groupId>
			<artifactId>rome</artifactId>
			<version>1.5.0</version>
		</dependency>

		<!-- JSR 303 with Hibernate Validator -->
		<dependency>
			<groupId>javax.validation</groupId>
			<artifactId>validation-api</artifactId>
			<version>1.0.0.GA</version>
		</dependency>
		<dependency>
			<groupId>org.hibernate</groupId>
			<artifactId>hibernate-validator</artifactId>
			<version>4.1.0.Final</version>
		</dependency>

		<!-- Joda Time Library -->
		<dependency>
			<groupId>joda-time</groupId>
			<artifactId>joda-time</artifactId>
			<version>2.3</version>
		</dependency>

		<!-- File Upload -->
		<dependency>
			<groupId>commons-fileupload</groupId>
			<artifactId>commons-fileupload</artifactId>
			<version>1.2.2</version>
		</dependency>
		<dependency>
			<groupId>commons-io</groupId>
			<artifactId>commons-io</artifactId>
			<version>2.0.1</version>
		</dependency>

        <!-- commons-dbcp -->
        
		<dependency>
			<groupId>commons-lang</groupId>
			<artifactId>commons-lang</artifactId>
			<version>2.2</version>
		</dependency>
		<dependency>
			<groupId>commons-dbcp</groupId>
			<artifactId>commons-dbcp</artifactId>
			<version>1.4</version>
		</dependency>
		
		<!-- Security (used for CSRF protection only) -->
		<dependency>
			<groupId>org.springframework.security</groupId>
			<artifactId>spring-security-web</artifactId>
			<version>${org.springframework.security-version}</version>
		</dependency>

		<!-- Test -->
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-test</artifactId>
			<version>${org.springframework-version}</version>
			<scope>test</scope>
		</dependency>
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>4.11</version>
			<scope>test</scope>
		</dependency>
		<dependency>
			<groupId>xmlunit</groupId>
			<artifactId>xmlunit</artifactId>
			<version>1.2</version>
			<scope>test</scope>
		</dependency>
		<dependency>
			<groupId>com.jayway.jsonpath</groupId>
			<artifactId>json-path</artifactId>
			<version>0.8.1</version>
		</dependency>
		<dependency>
			<groupId>org.hamcrest</groupId>
			<artifactId>hamcrest-library</artifactId>
			<version>1.3</version>
			<scope>test</scope>
		</dependency>
		<!-- XStream -->
		<dependency>
            <groupId>com.thoughtworks.xstream</groupId>
            <artifactId>xstream</artifactId>
            <version>1.4.4</version>
        </dependency>
	</dependencies>
	<repositories>
		<!-- For testing against latest Spring snapshots -->
		<repository>
			<id>org.springframework.maven.snapshot</id>
			<name>Spring Maven Snapshot Repository</name>
			<url>http://repo.spring.io/snapshot</url>
			<releases>
				<enabled>false</enabled>
			</releases>
			<snapshots>
				<enabled>true</enabled>
			</snapshots>
		</repository>
		<!-- For developing against latest Spring milestones -->
		<repository>
			<id>org.springframework.maven.milestone</id>
			<name>Spring Maven Milestone Repository</name>
			<url>http://repo.spring.io/milestone</url>
			<snapshots>
				<enabled>false</enabled>
			</snapshots>
		</repository>
	</repositories>
	<build>
		<finalName>${project.artifactId}</finalName>
		<plugins>
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-compiler-plugin</artifactId>
				<version>2.3.2</version>
				<configuration>
				    <encoding>UTF-8</encoding>
					<source>${java-version}</source>
					<target>${java-version}</target>
				</configuration>
			</plugin>
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-surefire-plugin</artifactId>
				<version>2.12</version>
				<configuration>
				    <encoding>UTF-8</encoding>
					<includes>
						<include>**/*Tests.java</include>
					</includes>
					<excludes>
						<exclude>**/Abstract*.java</exclude>
					</excludes>
					<junitArtifactName>junit:junit</junitArtifactName>
					<argLine>-Xmx512m</argLine>
				</configuration>
			</plugin>
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-dependency-plugin</artifactId>
				<executions>
					<execution>
						<id>install</id>
						<phase>install</phase>
						<goals>
							<goal>sources</goal>
						</goals>
					</execution>
				</executions>
			</plugin>
			<plugin>
				<groupId>org.codehaus.mojo</groupId>
				<artifactId>aspectj-maven-plugin</artifactId>
				<!-- Have to use version 1.2 since version 1.3 does not appear to work 
					with ITDs -->
				<version>1.2</version>
				<dependencies>
					<dependency>
						<groupId>org.aspectj</groupId>
						<artifactId>aspectjrt</artifactId>
						<version>${org.aspectj-version}</version>
					</dependency>
					<dependency>
						<groupId>org.aspectj</groupId>
						<artifactId>aspectjtools</artifactId>
						<version>${org.aspectj-version}</version>
					</dependency>
				</dependencies>
				<executions>
					<execution>
						<goals>
							<goal>compile</goal>
							<goal>test-compile</goal>
						</goals>
					</execution>
				</executions>
				<configuration>
					<outxml>true</outxml>
					<source>${java-version}</source>
					<target>${java-version}</target>
				</configuration>
			</plugin>
			<plugin>
				<groupId>org.apache.tomcat.maven</groupId>
				<artifactId>tomcat7-maven-plugin</artifactId>
				<version>2.2</version>
			</plugin>
			<plugin>
				<groupId>org.eclipse.jetty</groupId>
				<artifactId>jetty-maven-plugin</artifactId>
				<version>9.0.6.v20130930</version>
				<configuration>
					<webApp>
						<contextPath>/${project.artifactId}</contextPath>
					</webApp>
				</configuration>
			</plugin>
		</plugins>
	</build>
</project>

​

 

前端控制器配置(web.xml):

<servlet>

    <servlet-name>appServlet</servlet-name>

    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>

    <load-on-startup>1</load-on-startup>

</servlet>

<servlet-mapping>

    <servlet-name>appServlet</servlet-name>

    <url-pattern>/</url-pattern>

</servlet-mapping>

load-on-startup:表示啓動容器時初始化該Servlet;java

url-pattern:表示哪些請求交給Spring Web MVC處理, 「/」 是用來定義默認servlet映射的。「*.html」表示攔截全部以html爲擴展名的請求。mysql

 

spring配置文件(appServlet-servlet.xml):

<beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">

        <beans:property name="prefix" value="/WEB-INF/views/" />

        <beans:property name="suffix" value=".jsp" />

</beans:bean>

<context:component-scan base-package=" com.huntkey.ruixin.demo.web" />

<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"/>

InternalResourceViewResolver:用於支持Servlet、JSP視圖解析;git

prefix和suffix:查找視圖頁面的前綴和後綴(前綴[邏輯視圖名]後綴),好比傳進來的邏輯視圖名爲hello,則該該jsp視圖頁面應該存放在「WEB-INF/jsp/hello.jsp」;web

context:component-scan:配合@Controller註解使用,讓spring找到定義爲Controller的bean。 對web包中的全部類進行掃描,以完成Bean建立和自動依賴注入的功能 ;正則表達式

AnnotationMethodHandlerAdapter: 啓動Spring MVC的註解功能,完成請求和註解POJO的映射redis

 

 

編碼部分:spring

Controller:

@Controller註解將class定義爲一個controller類。sql

@ RequestMapping 處理請求地址映射,可註解類或者方法前。註解的六個參數:

@RequestMapping註解參數

 參數 描述
value 請求的實際地址
method 請求的method類型(GET/POST/PUT/DELETE)
consumes 指處理請求的提交內容類型(Content-Type),如application/json, text/html
produces 返回的內容類型,僅當request請求頭中的(Accept)中包含該指定類型才返回
params 指定request中必須包含某些參數值,才讓該方法處理
headers 指定request中必須包含某些指定的header值,才能讓該方法處理請求

eg.

@RequestMapping(value="/owners/{ownerId}", method=RequestMethod.GET)
@RequestMapping("/spring-web/{symbolicName:[a-z-]+}-{version:\d\.\d\.\d}.{extension:\.[a-z]}")
@RequestMapping(value = "/pets", consumes="application/json")

@RequestParam:通常用於將指定的請求參數匹配方法中的形參。

 

public String test(@RequestParam("a")String b) {}就會將a參數的值賦給b.

@RequestMapping(value="html", method=RequestMethod.GET)
public String prepare(Model model) {
    model.addAttribute("foo", "bar");
    model.addAttribute("fruit", "apple");
    return "views/html";
}

SpringMVC會自動將請求參數封裝進model中,能夠把model理解爲一個Map

 

數據校驗:

在JavaBean定義時能夠添加經常使用的數據驗證類註解。

javax.validation.constraints和org.hibernate.validator.constraints中提供經常使用的數據校驗註解

 

Bean Validation 中內置的 constraint

Constraint 詳細信息
@Null 被註釋的元素必須爲 null
@NotNull 被註釋的元素必須不爲 null
@AssertTrue 被註釋的元素必須爲 true
@AssertFalse 被註釋的元素必須爲 false
@Min(value) 被註釋的元素必須是一個數字,其值必須大於等於指定的最小值
@Max(value) 被註釋的元素必須是一個數字,其值必須小於等於指定的最大值
@DecimalMin(value) 被註釋的元素必須是一個數字,其值必須大於等於指定的最小值
@DecimalMax(value) 被註釋的元素必須是一個數字,其值必須小於等於指定的最大值
@Size(max, min) 被註釋的元素的大小必須在指定的範圍內
@Digits (integer, fraction) 被註釋的元素必須是一個數字,其值必須在可接受的範圍內
@Past 被註釋的元素必須是一個過去的日期
@Future 被註釋的元素必須是一個未來的日期
@Pattern(value) 被註釋的元素必須符合指定的正則表達式

 

 

Hibernate Validator 附加的 constraint

Constraint 詳細信息
@Email 被註釋的元素必須是電子郵箱地址
@Length 被註釋的字符串的大小必須在指定的範圍內
@NotEmpty 被註釋的字符串的必須非空
@Range 被註釋的元素必須在合適的範圍內

 

org.springframework.format.annotation中提供數字和日期格式驗證註解

此外,經過實現javax.validation.ConstraintValidator接口能夠自定義驗證註解。

eg.

public class JavaBean {

    @NotNull

    @Max(5)

    private Integer number;

    @NotNull

    @Future

    @DateTimeFormat(iso=ISO.DATE)

    private Date date;

}

在Controller中用@Valid配合BindingResult使用能夠將JavaBean的校驗結果自動放入result中

 

BindingResult 對象必須在 @Valid 的緊挨着的後面,不然接收不到錯誤信息。
 

public @ResponseBody String validate(@RequestBody @Valid JavaBean bean, BindingResult result) {

        if (result.hasErrors()) {

            return "Object has validation errors";

        } else {

            return "No errors";

        }

    }

 

異常處理:

springMVC提供兩種異常處理方法

第一種 局部異常處理

在controller中經過註解@ExceptionHandler配置,這對當前controller中每一個有@requestMapping註解的方法都有效。

@Controller

public class ExceptionController {

    @RequestMapping("/exception")

    public @ResponseBody String exception() {

        throw new IllegalStateException("Sorry!");

    }

    @ExceptionHandler

    public @ResponseBody String handle(IllegalStateException e,HttpServletRequest req) {

        return "IllegalStateException handled!";

    }

 }

第二種 全局異常處理

用@ControllerAdvice註解的異常處理器,針對所有controller

@ControllerAdvice

public class GlobalExceptionHandler {

    @ExceptionHandler

    public @ResponseBody String handleBusinessException(BusinessException ex) {

        return "Handled BusinessException";

    }

}

文件上傳:

appServlet-servlet.xml中配置multipar解析器

<beans:bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver" />

jsp中form設置屬性以支持上傳二進制數據:enctype="multipart/form-data"

<form id="fileuploadForm" action=""method="POST" enctype="multipart/form-data" class="cleanform"> </form>

controller中

public void processUpload(@RequestParam MultipartFile file, Model model) throws IOException {
    File f = new File("D:/fileupload/"+file.getOriginalFilename());
    file.transferTo(f);
    model.addAttribute("message", "File '" + file.getOriginalFilename() + "' uploaded successfully");
}
相關文章
相關標籤/搜索