成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Spring Boot QuickStart (3) - Web & Restful

chnmagnus / 1965人閱讀

摘要:不過可以切換到版本,兼容性未知。注解一旦添加了依賴會(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:




    
    title


h1

請求參數(shù) 單一參數(shù)

@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 gets) {
   return gets.toString();
}
額外參數(shù)列表

除了注解獲取數(shù)據(jù)以外,我們還可以通過向 Controller 中的方法,注入 Servlet 相關(guān)的類,來獲取一些額外的參數(shù),比如客戶端 IP 地址

@RequestMapping("/request")
@ResponseBody
public String request(HttpServletRequest request) {
   HashMap requests = 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

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) {

   HashMap map = 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);

   HashMap sessionMap = 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, Map map) {
   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

相關(guān)文章

  • Spring Boot QuickStart (1)

    摘要:開始介紹簡化了基于的應(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)...

    klinson 評論0 收藏0
  • 7、服務(wù)發(fā)現(xiàn)&amp;服務(wù)消費(fèi)者Ribbon

    摘要:在服務(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)...

    tangr206 評論0 收藏0
  • Spring Boot 2 快速教程:WebFlux 快速入門(二)

    摘要:響應(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...

    gaara 評論0 收藏0
  • Spring 指南(目錄)

    摘要:指南無論你正在構(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ù)。 入門指南 這些...

    only_do 評論0 收藏0
  • Spring Boot QuickStart (2) - 基礎(chǔ)

    摘要:比如日志默認(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)目框架...

    zgbgx 評論0 收藏0

發(fā)表評論

0條評論

最新活動(dòng)
閱讀需要支付1元查看
<