亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

SpringMVC的詳細(xì)架構(gòu)你了解嘛

 更新時(shí)間:2022年01月19日 17:13:27   作者:YSOcean  
這篇文章主要為大家介紹了SpringMVC的詳細(xì)架構(gòu),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助

通過上篇博客,我們能編寫一個(gè) SpringMVC 的入門實(shí)例,但是為什么要這樣寫?這樣寫有啥好處?通過這篇博客我們會有詳細(xì)的了解。

1、SpringMVC 詳細(xì)介紹

通過入門實(shí)例,我們大概知道 SpringMVC 的作用,那么它到底是什么呢?

Spring Web MVC是一種基于Java的實(shí)現(xiàn)了Web MVC設(shè)計(jì)模式的請求驅(qū)動(dòng)類型的輕量級Web框架,即使用了MVC架構(gòu)模式的思想,將web層進(jìn)行職責(zé)解耦,基于請求驅(qū)動(dòng)指的就是使用請求-響應(yīng)模型,框架的目的就是幫助我們簡化開發(fā),Spring Web MVC也是要簡化我們?nèi)粘eb開發(fā)的。

與之相反的是基于組件的、事件驅(qū)動(dòng)的Web框架,如Tapestry、JSF等,在此就不介紹了。

Spring Web MVC也是服務(wù)到工作者模式的實(shí)現(xiàn),但進(jìn)行可優(yōu)化。前端控制器是DispatcherServlet;應(yīng)用控制器其實(shí)拆為處理器映射器(Handler Mapping)進(jìn)行處理器管理和視圖解析器(View Resolver)進(jìn)行視圖管理;頁面控制器/動(dòng)作/處理器為Controller接口(僅包含ModelAndView handleRequest(request, response) 方法)的實(shí)現(xiàn)(也可以是任何的POJO類);支持本地化(Locale)解析、主題(Theme)解析及文件上傳等;提供了非常靈活的數(shù)據(jù)驗(yàn)證、格式化和數(shù)據(jù)綁定機(jī)制;提供了強(qiáng)大的約定大于配置(慣例優(yōu)先原則)的契約式編程支持。

2、SpringMVC 處理請求流程

第一步:用戶發(fā)送請求到前端控制器(DispatcherServlet)。

第二步:前端控制器請求 HandlerMapping 查找 Handler,可以根據(jù) xml 配置、注解進(jìn)行查找。

第三步: 處理器映射器 HandlerMapping 向前端控制器返回 Handler

第四步:前端控制器調(diào)用處理器適配器去執(zhí)行 Handler

第五步:處理器適配器執(zhí)行 Handler

第六步:Handler 執(zhí)行完成后給適配器返回ModelAndView

第七步:處理器適配器向前端控制器返回 ModelAndView

ModelAndViewSpringMVC 框架的一個(gè)底層對象,包括ModelView

