在 Spring Boot 中,@Controller 註解是專門用於處理 Http 請求處理的,是以 MVC 爲核心的設計思想的控制層。@RestController 則是 @Controller 的衍生註解。
1 Spring Boot Controller
1.1 原理
Spring Boot 本身就 Spring MVC 的簡化版本。是在 Spring MVC 的基礎上實現了自動配置,簡化了開發人員開發過程。
Spring MVC 是通過一個叫 DispatcherServlet
前端控制器的來攔截請求的。而在 Spring Boot 中 使用自動配置把 DispatcherServlet
前端控制器自動配置到框架中。
例如,我們來解析 /users 這個請求
DispatcherServlet
前端控制器攔截請求 /usersservlet
決定使用哪個handler
處理- Spring 檢測哪個控制器匹配
/users
,Spring 從 @RquestMapping 中查找出需要的信息 - Spring 找到正確的 Controller 方法後,開始執行 Controller 方法
- 返回 users 對象列表
- 根據與客戶端交互需要返回 Json 或者 Xml 格式
1.2 相關注解
在 Spring Boot 中使用到 @Controller 及相關的註解如下,主要分爲三個層面進行,請求前,處理中,返回。
應用場景 | 註解 | 註解說明 |
---|---|---|
處理請求 | @Controller | 處理 Http 請求 |
處理請求 | @RestController | @Controller 的衍生註解 |
路由請求 | @RequestMapping | 路由請求 可以設置各種操作方法 |
路由請求 | @GetMapping | GET 方法的路由 |
路由請求 | @PostMapping | POST 方法的路由 |
路由請求 | @PutMapping | PUT 方法的路由 |
路由請求 | @DeleteMapping | DELETE 方法的路由 |
請求參數 | @PathVariable | 處理請求 url 路徑中的參數 /user/{id} |
請求參數 | @RequestParam | 處理問號後面的參數 |
請求參數 | @RequestBody | 請求參數以json格式提交 |
返回參數 | @ResponseBody | 返回 json 格式 |
注意以上註解需要強調的是 @RestController 是 @Controller 的子集。
@GetMapping、@PostMapping、@PutMapping、@DeleteMapping 是 @RequestMapping 的子集。所以實際上我們只需要掌握 @Controller 和 @RequestMapping 就可以了。
1.3 @Controller 與 @RestController 區別
@Controller 包括了 @RestController。@RestController 是 Spring4 後新加的註解,從 RestController 類源碼可以看出 @RestController 是 @Controller 和 @ResponseBody 兩個註解的結合體。
@Controller=@RestController+@ResponseBody
如下 @RestController 的源碼可以看出他們的關係
<span style="color:#333333"><code><span style="color:#2b91af">@Target</span>({ElementType.TYPE})
<span style="color:#2b91af">@Retention</span>(RetentionPolicy.RUNTIME)
<span style="color:#2b91af">@Documented</span>
<span style="color:#2b91af">@Controller</span>
<span style="color:#2b91af">@ResponseBody</span>
<span style="color:#0000ff">public</span> <span style="color:#2b91af">@interface</span> RestController {
<span style="color:#2b91af">@AliasFor</span>(
annotation = Controller.class
)
String <span style="color:#a31515">value</span>() <span style="color:#0000ff">default</span> "";
}
</code></span>
1.4 @Controller 與 @RestController應用場景
-
@Controller 一般應用在有返回界面的應用場景下.
例如,管理後臺使用了 thymeleaf 作爲模板開發,需要從後臺直接返回 Model 對象到前臺,那麼這時候就需要使用 @Controller 來註解。
-
@RestController 如果只是接口,那麼就用 RestController 來註解.
例如前端頁面全部使用了 Html、Jquery來開發,通過 Ajax 請求服務端接口,那麼接口就使用 @RestController 統一註解。
1.5 @RequestMapping 說明
首先我們來看看 @RequestMapping 的源碼,我在上面加了註釋
<span style="color:#333333"><code><span style="color:#2b91af">@Target</span>({ElementType.TYPE, ElementType.METHOD})
<span style="color:#2b91af">@Retention</span>(RetentionPolicy.RUNTIME)
<span style="color:#2b91af">@Documented</span>
<span style="color:#2b91af">@Mapping</span>
<span style="color:#0000ff">public</span> <span style="color:#2b91af">@interface</span> RequestMapping {
String <span style="color:#a31515">name</span>() <span style="color:#0000ff">default</span> "";
<span style="color:#008000">//指定請求的實際地址</span>
<span style="color:#2b91af">@AliasFor</span>(<span style="color:#a31515">"path"</span>)
String[] value() <span style="color:#0000ff">default</span> {};
<span style="color:#2b91af">@AliasFor</span>(<span style="color:#a31515">"value"</span>)
String[] path() <span style="color:#0000ff">default</span> {};
<span style="color:#008000">//指定請求的method類型, GET、POST、PUT、DELETE等</span>
RequestMethod[] method() <span style="color:#0000ff">default</span> {};
<span style="color:#008000">//指定request中必須包含某些參數值是,才讓該方法處理。</span>
String[] params() <span style="color:#0000ff">default</span> {};
<span style="color:#008000">//指定request中必須包含某些指定的header值,才能讓該方法處理請求。</span>
String[] headers() <span style="color:#0000ff">default</span> {};
<span style="color:#008000">//指定處理請求的提交內容類型(Content-Type),例如application/json, text/html;</span>
String[] consumes() <span style="color:#0000ff">default</span> {};
<span style="color:#008000">//指定返回的內容類型,僅當request請求頭中的(Accept)類型中包含該指定類型才返回;</span>
String[] produces() <span style="color:#0000ff">default</span> {};
}</code></span>
示例說明:
示例 | 說明 |
---|---|
@RequestMapping("/index") | 默認爲 GET 方法的路由 /index |
@RequestMapping(value="/index",method = RequestMethod.GET) | 同上面一條 |
@RequestMapping(value="/add",method = RequestMethod.POST) | 路由爲 /add 的 POST 請求 |
@RequestMapping(value="/add",method = RequestMethod.POST),consumes="application/json" | 路由爲 /add 的 POST 請求,但僅僅處理 application/json 的請求 |
@RequestMapping(value="/add",method = RequestMethod.POST),produces="application/json" | 路由爲 /add 的 POST 請求,強調返回爲 JSON 格式 |
@RequestMapping(value="/add",method = RequestMethod.POST),params="myParam=xyz" | 路由爲 /add 的 POST 請求,但僅僅處理頭部包括 myParam=xyz 的請求 |
@RequestMapping(value="/add",method = RequestMethod.POST),headers="Referer=http://www.xyz.com/" | 路由爲 /add 的 POST 請求,但僅僅處理 來源爲 www.xyz.com 的請求 |
2 @Controller 和 @RestController 示例
本章節,將對兩個註解配合其他註解編寫一系列示例,爲了演示 @Controller 返回對應頁面功能,我們在示例中引入了 thymeleaf 模板。具體在 pom.xml 中有說明。
編號 | 路由 | Http方法 | 方法說明 |
---|---|---|---|
1 | /user/index | GET | 獲取用戶列表並返回列表頁面 |
1 | /user/add | GET | 用戶新增頁面 |
1 | /user/save | POST | 新增用戶的api |
1 | /user/edit | GET | 用戶編輯的頁面 |
1 | /user/update | POST | 編輯用戶的api |
1 | /user/del | GET | 刪除用戶頁面 |
1 | /user/deleted | POST | 刪除用戶頁面的api |
2.1 新建 Spring Boot 項目
- File > New > Project,如下圖選擇
Spring Initializr
然後點擊 【Next】下一步 - 填寫
GroupId
(包名)、Artifact
(項目名) 即可。點擊 下一步
groupId=com.fishpro
artifactId=restcontroller - 選擇依賴
Spring Web Starter
前面打鉤,在模板列中勾選thymeleaf
。 - 項目名設置爲
spring-boot-study-restcontroller
.
2.2 依賴 Pom.xml 配置
本項目引入了 web 和 thymeleaf ,具體一人如下代碼:
<span style="color:#333333"><code><span style="color:#0000ff"><<span style="color:#0000ff">dependencies</span>></span>
<span style="color:#0000ff"><<span style="color:#0000ff">dependency</span>></span>
<span style="color:#0000ff"><<span style="color:#0000ff">groupId</span>></span>org.springframework.boot<span style="color:#0000ff"></<span style="color:#0000ff">groupId</span>></span>
<span style="color:#0000ff"><<span style="color:#0000ff">artifactId</span>></span>spring-boot-starter-thymeleaf<span style="color:#0000ff"></<span style="color:#0000ff">artifactId</span>></span>
<span style="color:#0000ff"></<span style="color:#0000ff">dependency</span>></span>
<span style="color:#0000ff"><<span style="color:#0000ff">dependency</span>></span>
<span style="color:#0000ff"><<span style="color:#0000ff">groupId</span>></span>org.springframework.boot<span style="color:#0000ff"></<span style="color:#0000ff">groupId</span>></span>
<span style="color:#0000ff"><<span style="color:#0000ff">artifactId</span>></span>spring-boot-starter-web<span style="color:#0000ff"></<span style="color:#0000ff">artifactId</span>></span>
<span style="color:#0000ff"></<span style="color:#0000ff">dependency</span>></span>
<span style="color:#0000ff"><<span style="color:#0000ff">dependency</span>></span>
<span style="color:#0000ff"><<span style="color:#0000ff">groupId</span>></span>org.springframework.boot<span style="color:#0000ff"></<span style="color:#0000ff">groupId</span>></span>
<span style="color:#0000ff"><<span style="color:#0000ff">artifactId</span>></span>spring-boot-starter-test<span style="color:#0000ff"></<span style="color:#0000ff">artifactId</span>></span>
<span style="color:#0000ff"><<span style="color:#0000ff">scope</span>></span>test<span style="color:#0000ff"></<span style="color:#0000ff">scope</span>></span>
<span style="color:#0000ff"></<span style="color:#0000ff">dependency</span>></span>
<span style="color:#0000ff"></<span style="color:#0000ff">dependencies</span>></span>
</code></span>
並把配置文件重命名爲 application.yml ,修改默認測試端口
server:
port: 8087
2.3 基於 @Controller 的示例代碼
本代碼實例中新增瞭如下頁面,注意 templates
表示 /resources/tempalates/
,controller
表示 com.fishpro.restcontroller.controller
包。
- controller/UserController.java 控制層-用戶類
- domain/UserDO.java 用戶控實體類
- templates/user/index.html 視圖-用戶列表頁面
- templates/user/add.html 視圖-新增用戶頁面
- templates/user/edit.html 視圖-編輯用戶頁面
2.3.1 返回用戶列表信息 /user/index
首先構件一個虛擬的用戶數據
<span style="color:#333333"><code> <span style="color:#008000">/**
* 模擬一組數據
* */</span>
<span style="color:#0000ff">private</span> List<UserDO> <span style="color:#a31515">getData</span>(){
List<UserDO> list=<span style="color:#0000ff">new</span> ArrayList<>();
UserDO userDO=<span style="color:#0000ff">new</span> UserDO();
userDO.setUserId(1);
userDO.setUserName(<span style="color:#a31515">"admin"</span>);
list.add(userDO);
userDO=<span style="color:#0000ff">new</span> UserDO();
userDO.setUserId(2);
userDO.setUserName(<span style="color:#a31515">"heike"</span>);
list.add(userDO);
userDO=<span style="color:#0000ff">new</span> UserDO();
userDO.setUserId(3);
userDO.setUserName(<span style="color:#a31515">"tom"</span>);
list.add(userDO);
userDO=<span style="color:#0000ff">new</span> UserDO();
userDO.setUserId(4);
userDO.setUserName(<span style="color:#a31515">"mac"</span>);
list.add(userDO);
<span style="color:#0000ff">return</span> list;
}</code></span>
1 創建一個用戶列表頁面 /user/index
UserController 增加方法如下圖所示,使用 @RequestMapping 註解,注意 @RequestMapping(method = RequestMethod.GET,value = "/index")
等於 @RequestMapping(value = "/index")
也等於 @RequestMapping("/index")
也等於 @GetMapping("/index")
<span style="color:#333333"><code> <span style="color:#008000">/**
* GET 返回用戶列表信息
* */</span>
<span style="color:#2b91af">@RequestMapping</span>(method = RequestMethod.GET,value = <span style="color:#a31515">"/index"</span>)
<span style="color:#0000ff">public</span> String <span style="color:#a31515">index</span>(Model model){
List<UserDO> list =getData();
model.addAttribute(<span style="color:#a31515">"list"</span>,list);<span style="color:#008000">//返回 用戶 list</span>
<span style="color:#0000ff">return</span> <span style="color:#a31515">"user/index"</span>;
}
</code></span>
2 創建 templates/index.html 對應上面的路由 /user/index
<span style="color:#333333"><code><span style="color:#2b91af"><!DOCTYPE html></span>
<span style="color:#0000ff"><<span style="color:#0000ff">html</span> <span style="color:#ff0000">lang</span>=<span style="color:#a31515">"en"</span>></span>
<span style="color:#0000ff"><<span style="color:#0000ff">head</span>></span>
<span style="color:#0000ff"><<span style="color:#0000ff">meta</span> <span style="color:#ff0000">charset</span>=<span style="color:#a31515">"UTF-8"</span>></span>
<span style="color:#0000ff"><<span style="color:#0000ff">title</span>></span>Title<span style="color:#0000ff"></<span style="color:#0000ff">title</span>></span>
<span style="color:#0000ff"></<span style="color:#0000ff">head</span>></span>
<span style="color:#0000ff"><<span style="color:#0000ff">body</span>></span>
<span style="color:#0000ff"><<span style="color:#0000ff">div</span> <span style="color:#ff0000">class</span>=<span style="color:#a31515">"title"</span>></span>
<span style="color:#0000ff"></<span style="color:#0000ff">div</span>></span>
<span style="color:#0000ff"><<span style="color:#0000ff">div</span> <span style="color:#ff0000">th:each</span>=<span style="color:#a31515">"user :${list}"</span>></span>
用戶ID:<span style="color:#0000ff"><<span style="color:#0000ff">span</span> <span style="color:#ff0000">th:text</span>=<span style="color:#a31515">"${user.userId}"</span>></span><span style="color:#0000ff"></<span style="color:#0000ff">span</span>></span>
用戶名:<span style="color:#0000ff"><<span style="color:#0000ff">span</span> <span style="color:#ff0000">th:text</span>=<span style="color:#a31515">"${user.userName}"</span>></span><span style="color:#0000ff"></<span style="color:#0000ff">span</span>></span>
<span style="color:#0000ff"></<span style="color:#0000ff">div</span>></span>
<span style="color:#0000ff"></<span style="color:#0000ff">body</span>></span>
<span style="color:#0000ff"></<span style="color:#0000ff">html</span>></span></code></span>
3 在瀏覽器中查看
右鍵 RestControllerApplication > Run 在瀏覽器輸入 http://localhost:8087/user/index
<span style="color:#333333"><code>用戶ID:1 用戶名:admin
用戶ID:2 用戶名:heike
用戶ID:3 用戶名:tom
用戶ID:4 用戶名:mac</code></span>
2.3.3 新增用戶頁面 /user/add
在 UserController 中增加 add 路由 /user/add
UserController 增加方法如下圖所示,使用 @RequestMapping 註解,並創建了兩個路由
- /user/add 對應前端頁面
- /user/save 對應前端頁面提交按鈕的接口
<span style="color:#333333"><code> <span style="color:#008000">/**
* GET 返回add頁面
* <span style="color:#808080">@GetMapping</span>("/add") = <span style="color:#808080">@RequestMapping</span>(method = RequestMethod.GET,value = "/add")
* */</span>
<span style="color:#2b91af">@GetMapping</span>(<span style="color:#a31515">"/add"</span>)
<span style="color:#0000ff">public</span> String <span style="color:#a31515">add</span>(){
<span style="color:#0000ff">return</span> <span style="color:#a31515">"user/add"</span>;
}
<span style="color:#008000">/**
* POST 新增用戶api
* <span style="color:#808080">@return</span> 返回 map對象
* */</span>
<span style="color:#2b91af">@RequestMapping</span>(method = RequestMethod.POST,value = <span style="color:#a31515">"/save"</span>)
<span style="color:#2b91af">@ResponseBody</span>
<span style="color:#0000ff">public</span> Object <span style="color:#a31515">save</span>(UserDO user){
List<UserDO> list= getData();
list.add(user);<span style="color:#008000">//模擬向列表中增加數據</span>
Map<String,Object> map=<span style="color:#0000ff">new</span> HashMap<>();
<span style="color:#0000ff">if</span>(<span style="color:#0000ff">null</span>==user){
map.put(<span style="color:#a31515">"status"</span>,3);
map.put(<span style="color:#a31515">"message"</span>,<span style="color:#a31515">"沒有傳任何對象"</span>);
<span style="color:#0000ff">return</span> map;
}
map.put(<span style="color:#a31515">"status"</span>,0);
map.put(<span style="color:#a31515">"data"</span>,user);
<span style="color:#0000ff">return</span> map;
}
</code></span>
創建 templates/add.htm 文件對應路由 /user/add
在對應的 templates/add.html中增加代碼
<span style="color:#333333"><code><span style="color:#2b91af"><!DOCTYPE html></span>
<span style="color:#0000ff"><<span style="color:#0000ff">html</span> <span style="color:#ff0000">lang</span>=<span style="color:#a31515">"en"</span>></span>
<span style="color:#0000ff"><<span style="color:#0000ff">head</span>></span>
<span style="color:#0000ff"><<span style="color:#0000ff">meta</span> <span style="color:#ff0000">charset</span>=<span style="color:#a31515">"UTF-8"</span>></span>
<span style="color:#0000ff"><<span style="color:#0000ff">title</span>></span>用戶新增頁面<span style="color:#0000ff"></<span style="color:#0000ff">title</span>></span>
<span style="color:#0000ff"><<span style="color:#0000ff">script</span> <span style="color:#ff0000">src</span>=<span style="color:#a31515">"https://cdn.bootcss.com/jquery/1.11.3/jquery.js"</span>></span><span style="color:#0000ff"></<span style="color:#0000ff">script</span>></span>
<span style="color:#0000ff"></<span style="color:#0000ff">head</span>></span>
<span style="color:#0000ff"><<span style="color:#0000ff">body</span>></span>
<span style="color:#0000ff"><<span style="color:#0000ff">form</span> <span style="color:#ff0000">id</span>=<span style="color:#a31515">"form1"</span>></span>
<span style="color:#0000ff"><<span style="color:#0000ff">div</span>></span> <span style="color:#0000ff"><<span style="color:#0000ff">input</span> <span style="color:#ff0000">name</span>=<span style="color:#a31515">"userId"</span> <span style="color:#ff0000">id</span>=<span style="color:#a31515">"userId"</span> <span style="color:#ff0000">placeholder</span>=<span style="color:#a31515">"請輸入userid"</span>></span><span style="color:#0000ff"></<span style="color:#0000ff">div</span>></span>
<span style="color:#0000ff"><<span style="color:#0000ff">div</span>></span> <span style="color:#0000ff"><<span style="color:#0000ff">input</span> <span style="color:#ff0000">name</span>=<span style="color:#a31515">"userName"</span> <span style="color:#ff0000">id</span>=<span style="color:#a31515">"userName"</span> <span style="color:#ff0000">placeholder</span>=<span style="color:#a31515">"請輸入username"</span>></span><span style="color:#0000ff"></<span style="color:#0000ff">div</span>></span>
<span style="color:#0000ff"><<span style="color:#0000ff">div</span>></span> <span style="color:#0000ff"><<span style="color:#0000ff">input</span> <span style="color:#ff0000">type</span>=<span style="color:#a31515">"button"</span> <span style="color:#ff0000">value</span>=<span style="color:#a31515">"新增"</span> <span style="color:#ff0000">id</span>=<span style="color:#a31515">"btnSave"</span>/></span><span style="color:#0000ff"></<span style="color:#0000ff">div</span>></span>
<span style="color:#0000ff"></<span style="color:#0000ff">form</span>></span>
<span style="color:#0000ff"><<span style="color:#0000ff">script</span>></span>
$(<span style="color:#0000ff">function</span> () {
$(<span style="color:#a31515">"#btnSave"</span>).click(<span style="color:#0000ff">function</span> () {
$.ajax({
<span style="color:#ff0000">cache</span>: <span style="color:#a31515">true</span>,
<span style="color:#ff0000">type</span>: <span style="color:#a31515">"POST"</span>,
<span style="color:#ff0000">url</span>: <span style="color:#a31515">"/user/save"</span>,
<span style="color:#ff0000">data</span>:$(<span style="color:#a31515">'#form1'</span>).serialize(),
<span style="color:#ff0000">dataType</span>:<span style="color:#a31515">"json"</span>,
<span style="color:#ff0000">async</span>: <span style="color:#a31515">false</span>,
<span style="color:#ff0000">error</span>: <span style="color:#0000ff">function</span> (request) {
<span style="color:#0000ff">console</span>.log(<span style="color:#a31515">"Connection error"</span>);
},
<span style="color:#ff0000">success</span>: <span style="color:#0000ff">function</span> (data) {
<span style="color:#0000ff">if</span> (data.code == 0) {
<span style="color:#0000ff">console</span>.log(<span style="color:#a31515">"成功"</span>);
} <span style="color:#0000ff">else</span> {
<span style="color:#0000ff">console</span>.log(<span style="color:#a31515">"失敗"</span>);
}
}
});
});
});
<span style="color:#0000ff"></<span style="color:#0000ff">script</span>></span>
<span style="color:#0000ff"></<span style="color:#0000ff">body</span>></span>
<span style="color:#0000ff"></<span style="color:#0000ff">html</span>></span></code></span>
在瀏覽器中測試效果
右鍵 RestControllerApplication > Run 在瀏覽器輸入 http://localhost:8087/user/add
2.3.3 編輯用戶頁面 /user/edit
這部分代碼原理同 2.3.2 代碼原理 通過構件一個編輯頁面,點擊編輯頁面的【保存】提交到後端的 api 中。
本示例中創建了2個接口 1個文件
- /user/edit 對應前端頁面
- /user/update 對應前端頁面提交按鈕的接口
- /templates/user/edit.html
<span style="color:#333333"><code> <span style="color:#008000">/**
* GET 返回編輯頁面
* <span style="color:#808080">@GetMapping</span>("/edit/{id}") = <span style="color:#808080">@RequestMapping</span>(method = RequestMethod.GET,value = "/edit/{id}")
* <span style="color:#808080">@PathVariable</span>("id") 表示路由中的動態參數部分
* <span style="color:#808080">@param</span> id 表示要編輯的用戶id
* <span style="color:#808080">@param</span> model 表示將要輸出到頁面的 Model 對象
* <span style="color:#808080">@return</span> 返回到 user/edit頁面
* */</span>
<span style="color:#2b91af">@GetMapping</span>(<span style="color:#a31515">"/edit/{id}"</span>)
<span style="color:#0000ff">public</span> String <span style="color:#a31515">edit</span>(@PathVariable(<span style="color:#a31515">"id"</span>) String id, Model model){
UserDO user =<span style="color:#0000ff">new</span> UserDO();
user.setUserId(3);
user.setUserName(<span style="color:#a31515">"fishpro"</span>);
model.addAttribute(<span style="color:#a31515">"user"</span>,user);
<span style="color:#0000ff">return</span> <span style="color:#a31515">"user/edit"</span>;
}
<span style="color:#008000">/**
* POST 修改用戶api
* <span style="color:#808080">@RequestBody</span> 表示參數使用 json 對象傳輸
* <span style="color:#808080">@return</span> 返回 map對象
* */</span>
<span style="color:#2b91af">@PostMapping</span>(<span style="color:#a31515">"/update"</span>)
<span style="color:#2b91af">@ResponseBody</span>
<span style="color:#0000ff">public</span> Object <span style="color:#a31515">update</span>(@RequestBody UserDO user){
Map<String,Object> map=<span style="color:#0000ff">new</span> HashMap<>();
<span style="color:#0000ff">if</span>(<span style="color:#0000ff">null</span>==user){
map.put(<span style="color:#a31515">"status"</span>,3);
map.put(<span style="color:#a31515">"message"</span>,<span style="color:#a31515">"沒有傳任何對象"</span>);
<span style="color:#0000ff">return</span> map;
}
<span style="color:#008000">//更新邏輯</span>
map.put(<span style="color:#a31515">"status"</span>,0);
<span style="color:#0000ff">return</span> map;
}</code></span>
edit.html
<span style="color:#333333"><code><span style="color:#2b91af"><!DOCTYPE html></span>
<span style="color:#0000ff"><<span style="color:#0000ff">html</span> <span style="color:#ff0000">lang</span>=<span style="color:#a31515">"en"</span>></span>
<span style="color:#0000ff"><<span style="color:#0000ff">head</span>></span>
<span style="color:#0000ff"><<span style="color:#0000ff">meta</span> <span style="color:#ff0000">charset</span>=<span style="color:#a31515">"UTF-8"</span>></span>
<span style="color:#0000ff"><<span style="color:#0000ff">title</span>></span>用戶編輯頁面<span style="color:#0000ff"></<span style="color:#0000ff">title</span>></span>
<span style="color:#0000ff"><<span style="color:#0000ff">script</span> <span style="color:#ff0000">src</span>=<span style="color:#a31515">"https://cdn.bootcss.com/jquery/1.11.3/jquery.js"</span>></span><span style="color:#0000ff"></<span style="color:#0000ff">script</span>></span>
<span style="color:#0000ff"></<span style="color:#0000ff">head</span>></span>
<span style="color:#0000ff"><<span style="color:#0000ff">body</span>></span>
<span style="color:#0000ff"><<span style="color:#0000ff">form</span> <span style="color:#ff0000">id</span>=<span style="color:#a31515">"form1"</span>></span>
<span style="color:#0000ff"><<span style="color:#0000ff">div</span>></span> <span style="color:#0000ff"><<span style="color:#0000ff">input</span> <span style="color:#ff0000">name</span>=<span style="color:#a31515">"userId"</span> <span style="color:#ff0000">id</span>=<span style="color:#a31515">"userId"</span> <span style="color:#ff0000">placeholder</span>=<span style="color:#a31515">"請輸入userid"</span> <span style="color:#ff0000">th:value</span>=<span style="color:#a31515">${user.userId}</span>></span> <span style="color:#0000ff"></<span style="color:#0000ff">div</span>></span>
<span style="color:#0000ff"><<span style="color:#0000ff">div</span>></span> <span style="color:#0000ff"><<span style="color:#0000ff">input</span> <span style="color:#ff0000">name</span>=<span style="color:#a31515">"userName"</span> <span style="color:#ff0000">id</span>=<span style="color:#a31515">"userName"</span> <span style="color:#ff0000">placeholder</span>=<span style="color:#a31515">"請輸入username"</span> <span style="color:#ff0000">th:value</span>=<span style="color:#a31515">${user.userName}</span>></span><span style="color:#0000ff"></<span style="color:#0000ff">div</span>></span>
<span style="color:#0000ff"><<span style="color:#0000ff">div</span>></span> <span style="color:#0000ff"><<span style="color:#0000ff">input</span> <span style="color:#ff0000">type</span>=<span style="color:#a31515">"button"</span> <span style="color:#ff0000">value</span>=<span style="color:#a31515">"新增"</span> <span style="color:#ff0000">id</span>=<span style="color:#a31515">"btnSave"</span>/></span><span style="color:#0000ff"></<span style="color:#0000ff">div</span>></span>
<span style="color:#0000ff"></<span style="color:#0000ff">form</span>></span>
<span style="color:#0000ff"><<span style="color:#0000ff">script</span>></span>
$(<span style="color:#0000ff">function</span> () {
$(<span style="color:#a31515">"#btnSave"</span>).click(<span style="color:#0000ff">function</span> () {
$.ajax({
<span style="color:#ff0000">cache</span>: <span style="color:#a31515">true</span>,
<span style="color:#ff0000">type</span>: <span style="color:#a31515">"POST"</span>,
<span style="color:#ff0000">url</span>: <span style="color:#a31515">"/user/update"</span>,
<span style="color:#ff0000">data</span>:$(<span style="color:#a31515">'#form1'</span>).serialize(),
<span style="color:#ff0000">dataType</span>:<span style="color:#a31515">"json"</span>,
<span style="color:#ff0000">async</span>: <span style="color:#a31515">false</span>,
<span style="color:#ff0000">error</span>: <span style="color:#0000ff">function</span> (request) {
<span style="color:#0000ff">console</span>.log(<span style="color:#a31515">"Connection error"</span>);
},
<span style="color:#ff0000">success</span>: <span style="color:#0000ff">function</span> (data) {
<span style="color:#0000ff">if</span> (data.code == 0) {
<span style="color:#0000ff">console</span>.log(<span style="color:#a31515">"成功"</span>);
} <span style="color:#0000ff">else</span> {
<span style="color:#0000ff">console</span>.log(<span style="color:#a31515">"失敗"</span>);
}
}
});
});
});
<span style="color:#0000ff"></<span style="color:#0000ff">script</span>></span>
<span style="color:#0000ff"></<span style="color:#0000ff">body</span>></span>
<span style="color:#0000ff"></<span style="color:#0000ff">html</span>></span></code></span>
2.3.3 刪除用戶 /user/delete
<span style="color:#333333"><code><span style="color:#008000">/**
* POST 修改用戶api
* <span style="color:#808080">@return</span> 返回 map對象
* */</span>
<span style="color:#2b91af">@PostMapping</span>(<span style="color:#a31515">"/delete/{id}"</span>)
<span style="color:#2b91af">@ResponseBody</span>
<span style="color:#0000ff">public</span> Object <span style="color:#a31515">delete</span>(@PathVariable(<span style="color:#a31515">"id"</span>) Integer id){
List<UserDO> list= getData();
UserDO userDO=<span style="color:#0000ff">null</span>;
<span style="color:#0000ff">for</span> (UserDO user:list
) {
<span style="color:#0000ff">if</span>(id.equals(user.getUserId().toString())){
<span style="color:#008000">//刪除用戶</span>
userDO=user;
<span style="color:#0000ff">break</span>;
}
}
Map<String,Object> map=<span style="color:#0000ff">new</span> HashMap<>();
map.put(<span style="color:#a31515">"status"</span>,0);
map.put(<span style="color:#a31515">"data"</span>,userDO);
<span style="color:#0000ff">return</span> map;
}</code></span>
2.4 基於 @RestController 的示例代碼
本章節中是基於 2.3版本中的接口,其實是一樣的功能,詳細見下面的代碼,爲了完成代碼功能示例,我們新建了 UserRestController.java,不同的是 我們給類加了 @RestController 修飾符。
<span style="color:#333333"><code><span style="color:#2b91af">@RestController</span>
<span style="color:#2b91af">@RequestMapping</span>(<span style="color:#a31515">"user2"</span>)
<span style="color:#0000ff">public</span> <span style="color:#0000ff">class</span> <span style="color:#a31515">UserRestController</span> {
<span style="color:#008000">//從 UserController 搬過來代碼即可</span></code></span>