SpringMVC是spring的一大組件雏搂,來代替?zhèn)鹘y(tǒng)的servlet。首先要明白SpringMVC的調用過程吞获。
SpringMVC調用過程
1.客戶發(fā)送request請求localhost:8090/SpringMVC/hello.action
2.請求處理器映射器處理handler(找到匹配的Controller類)
3.返回能夠處理的那個Controller類
4.請求處理器適配器執(zhí)行handler(內部按照匹配規(guī)則執(zhí)行)
5.執(zhí)行handler(Controller-service--dao)
6.將處理結果進行返回羽嫡,返回ModelAndView對象(model表示處理后的數(shù)據(jù) View表示頁面的邏輯名稱hello)
7.將ModelAndView對象返回給前端控制器
8.請求視圖解析器解析View對象(將頁面的邏輯名稱,拼接成一個完整的頁面路徑/WEB-INF/hello.jsp)
9.將完整的頁面路徑再次返回值給前端控制器
10.將model數(shù)據(jù)填充到頁面中的Request域中
Springmvc入門
一叹俏、配置文件方式
1導入相關jar包
2 web.xml配置前段控制器
前端控制器實際上就是一個servlet芦鳍,springMVC的前端控制器就是這個DispatcherServlet嚷往。他所在的位置如圖:
在Web.Xml中配置這個servlet
這表示所有以”*.action”結尾的請求,都交給DispatcherServlet這個前端控制器柠衅,這個前端控制器不是一個class皮仁,同樣我們可以通過簡單的xml配置就可以讓這個控制器以及其他的處理器映射器,視圖解析器起作用菲宴。
3. 配置springmvc的核心配置文件
SpringMVC核心配置文件命名規(guī)則
Servlet的name+“-servlet.xml”那么這里就是springmvc-servlet.xml
這個過程也是讓處理器映射器起作用
Spring的核心配置文件已經(jīng)配置好了那個訪問路徑贷祈,需要用那個Controller,下面我們來實現(xiàn)controller
4.實現(xiàn)controller
5. 配置視圖解析器
經(jīng)過這五步后就實現(xiàn)了簡單的springmvc的入門喝峦。除了用配置文件的方式外Spring還提供了簡單的通過注釋來實現(xiàn)势誊。
二、注解方式實現(xiàn)
前兩步和配置文件相同愈犹,但在配置springmvc核心配置文件時。需要開啟spring的注解闻丑,不用去新加一個bean來映射url和controller的關系漩怎。
1 2同上
3 開啟springmvc的注解同時配置好視圖解析器
4.實現(xiàn)controller
可以直接添加@RequestMapping來說明那個請求用哪個類或哪個方法來處理。
5.注意
@RequestMapping標注在類上表示這個url和子url都在這個類處理嗦嗡,可以用@RequestMapping來標注類和類中的方法
比如:
@RequestMapping(/user)
public class Usercontroller{
@RequestMapping(/users)//表示只有url=“/user/users”時交給這個方法來處理
public String list(Model model){
model.addAttribute(“user”,user);
return “user/list”
}
}
@RequestMapping(/user)
public class Usercontroller{
@RequestMapping(/users)//表示只有url=“/user/users”時交給這個方法來處理
public String list(Model model){
model.addAttribute(“user”,user);
return “user/list”
}
}
三勋锤、怎么獲取頁面參數(shù)
一般情況下springmvc可以直接通過形參來獲取傳遞過來的參數(shù)
前臺傳遞可以直接get方式?后添加相應參數(shù)侥祭,或者頁面中的name屬性的值應該與接收方法的參數(shù)名稱一致叁执。茄厘,比如
四.怎么返回給頁面參數(shù)
返回參數(shù)需要用到Springmvc的model對象用法和map一樣,key-value的形式
前臺獲取也直接用map的方式獲取谈宛。
@RequestMapping(/user)
public class Usercontroller{
@RequestMapping(/users)//表示只有url=“/user/users”時交給這個方法來處理
public String list(Model model){
model.addAttribute(“user”,user);//添加返回參數(shù)到response域中
return “user/list”
}
}
五.幾個常見問題
1,解決中文亂碼問題
<!--解決中文亂碼問題 -->
<filter>
<filter-name>characterEncoding</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>
</filter>
<filter-mapping>
<filter-name>characterEncoding</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
轉發(fā)和重定向
1.轉發(fā):
1.瀏覽器的地址不會發(fā)生改變
2.轉發(fā)能夠攜帶參數(shù)
forward:/toUser.action 轉發(fā)的關鍵字不能錯
關鍵字 url
2.重定向
1.瀏覽器的地址發(fā)生改變
2.重定向不負責傳遞參數(shù)
redirect:/toUser.action
關鍵字 url
3.同名提交問題
如果遇到同名提交問題次哈,那么如果接收參數(shù)為String類型時,那么將會把用戶提交的信息拼接成一個字符串吆录,
如果接收的參數(shù)為數(shù)組時窑滞,那么SpringMVC將會把同名提交自動的賦值到數(shù)組中。
4.對象封裝參數(shù)
如果參數(shù)個數(shù)較多時恢筝,可以使用對象進行封裝哀卫,頁面中的name屬性的值應該和對象中的屬性保持一致,并且set方法不能省略撬槽,否則不能正確注入
5.為對象的引用封裝參數(shù)
SpringMVC能夠為對象的引用賦值
-
name屬性的值
image.png set()不能省略
如果想進行賦值此改,必須添加set方法
頁面中的name屬性的值和參數(shù)名稱不匹配
其他屬性值的用法
@RequestParam(value="state",required=true,defaultValue="長不大的成年人")String sta
Value:頁面中的name屬性值
required:如果為true則表示必須傳遞該參數(shù) false表示可以不傳
defaultValue:如果該值為null時,那么會添加默認值
6.日期類型的轉化
如果想轉化日期格式例如 2017-11-11 這時如果不做任何處理那么必然會報400錯誤 400表示 類型匹配錯誤
解決方案:自定義日期格式
@InitBinder
publicvoid InitBinder (ServletRequestDataBinder binder){
binder.registerCustomEditor(
java.util.Date.class,
newCustomDateEditor(new SimpleDateFormat("yyyy-MM-dd"), true));
}
如果將上述代碼配置到Controller中那么當前的controller任意的方法都能夠實現(xiàn)日期格式的轉化侄柔。
如果其他的Controller也需要進行日期格式的轉化共啃,那么必須添加上述代碼,這時造成了代碼的重復勋拟。
所以勋磕,日期轉化工具通常情況下放到基本類中,別的類繼承即可敢靡。