1. 程式人生 > >Spring4.x官方參考文件中文版——第21章 Web MVC框架(20)

Spring4.x官方參考文件中文版——第21章 Web MVC框架(20)

21.7 URI的組建

Spring MVC提供了一種機制,可以使用UriComponentsBuilder和UriComponents來組建並編碼URI。

       如下例所示,你能擴充套件並編碼一個URI模板的字串:

UriComponents uriComponents =UriComponentsBuilder.fromUriString(
       "http://example.com/hotels/{hotel}/bookings/{booking}").build();
 
URI uri = uriComponents.expand("42", "21").encode().toUri();

       注意,UriComponents是不可變的,而expand()和encode()操作,在必要的時候,會返回新的例項。

       你也可以使用獨立的URI元件來擴充套件並編碼URI:

UriComponents uriComponents =UriComponentsBuilder.newInstance()
       .scheme("http").host("example.com").path("/hotels/{hotel}/bookings/{booking}").build()
       .expand("42", "21")
       .encode();

       在Servlet環境下,ServletUriComponentBuilder的子類提供了一個靜態工廠方法,這個方法可以從Servlet請求中,複製有效的URL資訊。如下:

HttpServletRequest request = ...
 
// 重用原request中的host,scheme格式,埠,路徑和查詢引數的字串
// 替換掉"accountId" 的查詢引數值
 
ServletUriComponentsBuilder ucb =ServletUriComponentsBuilder.fromRequest(request)
       .replaceQueryParam("accountId", "{id}").build()
       .expand("123")
       .encode();

       此外,你也可以選擇拷貝可用資訊中的一部分,並追加到context路徑後面:

// 重用host,port(埠)和context路徑
// 把"/accounts"追加到路徑後面
 
