MVC的雜亂筆記

SpringMVC簡單筆記css

主要是學習一下Controller和View的設計,起碼寫的規範點html

筆記部分來自簡短的精通Spring MVC4,剛好書裏也是用Spring Boot的,很適合上手
因爲時間跨度比較大(大概2 3個月),因此可能會記錄一些蠢到爆的問題。。前端

@SpringBootApplication 是@Configuration、@EnableAutoConfiguration 和 @ComponentScan的組合java

@Configuration代表咱們的這個類將會處理 Spring 的常規配置,如 bean 的聲明jquery

@ComponentScan它會告訴 Spring 去哪裏查找 Spring 組 件(服務、控制器等)。在默認狀況下,這個註解將會掃描當前包以及該包下面的全部 子包web

@EnableAutoConfiguration 註解,它會指導 Spring Boot 發揮其魔力。若是你將其移除掉的話,就沒法從 Spring Boot 的自動配置中收益了spring

XML經常使用配置(Spring Boot中並不須要,但要求瞭解)數據庫

通常來說,初始的步驟以下所示:
1.初始化 Spring MVC 的 DispatcherServlet;
2.搭建轉碼過濾器,保證客戶端請求進行正確地轉碼;
3.搭建視圖解析器(view resolver),告訴 Spring 去哪裏查找視圖,以及它們是使用哪 種方言編寫的(JSP、Thymeleaf 模板等);
4.配置靜態資源的位置(CSS、JS);
5.配置所支持的地域以及資源 bundle;
6.配置 multipart 解析器,保證文件上傳可以正常工做;
7.將 Tomcat 或 Jetty 包含進來,從而可以在 Web 服務器上運行咱們的應用;
8.創建錯誤頁面(如 404)。segmentfault

properties中後端

debug=true Spring Boot 自動配置報告

server.port 屬性或者定義名爲 SERVER_PORT 的環境變量,咱們能夠修改默認的 HTTP 端口中定義 server.port 屬性或者定義名爲 SERVER_PORT 的環境變量,咱們能夠修改默認的 HTTP 端口

配置SSL

server.port = 8443 
server.ssl.key-store = classpath:keystore.jks 
server.ssl.key-store-password = secret 
server.ssl.key-password = another-secret

其它已經默認配好的配置

在 JacksonAutoConfiguration 中,聲明使用 Jackson 進行 JSON 序列化;

在HttpMessageConvertersAutoConfiguration 中,聲明瞭默認的HttpMessageConverter;

在 JmxAutoConfiguration 中,聲明瞭 JMX 功能。

模型是由Spring MVC 的Model 或ModelAndView 封裝的簡單 Map。

它能夠來源於數據庫、文件、外部服務等,這取決於你如何獲取數據並將其放到模型

經過使用@RequestMapping 註解,控制器可以聲明它們會根據 HTTP 方法(如 GET 或 POST 方法)和 URL 來處理特定的請求。控制器就能夠肯定是在 Web 響應中直接寫入內容, 仍是將應用路由一個視圖並將屬性注入到該視圖中

純粹的 RESTful 應用將會選擇第一種方式,而且會在 HTTP 響應中直接暴露模型的JSON 或 XML 表述,這須要用到@ResponseBody 註解。在 Web 應用中,這種類型的架構 一般會與前端 JavaScript 框架關聯,如 Backbone.js、AngularJS 或 React。在這種場景中, Spring 應用只需處理 MVC 中的模型層。

在第二種方式中,模型會傳遞到視圖中,視圖會由模板引擎進行渲染,並寫入到響應 之中。

大概意思就是說前者是先後端分離的工做方式

爲了加快開發速度,在 application.properties 文件中添加該屬性:
spring.thymeleaf.cache=false
這將會禁止啓用視圖緩存,每次訪問的時候都會從新加載模板。

HTTP請求通過Dispatcher Servlet分派到Handler Mapping/Controller/View Resolver/View

