摘要:不過可以切換到版本,兼容性未知。注解一旦添加了依賴會(huì)判斷這是一個(gè)應(yīng)用,并啟動(dòng)一個(gè)內(nèi)嵌的容器默認(rèn)是用于處理請求。注意中空字符串與的區(qū)別。
環(huán)境:Spring Boot 1.5.4
基于 Spring Boot 可以快速創(chuàng)建一個(gè)Web & Restful 應(yīng)用,在開始應(yīng)用之前,至少要了解以下用法:
定義路由,定義 HTTP 方法
獲取Header、GET、POST、路徑等參數(shù)
Cookie、Session操作
應(yīng)用一個(gè)模板引擎,選擇 Thymeleaf
獲取表單數(shù)據(jù),以及文件上傳數(shù)據(jù)
完成一個(gè)登陸、登出、注冊流程
增加以下兩個(gè)依賴即可完成構(gòu)建:
org.springframework.boot spring-boot-starter-thymeleaf org.springframework.boot spring-boot-starter-web
注意:當(dāng)前版本默認(rèn)選擇的 Thymeleaf 是 2.x 版本的,對html 標(biāo)簽閉合性要求比較高,雖然可以通過設(shè)置 mode,改變解析方式,但是還要引入額外的 nekoHTML,所以很蛋疼。不過可以切換到 3.x 版本,兼容性未知。
注解3.0.2.RELEASE 2.1.1
一旦添加了 spring-boot-starter-web 依賴 Spring Boot 會(huì)判斷這是一個(gè)Web 應(yīng)用,并啟動(dòng)一個(gè)內(nèi)嵌的Servlet容器(默認(rèn)是Tomcat)用于處理HTTP請求。
Spring 框架中關(guān)于 Web 應(yīng)用有大量的注解:
@Controller
注解一個(gè) Web 控制器類,框架會(huì)將 Servlet 容器里收到的 HTTP 請求根據(jù)路徑分發(fā)給對應(yīng)的 Controller 類進(jìn)行處理
@RestController
注解一個(gè) Restful 控制器,默認(rèn)會(huì)自動(dòng)返回 JSON
@RequestMapping
注解一個(gè)路由,如果定義在類上,相當(dāng)于一個(gè)路由組,最終路由是類+方法路由,參數(shù)有路由規(guī)則和 HTTP 方法,同時(shí)還有一些簡寫形式如:@GetMapping,@PutMapping
@PathVariable
注解路徑參數(shù),如 /user/{id}
@RequestParam
注解請求參數(shù),如 ?user=a 或 post["user"] = a
@RequestBody
注解請求體
@RequestHeader
注解請求header頭
@CookieValue
注解一個(gè)Cookie值
@SessionAttribute
注解一個(gè)Session值
下面代碼對應(yīng)了兩個(gè)路由:
/ 使用 @ResponseBody 注解,所以返回了文本串
/hello 返回表示模板的字符串,將會(huì)使用 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"; } }
這段代碼對應(yīng)了 /rest/ 路由。注意 @RequestMapping 中空字符串與 "/" 的區(qū)別。
使用空,則 /rest 與 /rest/ 都可以訪問,使用 / 則必須通過 /rest 訪問:
@RestController @RequestMapping("/rest") public class RestfulController { @RequestMapping("") public String index() { return "Hello Rest"; } }
hello.html:
請求參數(shù) 單一參數(shù)title h1
@RequestParam 可以用來注解一個(gè)請求參數(shù),默認(rèn)會(huì)合并 GET、POST 請求名相同的參數(shù),變成一個(gè)數(shù)組,所以下面的 text2 會(huì)進(jìn)行數(shù)組 -> String 的轉(zhuǎn)型。
@RequestMapping(value = "/get", method = {RequestMethod.GET, RequestMethod.POST}) @ResponseBody public String get(@RequestParam("text1") String text1, @RequestParam("text2") String text2) { return text1 + "/" + text2; }
在這里不使用注解同樣可以獲得數(shù)據(jù),那為什么要使用注解呢? 因?yàn)?@RequestParam 主要提供了一些額外的功能:
如參數(shù)名->變量名的映射,required 檢查等,更嚴(yán)謹(jǐn)一些。
@RequestMapping(value = "/getsimple", method = {RequestMethod.GET, RequestMethod.POST}) @ResponseBody public String getSimple(String text1, String text2) { return text1 + "/" + text2; }參數(shù)列表
除了使用 @RequestParam 注解獲取單個(gè)參數(shù)意外,還可以獲取一個(gè)參數(shù)列表,但這種方式,POST 不會(huì)合并 GET 中的同名參數(shù):
@RequestMapping("/getmap") @ResponseBody public String getMap(@RequestParam Map額外參數(shù)列表gets) { return gets.toString(); }
除了注解獲取數(shù)據(jù)以外,我們還可以通過向 Controller 中的方法,注入 Servlet 相關(guān)的類,來獲取一些額外的參數(shù),比如客戶端 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 的操作其實(shí)和 Spring 沒有太大的關(guān)系,不過Spring 提供了一個(gè) @CookieValue 注解用來快速獲取 Cookie 值
通過 HttpServletResponse 設(shè)置頁面的 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,就是重新設(shè)置cookie的值與過期時(shí)間:
@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的相關(guān)操作,通過 HttpSession、HttpServletRequest、@SessionAttribute 來完成。
設(shè)置 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"; }模板引擎
在模板引擎之前,要了解怎么向模板中傳遞數(shù)據(jù),于是有這三種姿勢:
Map,這是一個(gè)Java原生類型 ModelMap,這是一個(gè)類 Model,這是一個(gè)接口,其實(shí)現(xiàn)類為 ExtendedModelMap,繼承了 ModelMap 類
這三個(gè)都可以在方法參數(shù)中直接注入使用,暫時(shí)不知道這三個(gè)有什么區(qū)別,用起來差不多。
@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 手動(dòng)渲染模板,效果是一樣的:
@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 默認(rèn)可以集成好幾種模板引擎,現(xiàn)在主要使用 thymeleaf。
@ModelAttribute 注解這個(gè)注解有點(diǎn)復(fù)雜??梢宰⒔獾椒椒ㄉ?,也可以注解到方法參數(shù)上
注解到方法參數(shù)
大概意思是通過模型中獲取,這個(gè)模型是什么呢?大概通過一些途徑(可能來自Session?可能來自請求參數(shù)?可能來自控制器注解到方法上的 @ModelAttribute)
完成自動(dòng)填充,并且自動(dòng)傳遞到模板中,這是 Spring MVC 數(shù)據(jù)綁定。
下面是兩個(gè)例子:
請求通過 /xxx?id=1&name=張三,能夠自動(dòng)進(jìn)行映射,并且傳到模板中,并且還能自動(dòng)進(jìn)行輸出格式轉(zhuǎn)換,如下面第一個(gè)例子,受 @ResponseBody 影響,直接輸出了 JSON
@RequestMapping("/getmodel") @ResponseBody public User getModel(@ModelAttribute User user) { return user; } @RequestMapping("/modelattribute") public String modelAttribute(@ModelAttribute User user) { return "model"; }
注解到方法
將這個(gè)控制器的方法,變成一個(gè)非請求處理的方法,在其它請求方法(RequestMapping)被調(diào)用前首先調(diào)用該方法,并將返回的數(shù)據(jù)放到 Model 中
有什么用呢?
估計(jì)是用來生成初始化數(shù)據(jù)的,比如生成一個(gè)帶有一些默認(rèn)數(shù)據(jù)的表單?在進(jìn)入控制器之前對數(shù)據(jù)進(jìn)行一些整理和清洗?
常用配置 自動(dòng) trim 參數(shù)大多數(shù) PHP 框架都有自動(dòng) trim GET/POST 參數(shù)的功能
在 Spring 里面,可以借助 @InitBinder 注解可以完成這種事情,我們定義一個(gè)控制器基類,方便接受請求的控制器繼承
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日志,日志目錄,線程數(shù)等
server.session.cookie.* SessionCookie相關(guān)配置
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/67275.html
摘要:開始介紹簡化了基于的應(yīng)用開發(fā),你只需要就能創(chuàng)建一個(gè)獨(dú)立的,產(chǎn)品級(jí)別的應(yīng)用。該包含很多搭建,快速運(yùn)行項(xiàng)目所需的依賴,并提供一致的,可管理傳遞性的依賴集。日志級(jí)別通過標(biāo)識(shí)開啟控制臺(tái)級(jí)別日志記錄,也可以在中指定日志級(jí)別配置示例 開始 介紹 Spring Boot 簡化了基于 Spring 的應(yīng)用開發(fā),你只需要 run 就能創(chuàng)建一個(gè)獨(dú)立的,產(chǎn)品級(jí)別的 Spring 應(yīng)用。 Spring 平臺(tái)...
摘要:在服務(wù)注冊服務(wù)提供者這一篇可能學(xué)習(xí)了這么開發(fā)一個(gè)服務(wù)提供者,在生成上服務(wù)提供者通常是部署在內(nèi)網(wǎng)上,即是服務(wù)提供者所在的服務(wù)器是與互聯(lián)網(wǎng)完全隔離的。服務(wù)消費(fèi)者本質(zhì)上也是一個(gè)。 在《服務(wù)注冊&服務(wù)提供者》這一篇可能學(xué)習(xí)了這么開發(fā)一個(gè)服務(wù)提供者,在生成上服務(wù)提供者通常是部署在內(nèi)網(wǎng)上,即是服務(wù)提供者所在的服務(wù)器是與互聯(lián)網(wǎng)完全隔離的。這篇說下服務(wù)發(fā)現(xiàn)(服務(wù)消費(fèi)者),通常服務(wù)消費(fèi)者是部署在與互聯(lián)網(wǎng)...
摘要:響應(yīng)式編程是基于異步和事件驅(qū)動(dòng)的非阻塞程序,只是垂直通過在內(nèi)啟動(dòng)少量線程擴(kuò)展,而不是水平通過集群擴(kuò)展。三特性常用的生產(chǎn)的特性如下響應(yīng)式編程模型適用性內(nèi)嵌容器組件還有對日志消息測試及擴(kuò)展等支持。 摘要: 原創(chuàng)出處 https://www.bysocket.com 「公眾號(hào):泥瓦匠BYSocket 」歡迎關(guān)注和轉(zhuǎn)載,保留摘要,謝謝! 02:WebFlux 快速入門實(shí)踐 文章工程: JDK...
摘要:指南無論你正在構(gòu)建什么,這些指南都旨在讓你盡快提高工作效率使用團(tuán)隊(duì)推薦的最新項(xiàng)目版本和技術(shù)。使用進(jìn)行消息傳遞了解如何將用作消息代理。安全架構(gòu)的主題指南,這些位如何組合以及它們?nèi)绾闻c交互。使用的主題指南以及如何為應(yīng)用程序創(chuàng)建容器鏡像。 Spring 指南 無論你正在構(gòu)建什么,這些指南都旨在讓你盡快提高工作效率 — 使用Spring團(tuán)隊(duì)推薦的最新Spring項(xiàng)目版本和技術(shù)。 入門指南 這些...
摘要:比如日志默認(rèn)使用作為第一選擇,默認(rèn)集成了,并且支持配置使用貌似和有點(diǎn)變化,暫時(shí)不折騰了單元測試 環(huán)境:Spring Boot 1.5.4 基于 Spring Boot 創(chuàng)建一個(gè)命令行應(yīng)用,先來個(gè)最基本的體驗(yàn),體驗(yàn)一下: 配置管理(配置文件加載,多環(huán)境配置文件) 日志 單元測試 創(chuàng)建項(xiàng)目 比較好的兩種方法: 通過 https://start.spring.io/ 網(wǎng)站,生成項(xiàng)目框架...
閱讀 3595·2021-09-13 10:28
閱讀 1946·2021-08-10 09:43
閱讀 1018·2019-08-30 15:44
閱讀 3189·2019-08-30 13:14
閱讀 1843·2019-08-29 16:56
閱讀 2946·2019-08-29 16:35
閱讀 2852·2019-08-29 12:58
閱讀 872·2019-08-26 13:46