2016年1月30日 星期六

Java Bean、參數、返回值 (Spring3.x MVC 二)

※Java Bean


public class Book {
    private int id;
    private String name;
    private ComicBook comicBook;
    
    // setter/getter...
}
------------------------------
public class ComicBook {
    private String name;
    
    // setter/getter...
}




@RequestMapping("book")
public String pojo(Book book) {
    System.out.println(book.getId());
    System.out.println(book.getName());
    System.out.println(book.getComicBook().getName());
    return "hello";
}

※傳到 controller 後,只要名稱符合 java bean 裡面的名字,就會抓的到


<a href="ooo/xxx/book.mvc?id=99&name=漫畫&comicBook.name=七龍珠">pojo</a>





※接受的參數

官方文件有說明,有一些上一篇也說過了,

Servlet API 

有 9 個:
.ServletRequest
.ServletResponse
.HttpSession
.Principal
.Locale
.InputStream
.Reader
.OutputStream
.Writer

@RequestMapping("api")
public String api(
    ServletRequest req, 
    ServletResponse res, 
    HttpSession session, 
    Principal principal, 
    Locale locale,
    InputStream is, 
    // Reader reader, 
    // OutputStream out,
    Writer writer) {
    
    System.out.println(req);
    System.out.println(res);
    System.out.println(session);
    System.out.println(principal);
    System.out.println(locale);
    System.out.println(is);
    // System.out.println(reader);
    // System.out.println(out);
    System.out.println(writer);
    return null;
}

※注意 XXX has already been called for this response,IO 的 InputStream 和 Reader 只能選其中一個; OutputStream 和 Writer 也只能選其中一個

※在 controller 第一行下繼點後,下面第 2 個 Annotation

※第二個 for  迴圈裡 resolveHandlerArguments 會看到判斷 annotation 的程式碼
RequestParam
RequestHeader
RequestBody
CookieValue
PathVariable
ModelAttribute
Value
Valid 開頭的
所以在參數裡,可以用以上這幾個 annotation

再往下看有一個 if,裡面有個方法 resolveCommonArgument
進去後,再找到 resolveStandardArgument,按 Open Implementation 就能看到這 9 個判斷

※測試
<a href="ooo/xxx/api.mvc">servlet api</a>


※Model

@RequestMapping("model")
public String model(Model model) {
    System.out.println(model.getClass().getName());
    model.addAttribute("m", Stream.of("ddd", "eee", "fff").collect(Collectors.toList()));
    return "hello";
}



※測試
---------- index.jsp ----------
<a href="ooo/xxx/model.mvc">model</a>
    
    
---------- hello.jsp ----------
m:${requestScope.m}



※Map

@RequestMapping("map")
public String map(Map<String, Object> map) {
    map.put("ooo", Stream.of("aaa", "bbb", "ccc").collect(Collectors.toList()));
    return "hello";
}



※測試
---------- index.jsp ----------
<a href="ooo/xxx/map.mvc">map</a>
    
    
---------- hello.jsp ----------
ooo:${requestScope.ooo}

※ModelMap 當然也可以,因為它是 Map 的子類

※從ExtendedModelMap 分開來的



※接受的返回值


官方文件


※ModelAndView

@RequestMapping("modelView")
public ModelAndView mv() {
    ModelAndView mav = new ModelAndView();
    // mav.setViewName("/WEB-INF/hello.jsp");
    mav.setViewName("hello");
    mav.addObject("xxx", "yeah");
    return mav;
}

※setViewName 的內容和 上一篇說的 InternalResourceViewResolver (Spring 設定檔裡) 有關

※也可使用建構子 new ModelAndView("hello");

※測試
---------- index.jsp ----------
<a href="ooo/xxx/modelView.mvc">modelAndView</a>
    
    
---------- hello.jsp ----------
xxx:${requestScope.xxx}



沒有留言:

張貼留言