国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

SpringMVC之源碼分析--ViewResolver(四)

jcc / 2409人閱讀

摘要:概述本章繼續(xù)學(xué)習(xí)另一個(gè)實(shí)現(xiàn)類解析器,該類的主要作用是根據(jù)同一請(qǐng)求的某些策略,選擇對(duì)應(yīng)的進(jìn)行渲染??梢园牙斫鉃檫m配器,對(duì)不同類型進(jìn)行適配。值得注意的是處理的為同一個(gè)。本系列文章是基于。實(shí)戰(zhàn)需求目標(biāo)實(shí)現(xiàn)后綴名或參數(shù)控制,顯示不同的視圖。

概述

本章繼續(xù)學(xué)習(xí)ViewResolver另一個(gè)實(shí)現(xiàn)類ContentNegotiatingViewResolver解析器,該類的主要作用是根據(jù)同一請(qǐng)求的某些策略,選擇對(duì)應(yīng)的View進(jìn)行渲染。可以把ContentNegotiatingViewResolver理解為適配器,對(duì)不同類型View進(jìn)行適配。值得注意的是處理的handler為同一個(gè)。

ContentNegotiatingViewResolver本身不解析視圖,它將委托其他視圖解析器進(jìn)行視圖解析。

請(qǐng)求的策略包括:請(qǐng)求后綴、請(qǐng)求頭的Accept、使用參數(shù)等等。

本系列文章是基于Spring5.0.5RELEASE。

流程概述

使用此視圖解析器時(shí),調(diào)用resolverViewName(viewName,locale)方法,首先調(diào)用本類的getMediaType(reuqest)獲取請(qǐng)求的媒體類型mediaType(根據(jù)策略),然后調(diào)用getCandidateViews()方法解析歸并到View集合,最后調(diào)用getBestView()方法,根據(jù)contentType選擇出合適的視圖并返回。

源碼分析

ContentNegotiatingViewResolver

該類主要完成

