經過@RequestMapping 註解能夠定義處理器對於請求的映射規則javascript
該註解能夠註解在方法上,也能夠註解在類上,但意義是不一樣的css
value 屬性值常以「/」開始html
一個@Controller 所註解的類中,能夠定義多個處理器方法。固然,不一樣的處理器方法所匹配的 URI 是不一樣的java
這些不一樣的 URI 被指定在註解於方法之上的@RequestMapping 的value 屬性中jquery
但若這些請求具備相同的 URI 部分,則這些相同的 URI,能夠被抽取到註解在類之上的@RequestMapping 的 value 屬性中,此時的這個 URI 表示模塊的名稱程序員
URI 的請求是相對於 Web 的根目錄web
下面的例子仍是在第一個程序的上面進行改寫ajax
/** *@RequestMapping: * value:全部請求地址的公共部分,叫作模塊名稱 * 位置:放在類的上面 */ @Controller @RequestMapping(value = "/test") public class MyController { @RequestMapping(value = "/some.do") public ModelAndView doSome(){ ModelAndView mv = new ModelAndView(); mv.addObject("msg","歡迎使用springmvc"); mv.addObject("fun","執行的是doSome方法"); mv.setViewName("show"); return mv; } @RequestMapping(value = "/other.do") public ModelAndView doOther(){ ModelAndView mv = new ModelAndView(); mv.addObject("msg","歡迎使用springmvc"); mv.addObject("fun","執行的是doOther方法"); mv.setViewName("show"); return mv; } }
此時在index.jsp中spring
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> </head> <body> <p>第一個springmvc項目</p> <p> <a href="test/some.do">發起test/some.do的請求</a> </p> <p> <a href="test/other.do">發起test/other.do的請求</a> </p> </body> </html>
也就是把請求這些請求中相同的部分添加到了類的上面,添加了@RequestMapping(value = "/test")json
對於@RequestMapping,其有一個屬性 method,用於對被註解方法所處理請求的提交方式進行限制,即只有知足該method屬性指定的提交方式的請求,纔會執行該被註解方法
Method 屬性的取值爲 RequestMethod 枚舉常量。經常使用的爲 RequestMethod.GET 與RequestMethod.POST,分別表示提交方式的匹配規則爲 GET 與 POST 提交
只要指定了處理器方法匹配的請求提交方式爲 POST,則至關於指定了請求發送的方式:要麼使用表單請求,要麼使用 AJAX 請求。其它請求方式被禁用
固然,若不指定 method 屬性,則不管是 GET 仍是 POST 提交方式,都可匹配。即對於請求的提交方式無要求
例子以下:
@Controller @RequestMapping(value = "/test") public class MyController { /** *@RequestMapping:請求映射 * 屬性:method:請求的方式,它的值是RequestMethod類枚舉值 */ @RequestMapping(value = "/some.do",method = RequestMethod.GET) public ModelAndView doSome(){ ModelAndView mv = new ModelAndView(); mv.addObject("msg","歡迎使用springmvc"); mv.addObject("fun","執行的是doSome方法"); mv.setViewName("show"); return mv; } /** * * 獲取到請求參數 */ @RequestMapping(value = "/other.do",method = RequestMethod.POST) public ModelAndView doOther(HttpServletRequest request, HttpServletResponse response , HttpSession session){ ModelAndView mv = new ModelAndView(); mv.addObject("msg","歡迎使用springmvc,獲取請求的參數:"+request.getParameter("name")); mv.addObject("fun","執行的是doOther方法"); mv.setViewName("show"); return mv; } }
在index.jsp頁面
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> </head> <body> <p>第一個springmvc項目</p> <p> <a href="test/some.do">發起test/some.do的get請求</a> </p> <form action="test/other.do" method="post"> name:<input type="text" name="name"> <input type="submit" value="post請求other.do"> </form> </body> </html>
處理器方法能夠包含如下四類參數,這些參數會在系統調用時由系統自動賦值,即程序員可在方法內直接使用
只要保證請求參數名與該請求處理方法的參數名相同便可
仍是在上面的例子中,修改index.jsp頁面
<h1>提交參數給Controller</h1> <form action="test/receive.do" method="post"> 姓名:<input type="text" name="name"><br> 年齡:<input type="text" name="age"><br> <input type="submit"> </form>
而後修改處理器類
@Controller @RequestMapping(value = "/test") public class MyController { /** * 逐個接收請求參數: * 要求: 處理器(控制器)方法的形參名和請求中參數名必須一致。 * 同名的請求參數賦值給同名的形參 * * 框架接收請求參數 * 1. 使用request對象接收請求參數 * String strName = request.getParameter("name"); * String strAge = request.getParameter("age"); * 2. springmvc框架經過 DispatcherServlet 調用 MyController的doOther()方法 * 調用方法時,按名稱對應,把接收的參數賦值給形參 * doOther(strName,Integer.valueOf(strAge)) * 框架會提供類型轉換的功能,能把String轉爲 int ,long , float, double等類型。 * * 400狀態碼是客戶端錯誤, 表示提交請求參數過程當中,發生了問題。 */ @RequestMapping(value = "/receive.do") public ModelAndView doOther(String name, Integer age){ // 能夠直接使用name和age ModelAndView mv = new ModelAndView(); // 獲取到表單中的數據 mv.addObject("myname",name); mv.addObject("myage",age); mv.setViewName("show"); return mv; } }
此時在show頁面就能夠的到數據了
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> </head> <body> <h1>show.jsp</h1> 這些都是從request做用域獲取到的數據 <h2>姓名:${myname}</h2> <h2>年齡: ${myage}</h2> </body> </html>
請求中參數名和處理器方法的形參名不同
在index.jsp頁面
<p>請求參數名和處理器方法的形參名不一致</p> <form action="test/receiveparam.do" method="post"> 姓名:<input type="text" name="username"><br> 年齡:<input type="text" name="rage"><br> <input type="submit"> </form>
主要就是處理器中方法的名字和請求參數的名字不同,這個時候須要添加註解
/** *請求中參數名和處理器方法的形參名不同 * @RequestParam:逐個解決請求中參數名和形參名不一致的問題 * 屬性: * 1. value,請求中參數的名稱 * 2. required 是一個boolean,默認是true * true表示請求中必須包含此參數 * 做爲:在處理器方法的形參前面定義 */ @RequestMapping(value = "/receiveparam.do") public ModelAndView receiveParam(@RequestParam(value = "username") String name, @RequestParam(value = "rage") Integer age){ ModelAndView mv = new ModelAndView(); // 獲取到表單中的數據 mv.addObject("myname",name); mv.addObject("myage",age); mv.setViewName("show"); return mv; }
這樣就能夠在show頁面接收到數據了
對於前面所接收的post請求,若含有中文,則會出現中文亂碼問題
Spring 對於請求參數中的中文亂碼問題,給出了專門的字符集過濾器,解決方法:
在 web.xml 中註冊字符集過濾器,便可解決 Spring 的請求參數的中文亂碼問題
注意:最好將該過濾器註冊在其它過濾器以前。由於過濾器的執行是按照其註冊順序進行的
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" version="4.0"> <servlet> <servlet-name>springmvc</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <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>springmvc</servlet-name> <url-pattern>*.do</url-pattern> </servlet-mapping> <!--聲明過濾器,解決post請求亂碼的問題--> <filter> <filter-name>characterEncodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <!--設置項目中使用的編碼--> <init-param> <param-name>encoding</param-name> <param-value>utf-8</param-value> </init-param> <!--強制請求對象(HttpServletRequest)使用encoding編碼--> <init-param> <param-name>forceRequestEncoding</param-name> <param-value>true</param-value> </init-param> <!--強制請求對象(HttpServletResponse)使用encoding編碼--> <init-param> <param-name>forceResponseEncoding</param-name> <param-value>true</param-value> </init-param> </filter> <filter-mapping> <filter-name>characterEncodingFilter</filter-name> <!-- /* : 全部的請求都會先經過這個過濾器 --> <url-pattern>/*</url-pattern> </filter-mapping> <!--這個過濾器基本上每一個項目都有使用,直接用便可--> </web-app>
將處理器方法的參數定義爲一個對象,只要保證請求參數名與這個對象的屬性同名便可
1. 定義一個Student類
package com.md.vo; /** * @author MD * @create 2020-08-12 15:33 */ // 用於保存請求的參數的 public class Student { // 屬性名和請求參數名同樣 private String name; private Integer age; public Student() { } public Student(String name, Integer age) { this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } @Override public String toString() { return "Student{" + "name='" + name + '\'' + ", age=" + age + '}'; } }
2. 在index.jsp中
<p>使用java對象來接收請求參數</p> <form action="test/receiveobject.do" method="post"> 姓名:<input type="text" name="name"><br> 年齡:<input type="text" name="age"><br> <input type="submit"> </form>
3. 在處理器類
package com.md.controller; @Controller @RequestMapping(value = "/test") public class MyController { /** * 處理器方法形參是java對象,這個對象的屬性名和請求中參數名同樣 * 框架會建立形參的java對象,給屬性賦值,請求中的參數是name,框架會調用setName() * */ @RequestMapping(value = "/receiveobject.do") public ModelAndView receiveObject(Student student){ ModelAndView mv = new ModelAndView(); // 獲取到表單中的數據 mv.addObject("myname",student.getName()); mv.addObject("myage",student.getAge()); mv.setViewName("show"); return mv; } }
此時show頁面也是能夠接收到數據的
使用@Controller 註解的處理器的處理器方法,其返回值經常使用的有四種類型:
若處理器方法處理完後,須要跳轉到其它資源,且又要在跳轉的資源間傳遞數據,此時處理器方法返回 ModelAndView 比較好。固然,若要返回 ModelAndView,則處理器方法中須要定義 ModelAndView 對象。
在使用時,若該處理器方法只是進行跳轉而不傳遞數據,或只是傳遞數據而並不向任何資源跳轉(如對頁面的 Ajax 異步響應),此時若返回 ModelAndView,則將老是有一部分多餘:要麼 Model 多餘,要麼 View 多餘。即此時返回 ModelAndView 將不合適
以前的例子中一直用的就是這個
處理器方法返回的字符串能夠指定邏輯視圖名,經過視圖解析器解析能夠將其轉換爲物理視圖地址
例如:
在index.jsp頁面中
<h1>處理器方法返回String表示視圖名稱</h1> <form action="return-view.do" method="post"> 姓名:<input type="text" name="name"><br> 年齡:<input type="text" name="age"><br> <input type="submit"> </form>
在springmvc.xml中配置視圖解析器
<!--聲明springmvc框架中的視圖解析器,幫助開發人員設置視圖文件路徑--> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <!--前綴:視圖文件的路徑--> <property name="prefix" value="/WEB-INF/view/" /> <!--後綴:視圖文件的擴展名--> <property name="suffix" value=".jsp"/> </bean>
在處理器中,
@Controller public class MyController { /** * 處理器方法返回String--表示邏輯視圖名稱,須要配置視圖解析器 */ @RequestMapping(value = "/return-view.do") public String doReturnView(HttpServletRequest request,String name , Integer age){ System.out.println("doReturnView , name="+name+" "+"age="+age); // 這個時候能夠本身手動的添加數據到request做用域 request.setAttribute("myname",name); request.setAttribute("myage",age); // show , 是邏輯視圖名稱,項目中已經配置了視圖解析器 // 在這裏,框架對視圖執行的是轉發操做 return "show"; } }
因爲配置了視圖解析器,此時返回字符串show,這個字符串與視圖解析器中的 prefix、suffix 相結合,便可造成要訪問的 URI
固然,也能夠直接返回資源的物理視圖名。不過,此時就不須要再在視圖解析器中再配置前輟與後輟了
// 處理器方法返回的String,表示完整的視圖路徑, // 此時不能配置視圖解析器 @RequestMapping(value = "/return-view2.do") public String doReturnView2(HttpServletRequest request,String name , Integer age){ System.out.println("---------doReturnView2--------- , name="+name+" "+"age="+age); // 這個時候能夠本身手動的添加數據到request做用域 request.setAttribute("myname",name); request.setAttribute("myage",age); // show , 是邏輯視圖名稱,項目中已經配置了視圖解析器 // 在這裏,框架對視圖執行的是轉發操做 return "/WEB-INF/view/show.jsp"; }
處理器方法也能夠返回 Object 對象。這個 Object 能夠是 Integer,String,自定義對象,Map,List 等。但返回的對象不是做爲邏輯視圖出現的,而是做爲直接在頁面顯示的數據出現的
返回對象,須要使用@ResponseBody 註解,將轉換後的 JSON 數據放入到響應體中
因爲返回 Object 數據,通常都是將數據轉化爲了 JSON 對象後傳遞給瀏覽器頁面的。而這個由 Object 轉換爲 JSON,是由 Jackson 工具完成的。因此須要導入 Jackson 的相關 Jar 包
1. 在pom.xml中
<!--jackson依賴--> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-core</artifactId> <version>2.9.0</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.9.0</version> </dependency>
2. 聲明註解驅動
將 Object 數據轉化爲 JSON 數據,須要由消息轉換器 HttpMessageConverter 完成。而轉換器的開啓,須要由<mvc:annotation-driven/>來完成。
SpringMVC 使用消息轉換器實現請求數據和對象,處理器方法返回對象和響應輸出之間的自動轉換
在springmvc.xml中添加
<!-- 加入註解驅動 --> <!--注意:找到結尾爲mvc的driven--> <mvc:annotation-driven />
返回自定義類型對象時,不能以對象的形式直接返回給客戶端瀏覽器,而是將對象轉換爲 JSON 格式的數據發送給瀏覽器的
因爲轉換器底層使用了Jackson轉換方式將對象轉換爲JSON數據,因此須要導入Jackson的相關 Jar 包
1. 定義數據類
package com.md.vo; public class Student { // 屬性名和請求參數名同樣 private String name; private Integer age; public Student() { } public Student(String name, Integer age) { this.name = name; this.age = age; } // set和get方法, }
修改處理器
重點看註釋
package com.md.controller; @Controller public class MyController { /** * 處理器方法返回一個Student,經過框架轉爲json,響應ajax請求 * @ResponseBody * 做用:把處理器方法返回對象轉爲json後,經過HttpServletResponse輸出給瀏覽器 * 位置:方法定義的上面 * 返回對象框架的處理流程: * 1. 框架會把返回Student類型,調用框架的中ArrayList<HttpMessageConverter>中每一個類的canWrite()方法 * 檢查那個HttpMessageConverter接口的實現類能處理Student類型的數據--MappingJackson2HttpMessageConverter * * 2.框架會調用實現類的write(), MappingJackson2HttpMessageConverter的write()方法 * 把林動的student對象轉爲json, 調用Jackson的ObjectMapper實現轉爲json * contentType: application/json;charset=utf-8 * * 3.框架會調用@ResponseBody把2的結果數據輸出到瀏覽器, ajax請求處理完成 */ @RequestMapping(value = "/returnStudentJson.do") @ResponseBody public Student doStudentJson(String name , Integer age){ // 調用service , 獲取請求結果數據,Student對象表示結果數據 Student student = new Student("林動", 20); // 會被框架轉爲json return student; } }
在index.jsp頁面
首先把jQuery導入進來,在webapp下創建js目錄,jQuery複製進來就好了
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> <script type="text/javascript" src="js/jquery-3.4.1.js"></script> <script type="text/javascript"> $(function(){ $("button").click(function(){ $.ajax({ url:"returnStudentJson.do", data:{ name:"pony", age:20 }, type:"post", dataType:"json", success:function(resp){ //resp從服務器端返回的是json格式的字符串 {"name":"林動","age":20} //jquery會把字符串轉爲json對象, 賦值給resp形參。 alert(resp.name + " "+resp.age); } }) }) }) </script> </head> <body> <button id="btn">發起Ajax請求</button> </body> </html>
仍是在上面的基礎上,修改處理器MyController
package com.md.controller; @Controller public class MyController { /** * 處理器方法返回的是List<Student> * 處理的方式和上面的同樣, */ @RequestMapping(value = "/returnStudentJsonArray.do") @ResponseBody public List<Student> doStudentJsonArray(String name , Integer age){ List<Student> list = new ArrayList<>(); // 調用service , 獲取請求結果數據,Student對象表示結果數據 Student student = new Student("林動", 20); Student student1 = new Student("唐三", 20); Student student2 = new Student("白昊天", 10); list.add(student); list.add(student1); list.add(student2); // 會被框架轉爲json的數組 return list; } }
此時在index.jsp頁面上
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> <script type="text/javascript" src="js/jquery-3.4.1.js"></script> <script type="text/javascript"> $(function(){ $("button").click(function(){ $.ajax({ url:"returnStudentJsonArray.do", data:{ name:"pony", age:20 }, type:"post", dataType:"json", success:function(resp){ [{"name":"林動","age":20},{"name":"唐三","age":20},{"name":"白昊天","age":10}] $.each(resp,function(i,n){ alert(n.name+" "+n.age) }) } }) }) }) </script> </head> <body> <button id="btn">發起Ajax請求</button> </body> </html>
這樣點擊按鈕就能夠獲取到數據了
若要返回非中文字符串,將前面返回數值型數據的返回值直接修改成字符串便可。
但若返回的字符串中帶有中文字符 ,則接收方頁面將會出現亂碼 。此時須要使用@RequestMapping 的 produces 屬性指定字符集
仍是修改處理器
package com.md.controller; @Controller public class MyController { /** * 處理器方法返回的是String , String表示數據的,不是視圖。 * 區分返回值String是數據,仍是視圖,看有沒有@ResponseBody註解 * * 若是有@ResponseBody註解,返回String就是數據,反之就是視圖 * * * 默認使用「text/plain;charset=ISO-8859-1」做爲contentType,致使中文有亂碼, * 解決方案:給RequestMapping增長一個屬性 produces, 使用這個屬性指定新的contentType. * * * 返回對象框架的處理流程: * 1. 框架會把返回String類型,調用框架的中ArtrayList<HtpMessageConverter>中每一個類的canWrite()方法 * 檢查那個HttpMessageConverter接口的實現類能處理String類型的數據--StringHttpMessageConverter * * 2.框架會調用實現類的write(), StringHttpMessageConverter的write()方法 * 把字符按照指定的編碼處理 text/plain;charset=ISO-8859-1 * * 3.框架會調用@ResponseBody把2的結果數據輸出到瀏覽器, ajax請求處理完成 */ // 返回的是字符串,直接輸出ajax請求,並不走過濾器,必須加屬性才能解決亂碼問題 @RequestMapping(value = "/returnStringData.do",produces = "text/plain;charset=utf-8") @ResponseBody public String doStringData(String name, Integer age){ return "我是返回的數據"; } }
在index.jsp頁面
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> <script type="text/javascript" src="js/jquery-3.4.1.js"></script> <script type="text/javascript"> $(function(){ $("button").click(function(){ $.ajax({ url:"returnStringData.do", data:{ name:"pony", age:20 }, type:"post", // 返回文本數據 dataType:"text", success:function(resp){ alert("返回的是文本數據:"+resp); } }) }) }) </script> </head> <body> <button id="btn">發起Ajax請求</button> </body> </html>
*.do
在沒有特殊要求的狀況下,SpringMVC 的中央調度器 DispatcherServlet 的<url-pattern/>常使用後輟匹配方式,如寫爲*.do 或者 *.action, *.mvc
等
能夠寫爲/,由於 DispatcherServlet 會將向靜態資源的獲取請求,例如.css、.js、.jpg、.png等資源的獲取請求,看成是一個普通的 Controller 請求。中央調度器會調用處理器映射器爲其查找相應的處理器,固然也是找不到的,
因此在這種狀況下,全部的靜態資源獲取請求也均會報 404 錯誤
例如:
在index.jsp頁面中存在一個訪問圖片的連接,演示將<url-pattern/>寫爲*.do能夠訪問到該圖片,而寫爲/,則沒法訪問,仍是在第一個例子中
1. 首先在Webapp下創建img目錄,而後放一張圖片
2. 而後在web.xml中
<servlet-mapping> <servlet-name>springmvc</servlet-name> <!-- 使用框架時,url-pattern能夠有兩種值 1. 擴展名 *.xxx , xxx是擴展名,例如:*.do,*.action等 2. 使用 "/" 當你的項目中使用了 / ,它會替代Tomcat中的default 致使全部的靜態資源都給DispatcherServlet處理,而默認狀況下DispatcherServlet沒有處理靜態資源的能力 沒有控制器對象能處理靜態資源的訪問,靜態資源(html、js、img、css)都404 靜態資源訪問不成,但動態資源能夠訪問,由於咱們的程序寫了MyController控制器對象,能處理some.do --> <!--<url-pattern>*.do</url-pattern>--> <url-pattern>/</url-pattern> </servlet-mapping>
修改index.jsp頁面
<img src="img/time.jpg" alt="我是靜態資源">
此時圖片是顯示不出來的
<url-pattern/>的值並非說寫爲/後,靜態資源就沒法訪問了。通過一些配置後,該問題也是能夠解決的
1. 使用<mvc:default-servlet-handler/>
聲 明 了 <mvc:default-servlet-handler /> 後 , springmvc 框 架 會 在 容 器 中 創 建
DefaultServletHttpRequestHandler 處理器對象。它會像一個檢查員,對進入 DispatcherServlet的 URL 進行篩查,若是發現是靜態資源的請求,就將該請求轉由 Web 應用服務器默認的Servlet 處理。通常的服務器都有默認的 Servlet
在 Tomcat 中,有一個專門用於處理靜態資源訪問的 Servlet 名叫 DefaultServlet
因此,只須要在springmvc.xml中加入這個標籤便可
<!-- default-servlet-handler 和 @RequestMapping註解 有衝突, 須要加入annotation-driven 解決問題--> <mvc:annotation-driven /> <!--第一種處理靜態資源的方式: 須要在springmvc配置文件加入 <mvc:default-servlet-handler> 原理是: 加入這個標籤後,框架會創健控制器對象DefaultServletHttpRequestHandler(相似咱們本身建立的MyController). DefaultServletHttpRequestHandler這個對象能夠把接收的請求轉發給 tomcat的default這個servlet。 --> <mvc:default-servlet-handler />
2. 使用<mvc:resources/>
在 Spring3.0 版本後,Spring 定義了專門用於處理靜態資源訪問請求的處理器ResourceHttpRequestHandler。而且添加了<mvc:resources/>標籤,專門用於解決靜態資源沒法訪問問題。須要在 springmvc 配置文件中添加以下形式的配置 :
<!--第二種處理靜態資源的方式 mvc:resources 加入後框架會建立 ResourceHttpRequestHandler這個處理器對象。 讓這個對象處理靜態資源的訪問,不依賴tomcat服務器。 mapping:訪問靜態資源的uri地址, 使用通配符 ** location:靜態資源在你的項目中的目錄位置,目錄不要使用/WEB-INF/及其子目錄 images/**:表示 images/time.jpg , images/user/logo.gif , images/order/history/list.png --> <mvc:resources mapping="/img/**" location="/img/" /> <mvc:resources mapping="/html/**" location="/html/" /> <mvc:resources mapping="/js/**" location="/js/" /> <!--mvc:resources和@RequestMapping有必定的衝突--> <mvc:annotation-driven /> <!--一般在webapp目錄下創建static目錄,把使用的靜態資源都放進來,這樣一句話搞定--> <!--使用一個配置語句,指定多種靜態資源的訪問--> <!--<mvc:resources mapping="/static/**" location="/static/" />-->