一個典型的 HttpServlet 類,它會將 HTTP 請求分發給 HandlerMapping。 HandlerMapping 會將資源(URL)與控制器關聯起來

控制器上對應的方法(也就是帶有@RequestMapping 註解的方法)將會被調用。在這 個方法中,控制器會設置模型數據並將視圖名稱返回給分發器。

而後,DispatcherServlet 將會查詢 ViewResolver 接口,從而獲得對應視圖的實現。

(ThymeleafAutoConfiguration 將會爲咱們搭建視圖解析器)

經過查看ThymeleafProperties類,能夠知道視圖的默認前綴是「classpath:/templates/」, 後綴 是「.html」。

這就意味着,假設視圖名爲 resultPage,那麼視圖解析器將會在類路徑的 templates 目 錄下查找名爲 resultPage.html 的文件。

默認樣例下,ViewResolver 接口是靜態的,可是更爲高級的實現可以根據請求的 頭信息或用戶的地域信息,返回不一樣的結

視圖最終將會被渲染,其結果會寫入到響應之中。

訪問列表元素 list[0]
訪問 Map 條目 map[key]
三元運算符 condition ? 'yes' :'no'
Elvis 運算符 person ?: default 若是 person 的值爲空的話,將會返回 default
安全導航 person?.name 若是 person 爲空或其 name 爲空的話,返回 null
模板 'Your name is #{person.name}' 將值注入到字符串中
投影 ${persons.[name]} 抽取全部 persons 的 name,並將其放到一個列表中
選擇 persons.?[name =='Bob']' 返回列表中 name 爲 Bob 的 person
函數調用 person.sayHello()

數據傳遞到視圖的方式:model->return

請求參數獲取數據:@RequestParam->瀏覽器中?屬性寫入

經常使用required 和 defaultValue

目前進展P63

簡單的遍歷

<ul>
     <li th:each="tweet : ${tweets}" th:text="${tweet}">Some tweet</li>   
</ul>

添加jQuery

<script src="/webjars/jquery/2.1.4/jquery.js"></script>

視圖的head中加入CSS

<link href="/webjars/materializecss/0.96.0/css/materialize.css" type="text/css" rel="stylesheet" media="screen,projection"/>

模仿樣例P53

可重用頁面的設計(佈局)

default.html的部分

<html xmlns:th="http://www.thymeleaf.org"                xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"> 
<head>....</head>
<body> 
<section layout:fragment="content">   
    <p>Page content goes here</p> 
</section>
<script..>....</script>
</body>

對於result頁面

<!DOCTYPE html> 
<html xmlns:th="http://www.thymeleaf.org"  xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"   layout:decorator="layout/default"> 
<head lang="en">
    <title>Hello twitter</title> 
</head> 
<body>
<div class="row" layout:fragment="content"> 
    <h2 class="indigo-text center" th:text="|Tweet results for ${search}|">Tweets</h2> 
    <ul class="collection"> 
        .....

其中,layout:decorator="layout/default"可以代表去哪裏查找佈局。這樣,咱們能夠將內容注入到佈局的不一樣 layout:fragment 區域中。

注意這種方法已經不推薦了(被書坑了),應該使用th:insert替代,

一個更好的用例:https://segmentfault.com/a/1190000009903821#articleHeader1

簡單的錯誤彈出P75

關於請求的處理

Redirect/Forward 是典型的可選方案。它們都會改變展示給用戶的視圖,其中的區別在於 Redirect 會發送一個 302 頭信息,它會在瀏覽器內部觸發導航,而 Forward 則不會致使 URL 的變化。在 Spring MVC 中,咱們能夠任意使用這兩種方案,只需在方法返回的字符串上添加「redirect:」或「forward:」 前綴便可

GET的經常使用寫法

@RequestMapping("/result")   
public String hello(
        @RequestParam(defaultValue = "masterSpringMVC4") String search, 
        Model model) {
    SearchResults searchResults = twitter.searchOperations().search(search);
    List<Tweet> tweets = searchResults.getTweets();  
    model.addAttribute("tweets", tweets);  
    model.addAttribute("search", search);  return "resultPage";  
}

