controller level
method-level
package spittr.web;
import static org.springframework.web.bind.annotation.RequestMethod.*;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
@Controller
public class HomeController {
@RequestMapping(value="/", method=GET)
public String home() {
return "home";
}
}
class-level
@Controller
@RequestMapping("/") //@RequestMapping({"/", "/homepage"})
public class HomeController {
@RequestMapping(method=GET)
public String home() {
return "home";
}
}
passing model data to the view
- 數(shù)據(jù)流: controller --> view resolver --> view
- 數(shù)據(jù)的類型: Model宾符,本質(zhì)上是一個(gè)map
- controller函數(shù)中始終返回的是view 名稱匠抗,Model 數(shù)據(jù)的傳遞由框架來(lái)實(shí)現(xiàn)
- 在前端的jsp中,可以通過(guò)key來(lái)訪問(wèn)數(shù)據(jù)
傳遞模型數(shù)據(jù)的幾種形式
返回view name隙咸, 數(shù)據(jù)保存在model中
- 返回的view名稱"spittles", 傳遞的數(shù)據(jù)保存在Model(map)中
- Model 不明確指定key,默認(rèn)自動(dòng)推導(dǎo)可以為"spittleList"(List<Spittle> 推導(dǎo)而來(lái))
@Controller
@RequestMapping("/spittles")
public class SpittleController {
private SpittleRepository spittleRepository;
@Autowired
public SpittleController(
SpittleRepository spittleRepository) {
this.spittleRepository = spittleRepository;
}
@RequestMapping(method=RequestMethod.GET)
public String spittles(Model model) {
model.addAttribute(spittleRepository.findSpittles(Long.MAX_VALUE, 20));//model.addAttribute("spittleList", spittleRepository.findSpittles(Long.MAX_VALUE, 20));
return "spittles";
}
}
返回view name, 數(shù)據(jù)使用java.util.Map保存
@RequestMapping(method=RequestMethod.GET)
public String spittles(Map model) {
model.put("spittleList",
spittleRepository.findSpittles(Long.MAX_VALUE, 20));
return "spittles";
}
返回?cái)?shù)據(jù)成洗,view name讓框架自動(dòng)推導(dǎo)(最好別這么做)
@RequestMapping(method=RequestMethod.GET)
public List<Spittle> spittles() {
return spittleRepository.findSpittles(Long.MAX_VALUE, 20));
}
- 返回的數(shù)據(jù)會(huì)保存到Model中五督,Model key也是自動(dòng)推導(dǎo)
- view name 根據(jù)request path推到而來(lái), 比例:http://xxx/spittles, view name就是spittles
request input
獲取參數(shù)
@RequestMapping(method=RequestMethod.GET)
public List<Spittle> spittles(
@RequestParam(value="max", defaultValue=MAX_LONG_AS_STRING) long max,
@RequestParam(value="count", defaultValue="20") int count) {
return spittleRepository.findSpittles(max, count);
}
resource-orientation 資源化的url
@RequestMapping(value="/{spittleId}", method=RequestMethod.GET)
public String spittle(
@PathVariable("spittleId") long spittleId,
Model model) {
model.addAttribute(spittleRepository.findOne(spittleId));
return "spittle";
}
- @PathVariable 可以省略參數(shù)瓶殃,默認(rèn)和函數(shù)的參數(shù)相同充包, 即spittleId (long spittleId)
processing forms
form controller
@RequestMapping(value="/register", method=POST)
public String processRegistration(Spitter spitter) {
spitterRepository.save(spitter);
return "redirect:/spitter/" +
spitter.getUsername();
}
validating forms
import javax.validation.constraints.Max;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
public class SpittleForm {
@NotNull
@Size(min=1, max=140)
private String message;
@Min(-180)
@Max(180)
private Double longitude;
@Min(-90)
@Max(90)
private Double latitude;
.....
}
- controller 對(duì)應(yīng)的處理函數(shù)中必須增加一個(gè)org.springframework.validation.Errors 參數(shù)
@RequestMapping(value="/register", method=POST)
public String processRegistration(
@Valid Spitter spitter,
Errors errors) {
if (errors.hasErrors()) {
return "registerForm";
}
spitterRepository.save(spitter);
return "redirect:/spitter/" + spitter.getUsername();
}