public class ContentNegotiatingViewResolver extends WebApplicationObjectSupport
    implements ViewResolver, Ordered, InitializingBean {

// 判斷請(qǐng)求mediaType,內(nèi)部包含使用的策略集合
@Nullable
private ContentNegotiationManager contentNegotiationManager;
// 用于創(chuàng)建ContentNegotiationManager實(shí)例
private final ContentNegotiationManagerFactoryBean cnmFactoryBean = new ContentNegotiationManagerFactoryBean();
// 控制為查找到時(shí)的處理
private boolean useNotAcceptableStatusCode = false;
// 存儲(chǔ)View實(shí)例,可在此集合查詢符合條件的View實(shí)例進(jìn)行視圖渲染
@Nullable
private List defaultViews;
// 視圖解析器集合,用于解析視圖
@Nullable
private List viewResolvers;
// 排序?qū)傩?private int order = Ordered.HIGHEST_PRECEDENCE;

... ...
/**
 *啟動(dòng)時(shí)從上下文中加載ViewResolver
 */
@Override
protected void initServletContext(ServletContext servletContext) {
    // 從上下文中獲取所有視圖解析器
    Collection matchingBeans =
            BeanFactoryUtils.beansOfTypeIncludingAncestors(obtainApplicationContext(), ViewResolver.class).values();
    if (this.viewResolvers == null) {
        // 將上下文配置的視圖解析器添加到屬性viewResolvers中,以供后續(xù)使用
        this.viewResolvers = new ArrayList<>(matchingBeans.size());
        for (ViewResolver viewResolver : matchingBeans) {
            if (this != viewResolver) {
                this.viewResolvers.add(viewResolver);
            }
        }
    }
    else {
        // 初始化viewResolvers屬性中配置的視圖解析器
        for (int i = 0; i < this.viewResolvers.size(); i++) {
            ViewResolver vr = this.viewResolvers.get(i);
            if (matchingBeans.contains(vr)) {
                continue;
            }
            String name = vr.getClass().getName() + i;
            obtainApplicationContext().getAutowireCapableBeanFactory().initializeBean(vr, name);
        }

    }
    if (this.viewResolvers.isEmpty()) {
        logger.warn("Did not find any ViewResolvers to delegate to; please configure them using the " +
                ""viewResolvers" property on the ContentNegotiatingViewResolver");
    }
    // 排序視圖解析器
    AnnotationAwareOrderComparator.sort(this.viewResolvers);
    this.cnmFactoryBean.setServletContext(servletContext);
}

/*
 *啟動(dòng)時(shí)調(diào)用,如果沒有配置ContentNegotiationManager,啟動(dòng)時(shí)進(jìn)行創(chuàng)建初始化該屬性
 */
@Override
public void afterPropertiesSet() {
    if (this.contentNegotiationManager == null) {
        this.contentNegotiationManager = this.cnmFactoryBean.build();
    }
}

/*
 *請(qǐng)求到來時(shí)匹配核實(shí)的View并返回
 */
@Override
@Nullable
public View resolveViewName(String viewName, Locale locale) throws Exception {
    RequestAttributes attrs = RequestContextHolder.getRequestAttributes();
    Assert.state(attrs instanceof ServletRequestAttributes, "No current ServletRequestAttributes");
    // 獲取請(qǐng)求的mediaType
    List requestedMediaTypes = getMediaTypes(((ServletRequestAttributes) attrs).getRequest());
    if (requestedMediaTypes != null) {
        // 解析出所有視圖View和配置的默認(rèn)View合并,供后面從中匹配選擇
        List candidateViews = getCandidateViews(viewName, locale, requestedMediaTypes);
        // 根據(jù)contentType匹配選擇出合適的View
        View bestView = getBestView(candidateViews, requestedMediaTypes, attrs);
        // 返回
        if (bestView != null) {
            return bestView;
        }
    }
    // 未匹配到合適的View,并且把參數(shù)useNotAcceptableStatusCode設(shè)置為true時(shí),返回406
    if (this.useNotAcceptableStatusCode) {
        if (logger.isDebugEnabled()) {
            logger.debug("No acceptable view found; returning 406 (Not Acceptable) status code");
        }
        return NOT_ACCEPTABLE_VIEW;
    }
    else {
        logger.debug("No acceptable view found; returning null");
        return null;
    }

    ... ...
}

以上是ContentNegotiatingViewResolver類的主要代碼,具體調(diào)用的方法再此不再展開,有興趣的童鞋可以自行查看,下面我們來使用這個(gè)解析器做個(gè)例子,通過例子再加深下理解。

實(shí)戰(zhàn)

需求目標(biāo)

實(shí)現(xiàn)后綴名或參數(shù)控制,顯示不同的視圖。如:

http://localhost:8088/user jsp視圖顯示

http://localhost:8088/user.json(http://localhost:8088/user?format=json) json視圖顯示

http://localhost:8088/user.xml(http://localhost:8088/user?format=xml) xml視圖顯示

項(xiàng)目結(jié)構(gòu)

新建maven web項(xiàng)目,最終目錄結(jié)構(gòu)如下:

pom文件

通過maven引入jar依賴,代碼如下:




    4.0.0

    com.github.dalianghe
    spring-mvc-viewresolver-03
    1.0-SNAPSHOT
    war

    spring-mvc-viewresolver-03 Maven Webapp
    
    http://www.example.com

    
        UTF-8
        1.8
        1.8
    

    
        
        
            org.springframework
            spring-webmvc
            5.0.5.RELEASE
        
        
        
            javax.servlet
            javax.servlet-api
            3.1.0
            provided
        
        
        
            javax.servlet
            jstl
            1.2
        
        
        
            com.fasterxml.jackson.core
            jackson-core
            2.9.5
        
        
            com.fasterxml.jackson.core
            jackson-databind
            2.9.5
        
        
        
            com.fasterxml.jackson.dataformat
            jackson-dataformat-xml
            2.9.5
        
    
    
        spring-mvc-viewresolver-03
        
            
                
                    org.apache.tomcat.maven
                    tomcat7-maven-plugin
                    2.2
                    
                        /
                        8088
                    
                
            
        
    

spring配置文件

配置視圖解析器等,代碼如下:




    
    

    
    
        
        
        
        
        
        
        
        
            
                
                
                
                
            
        
    

    
    
        

        
            
                
                    
                    
                    
                
            
        
        
        
            
                
                    
                    
                
                
                    
                
            
        
        
    


部署描述文件

配置DispatcherServlet,代碼如下:



  Archetype Created Web Application

  
    
    dispatcher
    
    org.springframework.web.servlet.DispatcherServlet
    
    
      contextConfigLocation
      classpath:spring-servlet.xml
    
    
    1
    true
  
  
  
    
    dispatcher
    
    /
  


User實(shí)體

簡(jiǎn)單的實(shí)體類,代碼如下:

public class User{

    private String username;
    private String password;

    public User(String username, String password) {
        this.username = username;
        this.password = password;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
}

handler處理器

編寫Controller,代碼如下:

import com.github.dalianghe.domain.User;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.GetMapping;

@Controller
public class DemoController {
    @GetMapping("/user")
    public String demo(ModelMap model){

        User user = new User("hedaliang", "123456");
        model.addAttribute(user);
        return "user";
    }
}

jsp頁面

jsp視圖(user.jsp),代碼如下:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>


    My Frist JSP


username:${user.username}


password:${user.password}

以上代碼編寫結(jié)束,下面來進(jìn)行測(cè)試。

測(cè)試

啟動(dòng)應(yīng)用,訪問地址:http://localhost:8080/user,此時(shí)應(yīng)使用jsp進(jìn)行渲染,結(jié)果如下:

訪問http://locahost:8088/user.json或http://localhost:8088/user?format=json,結(jié)果如下:

訪問http://localhost:8088/user.xml或http://localhost:8088/user?format=xml,結(jié)果如下:

OK!跟預(yù)期一致,測(cè)試通過,至此我們就實(shí)現(xiàn)了需求功能。

總結(jié)

本章介紹了ContentNegotiatingViewResolver類,并通過開發(fā)小demo驗(yàn)證了此類的功能,里面細(xì)節(jié)很多,有興趣的朋友可以再深入了解,希望本文能給大家一寫啟發(fā)。

最后創(chuàng)建了qq群方便大家交流,可掃描加入,同時(shí)也可加我qq:276420284,共同學(xué)習(xí)、共同進(jìn)步,謝謝!

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/69659.html

相關(guān)文章

  • SpringMVC源碼分析--ViewResolver(三)

    摘要:概述本節(jié)學(xué)習(xí)下的功能,簡(jiǎn)單來說,該類的作用就是把多個(gè)視圖解析器進(jìn)行組裝,內(nèi)部使用存儲(chǔ)配置使用的視圖解析器??偨Y(jié)本章介紹了類,根據(jù)測(cè)試,了解到屬性不影響中配置使用的視圖解析器順序。 概述 本節(jié)學(xué)習(xí)下ViewResolverComposite的功能,簡(jiǎn)單來說,該類的作用就是把多個(gè)ViewResolver視圖解析器進(jìn)行組裝,內(nèi)部使用list存儲(chǔ)配置使用的視圖解析器。 本系列文章是基于Spri...

    fox_soyoung 評(píng)論0 收藏0
  • SpringMVC源碼分析--ViewResolver(二)

    摘要:概述上篇學(xué)習(xí)了視圖解析器作用及處理流程,為我們提供了豐富的視圖解析器見下圖本系列文章是基于。該視圖解析器是根據(jù)處理器返回的邏輯視圖名稱,在應(yīng)用上下文中查找該名稱的視圖對(duì)象視圖對(duì)象就是的對(duì)象。 概述 上篇學(xué)習(xí)了Spring MVC ViewResolver視圖解析器作用及處理流程,Spring為我們提供了豐富的視圖解析器(見下圖):showImg(https://segmentfault...

    jas0n 評(píng)論0 收藏0
  • SpringMVC源碼分析--ViewResolver(一)

    摘要:概述本章開始進(jìn)入另一重要的組件,即視圖組件,處理視圖組件使用兩個(gè)主要的接口是和。接口的作用是用于處理視圖進(jìn)行渲染。延用之前的介紹流程,本章分兩部分進(jìn)行闡述啟動(dòng)初始化和請(qǐng)求處理。 概述 本章開始進(jìn)入另一重要的組件,即視圖組件,Spring MVC處理視圖組件使用兩個(gè)主要的接口是ViewResolver和View。根據(jù)名稱可知,ViewResolver即視圖解析器,其作用是把邏輯視圖名稱解...

    pf_miles 評(píng)論0 收藏0
  • SpringMVC源碼分析--ViewResolver(五)

    摘要:此解析器與差不多,更改下配置文件中的類全路徑即可??偨Y(jié)本章介紹了以及三個(gè)視圖解析器。這部分內(nèi)容有點(diǎn)兒多,我會(huì)盡快結(jié)束。 概述 通過上幾篇的學(xué)習(xí),我們分析了并試驗(yàn)了ViewResolverComposite、BeanNameViewResolver和ContentNegotiatingViewResolver,這三個(gè)類都直接實(shí)現(xiàn)ViewResolver接口。Spring MVC提供了很多...

    klinson 評(píng)論0 收藏0
  • SpringMVC源碼分析--ViewResolver(六)

    摘要:與一樣,該類繼承抽象類,并且通過外部的屬性文件定義邏輯視圖名稱與真正的視圖對(duì)象的關(guān)系,屬性文件默認(rèn)是下的,可以通過或?qū)傩詠碇付?,該屬性指的是文件的基名稱,也就是說以屬性值開頭的屬性文件。 概述 本章再學(xué)習(xí)另外兩個(gè)ViewResolver,分別是XmlViewResolver和ResourceBundleViewResolver,從功能上說,這兩個(gè)視圖解析器都是從外部資源文件中查找視圖V...

    alighters 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<