2022年2月18日 星期五

Spring MVC


MVC是一種軟體架構模式,把軟體系統分為三個基本部分
模型(Model)、視圖(View)和控制器(Controller)

模型(Model)進行資料管理和封裝數據和一般他們會組成的POJO、VO。
視圖(View)是負責呈現數據和讓客戶端的瀏覽器能夠將資料展示出來。
控製器(Controller)負責處理用戶的請求,對請求進行處理。

Spring MVC流程圖
Spring MVC流程圖





故事版來說明MVC
有一天  L哥,找朋友 小M 喝咖啡聊是非。
小M說: 我們家三兄弟合開一家MVC雜貨店。
大哥叫 大C,店長,負責接收客戶的請求及下指令處理。
老二叫 二V,負責將跟客戶講通,因為二V哥會多國語言。
我老三叫 小M,負責商品及客戶訊息等資訊打包,拿給二V哥。
MVC雜貨店流程圖
MVC雜貨店流程圖


L哥說: 我有一個朋友 叫 S (Servlet) ,他也是開雜貨店的。
但他只有一個人,超忙的,忙到一直出錯。
S雜貨店流程圖
 S雜貨店流程圖



(本篇故事先到此處,後面待續。)

上面的故事看完後,在以前開發沒有MVC的設計想法時,使用Servlet開發時,什麼都要自己來做,
後來才有人會想出來一些解決軟體開發上的不便利,而但生了相關的軟體框架。


相關參考:















用LINE傳送分享








其它文章

2022年2月12日 星期六

Spring Boot web 專案 Controller RequestBody ResponseBody annotation



@RequestBody annotation 將 HttpRequest Body 映射到domain object,,HttpRequest 主體自動反序列化到 Java 對像上。

@ResponseBody annotation 告訴控制器返回的對象自動序列化為 JSON 並傳回 HttpResponse 對象





一、@RequestBody 及 @ResponseBody 為JSON 資料請求及回應

@RequestBody 及 @ResponseBody 不指定MediaType 預設為 APPLICATION_JSON_VALUE
APPLICATION_JSON_VALUE = application/json
(spring-web-xxx-jar org.springframework.http.MediaType)
程式:
    @RequestMapping(value = "/test1",
            method = RequestMethod.POST)//produces= MediaType.APPLICATION_JSON_VALUE
    public @ResponseBody
    Book bodyTest1(@RequestBody Book book) {
        return book;
    }
圖1 





圖2 Book為 domain object,會將傳入參數映射到Book.java中。



圖3 測試 傳送資料為JSON格式,回應為JSON格式
測試URI:http://localhost:8080/books/test1
測試資料:
{
    "id": 30,
    "name": "java",
    "price": "100"
}


二、@RequestBody 及 @ResponseBody 為 XML 資料請求及回應

@RequestBody 及 @ResponseBody 指定MediaType 為 APPLICATION_XML_VALUE
程式:
@RequestMapping(value = "/test2",
            method = RequestMethod.POST,
            produces=MediaType.APPLICATION_XML_VALUE)
    public @ResponseBody
    Book bodyTest2(@RequestBody Book book) {
        return book;
    }

圖4 


圖5 pom.xml 加入dependency com.fasterxml.jackson.dataformat
<dependency>
            <groupId>com.fasterxml.jackson.dataformat</groupId>
            <artifactId>jackson-dataformat-xml</artifactId>
    </dependency>

參考官方文件

圖6 測試  傳送資料為XML格式,回應為XML格式
<?xml version="1.0" encoding="UTF-8" ?>
<root>
  <id>30</id>
  <name>java</name>
  <price>100</price>
</root>


Convert JSON To XML





















用LINE傳送分享








其它文章

Spring Boot web 專案 Controller RequestMapping annotation


一、前言
RequestMapping 是開發專案常用的annotation。可以說必用到的。
這RequestMapping annotation,是用來對應請求的URI來決定要執行哪個方法。
如請求 http://localhost:8080/books 而這/books 就是要執行的方向。
而RequestMapping annotation 就是宣告當請求為/Books時,在這裡執行該程式。
二、基本使用
基本使用@RequestMapping("/books") 。
@RequestMapping("/books") 等於@RequestMapping(value="/books") 也等於 @RequestMapping(path="/books")。
而@RequestMapping("/books") 如果你沒設定參數名稱,Spring自動存入value。
另而查看原碼的value 上方會有@AliasFor的annotation。就是對應該參數方法。
如RequestMapping 有value() 跟 path()。所以這二個功能會是一樣的。
所以在Spring的框架中,有些annotation,都在 @xxxxx(這裡給值,不帶參數名稱)
例:@PathVariable("id")、@GetMapping("/books")等。
三、@RequestMapping 註解有八個屬性
name、value、path、method、consumes、produces、params、headers
name :該RequestMapping 分配一个名稱。

