SpringMVC 概述
- Spring为展现层提供的基于MVC设计理念的优秀的Web框架,是目前最主流的MVC框架之一
- Spring3.0后全面超越Struts2,成为最优秀的MVC框架
- Spring MVC通过一套MVC注解,让POJO成为处理请求的控制器,而无须实现任何接口。
- 支持REST风格的URL请求
- 采用了松散耦合可插拔组件结构,比其他MVC框架更具扩展性和灵活性
SpringMVC HelloWorld
- 步骤
- 加入 jar 包
- 在 web.xml 中配置 DispatcherServlet
- 加入 Spring MVC 的配置文件
- 编 写 处 理 请 求的 处 理器,并 标识为处 理器
- 编 写 视图
- 需要 jar 包
commons-logging-1.1.1.jar
spring-aop-4.0.2.RELEASE.jar
spring-beans-4.0.2.RELEASE.jar
spring-context-4.0.2.RELEASE.jar
spring-core-4.0.2.RELEASE.jar
spring-expression-4.0.2.RELEASE.jar
spring-web-4.0.2.RELEASE.jar
spring-webmvc-4.0.2.RELEASE.jar
1. 在web.xml中配置DispatcherServlet
DispatcherServlet默认加载/WEB-INF/ servletName-servlet.xml的Spring配置文件,启动WEB层的Spring容器。可以通过 contextConfigLocation 初始化参数自定义配置文件的位置和名称
web.xml
<?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_3_0.xsd" id="WebApp_ID" version="3.0">
<!-- 配置 DispatcherServlet -->
<servlet>
<servlet-name>springDispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 配置 DispatcherServlet 的一个初始化参数 : 配置 SpringMVC 配置文件的位置和名称 -->
<!--
实际上也可以不通过 contextConfigLocation 来配置 SpringMVC 的配置文件, 而使用默认的。
默认的配置文件为 : /WEB-INF/servletName-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>springDispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
2. 创建Spring MVC配置文件
配置自动扫描的包
配置视图解析器:视图名称解析器:将视图逻辑名解析为: /WEB-INF/pages / viewName .jsp
springmvc.xml
<?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"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.0.xsd">
<!-- 配置自定扫描的包 -->
<context:component-scan base-package="com.anqi.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>
</beans>
3. 创建请求处理器类
@Controller
public class HelloWorld {
/**
* 1. 使用 @RequestMapping 注解来映射请求的 URL
* 2. 返回值会通过视图解析器解析为实际的物理视图, 对于 InternalResourceViewResolver
* 视图解析器, 会做如下的解析
*
* /WEB-INF/views/success.jsp
*
* @return
*/
@RequestMapping("/helloworld")
public String hello() {
System.out.println("hello world");
return "success";
}
}
使用 @RequestMapping 映射请求
1. 修饰类
@RequestMapping("/springmvc")
@Controller()
public class TestRequestMapping {
private static final String SUCCESS = "success";
/**
* 1. @RequestMapping 除了修饰方法, 还可以用来修饰类
* 2.
* 1). 类定义处 : 提供初步的请求映射信息, 相对于 WEB 应用的根目录
* 2). 方法处 : 提供进一步的细分映射信息。
* 相对于类定义处的 URL, 若类定义出未标注 @RequestMapping 则方法处标记的 URL
* 相当于 WEB 的根目录
* @return
*/
@RequestMapping("/testRequestMapping")
public String testRequestMapping() {
System.out.println("testRequestMapping");
return SUCCESS;
}
//下列方法均在此类中
<a href="helloworld">hello World</a>
<br/><br/>
success.jsp
在 WEB-INF/view目录下
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<font color="red">Success</font>
</body>
</html>
2. 请求方式
/**
* 使用 method 属性来指定请求的类型
* @return
*/
@RequestMapping(value="/testMethod", method=RequestMethod.POST)
public String testMethod() {
System.out.println("testMethod");
return SUCCESS;
}
<a href="springmvc/testRequestMapping">Test RequestMapping</a>
<br/><br/>
3. 请求参数 & 请求头
/**
* 仅需了解
* 可以使用 params 和 headers 来更加精确映射需求, params 和 headers 支持简单的表达式
* @return
*/
@RequestMapping(value="testParamsAndHeaders",params= {"username","age!=10"},
headers= {"Request Method=GET"})
public String testParamsAndHeaders() {
System.out.println("testParamsAndHeaders");
return SUCCESS;
}
<!-- a 标签时 get 所以无法被 POST 类型方法的转发器处理 -->
<a href="springmvc/testMethod">TestMethod GET</a>
<br/><br/>
<form action="springmvc/testMethod" method="post">
<input type="submit" value="提交post请求"/>
</form>
<br/><br/>
4. Ant 路径
/**
* 支持通配符 *
* @return
*/
@RequestMapping("/testAntPath/*/abc")
public String testAntPath() {
System.out.println("testAntPath");
return SUCCESS;
}
<a href="springmvc/testAntPath/xxx/abc">Test AntPath</a>
<br/><br/>
5. PathVariable 注解映射 URL 绑定占位符
@RequestMapping("/testPathVariable/{id}")
public String testPathVariable(@PathVariable("id")Integer id) {
System.out.println("testPathVariable-- "+id);
return SUCCESS;
}
<a href="springmvc/testPathVariable/1">testPathVariable/1</a>
6. HiddenHttpMethodFilter 过滤器
浏览器form 表单只支持GET 与POST 请求,而DELETE、PUT 等method 并不支持,Spring3.0 添加了一个过滤器,可以将这些请求转换为标准的http 方法,使得支持GET、POST、PUT 与DELETE 请求。
在web.xml中配置
<!-- 配置 HiddenHttpMethodFilter : 可以把 POST 请求转化为 DELETE 请求或者 PUT 请求-->
<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>
<a href="springmvc/testRest/5">Test Rest Get</a>
<br><br>
<form action="springmvc/testRest" method="post">
<input type="submit" value="TestRest POST"/>
</form>
<br/><br/>
<form action="springmvc/testRest/1" method="post">
<input type="hidden" name="_method" value="DELETE"/>
<input type="submit" name="_method" value="TestRest DELETE">
</form>
<br/><br/>
<form action="springmvc/testRest/1" method="post">
<input type="hidden" name="_method" value="PUT"/>
<input type="submit" name="_method" value="TestRest PUT">
</form>
<br/><br/>
/**
* Rest 风格的 URL
* 以 CRUD 为例
* 新增 : /order/ POST
* 修改 : /order/1 PUT update?id=1
* 获取 : /order/1 GET get?id=1
* 删除 : /order/1 DELETE delete?id=1
*
* 如何发送 PUT 请求和 DELETE 请求呢
* 1. 需要配置 HiddenHttpMethodFilter
* 2. 需要发送 POST 请求
* 3. 需要在发送 POST 请求时携带一个 name="_method" 的隐藏域,值为 DELETE 或 PUT
*
* 在 SpringMVC 的目标方法中如何获得 id 呢?
* 使用 @PathVariable 注解
*/
@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 testRestPost() {
System.out.println("testRest POST:");
return SUCCESS;
}
@RequestMapping(value="/testRest/{id}",method=RequestMethod.GET)
public String testRestGet(@PathVariable Integer id) {
System.out.println("testRest GET:"+ id);
return SUCCESS;
}