若是要修改表單,把method改成post(多了一個攔截postSearch的方法)

@RequestMapping(value = "/postSearch", method = RequestMethod.POST) 
public String postSearch(
        HttpServletRequest request,
        RedirectAttributes redirectAttributes) {  
    String search = request.getParameter("search");
    redirectAttributes.addAttribute("search", search);
    return "redirect:result"; 
}

RedirectAttributes 是一個 Spring 的模型,專門用於 redirect 場景下傳送值

一個更加魯棒的方法

@RequestMapping(value = "/postSearch", method = RequestMethod.POST) 
public String postSearch(
        HttpServletRequest request, 
        RedirectAttributes redirectAttributes) {  
    String search = request.getParameter("search");  
    if (search.toLowerCase().contains("struts")) {  //不容許出現的內容
        redirectAttributes.addFlashAttribute("error", "Try using spring instead!"); 
        return "redirect:/";  
    }  
    redirectAttributes.addAttribute("search", search);  
    return "redirect:result"; 
}

表單

@{}語法將會爲資源構建完整的路徑,它會將服務器上下文路徑

所以在thymeleaf中能夠用form th:action="@{...}"替代form action=..

DTO能夠直接使用POJO,只須要getter和setter進行數據綁定便可

具體查閱P82

校驗邏輯查閱P86

表單邏輯P99

P120

HTTP 會話(session)是用來在請求之間存儲信息的一種 方式。HTTP 是無狀態的協議,這就意味着沒有辦法將同一 用戶的兩個請求關聯起來。Servlet容器最經常使用的辦法是爲每 個用戶關聯一個名爲 JSESSIONID 的cookie。這個 cookie 將會經過請求頭信息進行傳輸,藉助這項技術容許用戶將 任意的對象存儲在 Map 中,也就是名爲 HttpSession 的抽 象形式。這樣的會話通常狀況下會在用戶關閉或切換 Web 瀏覽器,或者預約時間內用戶沒有活躍的動做時失效

能夠經過使用@SessionAttributes 註解,將對象放到了會話中 P115

@Controller @SessionAttributes("picturePath") public class PictureUploadController { }

在 Spring 中,將內容放到會話中的另一種流行方式就是爲 bean 添加@Scope ("session")註解。

表格的坑:

https://blog.csdn.net/ystyaoshengting/article/details/84773952

關於Controller的傳參 返回值,仍是參考MVC官方文檔

https://docs.spring.io/spring/docs/5.1.8.RELEASE/spring-framework-reference/web.html

大概在1.3.3

結果仍是看不太懂String View ModelAndView的關係。。。

感受上,String返回的是View的名字,交由由ViewResolver處理,而View能夠經過setter作到了String同樣拿到View的名字,但可能已經進一步解析,而ModelAndView可進一步設置view裏頭所依賴的model

關於傳參中的Model,是否須要名字一一對應?

關於@ModelAttribute

You can use the @ModelAttribute annotation on a method argument to access an attribute from the model or have it be instantiated if not present. The model attribute is also overlain with values from HTTP Servlet request parameters whose names match to field names. This is referred to as data binding, and it saves you from having to deal with parsing and converting individual query parameters and form fields. The following example shows how to do so:

@PostMapping("/owners/{ownerId}/pets/{petId}/edit")
public String processSubmit(@ModelAttribute Pet pet) { }

The Pet instance above is resolved as follows:

  • From the model if already added by using Model.
  • From the HTTP session by using @SessionAttributes.
  • From a URI path variable passed through a Converter (see the next example).
  • From the invocation of a default constructor.
  • From the invocation of a 「primary constructor」 with arguments that match to Servlet request parameters. Argument names are determined through JavaBeans @ConstructorProperties or through runtime-retained parameter names in the bytecode.
相關文章
相關標籤/搜索