※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}
※


沒有留言:
張貼留言