摘要:不過可以切換到版本,兼容性未知。注解一旦添加了依賴會判斷這是一個應用,并啟動一個內嵌的容器默認是用于處理請求。注意中空字符串與的區別。
環境:Spring Boot 1.5.4
基于 Spring Boot 可以快速創建一個Web & Restful 應用,在開始應用之前,至少要了解以下用法:
定義路由,定義 HTTP 方法
獲取Header、GET、POST、路徑等參數
Cookie、Session操作
應用一個模板引擎,選擇 Thymeleaf
獲取表單數據,以及文件上傳數據
完成一個登陸、登出、注冊流程
增加以下兩個依賴即可完成構建:
org.springframework.boot spring-boot-starter-thymeleaf org.springframework.boot spring-boot-starter-web
注意:當前版本默認選擇的 Thymeleaf 是 2.x 版本的,對html 標簽閉合性要求比較高,雖然可以通過設置 mode,改變解析方式,但是還要引入額外的 nekoHTML,所以很蛋疼。不過可以切換到 3.x 版本,兼容性未知。
注解3.0.2.RELEASE 2.1.1
一旦添加了 spring-boot-starter-web 依賴 Spring Boot 會判斷這是一個Web 應用,并啟動一個內嵌的Servlet容器(默認是Tomcat)用于處理HTTP請求。
Spring 框架中關于 Web 應用有大量的注解:
@Controller
注解一個 Web 控制器類,框架會將 Servlet 容器里收到的 HTTP 請求根據路徑分發給對應的 Controller 類進行處理
@RestController
注解一個 Restful 控制器,默認會自動返回 JSON
@RequestMapping
注解一個路由,如果定義在類上,相當于一個路由組,最終路由是類+方法路由,參數有路由規則和 HTTP 方法,同時還有一些簡寫形式如:@GetMapping,@PutMapping
@PathVariable
注解路徑參數,如 /user/{id}
@RequestParam
注解請求參數,如 ?user=a 或 post["user"] = a
@RequestBody
注解請求體
@RequestHeader
注解請求header頭
@CookieValue
注解一個Cookie值
@SessionAttribute
注解一個Session值
下面代碼對應了兩個路由:
/ 使用 @ResponseBody 注解,所以返回了文本串
/hello 返回表示模板的字符串,將會使用 resources/templates/hello.html 模板渲染
@Controller public class IndexController { @RequestMapping("/") @ResponseBody public String index() { return "Spring Boot Index"; } @RequestMapping("/hello") public String hello(Model model) { model.addAttribute("title", "Spring Boot"); return "hello"; } }
這段代碼對應了 /rest/ 路由。注意 @RequestMapping 中空字符串與 "/" 的區別。
使用空,則 /rest 與 /rest/ 都可以訪問,使用 / 則必須通過 /rest 訪問:
@RestController @RequestMapping("/rest") public class RestfulController { @RequestMapping("") public String index() { return "Hello Rest"; } }
hello.html:
請求參數 單一參數title h1
@RequestParam 可以用來注解一個請求參數,默認會合并 GET、POST 請求名相同的參數,變成一個數組,所以下面的 text2 會進行數組 -> String 的轉型。
@RequestMapping(value = "/get", method = {RequestMethod.GET, RequestMethod.POST}) @ResponseBody public String get(@RequestParam("text1") String text1, @RequestParam("text2") String text2) { return text1 + "/" + text2; }
在這里不使用注解同樣可以獲得數據,那為什么要使用注解呢? 因為 @RequestParam 主要提供了一些額外的功能:
如參數名->變量名的映射,required 檢查等,更嚴謹一些。
@RequestMapping(value = "/getsimple", method = {RequestMethod.GET, RequestMethod.POST}) @ResponseBody public String getSimple(String text1, String text2) { return text1 + "/" + text2; }參數列表
除了使用 @RequestParam 注解獲取單個參數意外,還可以獲取一個參數列表,但這種方式,POST 不會合并 GET 中的同名參數:
@RequestMapping("/getmap") @ResponseBody public String getMap(@RequestParam Map額外參數列表gets) { return gets.toString(); }
除了注解獲取數據以外,我們還可以通過向 Controller 中的方法,注入 Servlet 相關的類,來獲取一些額外的參數,比如客戶端 IP 地址
@RequestMapping("/request") @ResponseBody public String request(HttpServletRequest request) { HashMapCookierequests = new HashMap<>(); requests.put("Method", request.getMethod()); requests.put("QueryString", request.getQueryString()); requests.put("RequestURI", request.getRequestURI()); requests.put("getRequestURL", request.getRequestURL().toString()); requests.put("RemoteAddr", request.getRemoteAddr()); return requests.toString(); }
Cookie 的操作其實和 Spring 沒有太大的關系,不過Spring 提供了一個 @CookieValue 注解用來快速獲取 Cookie 值
通過 HttpServletResponse 設置頁面的 Cookie:
@RequestMapping("/setcookie") @ResponseBody public String setCookie(HttpServletResponse response) { Cookie cookie1 = new Cookie("cookie1", "value1"); cookie1.setMaxAge(1800); Cookie cookie2 = new Cookie("cookie2", "value2"); cookie2.setMaxAge(3600); response.addCookie(cookie1); response.addCookie(cookie2); return "cookie set ok"; }
通過 HttpServletRequest 或 @CookieValue 注解獲取 Cookie:
@RequestMapping("/getcookie") @ResponseBody public String getCookie(HttpServletRequest request, @CookieValue(value = "cookie1", required = false) String cookie1) { HashMapmap = new HashMap<>(); Cookie[] cookies = request.getCookies(); if (cookies != null) { for (Cookie cookie : cookies) { map.put(cookie.getName(), cookie.getValue()); } } logger.info(cookie1); return map.toString(); }
清空Cookie,就是重新設置cookie的值與過期時間:
@RequestMapping("/delcookie") @ResponseBody public String delCookie(HttpServletRequest request, HttpServletResponse response) { Cookie[] cookies = request.getCookies(); if (cookies != null) { for (Cookie cookie : cookies) { // setValue只是清空了value,cookie還在 cookie.setValue(null); cookie.setMaxAge(0); response.addCookie(cookie); } } return "delete ok"; }Session
Session的相關操作,通過 HttpSession、HttpServletRequest、@SessionAttribute 來完成。
設置 Session:
@RequestMapping("/setsession") @ResponseBody public String setSession(HttpSession session) { session.setAttribute("session1", "value1"); session.setAttribute("session2", "value2"); return ""; }
獲取Session:
@RequestMapping("/getsession") @ResponseBody public String getSession( HttpServletRequest request, HttpSession httpSession, @SessionAttribute(value = "session1", required = false) String session1) { HttpSession session = request.getSession(); String session2 = (String)session.getAttribute("session2"); String http_session1 = (String)httpSession.getAttribute("session1"); logger.info(http_session1); logger.info(session1); logger.info(session2); HashMapsessionMap = new HashMap<>(); Enumeration sessions = session.getAttributeNames(); while(sessions.hasMoreElements()) { String key = sessions.nextElement(); sessionMap.put(key, (String)session.getAttribute(key)); } return sessionMap.toString(); }
刪除Session:
@RequestMapping("/delsession") @ResponseBody public String delSession(HttpSession httpSession) { httpSession.removeAttribute("session1"); httpSession.removeAttribute("session2"); return "delete session ok"; }模板引擎
在模板引擎之前,要了解怎么向模板中傳遞數據,于是有這三種姿勢:
Map,這是一個Java原生類型 ModelMap,這是一個類 Model,這是一個接口,其實現類為 ExtendedModelMap,繼承了 ModelMap 類
這三個都可以在方法參數中直接注入使用,暫時不知道這三個有什么區別,用起來差不多。
@RequestMapping("/model") public String model(Model model, ModelMap modelMap, Mapmap) { model.addAttribute("title1", "model_title"); modelMap.addAttribute("title2", "modelMap_title"); map.put("title2", "map_title"); User user = new User(1, "test"); model.addAttribute("user", user); return "model"; }
除了上面的用法,還可以使用 ModelAndView 手動渲染模板,效果是一樣的:
@RequestMapping("/modelandview") public ModelAndView modelAndView() { ModelAndView modelAndView = new ModelAndView(); modelAndView.setViewName("model"); modelAndView.addObject("title1", "title1"); modelAndView.addObject("title2", "title2"); User user = new User(1, "test"); modelAndView.addObject("user", user); return modelAndView; }
最后 SpringBoot 默認可以集成好幾種模板引擎,現在主要使用 thymeleaf。
@ModelAttribute 注解這個注解有點復雜。可以注解到方法上,也可以注解到方法參數上
注解到方法參數
大概意思是通過模型中獲取,這個模型是什么呢?大概通過一些途徑(可能來自Session?可能來自請求參數?可能來自控制器注解到方法上的 @ModelAttribute)
完成自動填充,并且自動傳遞到模板中,這是 Spring MVC 數據綁定。
下面是兩個例子:
請求通過 /xxx?id=1&name=張三,能夠自動進行映射,并且傳到模板中,并且還能自動進行輸出格式轉換,如下面第一個例子,受 @ResponseBody 影響,直接輸出了 JSON
@RequestMapping("/getmodel") @ResponseBody public User getModel(@ModelAttribute User user) { return user; } @RequestMapping("/modelattribute") public String modelAttribute(@ModelAttribute User user) { return "model"; }
注解到方法
將這個控制器的方法,變成一個非請求處理的方法,在其它請求方法(RequestMapping)被調用前首先調用該方法,并將返回的數據放到 Model 中
有什么用呢?
估計是用來生成初始化數據的,比如生成一個帶有一些默認數據的表單?在進入控制器之前對數據進行一些整理和清洗?
常用配置 自動 trim 參數大多數 PHP 框架都有自動 trim GET/POST 參數的功能
在 Spring 里面,可以借助 @InitBinder 注解可以完成這種事情,我們定義一個控制器基類,方便接受請求的控制器繼承
public class BaseController { @InitBinder protected void initBinder(WebDataBinder binder) { StringTrimmerEditor stringtrimmer = new StringTrimmerEditor(true); binder.registerCustomEditor(String.class, stringtrimmer); } }server
server.address 綁定地址
server.port 綁定端口
server.compression.enabled 是否開啟壓縮
server.compression.mime-types 壓縮的類型
server.compression.min-response-size 壓縮的閾值
server.tomcat.* access日志,日志目錄,線程數等
server.session.cookie.* SessionCookie相關配置
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/67275.html
摘要:開始介紹簡化了基于的應用開發,你只需要就能創建一個獨立的,產品級別的應用。該包含很多搭建,快速運行項目所需的依賴,并提供一致的,可管理傳遞性的依賴集。日志級別通過標識開啟控制臺級別日志記錄,也可以在中指定日志級別配置示例 開始 介紹 Spring Boot 簡化了基于 Spring 的應用開發,你只需要 run 就能創建一個獨立的,產品級別的 Spring 應用。 Spring 平臺...
摘要:在服務注冊服務提供者這一篇可能學習了這么開發一個服務提供者,在生成上服務提供者通常是部署在內網上,即是服務提供者所在的服務器是與互聯網完全隔離的。服務消費者本質上也是一個。 在《服務注冊&服務提供者》這一篇可能學習了這么開發一個服務提供者,在生成上服務提供者通常是部署在內網上,即是服務提供者所在的服務器是與互聯網完全隔離的。這篇說下服務發現(服務消費者),通常服務消費者是部署在與互聯網...
摘要:響應式編程是基于異步和事件驅動的非阻塞程序,只是垂直通過在內啟動少量線程擴展,而不是水平通過集群擴展。三特性常用的生產的特性如下響應式編程模型適用性內嵌容器組件還有對日志消息測試及擴展等支持。 摘要: 原創出處 https://www.bysocket.com 「公眾號:泥瓦匠BYSocket 」歡迎關注和轉載,保留摘要,謝謝! 02:WebFlux 快速入門實踐 文章工程: JDK...
摘要:指南無論你正在構建什么,這些指南都旨在讓你盡快提高工作效率使用團隊推薦的最新項目版本和技術。使用進行消息傳遞了解如何將用作消息代理。安全架構的主題指南,這些位如何組合以及它們如何與交互。使用的主題指南以及如何為應用程序創建容器鏡像。 Spring 指南 無論你正在構建什么,這些指南都旨在讓你盡快提高工作效率 — 使用Spring團隊推薦的最新Spring項目版本和技術。 入門指南 這些...
摘要:比如日志默認使用作為第一選擇,默認集成了,并且支持配置使用貌似和有點變化,暫時不折騰了單元測試 環境:Spring Boot 1.5.4 基于 Spring Boot 創建一個命令行應用,先來個最基本的體驗,體驗一下: 配置管理(配置文件加載,多環境配置文件) 日志 單元測試 創建項目 比較好的兩種方法: 通過 https://start.spring.io/ 網站,生成項目框架...
閱讀 3588·2021-09-13 10:28
閱讀 1937·2021-08-10 09:43
閱讀 1010·2019-08-30 15:44
閱讀 3178·2019-08-30 13:14
閱讀 1830·2019-08-29 16:56
閱讀 2938·2019-08-29 16:35
閱讀 2843·2019-08-29 12:58
閱讀 864·2019-08-26 13:46