亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

SpringMVC?ViewResolver視圖解析器組件怎么用

發布時間:2023-04-10 16:51:25 來源:億速云 閱讀:107 作者:iii 欄目:開發技術

本篇內容主要講解“SpringMVC ViewResolver視圖解析器組件怎么用”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“SpringMVC ViewResolver視圖解析器組件怎么用”吧!

    Spring MVC的視圖解析器 ViewResolver 是框架中一個重要的組件,用于將控制器返回的邏輯視圖名稱解析為具體的視圖實現對象,最終呈現給用戶的是具體的視圖實現,例如 JSP、FreeMarker 模板、Thymeleaf 模板、JSON 等等。

    作用

    在 Spring MVC 中,控制器處理完請求之后需要將生成的模型數據和視圖名稱返回給 DispatcherServlet,DispatcherServlet 會將模型數據和視圖名稱交給 ViewResolver 進行解析,ViewResolver 將對應的視圖解析出來,并返回給 DispatcherServlet,由 DispatcherServlet 進行渲染,最終將渲染后的結果返回給客戶端。因此,ViewResolver 的作用是將控制器返回的邏輯視圖名稱解析為具體的視圖實現對象。

    類型

    Spring MVC 中提供了多種 ViewResolver 類型,不同類型的 ViewResolver 會使用不同的解析策略和算法,下面介紹幾種常見的 ViewResolver 類型。

    InternalResourceViewResolver

    InternalResourceViewResolver 是 Spring MVC 中最常用的視圖解析器,它用于解析 JS P或 HTML 等資源文件。該解析器會將邏輯視圖名稱加上前綴和后綴,例如將邏輯視圖名稱 “hello” 解析為 “/WEB-INF/views/hello.jsp”。

    @Configuration
    @EnableWebMvc
    @ComponentScan(basePackages = "com.example.controller")
    public class AppConfig {
        @Bean
        public InternalResourceViewResolver viewResolver() {
            InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
            viewResolver.setPrefix("/WEB-INF/views/");
            viewResolver.setSuffix(".jsp");
            return viewResolver;
        }
    }

    FreeMarkerViewResolver

    FreeMarkerViewResolver 用于解析FreeMarker 模板,它會將邏輯視圖名稱加上前綴和后綴,例如將邏輯視圖名稱 “hello” 解析為 “/WEB-INF/views/hello.ftl”。

    @Configuration
    @EnableWebMvc
    @ComponentScan(basePackages = "com.example.controller")
    public class AppConfig {
        @Bean
        public FreeMarkerViewResolver viewResolver() {
            FreeMarkerViewResolver viewResolver = new FreeMarkerViewResolver();
            viewResolver.setPrefix("/WEB-INF/views/");
            viewResolver.setSuffix(".ftl");
            return viewResolver;
        }
    }

    TilesViewResolver

    TilesViewResolver 用于解析 Tiles 布局,它會將邏輯視圖名稱解析為 Tiles 布局,并返回給 DispatcherServlet 進行渲染。Tiles 是一個基于模板的布局框架,可以將頁面分成多個部分,每個部分都是一個獨立的模板,最終組合成一個完整的頁面。

    @Configuration
    @EnableWebMvc
    @ComponentScan(basePackages = "com.example.controller")
    public class AppConfig {
        @Bean
        public TilesConfigurer tilesConfigurer() {
            TilesConfigurer tilesConfigurer = new TilesConfigurer();
            tilesConfigurer.setDefinitions(new String[] { "/WEB-INF/tiles.xml" });
            return tilesConfigurer;
        }
        @Bean
        public TilesViewResolver viewResolver() {
            TilesViewResolver viewResolver = new TilesViewResolver();
            return viewResolver;
        }
    }

    ContentNegotiatingViewResolver

    ContentNegotiatingViewResolver 是一個復合視圖解析器,它可以根據請求的 Accept 頭信息來判斷客戶端需要的數據類型,并選擇對應的視圖解析器進行解析。例如客戶端請求的 Accept 頭信息為 “application/json”,則選擇使用 MappingJackson2JsonView 解析器將模型數據渲染成 JSON 格式返回給客戶端。

    @Configuration
    @EnableWebMvc
    @ComponentScan(basePackages = "com.example.controller")
    public class AppConfig {
        @Bean
        public ContentNegotiatingViewResolver viewResolver() {
            ContentNegotiatingViewResolver viewResolver = new ContentNegotiatingViewResolver();
            List<ViewResolver> viewResolvers = new ArrayList<>();
            viewResolvers.add(jsonViewResolver());
            viewResolver.setViewResolvers(viewResolvers);
            return viewResolver;
        }
        @Bean
        public MappingJackson2JsonViewResolver jsonViewResolver() {
            MappingJackson2JsonViewResolver jsonViewResolver = new MappingJackson2JsonViewResolver();
            return jsonViewResolver;
        }
    }

    源碼實現

    Spring MVC 中的視圖解析器是通過 ViewResolver 接口來實現的,該接口定義了兩個方法:

    public interface ViewResolver {
        View resolveViewName(String viewName, Locale locale) throws Exception;
        String REDIRECT_URL_PREFIX = "redirect:";
        String FORWARD_URL_PREFIX = "forward:";
    }

    其中,resolveViewName 方法接收一個邏輯視圖名稱和一個 Locale 對象作為參數,返回一個 View 對象。如果找不到對應的 View 對象,則返回 null。

    對于 InternalResourceViewResolver 而言,它的 resolveViewName 方法實現如下:

    @Override
    public View resolveViewName(String viewName, Locale locale) throws Exception {
        String prefix = getPrefix();
        String suffix = getSuffix();
        if (viewName.startsWith(REDIRECT_URL_PREFIX)) {
            String redirectUrl = viewName.substring(REDIRECT_URL_PREFIX.length());
            RedirectView redirectView = new RedirectView(redirectUrl, isRedirectContextRelative(), isRedirectHttp10Compatible());
            String[] hosts = StringUtils.toStringArray(getRedirectHosts());
            if (hosts.length > 0) {
                redirectView.setHosts(hosts);
            }
            return redirectView;
        }
        if (viewName.startsWith(FORWARD_URL_PREFIX)) {
            String forwardUrl = viewName.substring(FORWARD_URL_PREFIX.length());
            InternalResourceView forwardView = new InternalResourceView(forwardUrl);
            forwardView.setApplicationContext(getApplicationContext());
            forwardView.setServletContext(getServletContext());
            forwardView.setAttributesMap(getAttributesMap());
            return forwardView;
        }
        if (!viewName.startsWith(prefix) && !viewName.endsWith(suffix)) {
            viewName = prefix + viewName + suffix;
        }
        return buildView(viewName);
    }

    在上面的代碼中

    首先判斷邏輯視圖名稱是否以 redirect: 或 forward: 開頭,如果是就返回 RedirectView 或 InternalResourceView 對象。

    如果不是,則根據 prefix 和 suffix 屬性將邏輯視圖名稱轉換為物理視圖名稱。

    到此,相信大家對“SpringMVC ViewResolver視圖解析器組件怎么用”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

    向AI問一下細節

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    AI

    长子县| 平江县| 临洮县| 黎城县| 民乐县| 德庆县| 定远县| 治多县| 商都县| 聂荣县| 沁源县| 漳州市| 龙川县| 宁强县| 凉城县| 武安市| 长兴县| 新沂市| 高唐县| 横峰县| 大丰市| 邯郸县| 博湖县| 重庆市| 太原市| 奎屯市| 平原县| 福海县| 东莞市| 威远县| 金溪县| 敖汉旗| 铜梁县| 福州市| 淳化县| 嘉荫县| 景宁| 曲周县| 柳州市| 巢湖市| 雅江县|