国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Spring Boot QuickStart (3) - Web & Restful

chnmagnus / 1955人閱讀

摘要:不過可以切換到版本,兼容性未知。注解一旦添加了依賴會判斷這是一個應用,并啟動一個內嵌的容器默認是用于處理請求。注意中空字符串與的區別。

環境: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) {
   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 的操作其實和 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) {

   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,就是重新設置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);

   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";
}
模板引擎

在模板引擎之前,要了解怎么向模板中傳遞數據,于是有這三種姿勢:

Map,這是一個Java原生類型
ModelMap,這是一個類
Model,這是一個接口,其實現類為 ExtendedModelMap,繼承了 ModelMap 類

這三個都可以在方法參數中直接注入使用,暫時不知道這三個有什么區別,用起來差不多。

@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 手動渲染模板,效果是一樣的:

@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 QuickStart (1)

    摘要:開始介紹簡化了基于的應用開發,你只需要就能創建一個獨立的,產品級別的應用。該包含很多搭建,快速運行項目所需的依賴,并提供一致的,可管理傳遞性的依賴集。日志級別通過標識開啟控制臺級別日志記錄,也可以在中指定日志級別配置示例 開始 介紹 Spring Boot 簡化了基于 Spring 的應用開發,你只需要 run 就能創建一個獨立的,產品級別的 Spring 應用。 Spring 平臺...

    klinson 評論0 收藏0
  • 7、服務發現&amp;服務消費者Ribbon

    摘要:在服務注冊服務提供者這一篇可能學習了這么開發一個服務提供者,在生成上服務提供者通常是部署在內網上,即是服務提供者所在的服務器是與互聯網完全隔離的。服務消費者本質上也是一個。 在《服務注冊&服務提供者》這一篇可能學習了這么開發一個服務提供者,在生成上服務提供者通常是部署在內網上,即是服務提供者所在的服務器是與互聯網完全隔離的。這篇說下服務發現(服務消費者),通常服務消費者是部署在與互聯網...

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

    摘要:響應式編程是基于異步和事件驅動的非阻塞程序,只是垂直通過在內啟動少量線程擴展,而不是水平通過集群擴展。三特性常用的生產的特性如下響應式編程模型適用性內嵌容器組件還有對日志消息測試及擴展等支持。 摘要: 原創出處 https://www.bysocket.com 「公眾號:泥瓦匠BYSocket 」歡迎關注和轉載,保留摘要,謝謝! 02:WebFlux 快速入門實踐 文章工程: JDK...

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

    摘要:指南無論你正在構建什么,這些指南都旨在讓你盡快提高工作效率使用團隊推薦的最新項目版本和技術。使用進行消息傳遞了解如何將用作消息代理。安全架構的主題指南,這些位如何組合以及它們如何與交互。使用的主題指南以及如何為應用程序創建容器鏡像。 Spring 指南 無論你正在構建什么,這些指南都旨在讓你盡快提高工作效率 — 使用Spring團隊推薦的最新Spring項目版本和技術。 入門指南 這些...

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

    摘要:比如日志默認使用作為第一選擇,默認集成了,并且支持配置使用貌似和有點變化,暫時不折騰了單元測試 環境:Spring Boot 1.5.4 基于 Spring Boot 創建一個命令行應用,先來個最基本的體驗,體驗一下: 配置管理(配置文件加載,多環境配置文件) 日志 單元測試 創建項目 比較好的兩種方法: 通過 https://start.spring.io/ 網站,生成項目框架...

    zgbgx 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<