SpringMVC
QuickStart
基礎配置
-
创建maven项目
选择archetype:maven-archetype-webapp
注:如果创建项目过慢,输入<archetypeCatalog,internal>
在创建项目Properties的时候 -
补全工程文件目录
java,resource,并mark directory为Re/Source root -
在pom中引入依赖
<!-- 编译版本修改为1.8 -->
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<!-- Spring版本锁定 -->
<spring.version>5.0.2.RELEASE</spring.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.0</version>
<scope>provided</scope>
</dependency>
</dependencies>
- 在web.xml配置核心控制器DispatcherServlet
<web-app>
<!-- SpringMVC的核心控制器 -->
<servlet>
<servlet-name>dispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 配置Servlet的初始化参数,指定springmvc配置文件在類路徑下,创建springMVC容器 -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
<!-- 配置servlet启动时加载对象 -->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<!-- 在servlet映射中添加dispatcherServlet -->
<servlet-name>dispatcherServlet</servlet-name>
<!-- 整个网站全部的Servlet都要经过核心控制器 -->
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
輸入<servlet
生成兩行,第二行為沒寫完的<
光標下移,然後輸入servlet-class補全,然後在<servlet-class></servlet-class>
内輸入
DispatcherServlet,就可自動生成。init-param與servlet-mapping都需要自己手動輸入,不自動匹配。
提示:init-param不需要輸入,如果沒有指定使用默认值:/WEB-INF/<servlet-name>-servlet.xml
- 在類路徑Resouce文件下創建springmvc.xml文件(選擇創建Spring XML即可)。
以上配置完畢,就可以部署在Tomcat上。當然只有一個index.jsp頁面罷了
進階配置
- 在index.jsp上使用
<a/>
標簽
【入口頁面】
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<body>
<h2>Hello World!</h2>
<a href="hello" >新手程序,但是我好像都懂hhhh</a>
</body>
</html>
- 新建controller類
【控制器】
2個要點
第一個是使用@Controller標記這個類為控制器
第二個是使用@RequestMapping(path = “/hello”)標記接收的請求url為/hello
package cn.itcast.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
/**
* 控制器标记
*/
@Controller
public class HellowController {
/**
* 接收请求路徑为`hello`千萬別寫反斜杠/
* @return
*/
@RequestMapping(path = "/hello")
public String sayHello() {
System.out.println("Hello SpringMVC!!");
return "success";
}
}
-
在WEB-INF中創建pages文件夾
裏面放置跳轉的jsp頁面,這個路徑由SpringMVC-servlet.xml配置文件中 視圖解析器 決定的。 -
新建success JSP頁面
【跳轉頁面】
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h2>Welcome to SpringMVC!</h2>
</body>
</html>
- 修改springMVC.xml配置
1個要點:在springMVC的視圖解析器中,配置pages文件的路徑【可以不在WEB-INF中】
<?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/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
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">
<!-- 只扫描带有controller注解的控制器 -->
<context:component-scan base-package="com.atguigu.mybatis" use-default-filters="false">
<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
<!-- 视图解析器InternalResourceViewResolver -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/pages/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
<!-- 处理动态,静态资源两个MVC标签,重要**不僅僅是注解還代表注冊各種SpringMVC組件xxx器** -->
<mvc:annotation-driven></mvc:annotation-driven>
<mvc:default-servlet-handler/>
</beans>
<mvc:annotation-driven>
说明
在 SpringMVC 的各个组件中,处理器映射器、处理器适配器、视图解析器称为 SpringMVC 的三大组件。
使用<mvc:annotation-driven>
自动加载 RequestMappingHandlerMapping(处理映射器)
和RequestMappingHandlerAdapter(处理适配器)可用在SpringMVC.xml配置文件中使用 <mvc:annotation-driven>
替代注解处理器和适配器的配置。
入門SpringMVC圖解
詳細SpringMVC圖解
個人理解:
前端控制器DispatchServlet:只是中轉站,傳入request請求,返回response響應。這個中間經它的調用有
1.處理器映射器2.處理器適配器3.視圖解析器4.動靜態頁面
處理器映射器handlermapping:將傳入的請求路徑進行解析,生成這個請求路徑+背後全部需要的其他請求的執行鏈Chain。返回給前端控制器。
處理器適配器HandlerAdapter:將由前端控制器轉發的執行鏈中的全部servlet執行,返回Model結果數據和View需要的頁面
視圖解析器ViewResolver:將由前端控制器轉發的View頁面 拼裝 為完整的頁面訪問路徑
視圖:渲染–由前端控制器裝載model數據到返回的具體頁面request域中
注:爲什麽這個前端控制器這麽累
,是因爲和Spring IOC容器一樣,降低這些組件閒的相互耦合.
重要注解
@RequestMapping()
出现位置:
类上:请求 URL 的第一级访问目录。此处不写的话,就相当于应用的根目录。写的话需要以/开头。
功用:使 URL 訪問可以按照模块化管理:
例如:
账户模块: /account/add /account/update /account/delete ...
订单模块: /order/add /order/update /order/delete
實例:
@RequestMapping("/account") ,使 URL 更加精细【將重複性的類名從方法上的requestmapping中抽取出來放在上面而已】。
方法上:请求 URL 的第二级访问目录。
實例:
@RequestMapping(path="/add"),path,可寫可不寫,如果是一個參數時
属性:
value:用于指定请求的 URL。它和 path 属性的作用是一样的。
method:用于指定请求的方式(get/post/head/put/patch/delete/options/trace)可單個,可多個值。
實例:
@RequestMapping(value="/saveAccount",method=RequestMethod.POST)
@RequestMapping(value="/saveAccount",method={RequestMethod.POST,RequestMethod.GET})
注:<a></a>使用get方法
params:用于指定限制请求参数的条件。它支持简单的表达式。要求请求参数的 key 和 value 必须和 配置的一模一样。 可單多
半實例:
params = {"accountName"},表示请求参数必须有 accountName
params = {"moeny!100"},表示请求参数中 money 不能是 100。
headers:用于指定请求消息头的条件 限制。
半實例:
headers = {"Accept"}
注意: 以上四个属性只要出现 2 个或以上时,他们的关系是与的关系。
@RequestParam()
作用: 指定(從前臺傳入後臺的)參數名称,给控制器中的形参賦值。
属性:
value=name:请求参数中的名称。
required:请求参数中是否必须提供此参数。默认值為true必须提供,如果不提供将报错。
defaultValue:默認值
實例:
@RequestMapping("/useRequestParam")
public String useRequestParam(
@RequestParam("name")String username,
@RequestParam(value="age",required=false)Integer age)
{
System.out.println(username+","+age);
return "success";
}
@RequestBody()
GET請求方法是將所有參數封裝在url上,而POST方法則是封裝成一個對象【所以Form表單是POST請求】
請求體包含Form表單内容,controller函數形參只能寫一個@RequestBody String body。
作用: 用于获取请求体内容。直接使用得到是 key=value&key=value...结构的数据。
get 请求方式不适用。
【異步的時候會用到。傳遞Json數據,封裝的時候用到@RequestBody】
属性: required:是否必须有请求体。默认值是:true。当取值为 true 时,get 请求方式会报错。
如果取值 为 false,get 请求得到是 null。
controller.java
@RequestMapping("/testRequestBody")
public String testRequestBody(@RequestBody String body){
System.out.println("执行了...");
System.out.println(body);
return "success";
}
實例:如果表單為,username:abc,age:12。則請求體為:username=abc&age=12
@PathVaribale()
作用: 用于獲取 請求路徑 中的占位符`{}`内容(/usePathVariable/100)獲取100這樣就不需要input。
也不需要key=value的形式獲取。
属性:
name=value:用于指定 url 中占位符名称。
required:是否必须提供占位符
實例: controller函數上的@RequestMapping("/usePathVariable/{id}") 中的{id}就是 url 占位符。
url 支持占位符是 spring3.0 之后加入的。是 springmvc 支持 rest 风格 URL 的一个重要标志。
jsp 代码:
<!-- PathVariable 注解 -->
<a href="springmvc/usePathVariable/100">pathVariable 注解</a>
controller 代碼:
@RequestMapping("/usePathVariable/{id}")
public String usePathVariable(@PathVariable("id") Integer id){
System.out.println(id);
return "success";
}
Restful風格:
個人理解——用不同的請求方法+佔位符來區分相同請求路徑調用的不同方法——>用最簡單的方法來實現複雜重複代碼
對於緩存的優點是——共用一個局部緩存,因爲路徑上訪問的都是這個Controller類對象,利於管理。
Rest案例:
基於HiddentHttpMethodFilter的Restful風格Controller實現
由于浏览器 form 表单只支持 GET 与 POST 请求(a標簽支持的是GET),而 DELETE、PUT 等 method 并不支持
Spring3.0 添加了一个过滤器,可以将浏览器请求改为指定的请求方式,发送给我们的控制器方法,使得支持 GET、POST、PUT 与 DELETE 请求。
這樣就可以實現@PathVaribale()注解的功用,創建Restful風格代碼。
【除了這個filter,還可以通過WebClient類,直接調用靜態方法模擬各種請求方式。以及瀏覽器插件也可以做到】
使用方式:
- 在web.xml中添加此filter過濾器
- 请求方式必须使用 post 请求。
- 按照要求提供_method 请求参数,该参数的取值就是我们需要的请求方式。
filter完全實現類
原理:雖然form表單只能發post或者get
但下面有一行input 隱藏域<input type="hidden" name="_method" value="PUT">
這個會被filter攔截到,從而將post請求轉換為put請求。
.jsp