2017年12月23日 星期六

轉換器 (Spring3.x MVC 五)

.指的是前端發出 request 到 controller 的轉換,spring 已經幫我們實作很多常用的,但如有特殊需求,就要自己寫了

官網連接 ,可以看出有三種方式

.目前只寫 converter,其他兩種有空再寫


※converter

※Java Bean

public class Book {
    private Integer id;
    private String name;
    private Integer price;
    // setter/getter...
    
    public Book() {}
    
    public Book(Integer id, String name, Integer price) {
        this.id = id;
        this.name = name;
        this.price = price;
    }
}

※假設前端傳三個值為 id@name@price 這樣的格式,所以我在此類有三個屬性

※轉換類

@Component
public class TestConverter implements Converter<String, Book> {
    @Override
    public Book convert(String source) {
        String[] array = source.split("@");
        return new Book(Integer.valueOf(array[0]), array[1], Integer.valueOf(array[2]));
    }
}



※spring 設定檔
<bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean" p:converters-ref="testConverter" />
<mvc:annotation-driven conversion-service="conversionService" />

※conversion-service 不加會 500


※測試

@RequestMapping("book")
public String pojo(@RequestParam("xxx") Book b) {
    System.out.println(b.getId());
    System.out.println(b.getPrice());
    System.out.println(b.getName());
    return "hello";
}
------------------------------
<a href="ooo/xxx/book.mvc?xxx=123@toy@500">bookTransfer</a>

※如果不合乎自訂的轉換要求,會出現 400,描述為「The request sent by the client was syntactically incorrect.

※注意:如果前端傳 Book 的屬性,如 id、name、price 只是給 Book 塞值,並不會去轉換



※傳特殊字元

public void bruceTest() throws UnsupportedEncodingException {
    final String encode = "UTF-8";
    final String and = URLEncoder.encode("&", encode);
    System.out.println(and);
    System.out.println(URLDecoder.decode(and, encode));
}
------------------------------
const and = encodeURIComponent("&");
console.log(and);
console.log(decodeURIComponent(and));

※上面是 java,下面是javascript,使用此方式,可以知道網址列的特殊字元的編碼為何

※假設想傳 ooo/xxx/book.mvc?xxx=123&toy&500,但「&」是 get 請求的關鍵字,所以要用「%26」取代,變成 ooo/xxx/book.mvc?xxx=123%26toy%26500

沒有留言:

張貼留言