什么是SpringMVC?SpringMVC是Spring家族的一員,Spring是將現(xiàn)在開發(fā)中流行的組件進行組合而成的一個框架!它用在基于MVC的表現(xiàn)層開發(fā),類似于struts2框架 這里寫圖片描述 為什么要使用SpringMVC?我們在之前已經學過了Struts2這么一個基于MVC的框架....那么我們已經學會了Struts2,為啥要要學習SpringMVC呢??? 下面我們來看一下Struts2不足之處:
基于這么一些原因,并且業(yè)內現(xiàn)在SpringMVC已經逐漸把Struts2給替代了...因此我們學習SpringMVC一方面能夠讓我們跟上業(yè)界的潮流框架,一方面SpringMVC確實是非常好用! 可以這么說,Struts2能做的東西,SpringMVC也能夠做.... 回顧Struts2開發(fā)在Struts2中,我們的開發(fā)特點是這樣的:
Struts2的工作流程 這里寫圖片描述
SpringMVC快速入門導入開發(fā)包 前6個是Spring的核心功能包【IOC】,第7個是關于web的包,第8個是SpringMVC包
編寫Action Action實現(xiàn)Controller接口 public class HelloAction implements Controller { @Override public ModelAndView handleRequest(javax.servlet.http.HttpServletRequest httpServletRequest, javax.servlet.http.HttpServletResponse httpServletResponse) throws Exception { return null; }} 我們只要實現(xiàn)handleRequest方法即可,該方法已經說了request和response對象給我們用了。這是我們非常熟悉的request和response對象。然而該方法返回的是ModelAndView這么一個對象,這是和Struts2不同的。Struts2返回的是字符串,而SpringMVC返回的是ModelAndView ModelAndView其實他就是將我們的視圖路徑和數(shù)據(jù)封裝起來而已【我們想要跳轉到哪,把什么數(shù)據(jù)存到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中配置核心控制器 創(chuàng)建SpringMVC控制器 我們在hello.xml配置文件中把SpringMVC的控制器創(chuàng)建出來 訪問 當我們在瀏覽器訪問 這里寫圖片描述 SpringMVC工作流程這里寫圖片描述
上面的工作流程中,我們是沒有講過映射器,適配器,視圖解析器這樣的東西的。但是SpringMVC的環(huán)境還是被我們搭建起來了。 下面就由我來一個一個來介紹他們是有什么用的! 映射器 我們在web.xml中配置規(guī)定只要是.action為后綴的請求都是會經過SpringMVC的核心Servlet。 當我們接收到請求的時候,我們發(fā)現(xiàn)是hello.action,是會經過我們的核心Servlet的,那么核心Servlet就會去找有沒有專門的Action類來處理hello.action請求的。 也就是說:映射器就是用于處理“什么樣的請求提交給Action”處理?!灸J可省略的】..... 其實我們在快速入門的例子已經配置了:name屬性就是規(guī)定了hello.action到HelloAction控制器中處理! 映射器默認的值是這樣的: 當然了,上面我們在創(chuàng)建控制器的時候【也就是HelloAction】可以不使用name屬性來指定路徑,可以使用我們的映射器來配置。如以下的代碼: 當我們需要多個請求路徑都交由helloAction控制器來處理的話,我們只要添加prop標簽就行了! 這里寫圖片描述 適配器 當我們映射器找到對應的Action來處理請求的時候,核心控制器會讓適配器去找該類是否實現(xiàn)了Controller接口。【默認可省略的】 也就是說:適配器就是去找實現(xiàn)了Controller接口的類 視圖解析器 我們把結果封裝到ModelAndView以后,SpringMVC會使用視圖解析器來對ModelAndView進行解析?!灸J可省略的】 也有一種情況是不能省略的。我們在快速入門的例子中,將結果封裝到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頁面,也要寫業(yè)務方法。而業(yè)務方法也僅僅是返回一個簡單的字符串。 如下的代碼: public String home(){ return 'home';} 在SpringMVC中,如果僅僅是跳轉到某個視圖上,我們可以省略該Action和業(yè)務方法。配置的Action只要繼承著ParameterizableViewController這個類就行了! 這里寫圖片描述
AbstractCommandController 到目前為止,我們都沒有將SpringMVC是怎么接收web端傳遞過來的參數(shù)的。 我們在Struts2中,只要在Action類上寫對應的成員變量,給出對應的set和get方法。那么Struts2就會幫我們把參數(shù)封裝到對應的成員變量中,是非常方便的。 那么我們在SpringMVC中是怎么獲取參數(shù)的呢????我們是將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作為單例的,是不可能使用成員變量來進行接收的【因為會有多個用戶訪問,就會出現(xiàn)數(shù)據(jù)不合理性】! 那么SpringMVC作為單例的,他只能通過方法的參數(shù)來進行接收對應的參數(shù)!只有方法才能保證不同的用戶對應不同的數(shù)據(jù)! 實體 實體的屬性要和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 + '\'' + '}'; }} 提交參數(shù)的JSP 配置Action處理請求 Action接收參數(shù) 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'); //將數(shù)據(jù)封裝到ModelAndView中 modelAndView.addObject('USER', user); return modelAndView; }} 效果: 這里寫圖片描述 小總結這里寫圖片描述 這里寫圖片描述 Struts2和SpringMVC存值的區(qū)別: |
|
來自: Frank_Chia > 《JAVA》