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

資訊專欄INFORMATION COLUMN

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

jcc / 2439人閱讀

摘要:概述本章繼續學習另一個實現類解析器,該類的主要作用是根據同一請求的某些策略,選擇對應的進行渲染。可以把理解為適配器,對不同類型進行適配。值得注意的是處理的為同一個。本系列文章是基于。實戰需求目標實現后綴名或參數控制,顯示不同的視圖。

概述

本章繼續學習ViewResolver另一個實現類ContentNegotiatingViewResolver解析器,該類的主要作用是根據同一請求的某些策略,選擇對應的View進行渲染。可以把ContentNegotiatingViewResolver理解為適配器,對不同類型View進行適配。值得注意的是處理的handler為同一個。

ContentNegotiatingViewResolver本身不解析視圖,它將委托其他視圖解析器進行視圖解析。

請求的策略包括:請求后綴、請求頭的Accept、使用參數等等。

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

流程概述

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

源碼分析

ContentNegotiatingViewResolver

該類主要完成

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

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

... ...
/**
 *啟動時從上下文中加載ViewResolver
 */
@Override
protected void initServletContext(ServletContext servletContext) {
    // 從上下文中獲取所有視圖解析器
    Collection matchingBeans =
            BeanFactoryUtils.beansOfTypeIncludingAncestors(obtainApplicationContext(), ViewResolver.class).values();
    if (this.viewResolvers == null) {
        // 將上下文配置的視圖解析器添加到屬性viewResolvers中,以供后續使用
        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);
}

/*
 *啟動時調用,如果沒有配置ContentNegotiationManager,啟動時進行創建初始化該屬性
 */
@Override
public void afterPropertiesSet() {
    if (this.contentNegotiationManager == null) {
        this.contentNegotiationManager = this.cnmFactoryBean.build();
    }
}

/*
 *請求到來時匹配核實的View并返回
 */
@Override
@Nullable
public View resolveViewName(String viewName, Locale locale) throws Exception {
    RequestAttributes attrs = RequestContextHolder.getRequestAttributes();
    Assert.state(attrs instanceof ServletRequestAttributes, "No current ServletRequestAttributes");
    // 獲取請求的mediaType
    List requestedMediaTypes = getMediaTypes(((ServletRequestAttributes) attrs).getRequest());
    if (requestedMediaTypes != null) {
        // 解析出所有視圖View和配置的默認View合并,供后面從中匹配選擇
        List candidateViews = getCandidateViews(viewName, locale, requestedMediaTypes);
        // 根據contentType匹配選擇出合適的View
        View bestView = getBestView(candidateViews, requestedMediaTypes, attrs);
        // 返回
        if (bestView != null) {
            return bestView;
        }
    }
    // 未匹配到合適的View,并且把參數useNotAcceptableStatusCode設置為true時,返回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類的主要代碼,具體調用的方法再此不再展開,有興趣的童鞋可以自行查看,下面我們來使用這個解析器做個例子,通過例子再加深下理解。

實戰

需求目標

實現后綴名或參數控制,顯示不同的視圖。如:

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視圖顯示

項目結構

新建maven web項目,最終目錄結構如下:

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實體

簡單的實體類,代碼如下:

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}

以上代碼編寫結束,下面來進行測試。

測試

啟動應用,訪問地址:http://localhost:8080/user,此時應使用jsp進行渲染,結果如下:

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

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

OK!跟預期一致,測試通過,至此我們就實現了需求功能。

總結

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

最后創建了qq群方便大家交流,可掃描加入,同時也可加我qq:276420284,共同學習、共同進步,謝謝!

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/69659.html

相關文章

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

    摘要:概述本節學習下的功能,簡單來說,該類的作用就是把多個視圖解析器進行組裝,內部使用存儲配置使用的視圖解析器。總結本章介紹了類,根據測試,了解到屬性不影響中配置使用的視圖解析器順序。 概述 本節學習下ViewResolverComposite的功能,簡單來說,該類的作用就是把多個ViewResolver視圖解析器進行組裝,內部使用list存儲配置使用的視圖解析器。 本系列文章是基于Spri...

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

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

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

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

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

    摘要:此解析器與差不多,更改下配置文件中的類全路徑即可。總結本章介紹了以及三個視圖解析器。這部分內容有點兒多,我會盡快結束。 概述 通過上幾篇的學習,我們分析了并試驗了ViewResolverComposite、BeanNameViewResolver和ContentNegotiatingViewResolver,這三個類都直接實現ViewResolver接口。Spring MVC提供了很多...

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

    摘要:與一樣,該類繼承抽象類,并且通過外部的屬性文件定義邏輯視圖名稱與真正的視圖對象的關系,屬性文件默認是下的,可以通過或屬性來指定,該屬性指的是文件的基名稱,也就是說以屬性值開頭的屬性文件。 概述 本章再學習另外兩個ViewResolver,分別是XmlViewResolver和ResourceBundleViewResolver,從功能上說,這兩個視圖解析器都是從外部資源文件中查找視圖V...

    alighters 評論0 收藏0

發表評論

0條評論

jcc

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<