1.简介:
Spring为展现层提供的基于MVC设计理念的优秀的Web框架,是目前最主流的的MVC框架之一。
Spring3.0之后超越了Struts2,成为了最优秀的MVC框架。
SpringMVC通过一套MVC注解,让POJO称为处理请求的控制器,而无须实现任何接口。
支持REST风格的URL请求。
采用了松散耦合可插拔组件结构,比其他MVC框架更具拓展性和灵活性。
2.HelloWorld:
步骤:
加入jar包:
– commons-logging-1.1.3.jar
– spring-aop-4.0.0.RELEASE.jar
– spring-beans-4.0.0.RELEASE.jar
– spring-context-4.0.0.RELEASE.jar
– spring-core-4.0.0.RELEASE.jar
– spring-expression-4.0.0.RELEASE.jar– spring-web-4.0.0.RELEASE.jar
– spring-webmvc-4.0.0.RELEASE.jar
在web.xml中配置DispatcherServlet:
DispatcherServlet默认加载/WEB-INF/<servletName-servlet>.xml的Spring配置文件,启动Web层的Spring容器。可以通过contextConfigLocation初始化参数自定义配置文件的位置和名称。
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns="http://java.sun.com/xml/ns/javaee"xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"id="WebApp_ID" version="2.5"><!-- 配置 org.springframework.web.filter.HiddenHttpMethodFilter: 可以把 POST 请求转为 DELETE 或 POST 请求 --><filter><filter-name>HiddenHttpMethodFilter</filter-name><filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class></filter><filter-mapping><filter-name>HiddenHttpMethodFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping><!-- 配置 DispatcherServlet --><servlet><servlet-name>dispatcherServlet</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><!-- 配置 DispatcherServlet 的一个初始化参数: 配置 SpringMVC 配置文件的位置和名称 --><!-- 实际上也可以不通过 contextConfigLocation 来配置 SpringMVC 的配置文件, 而使用默认的.默认的配置文件为: /WEB-INF/<servlet-name>-servlet.xml--><!-- <init-param><param-name>contextConfigLocation</param-name><param-value>classpath:springmvc.xml</param-value></init-param>--><load-on-startup>1</load-on-startup></servlet><servlet-mapping><servlet-name>dispatcherServlet</servlet-name><url-pattern>/</url-pattern></servlet-mapping></web-app>
加入SpringMVC的配置文件:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xmlns:mvc="http://www.springframework.org/schema/mvc"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsdhttp://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd"><!-- 配置自定扫描的包 --><context:component-scan base-package="com.atguigu.springmvc"></context:component-scan><!-- 配置视图解析器: 如何把 handler 方法返回值解析为实际的物理视图 --><bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"><property name="prefix" value="/WEB-INF/views/"></property><property name="suffix" value=".jsp"></property></bean><!-- 配置视图 BeanNameViewResolver 解析器: 使用视图的名字来解析视图 --><!-- 通过 order 属性来定义视图解析器的优先级, order 值越小优先级越高 --><bean class="org.springframework.web.servlet.view.BeanNameViewResolver"><property name="order" value="100"></property></bean><!-- 配置国际化资源文件 --><bean id="messageSource"class="org.springframework.context.support.ResourceBundleMessageSource"><property name="basename" value="i18n"></property> </bean><!-- 配置直接转发的页面 --><!-- 可以直接相应转发的页面, 而无需再经过 Handler 的方法. --><mvc:view-controller path="/success" view-name="success"/><!-- 在实际开发中通常都需配置 mvc:annotation-driven 标签 --><mvc:annotation-driven></mvc:annotation-driven></beans>
编写处理请求的处理器,并标识为处理器:
package com.atguigu.springmvc.handlers;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;@Controller
public class HelloWorld {/*** 1.使用@RequestMapping注解映射请求的URL* 2.返回值会通过视图解析器解析为实际的物理视图,对于InternalResourceViewResolver会进行如下的解析:* 通过prefix + returnVal + 后缀的方式得到实际的物理视图,然后做转发操作* /WEB-INF/views/success.jsp* * @return*/@RequestMapping("/helloworld")public String hello(){System.out.println("hello world");return "success";}}
编写试图:
package com.atguigu.springmvc.views;import java.util.Date;
import java.util.Map;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;import org.springframework.stereotype.Component;
import org.springframework.web.servlet.View;@Component
public class HelloView implements View{@Overridepublic String getContentType() {return "text/html";}@Overridepublic void render(Map<String, ?> model, HttpServletRequest request,HttpServletResponse response) throws Exception {response.getWriter().print("hello view, time: " + new Date());}}
3.使用@RequestMapping:
SpringMVC使用@RequestMapping注解为控制器指定可以处理哪些URL请求,在控制器的类定义及方法定义处都可以标注。
@RequestMapping类定义处:提供初步的请求映射信息。相对于WEB应用的根目录;
方法处:提供进一步的细分映射信息。相对于类定义处的URL。若类定义处未标注@RequestMapping,则方法标记的URL相对于WEB应用的根目录。
DispatcherServlet截获请求后,就通过控制器上的@RequestMapping提供的映射信息确定请求所对应的处理方法。
@RequestMapping("/springmvc")
@Controller
public class SpringMVCTest {private static final String SUCCESS = "success";@RequestMapping("/testRequestMapping")public String testRequestMapping() {System.out.println("testRequestMapping");return SUCCESS;}
}
3.1 映射请求参数,请求方法或请求头:
标准的Http请求报头:
@RequestMapping的value、method、params以及headers分别表示请求URL、请求方法、请求参数及请求头的映射条件。
params和headers支持简单的表达式:
param1:表示请求必须包含param1的请求参数;
!param1:表示请求必须不能包含param1的请求参数;
param1!=value1:表示请求必须包含param1的请求参数,但是值不能未value1;
{"param1=value1","param2"}:表示请求必须包含param1和param2的请求参数且param1的值为value1;
@RequestMapping(value = "/testMethod", method = RequestMethod.POST)public String testMethod() {System.out.println("testMethod");return SUCCESS;
}@RequestMapping(value = "testParamsAndHeaders", params = { "username","age!=10" }, headers = { "Accept-Language=en-US,zh;q=0.8" })public String testParamsAndHeaders() {System.out.println("testParamsAndHeaders");return SUCCESS;
}
@RequestMapping映射请求Ant风格:
资源地址支持3种匹配风格:
?:匹配文件中的一个字符
*:匹配文件中的任意字符
**:匹配多层路径
-/user/*/createUser:
/user/aaa/createUser?/user/bbb/createUser ? URL
– /user/**/createUser:
/user/createUser?/user/aaa/bbb/createUser ? URL
– /user/createUser??:
/user/createUseraa?/user/createUserbb ? URL
@RequestMapping("/testAntPath/*/abc")public String testAntPath() {System.out.println("testAntPath");return SUCCESS;
}
4.@PathVariable映射URL绑定的占位符:
带占位符的URL是Spring 3.0新增的功能,该功能在SpringMVC向REST目标挺进发展过程中具有里程碑的意义。
@RequestMapping("/testPathVariable/{id}")public String testPathVariable(@PathVariable("id") Integer id) {System.out.println("testPathVariable: " + id);return SUCCESS;
}
@RequestMapping(value = "/testRest/{id}", method = RequestMethod.PUT)public String testRestPut(@PathVariable Integer id) {System.out.println("testRest Put: " + id);return SUCCESS;}@RequestMapping(value = "/testRest/{id}", method = RequestMethod.DELETE)public String testRestDelete(@PathVariable Integer id) {System.out.println("testRest Delete: " + id);return SUCCESS;}@RequestMapping(value = "/testRest", method = RequestMethod.POST)public String testRest() {System.out.println("testRest POST");return SUCCESS;}@RequestMapping(value = "/testRest/{id}", method = RequestMethod.GET)public String testRest(@PathVariable Integer id) {System.out.println("testRest GET: " + id);return SUCCESS;}