您好,登錄后才能下訂單哦!
這篇“SpringMVC有什么作用”除了程序員外大部分人都不太理解,今天小編為了讓大家更加理解“SpringMVC有什么作用”,給大家總結(jié)了以下內(nèi)容,具有一定借鑒價值,內(nèi)容詳細(xì)步驟清晰,細(xì)節(jié)處理妥當(dāng),希望大家通過這篇文章有所收獲,下面讓我們一起來看看具體內(nèi)容吧。
通過入門實例,我們大概知道 SpringMVC 的作用,那么它到底是什么呢?
Spring Web MVC是一種基于Java的實現(xiàn)了Web MVC設(shè)計模式的請求驅(qū)動類型的輕量級Web框架,即使用了MVC架構(gòu)模式的思想,將web層進(jìn)行職責(zé)解耦,基于請求驅(qū)動指的就是使用請求-響應(yīng)模型,框架的目的就是幫助我們簡化開發(fā),Spring Web MVC也是要簡化我們?nèi)粘eb開發(fā)的。
與之相反的是基于組件的、事件驅(qū)動的Web框架,如Tapestry、JSF等,在此就不介紹了。
Spring Web MVC也是服務(wù)到工作者模式的實現(xiàn),但進(jìn)行可優(yōu)化。前端控制器是DispatcherServlet;應(yīng)用控制器其實拆為處理器映射器(Handler Mapping)進(jìn)行處理器管理和視圖解析器(View Resolver)進(jìn)行視圖管理;頁面控制器/動作/處理器為Controller接口(僅包含ModelAndView handleRequest(request, response) 方法)的實現(xiàn)(也可以是任何的POJO類);支持本地化(Locale)解析、主題(Theme)解析及文件上傳等;提供了非常靈活的數(shù)據(jù)驗證、格式化和數(shù)據(jù)綁定機(jī)制;提供了強(qiáng)大的約定大于配置(慣例優(yōu)先原則)的契約式編程支持。
第一步:用戶發(fā)送請求到前端控制器(DispatcherServlet
)。
第二步:前端控制器請求 HandlerMapping
查找 Handler
,可以根據(jù) xml 配置、注解進(jìn)行查找。
第三步: 處理器映射器 HandlerMapping
向前端控制器返回 Handler
第四步:前端控制器調(diào)用處理器適配器去執(zhí)行 Handler
第五步:處理器適配器執(zhí)行 Handler
第六步:Handler
執(zhí)行完成后給適配器返回ModelAndView
第七步:處理器適配器向前端控制器返回 ModelAndView
ModelAndView
是SpringMVC
框架的一個底層對象,包括Model
和 View
第八步:前端控制器請求試圖解析器去進(jìn)行視圖解析
根據(jù)邏輯視圖名來解析真正的視圖。
第九步:試圖解析器向前端控制器返回 view
第十步:前端控制器進(jìn)行視圖渲染
就是將模型數(shù)據(jù)(在 ModelAndView
對象中)填充到 request
域
第十一步:前端控制器向用戶響應(yīng)結(jié)果
下面我們對上面出現(xiàn)的一些組件進(jìn)行解釋:
1、前端控制器DispatcherServlet(不需要程序員開發(fā))。 作用:接收請求,響應(yīng)結(jié)果,相當(dāng)于轉(zhuǎn)發(fā)器,中央處理器。有了DispatcherServlet減少了其它組件之間的耦合度。 2、處理器映射器HandlerMapping(不需要程序員開發(fā))。 作用:根據(jù)請求的url查找Handler。 3、處理器適配器HandlerAdapter(不需要程序員開發(fā))。 作用:按照特定規(guī)則(HandlerAdapter要求的規(guī)則)去執(zhí)行Handler。 4、處理器Handler(需要程序員開發(fā))。 注意:編寫Handler時按照HandlerAdapter的要求去做,這樣適配器才可以去正確執(zhí)行Handler 5、視圖解析器ViewResolver(不需要程序員開發(fā))。 作用:進(jìn)行視圖解析,根據(jù)邏輯視圖名解析成真正的視圖(view) 6、視圖View(需要程序員開發(fā)jsp)。 注意:View是一個接口,實現(xiàn)類支持不同的View類型(jsp、freemarker、pdf…) ps:不需要程序員開發(fā)的,需要程序員自己做一下配置即可。
可以總結(jié)出:需要我們開發(fā)的工作只有處理器 Handler 的編寫以及視圖比如JSP頁面的編寫??赡苣氵€對諸如前端控制器、處理器映射器等等名詞不太理解,那么接下來我們對其進(jìn)行詳細(xì)的介紹。
在 web.xml 文件中進(jìn)行如下配置:
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0"> <display-name>SpringMVC_01</display-name> <!-- 配置前端控制器DispatcherServlet --> <servlet> <servlet-name>springmvc</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <!--springmvc.xml 是自己創(chuàng)建的SpringMVC全局配置文件,用contextConfigLocation作為參數(shù)名來加載 如果不配置 contextConfigLocation,那么默認(rèn)加載的是/WEB-INF/servlet名稱-servlet.xml,在這里也就是 springmvc-servlet.xml --> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:springmvc.xml</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>springmvc</servlet-name> <!--第一種配置:*.do,還可以寫*.action等等,表示以.do結(jié)尾的或者以.action結(jié)尾的URL都由前端控制器DispatcherServlet來解析 第二種配置:/,所有訪問的 URL 都由DispatcherServlet來解析,但是這里最好配置靜態(tài)文件不由DispatcherServlet來解析 錯誤配置:/*,注意這里是不能這樣配置的,應(yīng)為如果這樣寫,最后轉(zhuǎn)發(fā)到 jsp 頁面的時候,仍然會由DispatcherServlet進(jìn)行解析, 而這時候會找不到對應(yīng)的Handler,從而報錯?。?! --> <url-pattern>*.do</url-pattern> </servlet-mapping> </web-app>
在 springmvc.xml 文件中配置。用來約束我們所需要編碼的 Handler類。
第一種配置:編寫 Handler 時必須要實現(xiàn) Controller
<!-- 配置處理器適配器,所有適配器都得實現(xiàn) HandlerAdapter接口 --> <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter" />
我們可以查看源碼:
第二種配置:編寫 Handler 時必須要實現(xiàn)HttpRequestHandler
<!-- 配置處理器適配器第二種方法,所有適配器都得實現(xiàn) HandlerAdapter接口 ,這樣配置所有Handler都得實現(xiàn) HttpRequestHandler接口--> <bean class="org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter" />
在 springmvc.xml 文件中配置。通俗來講,就是請求的 URL 到我們這里所編寫的 Handler 類的某個方法進(jìn)行一些業(yè)務(wù)邏輯處理。
我們在上面講解了兩個處理器適配器來約束 Handler,那么我們就通過上面兩種配置分別編寫兩個 Handler
第一種:實現(xiàn)Controller 接口
package com.ys.controller; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.mvc.Controller; public class HelloController implements Controller{ @Override public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception { ModelAndView modelView = new ModelAndView(); //類似于 request.setAttribute() modelView.addObject("name","張三"); modelView.setViewName("/WEB-INF/view/index.jsp"); return modelView; } }
第二種:實現(xiàn)HttpRequestHandler 接口
package com.ys.controller; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.web.HttpRequestHandler; public class HelloController2 implements HttpRequestHandler{ @Override public void handleRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setAttribute("name", "張三"); request.getRequestDispatcher("/WEB-INF/view/index.jsp").forward(request, response); } }
總結(jié):通常我們使用第一種方式來編寫 Handler ,但是第二種沒有返回值,我們可以通過 response 修改相應(yīng)內(nèi)容,比如返回 json 數(shù)據(jù)。
response.setCharacterEncoding("utf-8"); response.setContentType("application/json;charset=utf-8"); response.getWriter().write("json字符串");
所以具體使用哪一種根據(jù)實際情況來判斷。
在 springmvc.xml 文件中配置。通俗來講就是請求的 URL 怎么能被 SpringMVC 識別,從而去執(zhí)行我們上一步所編寫好的 Handler
第一種方法:
<!-- 配置Handler --> <bean name="/hello.do" class="com.ys.controller.HelloController2" /> <!-- 配置處理器映射器 將bean的name作為url進(jìn)行查找,需要在配置Handler時指定bean name(就是url)--> <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping" />
這樣配置的話,那么請求的 URL,必須為 http://localhost:8080/項目名/hello.do
第二種方法:
<!-- 配置Handler --> <bean id="hello1" class="com.ys.controller.HelloController" /> <bean id="hello2" class="com.ys.controller.HelloController" /> <!-- 第二種方法:簡單URL配置處理器映射器 --> <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"> <property name="mappings"> <props> <prop key="/hello1.do">hello1</prop> <prop key="/hello2.do">hello2</prop> </props> </property> </bean>
這種配置請求的 URL可以為 http://localhost:8080/項目名/hello1.do,或者h(yuǎn)ttp://localhost:8080/項目名/hello2.do
總結(jié):上面兩種處理器映射器配置可以并存,前端控制器會正確的去判斷 url 用哪個 Handler 去處理。
第一種配置:
<!-- 配置視圖解析器 進(jìn)行jsp解析,默認(rèn)使用jstl標(biāo)簽,classpath下得有jstl的包--> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" />
如果這樣配,那么在 Handler 中返回的必須是路徑+jsp頁面名稱+".jsp"
第二種配置:
<!--配置視圖解析器 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <!-- 返回視圖頁面的前綴 --> <property name="prefix" value="/WEB-INF/view"></property> <!-- 返回頁面的后綴 --> <property name="suffix" value=".jsp"></property> </bean>
如果這樣配,那么在 Handler 中只需要返回在 view 文件夾下的jsp 頁面名就可以了。
上面我們講解了各種配置,可能有人會問這么多配置,萬一少配置了一樣,那不就不能運(yùn)行了,那我們能不能不配置呢?答案是肯定的,SpringMVC 給我們提供了一個DispatcherServlet.properties
文件。系統(tǒng)會首先加載這里面的配置,如果我們沒有配置,那么就默認(rèn)使用這個文件的配置;如果我們配置了,那么就優(yōu)先使用我們手動配置的?! ?/p>
在 SpringMVC 運(yùn)行之前,會首先加載DispatcherServlet.properties 文件里面的內(nèi)容,那么我們來看看這里面都是什么。
我們可以從上面得出,如果我們不手動進(jìn)行各種配置,那么也有會默認(rèn)的
①、處理器適配器默認(rèn):org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter
②、處理器映射器默認(rèn):org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping
③、視圖解析器默認(rèn):org.springframework.web.servlet.view.InternalResourceViewResolver
感謝您的閱讀,希望您對“SpringMVC有什么作用”這一關(guān)鍵問題有了一定的理解,具體使用情況還需要大家自己動手實驗使用過才能領(lǐng)會,快去試試吧,如果想閱讀更多相關(guān)知識點的文章,歡迎關(guān)注億速云行業(yè)資訊頻道!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。