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

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

自定義WebDataBinder的初始化

為了在Spring的WebDataBinder裡,使用PropertyEditors來自定義請求引數的繫結,你能在你的controller中,使用@InitBinder方法,或在@ControllerAdvice註解了的類中使用@InitBinder,或者自己實現WebBingdingInitializer來自定義請求引數繫結。詳見”使用@ControllerAdvice對controller做橫切通知”這一章節。

使用@InitBinder自定義資料繫結

在controller中的方法上寫上@InitBinder,可以在你的controller類上直接配置web資料繫結。@InitBinder可以識別出初始化了WebDataBinder的方法,這個初始化了的WebDataBinder物件會被註解過的handler處理器方法的指令和表單物件入參所填充。

       這個init-binder(初始化繫結的)方法與@RequestMapping支援的入參型別相同。除了指令/表單物件和匹配驗證結果的物件外,這個初始化繫結的方法必須無返回值。因此,它們通常被宣告為void。一般來講,與WebRequest或java.util.Local結合的WebDataBinder入參,允許在程式碼中註冊特定context的編輯器。

       下面的例子展示了使用@InitBinder來為所有java.util.Data表單屬性配置一個CustomDataEditor。

       在Spring4.2中,可以考慮使用addCustomFormatter來定義Formatter實現,來代替使用PropertyEditor例項。同時,當你在一個共享的FormattingConversionService中存在一個基於Formatter的組織結構時,這也是特別有用的,稍微調整一下繫結規則就可在特定controller中以同樣的方式進行復用。

@Controller
public class MyFormController {
 
    @InitBinder
    public void initBinder(WebDataBinder binder) {
        binder.addCustomFormatter(new DateFormatter("yyyy-MM-dd"));
    }
 
    // ...
}

配置一個自定義的WebBindingInitializer

       為了實現繫結的初始化,你能夠通過實現WebBindingInitializer介面來自定義它。之後,需要為AnnotationMethodHandlerAdapter提供一個自定的bean配置,因此,需要覆寫配置文件中預設的配置。

       下面的例子來自於PetClinic應用,這個配置例子自定義實現了WebBindingInitializer介面,還有在PetClinic應用中,配置了PropertyEditors的controller所需的org.springframework.samples.petclinic.web.ClinicBindingInitialzier。

<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
    <property name="cacheSeconds" value="0"/>
    <property name="webBindingInitializer">
        <bean class="org.springframework.samples.petclinic.web.ClinicBindingInitializer"/>
    </property>
</bean>

       在@ControllerAdvice註解了的類中也能定義@InitBinder方法來匹配對應的controller。這種定義的方法使用了WebBindingInitializer的另一種方式。詳見”使用@ControllerAdvice對controller做橫切通知”。

使用@ControllerAdvice對controller做advice(橫切通知)

@ControllerAdvice的實現類能夠通過classpath掃描自動檢測到。當使用MVC 名稱空間或 MVC  java配置時,這是被自動啟用的。

       註解了@ControllerAdvice的類可以包含@ExceptionHandler,@InitBinder和@ModelAttribute方法。這些方法能夠應用到所有controller結構中的@RequestMapping方法上,而不單是在它所在的類中。

       @ControllerAdvice註解也能指定特定controller,這些controller可以帶有它的屬性:

// 指定所有註釋了@RestController的controller
@ControllerAdvice(annotations = RestController.class)
public class AnnotationAdvice {}
 
// 指定特定包下的所有controller
@ControllerAdvice("org.example.controllers")
public class BasePackageAdvice {}
 
// 指定所有可指定的特定類
@ControllerAdvice(assignableTypes = {ControllerInterface.class, AbstractController.class})
public class AssignableTypesAdvice {}

       詳見@ControllerAdvice的說明文件

Jackson 序列化檢視的支援

有些時候,過濾那些要在HTTP響應主體中被序列化的context化的物件是很有用的。為了提供這種功能,Spring MVC內建了對使用Jackson’s  Serialization View渲染的支援。

       當與@ResponseBody的controller方法或返回了ResponseEntity的controller方法配合使用時,可以新增@JsonView,這個@JsonView裡帶有需要使用的檢視類或介面的入參:

@RestController
public class UserController {
 
    @RequestMapping(path = "/user", method = RequestMethod.GET)
    @JsonView(User.WithoutPasswordView.class)
    public User getUser() {
        return new User("eric", "7!jd#h23");
    }
}
 
public class User {
 
    public interface WithoutPasswordView {};
    public interface WithPasswordView extends WithoutPasswordView {};
 
    private String username;
    private String password;
 
    public User() {
    }
 
    public User(String username, String password) {
        this.username = username;
        this.password = password;
    }
 
    @JsonView(WithoutPasswordView.class)
    public String getUsername() {
        return this.username;
    }
 
    @JsonView(WithPasswordView.class)
    public String getPassword() {
        return this.password;
    }
}

小提示:

         請注意,雖然@JsonView可以指定多個類,但是在controller方法上使用時只支援一個類的入參。如果需要啟用多個檢視類,可以指定其使用的介面來實現。

對於依賴於檢視解析的controller,可以在模型中新增這個序列化的檢視類:

@Controller
public class UserController extends AbstractController {
 
    @RequestMapping(path = "/user", method = RequestMethod.GET)
    public String getUser(Model model) {
        model.addAttribute("user", new User("eric", "7!jd#h23"));
        model.addAttribute(JsonView.class.getName(), User.WithoutPasswordView.class);
        return "userView";
    }
}

Jackson JSONP支援

       為了在@ResponseBody方法和返回ResponseEntity的方法中啟用JSONP的支援,可以宣告繼承了AbstractJsonpResponseBodyAdvice的@ControllerAdvice的bean,下面的例子展示了在這個構造器入參中,在何處指定JSONP的查詢引數名。

@ControllerAdvice
public class JsonpAdvice extends AbstractJsonpResponseBodyAdvice {
 
    public JsonpAdvice() {
        super("callback");
    }
}

       對於依賴於檢視解析的controller,當請求中存在命名為jsonp或callback的查詢引數時,JSONP會自動啟用,你也能夠在jsonParameterNames屬性中自定義這些命名。

相關推薦

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

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框架(20)

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

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 Boot 官方參考

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

《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 Framework 4.x 參考 (一)Spring 入門

第一部分 Spring 框架概覽 Spring框架是您建立企業級應用的輕量級解決方案與具有潛力的一站式商店。不過,Spring是模組化的,允許你只使用需要的部分,而不必帶上其他部分。你可以使用IoC容器,頂層用任意web框架,你也可以只使用Hibernate整