摘要:也就是說映射器就是用于處理什么樣的請求提交給處理。這和是一樣的提交參數的用戶名編號提交配置處理請求注冊映射器包框架接收參數設置無參構造器,里邊調用方法,傳入要封裝的對象這里的對象就表示已經封裝好的了對象了。
什么是SpringMVC?
SpringMVC是Spring家族的一員,Spring是將現在開發中流行的組件進行組合而成的一個框架!它用在基于MVC的表現層開發,類似于struts2框架
為什么要使用SpringMVC?我們在之前已經學過了Struts2這么一個基于MVC的框架....那么我們已經學會了Struts2,為啥要要學習SpringMVC呢???
下面我們來看一下Struts2不足之處:
有漏洞【詳細可以去搜索】
運行速度較慢【比SpringMVC要慢】
配置的內容較多【需要使用Struts.xml文件】
比較重量級
基于這么一些原因,并且業內現在SpringMVC已經逐漸把Struts2給替代了...因此我們學習SpringMVC一方面能夠讓我們跟上業界的潮流框架,一方面SpringMVC確實是非常好用!
可以這么說,Struts2能做的東西,SpringMVC也能夠做....
回顧Struts2開發在Struts2中,我們的開發特點是這樣的:
Action類繼承著ActionSupport類【如果要使用Struts2提供的額外功能,就要繼承它】
Action業務方法總是返回一個字符串,再由Struts2內部通過我們手寫的Struts.xml配置文件去跳轉到對應的view
Action類是多例的,接收Web傳遞過來的參數需要使用實例變量來記住,通常我們都會寫上set和get方法
Struts2的工作流程Struts2接收到request請求
將請求轉向我們的過濾分批器進行過濾
讀取Struts2對應的配置文件
經過默認的攔截器之后創建對應的Action【多例】
執行完業務方法就返回給response對象
SpringMVC快速入門 導入開發包前6個是Spring的核心功能包【IOC】,第7個是關于web的包,第8個是SpringMVC包
org.springframework.context-3.0.5.RELEASE.jar
org.springframework.expression-3.0.5.RELEASE.jar
org.springframework.core-3.0.5.RELEASE.jar
org.springframework.beans-3.0.5.RELEASE.jar
org.springframework.asm-3.0.5.RELEASE.jar
commons-logging.jar
org.springframework.web-3.0.5.RELEASE.jar
org.springframework.web.servlet-3.0.5.RELEASE.jar
編寫ActionAction實現Controller接口
public class HelloAction implements Controller { @Override public ModelAndView handleRequest(javax.servlet.http.HttpServletRequest httpServletRequest, javax.servlet.http.HttpServletResponse httpServletResponse) throws Exception { return null; } }
我們只要實現handleRequest方法即可,該方法已經說了request和response對象給我們用了。這是我們非常熟悉的request和response對象。然而該方法返回的是ModelAndView這么一個對象,這是和Struts2不同的。Struts2返回的是字符串,而SpringMVC返回的是ModelAndView
ModelAndView其實他就是將我們的視圖路徑和數據封裝起來而已【我們想要跳轉到哪,把什么數據存到request域中,設置這個對象的屬性就行了】。
public class HelloAction implements Controller { @Override public ModelAndView handleRequest(javax.servlet.http.HttpServletRequest httpServletRequest, javax.servlet.http.HttpServletResponse httpServletResponse) throws Exception { ModelAndView modelAndView = new ModelAndView(); //跳轉到hello.jsp頁面。 modelAndView.setViewName("/hello.jsp"); return modelAndView; } }注冊核心控制器
在Struts2中,我們想要使用Struts2的功能,那么就得在web.xml文件中配置過濾器。而我們使用SpringMVC的話,我們是在web.xml中配置核心控制器
創建SpringMVC控制器DispatcherServlet org.springframework.web.servlet.DispatcherServlet contextConfigLocation classpath:hello.xml DispatcherServlet *.action
我們在hello.xml配置文件中把SpringMVC的控制器創建出來
訪問
當我們在瀏覽器訪問http://localhost:8080/hello.action的時候,Spring會讀取到我們的訪問路徑,然后對比一下我們的配置文件中是否有配置/hello.action,如果有。那么就交由對應的Action類來進行處理。Action類的業務方法將其請求輸出到hello.jsp頁面上。
SpringMVC工作流程用戶發送請求
請求交由核心控制器處理
核心控制器找到映射器,映射器看看請求路徑是什么
核心控制器再找到適配器,看看有哪些類實現了Controller接口或者對應的bean對象
將帶過來的數據進行轉換,格式化等等操作
找到我們的控制器Action,處理完業務之后返回一個ModelAndView對象
最后通過視圖解析器來對ModelAndView進行解析
跳轉到對應的JSP/html頁面
上面的工作流程中,我們是沒有講過映射器,適配器,視圖解析器這樣的東西的。但是SpringMVC的環境還是被我們搭建起來了。
下面就由我來一個一個來介紹他們是有什么用的!
映射器我們在web.xml中配置規定只要是.action為后綴的請求都是會經過SpringMVC的核心Servlet。
當我們接收到請求的時候,我們發現是hello.action,是會經過我們的核心Servlet的,那么核心Servlet就會去找有沒有專門的Action類來處理hello.action請求的。
也就是說:映射器就是用于處理“什么樣的請求提交給Action”處理。【默認可省略的】.....
其實我們在快速入門的例子已經配置了:name屬性就是規定了hello.action到HelloAction控制器中處理!
映射器默認的值是這樣的:
當然了,上面我們在創建控制器的時候【也就是HelloAction】可以不使用name屬性來指定路徑,可以使用我們的映射器來配置。如以下的代碼:
helloAction
當我們需要多個請求路徑都交由helloAction控制器來處理的話,我們只要添加prop標簽就行了!
適配器helloAction helloAction
當我們映射器找到對應的Action來處理請求的時候,核心控制器會讓適配器去找該類是否實現了Controller接口。【默認可省略的】
也就是說:適配器就是去找實現了Controller接口的類
視圖解析器
我們把結果封裝到ModelAndView以后,SpringMVC會使用視圖解析器來對ModelAndView進行解析。【默認可省略的】
也有一種情況是不能省略的。我們在快速入門的例子中,將結果封裝到ModelAndView中,用的是絕對真實路徑!如果我們用的是邏輯路徑,那么就必須對其配置,否則SpringMVC是找不到對應的路徑的。
那什么是邏輯路徑呢???我們在Struts2中,返回的是"success"這樣的字符串,從而跳轉到success.jsp這樣的頁面上。我們就可以把"success"稱作為邏輯路徑。
在Action中返回hello,hello是一個邏輯路徑。需要我們使用視圖解析器把邏輯路基補全
public ModelAndView handleRequest(javax.servlet.http.HttpServletRequest httpServletRequest, javax.servlet.http.HttpServletResponse httpServletResponse) throws Exception { ModelAndView modelAndView = new ModelAndView(); //跳轉到hello.jsp頁面。 modelAndView.setViewName("hello"); return modelAndView; }
如果不使用視圖解析器的話,那么就會找不到頁面:
因此,我們需要配置視圖解析器
控制器 ParameterizableViewController
我們在之前使用Struts2的時候,如果僅僅要跳轉到某個WEB-INF/JSP頁面,也要寫業務方法。而業務方法也僅僅是返回一個簡單的字符串。
如下的代碼:
public String home(){ return "home"; }
/WEB-INF/jsp/nsfw/{1}.jsp
在SpringMVC中,如果僅僅是跳轉到某個視圖上,我們可以省略該Action和業務方法。配置的Action只要繼承著ParameterizableViewController這個類就行了!
2017年9月26日15:57:45 現在看來, 好像還是在方法上寫更好。我覺得統一管理起來會更加方便
AbstractCommandController到目前為止,我們都沒有將SpringMVC是怎么接收web端傳遞過來的參數的。
我們在Struts2中,只要在Action類上寫對應的成員變量,給出對應的set和get方法。那么Struts2就會幫我們把參數封裝到對應的成員變量中,是非常方便的。
那么我們在SpringMVC中是怎么獲取參數的呢????我們是將Action繼承AbstractCommandController這么一個類的。
public class HelloAction extends AbstractCommandController { @Override protected ModelAndView handle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, BindException e) throws Exception { return null; } }
在講解該控制器之前,首先我們要明白SpringMVC控制器一個與Struts2不同的地方:SpringMVC的控制器是單例的,Struts2的控制器是多例的!
也就是說:Struts2收集變量是定義成員變量來進行接收,而SpringMVC作為單例的,是不可能使用成員變量來進行接收的【因為會有多個用戶訪問,就會出現數據不合理性】!
那么SpringMVC作為單例的,他只能通過方法的參數來進行接收對應的參數!只有方法才能保證不同的用戶對應不同的數據!
實體實體的屬性要和web頁面上的name提交過來的名稱是一致的。這和Struts2是一樣的!
public class User { private String id; private String username; public User() { } public User(String id, String username) { this.id = id; this.username = username; } public String getId() { return id; } public void setId(String id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } @Override public String toString() { return "User{" + "id="" + id + """ + ", username="" + username + """ + "}"; } }提交參數的JSP
配置Action處理請求
Action接收參數helloAction
public class HelloAction extends AbstractCommandController { /*設置無參構造器,里邊調用setCommandClass方法,傳入要封裝的對象*/ public HelloAction() { this.setCommandClass(User.class); } /** * * @param httpServletRequest * @param httpServletResponse * @param o 這里的對象就表示已經封裝好的了User對象了。! * @param e * @return * @throws Exception */ @Override protected ModelAndView handle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, BindException e) throws Exception { User user = (User) o; System.out.println(user); ModelAndView modelAndView = new ModelAndView(); //跳轉到ok.jsp modelAndView.setViewName("/WEB-INF/ok.jsp"); //將數據封裝到ModelAndView中 modelAndView.addObject("USER", user); return modelAndView; } }效果: 小總結
Struts2和SpringMVC存值的區別:
SpringMVC的工作流程:
用戶發送HTTP請求,SpringMVC核心控制器接收到請求
找到映射器看該請求是否交由對應的Action類進行處理
找到適配器看有無該Action類
Action類處理完結果封裝到ModelAndView中
通過視圖解析器把數據解析,跳轉到對應的JSP頁面
控制器介紹了兩種:
ParameterizableViewController
能夠實現跳轉到WEB-INF下資源,并不用寫處理方法
AbstractCommandController
可以實現對參數數據的封裝
如果文章有錯的地方歡迎指正,大家互相交流。習慣在微信看技術文章,想要獲取更多的Java資源的同學,可以關注微信公眾號:Java3y
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/68801.html
摘要:前言由于寫的文章已經是有點多了,為了自己和大家的檢索方便,于是我就做了這么一個博客導航。 前言 由于寫的文章已經是有點多了,為了自己和大家的檢索方便,于是我就做了這么一個博客導航。 由于更新比較頻繁,因此隔一段時間才會更新目錄導航哦~想要獲取最新原創的技術文章歡迎關注我的公眾號:Java3y Java3y文章目錄導航 Java基礎 泛型就這么簡單 注解就這么簡單 Druid數據庫連接池...
摘要:有必要建一個資源服務器存放靜態資源。一些用戶級別的數據輕量可以考慮存儲在中。存儲的是值,可以通過來對和對象之間的轉換如果我們的數據是在后臺傳過去或者轉換而成的,在前臺上并沒有做什么改變的話。 移動商城項目總結 移動商城項目是我第二個做得比較大的項目,該項目系統來源于傳智Java168期,十天的視頻課程(想要視頻的同學關注我的公眾號就可以直接獲取了) 通過這次的項目又再次開闊了我的視野,...
摘要:開啟自動配置功能后文詳解這個注解,學過的同學應該對它不會陌生,就是掃描注解,默認是掃描當前類下的。簡單來說,這個注解可以幫助我們自動載入應用程序所需要的所有默認配置。簡單理解這二者掃描的對象是不一樣的。 前言 只有光頭才能變強。 文本已收錄至我的GitHub倉庫,歡迎Star:https://github.com/ZhongFuCheng3y/3y 回顧前面Spring的文章(以學習...
摘要:數據綁定入門學習總結時間年月日星期日說明本文部分內容均來自慕課網。慕課網教學示例源碼個人學習源碼第一章課程介紹數據綁定入門概述數據綁定概念來自百度百科簡單綁定是將一個用戶界面元素控件的屬性綁定到一個類型對象實例上的某個屬性的方法。 《SpringMVC數據綁定入門》學習總結 時間:2017年2月19日星期日說明:本文部分內容均來自慕課網。@慕課網:http://www.imooc.co...
摘要:是使用攔截器來自動幫我們完成中文亂碼的問題的。這是我的首頁當然了,基于注解和基于來開發,都是通過映射器適配器和視圖解析器的。能夠控制請求路徑和請求方式一個控制器寫多個業務方法到目前為止,我們都是一個控制器寫一個業務方法,這肯定是不合理的。 前言 本文主要是講解在Controller中的開發,主要的知識點有如下: 編碼過濾器 使用注解開發 注解@RequestMapping詳解 業務方...
閱讀 3461·2019-08-30 13:15
閱讀 1400·2019-08-29 18:34
閱讀 822·2019-08-29 15:18
閱讀 3480·2019-08-29 11:21
閱讀 3247·2019-08-29 10:55
閱讀 3688·2019-08-26 10:36
閱讀 1869·2019-08-23 18:37
閱讀 1816·2019-08-23 16:57