第一:要了解springMVC的運行原理html
第二:咱們爲何要使用springmvc?前端
那就是爲了替代咱們用servlet來處理和響應請求,雖然它的底層依然是servlet,可是利用框架不只可以減小咱們的代碼量,還能讓咱們更加專一於業務邏輯。java
第二:響應的方式:一種是配置文件,另外一種是註解web
這裏先講解配置文件方式的形式:若是咱們本身定義了controller類,那麼與直接使用框架中的是不一樣的spring
在這裏咱們先本身建立一個controller類數組
controller類代碼:瀏覽器
1 /** 2 * 3 */ 4 package com.sxt.controller; 5 6 import javax.servlet.http.HttpServletRequest; 7 import javax.servlet.http.HttpServletResponse; 8 9 import org.springframework.web.servlet.ModelAndView; 10 import org.springframework.web.servlet.mvc.Controller; 11 12 /** 13 * @author ASUS 14 * 若是使用的是自定義的controller就須要實現一個叫作controller的接口 15 * 16 */ 17 public class MyController implements Controller{ 18 @Override 19 public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception { 20 // TODO Auto-generated method stub 21 System.out.println("我被執行了"); 22 ModelAndView mv=new ModelAndView(); 23 mv.setViewName("index.jsp"); 24 return mv; 25 } 26 }
在使用springmvc的時候咱們一共須要兩個配置文件:一個是專門的springmvc配置文件是爲了告訴咱們的spring框架的dispartcherServlet中心處理器,要幫助咱們作的工做;另外一個是web項目的xml文件(該文件是每個web項目建立的時候都會生成的),這裏是將咱們的springmvc框架和咱們的web項目關聯起來,有了這兩個配置文件,springmvc框架就能夠很好地爲咱們的項目服務了。spring-mvc
spring-mvc配置文件(名字本身隨便起,可是該文件必須和web項目的包處於同一級文件夾下)服務器
1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns="http://www.springframework.org/schema/beans" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xsi:schemaLocation="http://www.springframework.org/schema/beans 5 http://www.springframework.org/schema/beans/spring-beans.xsd"> 6 7 <!-- 處理器映射器 將bean的name做爲url進行查找 , 8 須要在配置Handler時指定beanname(就是url) 全部的映射器都實現 9 HandlerMapping接口。 10 --> 11 <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping" /> 12 13 <!-- 配置 Controller適配器 --> 14 <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"></bean> 15 16 <!-- 配置自定義的 controller 表示將該類交給spring管理 --> 17 <bean class="com.sxt.controller.MyController" name="/user.sxt"></bean> 18 </beans>
web.xml配置文件的代碼:session
1 <?xml version="1.0" encoding="UTF-8"?> 2 <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1"> 3 <display-name>springmvc-01helloworld</display-name> 4 <welcome-file-list> 5 <welcome-file>index.html</welcome-file> 6 <welcome-file>index.htm</welcome-file> 7 <welcome-file>index.jsp</welcome-file> 8 <welcome-file>default.html</welcome-file> 9 <welcome-file>default.htm</welcome-file> 10 <welcome-file>default.jsp</welcome-file> 11 </welcome-file-list> 12 <!-- 前端控制器也叫做中心控制器;功能是任意的請求都會交給springmvc下的DispatcherServlet進行處理 --> 13 <servlet> 14 <servlet-name>spring-mvc</servlet-name> 15 <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 16 <!-- 這裏的配置是爲了關聯springmvc --> 17 <init-param> 18 <param-name>contextConfigLocation</param-name> 19 <param-value>classpath:spring-mvc.xml</param-value> 20 </init-param> 21 </servlet> 22 <servlet-mapping> 23 <servlet-name>spring-mvc</servlet-name> 24 <url-pattern>/</url-pattern> 25 </servlet-mapping> 26 </web-app>
須要導入的jar包:
在瀏覽器器中輸入地址進行驗證:http://localhost:8080/springmvc-01helloworld/user.sxt;就能夠看到結果
響應方式二之使用註解;上面那種方式咱們須要在配置文件中寫一大堆的配置信息,並且本身建立的controller也只能一次處理一種的請求,若是咱們須要多種請求(最起碼也是增刪查改吧),那麼就須要多建立幾個controller,增長了代碼量。而註解就很好的解決了這個問題
使用註解的controller代碼:在這裏必定要理解這幾個註解所表明的含義是什麼
1 /** 2 * 3 */ 4 package com.sxt.controller; 5 import org.springframework.stereotype.Controller; 6 import org.springframework.web.bind.annotation.RequestMapping; 7 import org.springframework.web.servlet.ModelAndView; 8 /** 9 * @author ASUS 10 * 這裏不使用本身定義的controller, 11 * 12 */ 13 @Controller 14 //表示將該類交給spring容器進行管理 15 @RequestMapping("/user")//表示的是咱們請求的是哪一個資源下的方法,起了一個別名 16 public class MyController { 17 @RequestMapping("/add") 18 public ModelAndView add() { 19 System.out.println("我執行了1"); 20 ModelAndView mc=new ModelAndView(); 21 mc.setViewName("/index.jsp"); 22 return mc; 23 } 24 @RequestMapping("/query") 25 public ModelAndView query() { 26 System.out.println("我執行了2"); 27 ModelAndView mc=new ModelAndView(); 28 mc.setViewName("/index.jsp"); 29 return mc; 30 } 31 }
咱們還要在springmvc.xml中開啓掃描和開啓註解,代碼以下:
1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns="http://www.springframework.org/schema/beans" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xmlns:context="http://www.springframework.org/schema/context" 5 xmlns:mvc="http://www.springframework.org/schema/mvc" 6 xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd 7 http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd 8 http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd"> 9 10 <!-- 開啓註解 --> 11 <mvc:annotation-driven></mvc:annotation-driven> 12 <!-- 開啓掃描 --> 13 <context:component-scan base-package="com.sxt.controller"></context:component-scan> 14 </beans>
web.xml配置文件的代碼:
1 <?xml version="1.0" encoding="UTF-8"?> 2 <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1"> 3 <display-name>springmvc-02-annotation</display-name> 4 <welcome-file-list> 5 <welcome-file>index.html</welcome-file> 6 <welcome-file>index.htm</welcome-file> 7 <welcome-file>index.jsp</welcome-file> 8 <welcome-file>default.html</welcome-file> 9 <welcome-file>default.htm</welcome-file> 10 <welcome-file>default.jsp</welcome-file> 11 </welcome-file-list> 12 <!-- 中心控制器 --> 13 <servlet> 14 <servlet-name>spring-mvc</servlet-name> 15 <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 16 <!-- 關聯springmvc配置文件:由於咱們的中心控制器要使用裏面的處理器 --> 17 <init-param> 18 <param-name>contextConfigLocation</param-name> 19 <param-value>classpath:spring-mvc.xml</param-value> 20 </init-param> 21 </servlet> 22 <servlet-mapping> 23 <servlet-name>spring-mvc</servlet-name> 24 <url-pattern>/</url-pattern> 25 </servlet-mapping> 26 </web-app>
效果圖以下:這裏的controller的兩個方法分別模仿的是添加和查詢的響應
當咱們使用了註解之後,咱們若是在不添加新的功能的狀況下(後面會有涉及,好比獲取用戶請求的時間數據,須要一個轉換器;處理中文亂碼問題須要一個過濾器配置),咱們的配置文件是不用改變的,這樣就大大的方便了咱們的開發。
觀察中心處理器的源碼能夠知道:
1 # Default implementation classes for DispatcherServlet's strategy interfaces. 2 # Used as fallback when no matching beans are found in the DispatcherServlet context. 3 # Not meant to be customized by application developers. 4 5 org.springframework.web.servlet.LocaleResolver=org.springframework.web.servlet.i18n.AcceptHeaderLocaleResolver 6 7 org.springframework.web.servlet.ThemeResolver=org.springframework.web.servlet.theme.FixedThemeResolver 8 9 org.springframework.web.servlet.HandlerMapping=org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping,\ 10 org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping 11 處理器映射器:有兩個一個因此使用的時候須要明確指出是哪個 12 org.springframework.web.servlet.HandlerAdapter=org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter,\ 13 org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter,\ 14 org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter 15 處理器適配器有三個:一個是轉門處理httP協議的請求,一個是本身定義controller的控制器處理適配器,還有一個是註解的適配器 16 org.springframework.web.servlet.HandlerExceptionResolver=org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerExceptionResolver,\ 17 org.springframework.web.servlet.mvc.annotation.ResponseStatusExceptionResolver,\ 18 org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver 19 20 org.springframework.web.servlet.RequestToViewNameTranslator=org.springframework.web.servlet.view.DefaultRequestToViewNameTranslator 21 22 org.springframework.web.servlet.ViewResolver=org.springframework.web.servlet.view.InternalResourceViewResolver 23 這裏是視圖解析器,只有一個,不配置的時候會默認使用該解析器 24 org.springframework.web.servlet.FlashMapManager=org.springframework.web.servlet.support.SessionFlashMapManager
由該源碼可知:在springmvc中一共有四個重要的組件:
一個是中心處理器:DispatcherServlet;處理用戶的請求,下降了組件之間的耦合性,起調配做用
二個是處理器映射器:負責根據用戶請求找處處理器返回給中心處理器,提供了不一樣的映射方式:配置映射,註解映射,實現接口映射(本身定義controller)
三個是處理器適配器:找到專門的controller來處理用戶的請求,並返回一個ModleAndView給中心處理器
四個是視圖解析器:負責將處理結果解析生成View視圖,而後渲染以後響應給用戶端。
第三:具體的springmvc響應請求的方式
基本數據類型
1 /** 2 * 接收基本的數據類型的參數 3 * 要求參數的名稱必須與形參一致 4 */ 5 @RequestMapping("/fun1") 6 @ResponseBody 7 public void fun1(Integer id ,String name,String password) { 8 System.out.println(id+","+name+","+password); 9 } 10 /** 11 * 接收基本的數據類型的參數 12 * 若是想要使參數名稱和形參不一致;能夠利用一個註解@RequestParam 13 */ 14 @RequestMapping("/fun3") 15 @ResponseBody 16 public void fun3(@RequestParam("ids")Integer id , 17 @RequestParam("username")String name, 18 @RequestParam("pass")String password) { 19 System.out.println(id+","+name+","+password); 20 } 21 /** 22 * 接收基本的數據類型的參數 23 * 若是想要使參數名稱和形參不一致;能夠利用一個註解@RequestParam 24 * 可是加了這個註解之後;該形參自動提高爲必須傳入的參數;若是想改變這種狀態,有兩種方式 25 * 方式一:required=false 26 */ 27 @RequestMapping("/fun4") 28 @ResponseBody 29 public void fun4(@RequestParam("ids")Integer id , 30 @RequestParam(value="username",required=false)String name, 31 @RequestParam("pass")String password) { 32 System.out.println(id+","+name+","+password); 33 } 34 /** 35 * 接收基本的數據類型的參數 36 * 若是想要使參數名稱和形參不一致;能夠利用一個註解@RequestParam 37 * 可是加了這個註解之後;該形參自動提高爲必須傳入的參數;若是想改變這種狀態,有兩種方式 38 * 方式一:required=false 39 * 方式二:設置一個默認值:defaultValue="aaaa";可是這樣的方法不可取 40 */ 41 @RequestMapping("/fun5") 42 @ResponseBody 43 public void fun5(@RequestParam("ids")Integer id , 44 @RequestParam(value="username",defaultValue="aaaa")String name, 45 @RequestParam("pass")String password) { 46 System.out.println(id+","+name+","+password); 47 }
對象
1 /** 2 * 接收簡單對象的數據類型的參數;能夠直接輸出 3 */ 4 @RequestMapping("/fun2") 5 @ResponseBody 6 public void fun2(Book book) { 7 System.out.println(book); 8 }
對象代碼:
1 /** 2 * 3 */ 4 package com.sxt.bean; 5 6 /** 7 * @author ASUS 8 * 9 */ 10 public class Book { 11 private int id; 12 private String name; 13 private String author; 14 public int getId() { 15 return id; 16 } 17 public void setId(int id) { 18 this.id = id; 19 } 20 public String getName() { 21 return name; 22 } 23 public void setName(String name) { 24 this.name = name; 25 } 26 public String getAuthor() { 27 return author; 28 } 29 public void setAuthor(String author) { 30 this.author = author; 31 } 32 @Override 33 public String toString() { 34 return "Book [id=" + id + ", name=" + name + ", author=" + author + "]"; 35 } 36 37 38 39 }
jsp代碼:
1 <%@ page language="java" contentType="text/html; charset=UTF-8" 2 pageEncoding="UTF-8"%> 3 <% 4 String path = request.getContextPath(); 5 String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; 6 %> 7 <!DOCTYPE html> 8 <html> 9 <head> 10 <base href="<%=basePath%>"> 11 <meta charset="UTF-8"> 12 <title>Insert title here</title> 13 </head> 14 <body> 15 <form action="fun2" method="post"> 16 <table> 17 <tr> 18 <td>編號</td> 19 <td><input type="text" name="id"></td> 20 </tr> 21 <tr> 22 <td>書名</td> 23 <td><input type="text" name="name"></td> 24 </tr> 25 <tr> 26 <td>做者</td> 27 <td><input type="text" name="author"></td> 28 </tr> 29 </table> 30 <input type="submit" value="提交"> 31 </form> 32 </body> 33 </html>
複雜對象類型的參數:即對象裏面的屬性還有對象的參數類型
對象代碼:
1 /** 2 * 3 */ 4 package com.sxt.bean; 5 6 /** 7 * @author ASUS 8 * 9 */ 10 public class Book { 11 private int id; 12 private String name; 13 private Author author; 14 public int getId() { 15 return id; 16 } 17 public void setId(int id) { 18 this.id = id; 19 } 20 public String getName() { 21 return name; 22 } 23 public void setName(String name) { 24 this.name = name; 25 } 26 public Author getAuthor() { 27 return author; 28 } 29 public void setAuthor(Author author) { 30 this.author = author; 31 } 32 @Override 33 public String toString() { 34 return "Book [id=" + id + ", name=" + name + ", author=" + author + "]"; 35 } 36 37 38 39 }
1 /** 2 * 3 */ 4 package com.sxt.bean; 5 6 /** 7 * @author ASUS 8 * 9 */ 10 public class Author { 11 private int age; 12 private String name; 13 private String sex; 14 public int getAge() { 15 return age; 16 } 17 public void setAge(int age) { 18 this.age = age; 19 } 20 public String getName() { 21 return name; 22 } 23 public void setName(String name) { 24 this.name = name; 25 } 26 public String getSex() { 27 return sex; 28 } 29 public void setSex(String sex) { 30 this.sex = sex; 31 } 32 @Override 33 public String toString() { 34 return "Author [age=" + age + ", name=" + name + ", sex=" + sex + "]"; 35 } 36 37 38 }
controller代碼:
1 /** 2 * 接收復雜對象的數據類型:即對象裏面的屬性還有對象 3 * 這裏要注意如何去將另外一個對象的屬性賦值給一個對象的屬性:經過存取器 4 */ 5 @RequestMapping("/fun6") 6 @ResponseBody 7 public void fun6(Book book ) { 8 System.out.println(book ); 9 } 10
jsp代碼:
1 <%@ page language="java" contentType="text/html; charset=UTF-8" 2 pageEncoding="UTF-8"%> 3 <% 4 String path = request.getContextPath(); 5 String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; 6 %> 7 <!DOCTYPE html> 8 <html> 9 <head> 10 <base href="<%=basePath%>"> 11 <meta charset="UTF-8"> 12 <title>Insert title here</title> 13 </head> 14 <body> 15 <form action="fun6" method="post"> 16 <table> 17 <tr> 18 <td>編號</td> 19 <td><input type="text" name="id"></td> 20 </tr> 21 <tr> 22 <td>書名</td> 23 <td><input type="text" name="name"></td> 24 </tr> 25 <tr> 26 <td>做者年齡</td> 27 <td><input type="text" name="authoer.age"></td> 28 </tr> 29 <tr> 30 <td>做者姓名</td> 31 <td><input type="text" name="authoer.name"></td> 32 </tr> 33 <tr> 34 <td>做者性別</td> 35 <td><input type="text" name="authoer.sex"></td> 36 </tr> 37 </table> 38 <input type="submit" value="提交"> 39 </form> 40 </body> 41 </html>
兩個配置文件的代碼參考註解綁定基本參數或者和註解響應請求裏面的
數組類型:例如在複選框中,咱們不知道選擇的類型有幾個,這時候能夠用數組來存儲複選框中的數據
jsp代碼:
1 <%@ page language="java" contentType="text/html; charset=UTF-8" 2 pageEncoding="UTF-8"%> 3 <% 4 String path = request.getContextPath(); 5 String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; 6 %> 7 <!DOCTYPE html> 8 <html> 9 <head> 10 <base href="<%=basePath%>"> 11 <meta charset="UTF-8"> 12 <title>Insert title here</title> 13 </head> 14 <body> 15 <form action="fun1" method="post"> 16 <table> 17 <tr> 18 <td>用戶名</td> 19 <td><input type="text" name="username"></td> 20 </tr> 21 <tr> 22 <td>用戶密碼</td> 23 <td><input type="password" name="password"></td> 24 </tr> 25 <tr> 26 <td>興趣愛好</td> 27 <td><input type="checkbox" name="favorites" value="zuqiu">足球 28 <input type="checkbox" name="favorites" value="lanqiu">籃球 <input 29 type="checkbox" name="favorites" value="pingpang">乒乓球</td> 30 </tr> 31 <tr> 32 <td><input type="submit" value="註冊"></td> 33 </tr> 34 </table> 35 </form> 36 </body> 37 </html>
controller代碼:
1 /** 2 * 獲取請求數據 的數組類型;在形參中能夠用數組來接收用戶的請求數據 3 */ 4 @RequestMapping("/fun1") 5 @ResponseBody 6 public void fun1(String username,String password,String [] favorites) { 7 System.out.println(username+","+password); 8 for (String f : favorites) { 9 System.out.println(f); 10 } 11 }
集合類型:若是在controller中使用集合類型在形參中來接收用戶的請求數據會有什麼反應呢?
會報錯,這裏說明不能使用集合在controller中來接收用戶的請求的數據
controller代碼:
1 /** 2 * 獲取請求數據 的集合類型:這裏會報錯,說明不能用集合在形參中類型來接收用戶的請求數據 3 */ 4 @RequestMapping("/fun2") 5 @ResponseBody 6 public void fun2(String username,String password,List<String> favorites) { 7 System.out.println(username+","+password+","+favorites); 8 9 }
若是將集合數據類型放在對象中能不能接收呢?
答案是:能。說明集合不能夠在形參中使用可是能夠在對象中使用
controller代碼:
1 /** 2 * 獲取請求數據 的集合類型:這裏是在對象中使用集合來存儲數據類型 3 * 這裏說明將集合數據類型放在對象中能夠接收,沒有錯誤 4 */ 5 @RequestMapping("/fun3") 6 @ResponseBody 7 public void fun3(User user) { 8 System.out.println(user); 9 10 }
對象代碼:
1 /** 2 * 3 */ 4 package com.sxt.bean; 5 6 import java.util.List; 7 8 /** 9 * @author ASUS 10 * 11 */ 12 public class User { 13 private String username; 14 private String password; 15 private List<String> favorites; 16 public String getUsername() { 17 return username; 18 } 19 public void setUsername(String username) { 20 this.username = username; 21 } 22 public String getPassword() { 23 return password; 24 } 25 public void setPassword(String password) { 26 this.password = password; 27 } 28 public List<String> getFavorites() { 29 return favorites; 30 } 31 public void setFavorites(List<String> favorites) { 32 this.favorites = favorites; 33 } 34 @Override 35 public String toString() { 36 return "User [username=" + username + ", password=" + password + ", favorites=" + favorites + "]"; 37 } 38 39 40 }
jsp代碼:
1 <%@ page language="java" contentType="text/html; charset=UTF-8" 2 pageEncoding="UTF-8"%> 3 <% 4 String path = request.getContextPath(); 5 String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; 6 %> 7 <!DOCTYPE html> 8 <html> 9 <head> 10 <base href="<%=basePath%>"> 11 <meta charset="UTF-8"> 12 <title>Insert title here</title> 13 </head> 14 <body> 15 <form action="fun3" method="post"> 16 <table> 17 <tr> 18 <td>用戶名</td> 19 <td><input type="text" name="username"></td> 20 </tr> 21 <tr> 22 <td>用戶密碼</td> 23 <td><input type="password" name="password"></td> 24 </tr> 25 <tr> 26 <td>興趣愛好</td> 27 <td><input type="checkbox" name="favorites" value="zuqiu">足球 28 <input type="checkbox" name="favorites" value="lanqiu">籃球 <input 29 type="checkbox" name="favorites" value="pingpang">乒乓球</td> 30 </tr> 31 <tr> 32 <td><input type="submit" value="註冊"></td> 33 </tr> 34 </table> 35 </form> 36 </body> 37 </html>
那麼若是對象中有數組屬性能不能被接收呢?
答案是:能
controller代碼:
1 /** 2 * 獲取請求數據 的數組類型:這裏是在對象中使用數組來存儲數據類型 3 * 這裏說明將數組數據類型放在對象中能夠接收,沒有錯誤 4 */ 5 @RequestMapping("/fun4") 6 @ResponseBody 7 public void fun4(User user) { 8 System.out.println(user); 9 10 }
對象代碼:
1 /** 2 * 3 */ 4 package com.sxt.bean; 5 6 import java.util.Arrays; 7 import java.util.List; 8 9 /** 10 * @author ASUS 11 * 12 */ 13 public class User { 14 private String username; 15 private String password; 16 private String[] favorites; 17 public String getUsername() { 18 return username; 19 } 20 public void setUsername(String username) { 21 this.username = username; 22 } 23 public String getPassword() { 24 return password; 25 } 26 public void setPassword(String password) { 27 this.password = password; 28 } 29 30 public String[] getFavorites() { 31 return favorites; 32 } 33 public void setFavorites(String[] favorites) { 34 this.favorites = favorites; 35 } 36 @Override 37 public String toString() { 38 return "User [username=" + username + ", password=" + password + ", favorites=" + Arrays.toString(favorites) 39 + "]"; 40 } 41 42 43 44 }
jsp代碼參照上面的就能夠了。
總結:在對象和形參中均可以使用數組來接收數據,在對象中也可使用集合來接收數據,可是在形參中不能使用集合去接收數據,不然報服務器錯誤。
時間類型:
當不輸入時間類型的時候不會報錯:
若是輸入時間類型的話:
緣由是:綁定的數據與傳輸的數據不一致,綁定的是date類型的,而傳輸的是string類型的;綁定出錯
解決問題:
方式一:將date類型---》string 類型---》在轉換爲date類型;作一個轉換操做,即轉換器
controller代碼:
1 /** 2 *傳輸時間類型的數據 3 * 4 */ 5 @RequestMapping("/fun5") 6 @ResponseBody 7 public void fun5(User user) { 8 System.out.println(user); 9 10 }
轉換器代碼:
1 /** 2 * 3 */ 4 package com.sxt.bean; 5 6 import java.text.ParseException; 7 import java.text.SimpleDateFormat; 8 import java.util.Date; 9 10 import org.springframework.core.convert.converter.Converter; 11 12 /** 13 * @author ASUS 14 * 注意的問題:一個是繼承的接口來自spring框架的core的核心包,而不是cglib包下面的 15 * 二參數問題:將S類型轉換爲T類型的數據 16 * 三:要是本身寫的轉換器起做用必須在配置文件中配置 17 * 18 */ 19 public class MyConvert implements Converter<String, Date> { 20 @Override 21 public Date convert(String s) { 22 SimpleDateFormat sdf=new SimpleDateFormat("yyyy-mm-dd"); 23 try { 24 return sdf.parse(s); 25 } catch (ParseException e) { 26 // TODO Auto-generated catch block 27 e.printStackTrace(); 28 } 29 return null; 30 } 31 32 }
spring-mvc配置文件代碼:
1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns="http://www.springframework.org/schema/beans" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xmlns:context="http://www.springframework.org/schema/context" 5 xmlns:mvc="http://www.springframework.org/schema/mvc" 6 xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd 7 http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd 8 http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd"> 9 10 <!-- 開啓註解 --> 11 <mvc:annotation-driven conversion-service="formattingConversionServiceFactoryBean"></mvc:annotation-driven> 12 <!-- 開啓掃描 --> 13 <context:component-scan base-package="com.sxt.controller"></context:component-scan> 14 <!-- 配置 視圖解析器 --> 15 <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 16 <!-- 配置先後綴 17 <property name="prefix" value="/book"/> 18 <property name="suffix" value=".jsp"/> 19 --> 20 </bean> 21 22 <!-- 配置自定義的轉換器 --> 23 <bean id="formattingConversionServiceFactoryBean" class="org.springframework.format.support.FormattingConversionServiceFactoryBean"> 24 <property name="converters"> 25 <set> 26 <bean class="com.sxt.bean.MyConvert"></bean> 27 </set> 28 </property> 29 </bean> 30 </beans>
總結:獲取用戶請求數據的時候,若是是基本數據類型能夠直接獲取,可是要注意包裝類(引用數據類類型)和基本類型的的區別?包裝類能夠爲空,基本數據類型不能爲空
第二還要注意的就是形參和要求的參數類型不一致的時候的解決。
對象:分爲簡單對象(直接獲取輸出便可),複雜對象(對象裏面套對象)經過存取器來獲取數據
數組:在對象和形參中均可以用來獲取數據
集合:在形參中不可使用來獲取數據,在對象中能夠用來獲取數據。
時間類型:要寫一個轉換器。
在springmvc中最主要的一是註解和配置文件的使用;
二是若是本身寫了新的類來處理業務,那麼必須在配置文件進行配置,不然不能使用。
若是想往動態頁面中傳值,那麼可使用如下三種方式:
map,ModelMap,Model
代碼以下:
1 /** 2 * 3 */ 4 package com.sxt.controller; 5 6 7 8 import java.util.Map; 9 10 import org.springframework.stereotype.Controller; 11 import org.springframework.ui.Model; 12 import org.springframework.ui.ModelMap; 13 import org.springframework.web.bind.annotation.RequestMapping; 14 /** 15 * @author ASUS 16 * 若是想往動態頁面傳值:能夠用一下三種方式 17 * 18 * 19 */ 20 @Controller 21 public class MyController { 22 /** 23 *經過map傳值 24 * @param map 25 * @return 26 */ 27 @RequestMapping("/fun1") 28 public String fun1(Map<String, Object> map) { 29 map.put("msg", "map-->value"); 30 System.out.println("-----------"); 31 return "/index.jsp"; 32 33 } 34 /** 35 *經過model傳值 36 * @param map 37 * @return 38 */ 39 @RequestMapping("/fun2") 40 public String fun2(Model m) { 41 m.addAttribute("msg","model-->value"); 42 System.out.println("-----------"); 43 return "/index.jsp"; 44 45 } 46 /** 47 *經過modelMap傳值 48 * @param map 49 * @return 50 */ 51 @RequestMapping("/fun3") 52 public String fun3(ModelMap m) { 53 m.addAttribute("msg","ModelMap-->value"); 54 System.out.println("-----------"); 55 return "/index.jsp"; 56 57 } 58 59 }
jsp頁面代碼:
1 <%@ page language="java" contentType="text/html; charset=UTF-8" 2 pageEncoding="UTF-8"%> 3 <% 4 String path = request.getContextPath(); 5 String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; 6 %> 7 <!DOCTYPE html> 8 <html> 9 <head> 10 <base href="<%=basePath%>"> 11 <meta charset="UTF-8"> 12 <title>Insert title here</title> 13 </head> 14 <body> 15 我是一個碼農!!!!!<br> 16 request:${requestScope.msg}<br> 17 session:${sessionScope.msg}<br> 18 19 </body> 20 </html>
結果以下:
由上圖可知:這三種傳值方式都是request傳值
若是想用session傳值怎麼辦?
直接在controller類的前面加一個註解,將傳值方式提高爲session傳值,這個時候request和session都會有值了。
代碼以下:
1 /** 2 * 3 */ 4 package com.sxt.controller; 5 6 7 8 import java.util.Map; 9 10 import org.springframework.stereotype.Controller; 11 import org.springframework.ui.Model; 12 import org.springframework.ui.ModelMap; 13 import org.springframework.web.bind.annotation.RequestMapping; 14 import org.springframework.web.bind.annotation.SessionAttributes; 15 /** 16 * @author ASUS 17 * 若是想往動態頁面傳值:能夠用一下三種方式 18 * 若是想改變成session傳值: 19 * 20 */ 21 @Controller 22 @SessionAttributes("msg") 23 public class MyController { 24 /** 25 *經過map傳值 26 * @param map 27 * @return 28 */ 29 @RequestMapping("/fun1") 30 public String fun1(Map<String, Object> map) { 31 map.put("msg", "map-->value"); 32 System.out.println("-----------"); 33 return "/index.jsp"; 34 35 } 36 /** 37 *經過model傳值 38 * @param map 39 * @return 40 */ 41 @RequestMapping("/fun2") 42 public String fun2(Model m) { 43 m.addAttribute("msg","model-->value"); 44 System.out.println("-----------"); 45 return "/index.jsp"; 46 47 } 48 /** 49 *經過modelMap傳值 50 * @param map 51 * @return 52 */ 53 @RequestMapping("/fun3") 54 public String fun3(ModelMap m) { 55 m.addAttribute("msg","ModelMap-->value"); 56 System.out.println("-----------"); 57 return "/index.jsp"; 58 59 } 60 61 }
jsp的代碼不變,必定要注意二者傳值的區別。
結果以下:
springmvc的中文亂碼問題解決:
若是是在基本的servlet處理請求的時候,咱們能夠在設置編碼方式,可是這裏沒有給咱們暴露相關的request,可是卻給咱們暴露了一個過濾器,所以咱們只須要在web.xml文件中配置一箇中文亂碼問題的過濾器就能夠了》
代碼以下:
1 <?xml version="1.0" encoding="UTF-8"?> 2 <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1"> 3 <display-name>web-springmvc-hello</display-name> 4 <welcome-file-list> 5 <welcome-file>index.html</welcome-file> 6 <welcome-file>index.htm</welcome-file> 7 <welcome-file>index.jsp</welcome-file> 8 <welcome-file>default.html</welcome-file> 9 <welcome-file>default.htm</welcome-file> 10 <welcome-file>default.jsp</welcome-file> 11 </welcome-file-list> 12 <servlet> 13 <servlet-name>spring-mvc</servlet-name> 14 <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 15 <!-- 關聯springmvc配置文件:由於咱們的中心控制器要使用裏面的處理器 --> 16 <init-param> 17 <param-name>contextConfigLocation</param-name> 18 <param-value>classpath:spring-mvc.xml</param-value> 19 </init-param> 20 </servlet> 21 <servlet-mapping> 22 <servlet-name>spring-mvc</servlet-name> 23 <url-pattern>/</url-pattern> 24 </servlet-mapping> 25 <!-- spring框架提供的字符集過濾器 --> 26 <!-- spring Web MVC框架提供了org.springframework.web.filter.CharacterEncodingFilter用於解決POST方式形成的中文亂碼問題 --> 27 <filter> 28 <filter-name>encodingFilter</filter-name> 29 <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> 30 <init-param> 31 <param-name>encoding</param-name> 32 <param-value>UTF-8</param-value> 33 </init-param> 34 </filter> 35 <filter-mapping> 36 <filter-name>encodingFilter</filter-name> 37 <url-pattern>/*</url-pattern> 38 </filter-mapping> 39 40 </web-app>