五、Spring Web應用程式構建

魚換水發表於2020-05-29

內容

  • 對映請求到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";
	}

}

  1. @Controller:註解來宣告控制器類,這是一個構造器的註解,也是基於@Component註解。但是,它的目的就是輔助實現元件掃描,元件掃描器會自動找到@Controller,並將其註解的類宣告為Spring上下文中的一個bean。
  2. @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";
}
  1. 假如路徑為/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()

	}
}

  1. 返回值發現重定向字元,就會跳轉到重定向加字尾的路徑,eg:/home/jobs
  2. 除了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()

	}

  1. 新增@Valid註解,需要確保這個物件滿足校驗限制。

5.5 總結

總體來說,Spring MVC還是很靈活和強大的一個框架,通過自動註解的確減少了很多的工作,更好的開發。這是對於Spring MVC基礎知識的記錄筆記,後續會對其他的模組進行不斷地學習和豐富。

相關文章