value、path :指定請求的實際地址,指定的地址可以是URI

method :指定請求的method型別, GET、POST、PUT、DELETE等
consumes :指定請求提交內容型別(Content-Type),例如application/json, text/html
produces :指定返回的內容型別,僅當request請求頭中的(Accept)型別中包含該指定型別才返回
params :指定request中必須包含某些參數值是,才讓該方法處理
headers :指定request中必須包含某些指定的header值,才能讓該方法處理請求
圖1 在spring-web-5.3.15.jar->org->springframework->web->bind->annotation->RequestMapping.java 可以看到相關屬性及說明
本文使用 spring-web-5.3.15.jar ,找spring-web-你的版本的.jar


四、@RequestMapping 註解屬性 value、path 程式測試及說明
本文測試:
BookController 指定為@RequestMapping("/books") ,requestMappingTest1方法指定@RequestMapping("/test1/{id}") 
URI為/books/test1/XXX ->會執行BookController-> requestMappingTest1(id)
程式:圖2 

本文使用工具類:
AnnotationUtils是spring 內鍵的工具類。可以分析Annotation。
import org.springframework.core.annotation.AnnotationUtils;
在測試程式取出RequestMapping Annotation 屬性值,查看value、path值是否相同
測試:圖3 查看value、path值是否相同


五、@RequestMapping 註解屬性 method 程式測試及說明
本文測試: requestMappingTest2 方法上 設定使用 GET 才能通行。
程式:圖4

測試:圖5 使用GET 才能通行。

  圖6 其它不能通行,測試POST 不能通行。
  

六、@RequestMapping 註解屬性 consumes 程式測試及說明
本文測試:requestMappingTest3 方法上 設定使用 POST 才能通行。
且只收JSON格式文件。
consumes 用在將 request Content-Type設定請求的型別。
用法:
consumes = "text/plain"
consumes = {"text/plain", "application/*"}
consumes = MediaType.TEXT_PLAIN_VALUE
程式:圖7 consumes 設為“application/json”型別的請求。

測試:圖8 請求時使用application/json ,結果可以成功回應

  圖9 請求時使用multipart/form-data ,結果回應415
  

七、@RequestMapping 註解屬性 produces 程式測試及說明
本文測試:requestMappingTest4 方法上 設定使用 POST 才能通行。
且只收JSON格式文件,回應也是JSON格式文件。
produces 設定Headers 裡的Accept屬性(能夠接受的回應內容類型)。
用法:
produces = "text/plain"
produces = {"text/plain", "application/*"}
produces = MediaType.TEXT_PLAIN_VALUE
produces = "text/plain;charset=UTF-8"
程式: produces="application/json;charset=UTF-8" 
application/json  設定接收/回應為JSON格式文件
charset 文件編碼為UTF-8
圖10  

測試:圖11 請求時使用application/json ,結果可以成功回應json

  圖12 查看回傳的Headers 
  

  圖13 請求時使用multipart/form-data ,結果回應415及查看回傳的Headers 
  

八、@RequestMapping 註解屬性 params 程式測試及說明
本文測試: requestMappingTest5  方法上設定GET ,且需要有傳入參數name=java 才能通行。
路徑為"/test5/{id}"
用法: params 是用在限定傳入參數用的,要有該參數及值才會回應請求。
程式:
圖14

測試:
圖15 在請求Params 中帶入name=java。回應成功。

圖16 在請求Params 為空,回應失敗

九、@RequestMapping 註解屬性 headers 程式測試及說明
本文測試:requestMappingTest6 方法上 設定使用 POST 才能通行。
且只收JSON格式文件,回應也是JSON格式文件。
用法:headers 設定,將headers所有的屬型都可設定。
HTTP頭欄位參考
程式:
圖17

測試:圖18 請求時使用application/json ,結果可以成功回應json

  圖19 請求時使用multipart/form-data ,結果回應415及查看回傳的Headers 
  

十、@RequestMapping 註解屬性 name 程式測試及說明
本文測試: 將BookController 設name=dc
requestMappingTest10方法 name=test10
用法:@RequestMapping(value="/books",name="bc")
程式:
圖20

測試:需要使用jsp ,spring tags庫mvcUrl函式
圖21 測試jsp

圖22 轉為html頁面的結果

圖23 點入測試url 的測試結果

測試2:如果不設定name時,一樣可以使用tags庫mvcUrl函式取到
而類的name 預設為 類名中的大寫字母
例:Book2Controller 的name = BC
方法的name 就是方法名稱
圖24 如程式預設使用 BC#requestMappingTest10