ServletUriComponentsBuilder ucb =ServletUriComponentsBuilder.fromContextPath(request)
       .path("/accounts").build()

        或者,在DispatcherServlet已基於名字進行了對映時(比如/main/*這種),你也可以獲得servlet對映所包含的部分值,如下:

// 重用 host, port,context path
// 追加servlet對映到路徑下的部分值
// 追加"/accounts" 到路徑上
 
ServletUriComponentsBuilder ucb =ServletUriComponentsBuilder.fromServletMapping(request)
       .path("/accounts").build()

21.7.1 組建連線到controller和方法的URI

Spring MVC提供了一種機制,能組建連線到controller的方法中的連結,如下例所示:

UriComponents uriComponents = MvcUriComponentsBuilder
   .fromMethodName(BookingController.class, "getBooking", 21).buildAndExpand(42);
 
URI uri = uriComponents.encode().toUri();

       在上面的例子中,我們提供了實際的方法入參值,在此情況下,這個長整形值21會被看作路徑變數來使用,並且把它新增到URL中。此外,我們提供了42這個值,用來填補在URI中剩餘的變數,比如從類級別請求對映中繼承的”hotel”變數。如果在這個方法裡有更多的入參,你能夠為那些URL並不需要的入參設定為null。一般來說,只有@PathVariable和@RequestParam的入參與構建URL相關。

       還有一種額外的方法來使用MvcUriComponentsBuilder。例如:你可以使用某種類似mock測試的技術,這種技術通過代理來避免基於名稱來參考匹配控制器的方法。(下面的例子假設靜態匯入了MvcUriComponentsBuilder.on):

UriComponents uriComponents =MvcUriComponentsBuilder
   .fromMethodCall(on(BookingController.class).getBooking(21)).buildAndExpand(42);
 
URI uri = uriComponents.encode().toUri();

       上面的例子使用MvcUriComponentsBuilder中的靜態方法。在這個方法內部,它們依賴於ServletUriComponentsBuilder來從現存的請求中,根據它的scheme(結構), host, port(埠),context路徑和servlet路徑,準備好URL。再多數情況下,這樣效果很好,但有些情況下,可能會效率低下。例如:你可能會在請求的context的外面(比如:連結準備時的批量處理過程)或者你需要插入一個路徑的字首(例如: 本地字首從請求路徑中被移除了,並且需要重新新增到連結中)。

       在這種情況下,你可以使用靜態的”fromXxx”過載的方法來允許一個UriComponentsBuilder來使用URL。或者,你可以建立一個帶有URL的MvcUriComponentsBuilder的例項,然後使用這個例項的”withXxx”的方法,例如: 

UriComponentsBuilder base = ServletUriComponentsBuilder.fromCurrentContextPath().path("/en");
MvcUriComponentsBuilder builder = MvcUriComponentsBuilder.relativeTo(base);
builder.withMethodCall(on(BookingController.class).getBooking(21)).buildAndExpand(42);
 
URI uri = uriComponents.encode().toUri();

21.7.2 在檢視中組建連線到controller和方法中的URI

       你同樣可以從類似JSP,Thymeleaf, FreeMarker等檢視中,組建連結到註解式controller中。可以通過使用MvcUriComponentsBuilder中的fromMappingName方法來實現,這個方法是基於名字來進行對映的。

       每一個@RequestMapping都被賦予了一個預設名,這個名字預設是類名中的大寫字母加上方法名的全稱。例如,有個方法叫”getFoo”,這個方法在FooController中,那麼這個預設名就是”FC#getFoo”。這種命名的策略還可以通過建立HandlerMethodMappingNamingStrategy的例項,並把這個例項加入進你的RequestMappingHandlerMapping中來進行自定義。這種預設策略的實現,也會在@RequestMapping中的name屬性存在時進行使用。這表示,預設指定的對映名與另一個名字衝突的時候(比如:過載的方法),你可以在@RequestMapping上顯式地為其指定一個名字。

請注意:

       這些被指定了的請求對映名會在啟動時的TRACE級別記錄日誌。

       Spring的JSP標籤庫提供了一個叫做mvcUrl的功能,這個功能能基於它的的機制,來把需要連線到controller方法的連結準備到位。如下例:

@RequestMapping("/people/{id}/addresses")
public class PersonAddressController {
 
    @RequestMapping("/{country}")
    public HttpEntity getAddress(@PathVariable String country) { ... }
}

       你能夠為其準備好一個連結,如下:

<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
...
<a href="${s:mvcUrl(''PAC#getAddress'').arg(0,''US'').buildAndExpand(''123'')}">Get Address</a>

       上面的例子中,依賴了在JSP中聲明瞭Spring標籤庫(比如META-INF/spring.tld)的 mvcUrl這個功能。若需處理更多進階的情況(比如在上一節講到過的自定義URL),為了使用擁有一個自定基礎URL的特定的MvcUriComponentsBuilder例項,來自定義一個功能,或者是使用自定義的標籤檔案,都是很方便的。

相關推薦

Spring4.x官方參考中文版——21 Web MVC框架(20)

21.7 URI的組建 Spring MVC提供了一種機制,可以使用UriComponentsBuilder和UriComponents來組建並編碼URI。        如下例所示,你能擴充套件並編碼一個URI模板的字串: UriComponents uriCompone

Spring4.x官方參考中文版——21 Web MVC框架(32)

21.16.2 對提供的配置進行定製為了在Java中定製預設的配置,你只需實現WebMvcConfigurer介面,或者繼承WebMvcConfigurerAdapter並覆寫你需要的方法:@Configuration @EnableWebMvc public class W

Spring4.x官方參考中文版——21 Web MVC框架(16)

21.5.2 串聯多個ViewResolver Spring支援多個檢視解析器。因此,你能夠串聯多個解析器,也可以在特定情況下覆寫特定的檢視。你可以通過在你的應用中的context中新增多個解析器來把這些檢視解析器串聯起來。此外,如果有必要的話,還可以設定order屬性來指

Spring4.x官方參考中文版——21 Web MVC框架(22)

21.9 主題(theme)的使用 21.9.1 主題概況 你能夠使用Spring Web MVC框架在你的應用中設定全域性生效的主題,從而提升使用者的體驗。主題是那些影響著應用裡視覺樣式的靜態資源(一般是表的樣式和影象)的集合。 21.9.2 主題的定義 為了在你的web

Spring4.x官方參考中文版——21 Web MVC框架(19)

21.6 使用flash attribute(flash屬性) Flash屬性為一個請求提供了儲存屬性的方式,這些儲存的請求可以在另一個請求中使用。當重定向時,比如在Post/Redirect/Get模式下的時候,這種需求是很普遍的。flash屬性會在重定向之前暫存(一般是

Spring 4.x官方參考中文版——21 Web MVC框架(11)

自定義WebDataBinder的初始化 為了在Spring的WebDataBinder裡,使用PropertyEditors來自定義請求引數的繫結,你能在你的controller中,使用@InitBinder方法,或在@ControllerAdvice註解了的類中使用@I

Spring 4.x官方參考中文版——21 Web MVC框架(10)

使用@SessionAttributes來儲存請求中HTTP session的model attribute(模型屬性)         類級別的@SessionAttributes聲明瞭session attributes會被特定的handler處理器所使用。它會把儲存

Spring 4.x官方參考中文版——21 Web MVC框架(8)

支援的方法返回引數型別        以下是支援的方法返回引數型別:ModelAndView : 這個物件由包括了指令物件的model模型,和帶@ModelAttribute註解的資料訪問方法的返回結果組成。Model : 模型物件,由通過RequestToViewName

Spring 4.x官方參考中文版——21 Web MVC框架(15)

21.5 檢視的解析 所有web應用的MVC框架都提供了指定檢視地址的方法。Spring提供了檢視解析器,這可以讓你在瀏覽器裡渲染model(模型),而不必與其他檢視技術繫結。不止如此,Spring還允許你使用如:JSP,Velocity模板和XSLT檢視等技術,需要了解更

Spring 4.x官方參考中文版——21 Web MVC框架(4)

21.3實現Controller控制器 Controller控制器可以為你在一個服務介面中定義好的應用行為提供訪問權。controller控制器可以理解使用者的輸入行為,並且把其轉化為一個可以通過檢視呈現給使用者的model模型。Spring是以一種十分抽象的方式來實現的c

《Python3.6官方》– 12 虛擬環境和包

原文連結   譯者:Carvendy 12. 虛擬環境和包 12.1 介紹   Python應用程式總會使用一些包和模組,它們離不開標準庫。應用程式需要指定標準庫的版本,因為應用程式可能需要避免一個已經修復的bug,或者是應用程式重寫了具體版本標準庫的介面的實現。   這意味著也許不可能需要給

《Python3.6官方》–

作業系統介面 os 模組提供一系列與作業系統進行互動的函式。 import os os.getcwd()      # 返回當前工作目錄 os.chdir('/server/accesslogs')   #  修改當前工作目錄 os.system('mkdir today')   # 在

《Python3.6官方》– 13 接下來

原文連線 13 章 接下來    讀到個別的指南,也許你已經迫不及待想使用python了——你渴望使用Python來解決現實發生的問題。你應該從何學習得更多呢?   指南是Python文件的一部分。其他的文件如下:    你應該瀏覽本手冊,裡面提供完整的(雖然簡潔)關於標準庫的型別,函式,和

《KAFKA官方:快速入門

快速入門 本教程假設讀者完全從零開始,電腦上沒有已經存在的Kafka和Zookeeper環境。以下內容需要注意的是:因為在類Unix平臺和Windows平臺上的Kafka控制指令碼不同,在Windows平臺上,需要使用路徑\bin\windows代替/bin,指令碼副檔名改為.bat。 第

《HttpClient官方 HTTP 快取

原文連結 譯者[xuheyang] 第六章. HTTP快取 6.1. 通用概念 HttpClient Cache 提供了用HttpClient(等效瀏覽器快取的Java實現)來相容HTTP / 1.1的快取層。實現遵循責任鏈模式,HttpClient快取的實現類可以替代預設無快取的HttpClient;完全

《HttpClient 官方 Fluent API

原文連結  譯者[white] 第五章:流式 API 5.1 易用 API 介面 4.2版本的 HttpClient 帶來了一組非常容易使用的流式 API(Fluent API) 介面。暴露的流式API(Fluent API) 介面中僅僅是 HttpClient 最基本的一些功能,這些介面是在

《HttpClient 官方 HTTP 狀態管理

原文連結 譯者[陳志軍] 通常 HTTP 被設計為無狀態,面向請求/響應的協議,對於有一些邏輯相關的請求/響應交換的有狀態會話沒有特別的規定。正當 HTTP 協議越來越流行和被認可,越來越多之前沒有打算使用它的系統,現在也開始為了應用程式而使用它。例如電子商務應用的內容傳輸。因此,支援 HTT

Spring Boot 官方參考

Appendix A. Common application propertiesVarious properties can be specified inside your application.properties/application.yml file or as command line swi

《精通Spring4.x企業應用開發實戰》

  這一章節主要介紹SpringBoot的使用,也是學習的重點內容,之後就打算用SpringBoot來寫後臺,所以提前看一下還是很有必要的。   3.SpringBoot概況 3.1.1SpringBoot發展背景   Spring Boot的出現。Spring Boot可讓開發人員不再需要編寫複雜的XML配