內容
- 對映請求到Spring控制器
- 透明地繫結表單引數
- 校驗表單提交
關鍵詞
- 模型-檢視-控制器(Model-View-Controller,MVC)
- 處理器對映(handle mapping)
- 檢視解析器(view resolver)
- 前端控制器(front controller)
- Java校驗API(Java Validation API,JSR-303)
5.1 請求處理流程
URL-->DispatcherServlet-->Controller-->Service-->Dao
當然上面也會反著來進行返回
第一個定義——Model(模型)
模型:控制器完成邏輯處理後,通常會產生一些資訊,這些資訊需要返回給使用者並在瀏覽器上顯示,這些資訊就被叫做模型(model)。
檢視:資訊返回後,需要給使用者進行格式化後展示,那麼資訊就需要傳送一個檢視(View)。
控制器最後將模型資料打包,並且標示出用於渲染輸出的檢視名。接下類會將請求連同模型和檢視名一起傳送給DispatcherServlet。
5.2 編寫基本的控制器
控制器方法時新增@RequestMapping註解,這個註解宣告瞭它所要處理的url請求。
5.2.1 定義方法級別的請求
package test
@Controller
public class HomeController() {
@RequestMapping(value='/',method=GET)
public String home() {
return "home";
}
}
- @Controller:註解來宣告控制器類,這是一個構造器的註解,也是基於@Component註解。但是,它的目的就是輔助實現元件掃描,元件掃描器會自動找到@Controller,並將其註解的類宣告為Spring上下文中的一個bean。
- @RequestMapping:屬性value指定了這個方法所要處理的請求路徑,method屬性細化了它所處理的HTTP方法。
5.2.2 定義類級別的請求
package test
@Controller
@RequestMapping(value='/')
public class HomeController() {
@RequestMapping(method=GET)
public String home() {
return "home";
}
}
1.一個RequestMapping被新增在了類級別上,意味著這個註解會應用到該控制器的所有的方法上,另一個方法上的註解,則是對類級別註解的一個補充。
2. 同時RequestMapping還可以接受一個String陣列@RequestMapping(value={'/','/home'})。
5.3 接受請求的輸入
關鍵詞
- 查詢引數(Query Parameter)
- 表單引數(Form Parameter)
- 路徑變數(Path Variable)
5.3.1 處理查詢引數
@RequestParam()的DefaultValue屬性可以接受引數
@RequestParam('id') long id;
但是這種方法不理想,@RequestMapping就有了佔位符這個概念
@RequestMapping(value="/home/{Id}",method=RequestMethod.GET)
public String book(@PathVariable("Id") long id,Model model) {
model.addAttribute(libraryRespo.findOne(id));
return "book";
}
- 假如路徑為/home/12345,則@PathVariable中的Id值為12345,且賦值給long id中的id
5.4 處理表單
提交表單,一般會使用POST請求,請求完成後,最好進行一下重定向——redirect,避免瀏覽器重新整理而重複提交表單。
// 寫一個介面,實現類略過
package spittr.data;
import spittr.Spitter;
public interface SpitterRepository {
Spitter save(Spitter spitter);
Spitter findByUsername(String username);
}
// 簡單寫一個Controller
package spittr.controller
import spittr.data.SpitterRepository;
import .......AutoWired;
import .......Model;
import .......RequestMapping;
import .......Controller;
import .......spittr.Spittr
@Controller
@RequestMapping('/home')
public class HomeController() {
priviate SpitterRepository spitterRepository;
@AutoWired
public HomeController(SpitterRepository spitterRepository) {
this.spitterRepository = spitterRepository;
}
@RequestMapping(value="/register",method=POST)
public String executeRegister(Spittr spittr) {
spitterRepository.save(spittr);
// 假設有一個POJO類為spittr,且有一個變數為Username,並生成一個getUsername()的方法
return "redirect:/home/" + spittr.getUsername()
}
}
- 返回值發現重定向字元,就會跳轉到重定向加字尾的路徑,eg:/home/jobs
- 除了redirect還有forward:字首,請求將會前往指定的URL路徑,而不再是重定向。
5.4.1 校驗表單
Java校驗API提供的校驗註解
註解 | 描述 |
---|---|
@AssertFalse | 所註解的元素必須是Boolean型別,並且值為false |
@AssertTrue | 所註解的元素必須是Boolean型別,並且值為True |
@DecimalMax,@DecimalMin | 所註解的元素必須是數字,並且值要大於(小於)或者等於給定的BigDecimalString值 |
@Max,@Min | 所註解的元素必須是數字,並且值要大於(小於)或者等於給定的值 |
@Digits | 所註解的元素必須是數字,並且值要有指定的位數 |
@Future | 所註解的元素必須是將來的一個日期 |
@Null,@NotNull | 所註解的元素必須為Null(不為Null) |
@Past | 所註解的元素必須是已過去的一個日期 |
@Pattern | 所註解的元素必須匹配給定的正規表示式 |
@Size(min=,max=) | 所註解的元素必須是String,集合或陣列,並且他的長度要符合給定的範圍。 |
@RequestMapping(value="/register",method=POST)
public String executeRegister(@Valid Spittr spittr,Errors errors) {
if (errors.hasErrors()) {
return "registerForm";
}
spitterRepository.save(spittr);
// 假設有一個POJO類為spittr,且有一個變數為Username,並生成一個getUsername()的方法
return "redirect:/home/" + spittr.getUsername()
}
- 新增@Valid註解,需要確保這個物件滿足校驗限制。
5.5 總結
總體來說,Spring MVC還是很靈活和強大的一個框架,通過自動註解的確減少了很多的工作,更好的開發。這是對於Spring MVC基礎知識的記錄筆記,後續會對其他的模組進行不斷地學習和豐富。