圖25 測試jsp

圖26 轉為html頁面的結果

圖27 點入測試url 的測試結果














用LINE傳送分享








其它文章

2022年2月11日 星期五

Spring Boot web 專案 Controller RequestParam 和 PathVariable annotation


@RequestParam 和 @PathVariable 註解是用於從request中接收請求的,兩個都可以接收引數,關鍵點不同的是@RequestParam 是從request裡面拿取值,
而 @PathVariable 是從一個URI模板裡面來填充



一、@PathVariable 的使用
PathVariable 有三個參數方法可用
name-要绑定到的路徑變量的名稱
required-指示是否為必需參數
value-名稱的别名(做用跟name一樣)
圖1 



二、@PathVariable的參數  name 及 value測試
pathVariableTest1 : 
@PathVariable不指定name 及 value,使用預設的參數名稱。
{id}的id ,需要跟String id的id 一樣。
@GetMapping("/test1/{id}")
    public String pathVariableTest1( @PathVariable String id) {

pathVariableTest2 :
@PathVariable(name="id")指定name ,對應到Mapping的{id}
@GetMapping("/test2/{id}")
    public String pathVariableTest2( @PathVariable(name="id") String bookId) {
pathVariableTest3 :
@PathVariable(value="id")指定value ,對應到Mapping的{id}
@GetMapping("/test3/{id}")
    public String pathVariableTest3( @PathVariable(value="id") String bookId) {
圖2
 


測試 pathVariableTest1
http://localhost:8080/books/test1/123
圖3


測試 pathVariableTest3
http://localhost:8080/books/test2/123
圖4


測試 pathVariableTest3
http://localhost:8080/books/test3/123
圖5


三、 @PathVariable的參數  required 設定參數是否為必需

required 不設定預設為true
true為必需的,false則非必需的。
本文測試 name 為必需, id 非必需的
案例如下: 
    @GetMapping(value={"/test4/{name}","/test4/{name}/{id}"})
    public String pathVariableTest4(@PathVariable String name, @PathVariable(required = false) String id) {
圖6

圖7 測試 pathVariableTest4 http://localhost:8080/books/test4/java



圖8 測試 pathVariableTest4 http://localhost:8080/books/test4/java/123456




四、 @PathVariable的多參數應用
可以多參數,本文測試二個測試。
可用符號分開如:/test5/{id}-{name}-{price}"
@GetMapping("/test5/{id}-{name}-{price}")
    public String pathVariableTest5( @PathVariable(value="id") String bookId,
                                     @PathVariable String name,
                                     @PathVariable String price) {
大多專案會使用如下:
@GetMapping("/test6/{id}/{name}/{price}")
    public String pathVariableTest6( @PathVariable(value="id") String bookId,
                                     @PathVariable String name,
                                     @PathVariable String price) {

圖9 程式

圖10 測試  http://localhost:8080/books/test6/123456-java-123

圖11 測試  http://localhost:8080/books/test6/123456/java/123


五、@PathVariable 將參數轉為 map 應用
使用測試程式如下:
@GetMapping(value = "/test8/{id}/{name}")
    public String pathVariableTest8(@PathVariable Map<String, String> bookMsp) {
圖12 程式

圖13 測試 http://localhost:8080/books/test8/123456/java






六、@RequestParam  的使用 

使用@RequestParam ,URL是這樣的:http://host:port/path?參數名1=參數值1&參數名2=參數值2

@RequestParam 有四個參數方法可以 value 、 name 、required、defaultValue
value 、 name 、required 方法跟 @PathVariable功能一樣。
defaultValue 當 required 為false時,給預設值的設定。
圖14


程式:
@GetMapping("/test10/list")
    public String requestParamTest10(@RequestParam String name, @RequestParam String id) {
圖15 



圖16 測試 http://localhost:8080/books/test10/list?name=test&id=123



七、@RequestParam  的參數放入request body裡傳送
在網頁上會有表單,會使用html form submit的。
而傳送資料就是放入request body裡。
本文使用psot來測試
@PostMapping("/test11/list")
    public String requestParamTest11(@RequestParam String name, @RequestParam String id) {
圖17

使用post
圖18

使用get
圖19 測試 http://localhost:8080/books/test10/list

八、同一個方法使用 @PathVariable 跟 @RequestParam 
是可以的。
程式:
   @GetMapping("/test12/{id}/{name}")
    public String pathVariableTest12(@PathVariable(value = "id") String bookId,
                                    @PathVariable String name,
                                    @RequestParam String price) {
圖20

圖21


九、測試@RequestParam 的 defaultValue
當 required 為false時,給預設值的設定。
程式:
@GetMapping("/test13/{id}/{name}")
    public String pathVariableTest13(@PathVariable(value = "id") String bookId,
                                     @PathVariable String name,
                                     @RequestParam(required=false,defaultValue="99") String price) {
 
圖22 設定 price 非必要參數 如果沒給值,就用預設值

圖23 price 參數傳入12

圖24 取消 price 傳入值




















用LINE傳送分享








其它文章

標籤

Oracle (150) Oracle DB (144) Oracle_DB (143) Oracle SQL (135) JAVA (84) css-基本類 (65) MySQL (59) CSS Selector (58) jQuery (49) JavaScript-基本類 (39) Spring Boot (38) JavaScript (37) JavaScript HTML DOM (37) JavaScript-HTML_DOM (36) CSS3 (30) JAVA-基本類 (28) jQuery UI (27) Apache (23) Oracle GROUP BY (20) datepicker (20) Android (18) Oracle Date (17) c (17) JAVA-lang套件 (16) Linux (16) Oracle Sub Query (16) Spring-基本類 (16) jQuery-基本類 (16) MySQL-進階系列教學 (15) Android基本類 (14) Grails (14) Oracle join (14) SQLite (13) Spring (13) WIN7-基本類 (13) grails-基本類 (13) linux cent os (13) CKEditor (12) JAVA-流程控制類 (12) JAVA_Spring (12) PHP (11) Spring MVC (11) MySQL-基本系列教學 (10) Notepad (10) Notepad++ (10) SQLite for java (10) Windows (10) c/c++ (10) eclipse (9) jQuery-Selector (9) sqldeveloper (9) DB_Toad (8) JAVA_IDE_Eclipse (8) JavaScript-String類 (8) MySQL DB Toad (8) MySQL-DATE相關 (8) MySQL-函式相關 (8) Spring Bean (8) Android Studio (7) HTML5 (7) Hibernate (7) JAVA-OCWCD (7) JavaScript-陣列類 (7) Docker (6) JAVA-程式分享 (6) JAVA.util套件 (6) JavaScript-數學類 (6) MinGw (6) MySQL-其它類 (6) Servlet (6) centos (6) Apache_Tomcat (5) Apache套件_POI (5) CSS (5) JavaScript-Date物件 (5) JavaScript-其它類 (5) PostgreSQL (5) httpd (5) log4j (5) 基本資訊 (5) 開發工具 (5) CSS Properties (4) Dev-C++ (4) IntelliJ IDEA (4) Oracle DDL (4) Sublime (4) TortoiseSVN (4) apache_Maven (4) Android NDK (3) Eclipse IDE for C/C++ (3) Hibernate-基本類 (3) JAVA-問題 (3) JAVA-綀習分享 (3) JVM (3) Linux 指令 (3) Proxy Server (3) Spring Mobile (3) Spring web (3) Squid (3) VirtualBox (3) maven (3) zk (3) 生活其它 (3) Bootstrap (2) Filter (2) JAVA_IO (2) JAVA_其它_itext套件 (2) JBoss-問題 (2) JSP (2) Jboss (2) Listener (2) MySQL-語法快速查詢 (2) Spring AOP (2) Spring Batch (2) Spring Boot Actuator (2) Spring i18n (2) Subversive (2) Tomcat 8 (2) UML (2) WebJars (2) WinMerge (2) c++ (2) c語言綀習題 (2) jQuery Mobile (2) jQuery-事件處理 (2) jQuery-套件類 (2) putty (2) svn (2) weblogic (2) Apache_JMeter (1) Apache套件_BeanUtils (1) Apache套件_StringUtils (1) Base64 (1) Google API (1) HTML5-基本類 (1) Heap (1) JAVA 7 (1) JAVA SE 、JAVA EE、JAVA ME (1) JAVA 日期 (1) JAVA-OCJP (1) JAVA-WEB (1) JAVA_IDE (1) JAVA其它 (1) JBoss Server (1) JDK (1) JMX (1) JRE (1) Java RMI (1) Java String (1) Joda Time (1) Linux_其它 (1) MySQL教學 (1) Oracle_VirtualBox (1) SQL Server (1) SWT (1) Session (1) Stack (1) Struts 2 (1) Tool (1) ZK Studio (1) csv (1) grails-其它類 (1) jQuery-進階 (1) java mail (1) java web (1) java8 (1) jsoup (1) mockmvc (1) modules (1) tomcat (1) win10 (1) 其它類 (1) 圖片工具 (1) 模擬器 (1) 讀書分享 (1) 開發資訊 (1)

精選文章

初學 Java 的 HelloWorld 程式

撰寫一個JAVA程式 public class HelloWorld{ public static void main(String[ ] args){ System.out.println("我第一支Java程式!!"); } } ...