第八步:前端控制器請求試圖解析器去進(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時(shí)按照HandlerAdapter的要求去做,這樣適配器才可以去正確執(zhí)行Handler
5、視圖解析器ViewResolver(不需要程序員開發(fā))。
  作用:進(jìn)行視圖解析,根據(jù)邏輯視圖名解析成真正的視圖(view)
6、視圖View(需要程序員開發(fā)jsp)。
  注意:View是一個(gè)接口,實(shí)現(xiàn)類支持不同的View類型(jsp、freemarker、pdf…)
ps:不需要程序員開發(fā)的,需要程序員自己做一下配置即可。

可以總結(jié)出:需要我們開發(fā)的工作只有處理器 Handler 的編寫以及視圖比如JSP頁面的編寫。可能你還對諸如前端控制器、處理器映射器等等名詞不太理解,那么接下來我們對其進(jìn)行詳細(xì)的介紹。

3、配置前端控制器

在 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來解析
        錯(cuò)誤配置:/*,注意這里是不能這樣配置的,應(yīng)為如果這樣寫,最后轉(zhuǎn)發(fā)到 jsp 頁面的時(shí)候,仍然會由DispatcherServlet進(jìn)行解析,
                    而這時(shí)候會找不到對應(yīng)的Handler,從而報(bào)錯(cuò)?。?!
      -->
    <url-pattern>*.do</url-pattern>
  </servlet-mapping>
</web-app>

4、配置處理器適配器

在 springmvc.xml 文件中配置。用來約束我們所需要編碼的 Handler類。

第一種配置:編寫 Handler 時(shí)必須要實(shí)現(xiàn) Controller

<!-- 配置處理器適配器,所有適配器都得實(shí)現(xiàn) HandlerAdapter接口 -->
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter" />

我們可以查看源碼: 

第二種配置:編寫 Handler 時(shí)必須要實(shí)現(xiàn)HttpRequestHandler

<!-- 配置處理器適配器第二種方法,所有適配器都得實(shí)現(xiàn) HandlerAdapter接口 ,這樣配置所有Handler都得實(shí)現(xiàn) HttpRequestHandler接口-->
<bean class="org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter" />

5、編寫 Handler

在 springmvc.xml 文件中配置。通俗來講,就是請求的 URL 到我們這里所編寫的 Handler 類的某個(gè)方法進(jìn)行一些業(yè)務(wù)邏輯處理。

我們在上面講解了兩個(gè)處理器適配器來約束 Handler,那么我們就通過上面兩種配置分別編寫兩個(gè) Handler

第一種:實(shí)現(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;
    }
 
}

第二種:實(shí)現(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ù)實(shí)際情況來判斷。

5、配置處理器映射器

在 springmvc.xml 文件中配置。通俗來講就是請求的 URL 怎么能被 SpringMVC 識別,從而去執(zhí)行我們上一步所編寫好的 Handler

第一種方法:

<!-- 配置Handler -->   
<bean name="/hello.do" class="com.ys.controller.HelloController2" />
 
<!-- 配置處理器映射器
    將bean的name作為url進(jìn)行查找,需要在配置Handler時(shí)指定bean name(就是url)-->
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping" />

這樣配置的話,那么請求的 URL,必須為 http://localhost:8080/項(xiàng)目名/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/項(xiàng)目名/hello1.do,或者h(yuǎn)ttp://localhost:8080/項(xiàng)目名/hello2.do

總結(jié):上面兩種處理器映射器配置可以并存,前端控制器會正確的去判斷 url 用哪個(gè) Handler 去處理。

6、配置視圖解析器

第一種配置:

<!-- 配置視圖解析器
    進(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 頁面名就可以了。

7、DispatcherServlet.properties

上面我們講解了各種配置,可能有人會問這么多配置,萬一少配置了一樣,那不就不能運(yùn)行了,那我們能不能不配置呢?答案是肯定的,SpringMVC 給我們提供了一個(gè)DispatcherServlet.properties 文件。系統(tǒng)會首先加載這里面的配置,如果我們沒有配置,那么就默認(rèn)使用這個(gè)文件的配置;如果我們配置了,那么就優(yōu)先使用我們手動(dòng)配置的?! ?/p>

在 SpringMVC 運(yùn)行之前,會首先加載DispatcherServlet.properties 文件里面的內(nèi)容,那么我們來看看這里面都是什么。

我們可以從上面得出,如果我們不手動(dòng)進(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

總結(jié)

本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!

相關(guān)文章

  • 關(guān)于@Controller和@Restcontroller的那點(diǎn)奇葩事

    關(guān)于@Controller和@Restcontroller的那點(diǎn)奇葩事

    這篇文章主要介紹了關(guān)于@Controller和@Restcontroller的那點(diǎn)奇葩事,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • Java實(shí)現(xiàn)讀取Jar文件屬性的方法詳解

    Java實(shí)現(xiàn)讀取Jar文件屬性的方法詳解

    這篇文章主要為大家詳細(xì)介紹了如何利用Java語言實(shí)現(xiàn)讀取Jar文件屬性的功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2022-08-08
  • Mybatis in條件傳參的三種實(shí)現(xiàn)方式(直接$,List,[])

    Mybatis in條件傳參的三種實(shí)現(xiàn)方式(直接$,List,[])

    這篇文章主要介紹了Mybatis in條件傳參的三種實(shí)現(xiàn)方式(直接$,List,[]),具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • Java實(shí)戰(zhàn)之小米交易商城系統(tǒng)的實(shí)現(xiàn)

    Java實(shí)戰(zhàn)之小米交易商城系統(tǒng)的實(shí)現(xiàn)

    這篇文章將利用Java實(shí)現(xiàn)小米交易商城系統(tǒng),文中采用的技術(shù)有:JSP?、Spring、SpringMVC、MyBatis等,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2022-04-04
  • 學(xué)習(xí)Java中的日期和時(shí)間處理及Java日歷小程序的編寫

    學(xué)習(xí)Java中的日期和時(shí)間處理及Java日歷小程序的編寫

    這篇文章主要介紹了學(xué)習(xí)Java中的日期和時(shí)間處理及Java日歷小程序的編寫,這個(gè)日歷小程序僅用簡單的算法實(shí)現(xiàn)沒有用到date類等,但是帶有圖形界面,需要的朋友可以參考下
    2016-02-02
  • SpringCloud中Zuul網(wǎng)關(guān)原理及其配置

    SpringCloud中Zuul網(wǎng)關(guān)原理及其配置

    Spring?Cloud是一個(gè)基于Spring?Boot實(shí)現(xiàn)的微服務(wù)應(yīng)用開發(fā)工具,其中的Zuul網(wǎng)關(guān)可以實(shí)現(xiàn)負(fù)載均衡、路由轉(zhuǎn)發(fā)、鑒權(quán)、限流等功能,本文將從Spring?Cloud中Zuul網(wǎng)關(guān)的原理、使用場景和配置過程詳細(xì)介紹,幫助大家更好地了解和應(yīng)用Zuul網(wǎng)關(guān),需要的朋友可以參考下
    2023-06-06
  • 詳解Java設(shè)計(jì)模式之單例模式

    詳解Java設(shè)計(jì)模式之單例模式

    這篇文章主要為大家詳細(xì)介紹了Java設(shè)計(jì)模式之單例模式的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-03-03
  • java遍歷途中修改數(shù)據(jù)及刪除數(shù)據(jù)的方法總結(jié)

    java遍歷途中修改數(shù)據(jù)及刪除數(shù)據(jù)的方法總結(jié)

    在使用java的集合類遍歷數(shù)據(jù)的時(shí)候,在某些情況下可能需要對某些數(shù)據(jù)進(jìn)行刪除,下面這篇文章主要給大家介紹了關(guān)于java遍歷途中修改數(shù)據(jù)及刪除數(shù)據(jù)的方法總結(jié),需要的朋友可以參考下
    2023-10-10
  • Mybatis如何實(shí)現(xiàn)延遲加載及緩存

    Mybatis如何實(shí)現(xiàn)延遲加載及緩存

    這篇文章主要介紹了Mybatis如何實(shí)現(xiàn)延遲加載及緩存,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-10-10
  • java如何根據(jù)用戶請求獲取ip地址并解析省市信息

    java如何根據(jù)用戶請求獲取ip地址并解析省市信息

    根據(jù)當(dāng)前用戶本地IP地址,查詢IP地址庫,獲取IP所在的省市信息,目前有多種方式實(shí)現(xiàn)該功能,這篇文章主要給大家介紹了關(guān)于java如何根據(jù)用戶請求獲取ip地址并解析省市信息的相關(guān)資料,需要的朋友可以參考下
    2023-12-12

最新評論