SpringMVC常⽤配置-Controller中的各种配置(基于JavaAPI和
注解)
1、本⽂内容
Controller是由很多内容组成的,包括将⼀个类配置为控制器、将类或⽅法映射为请求路径、从URL请求中解析参数、从表单中解析参数、控制器之间的跳转、请求的重定向、返回视图、构造模型等等内容
本⽂对这些控制器的常⽤部分做⼀个⼤致的梳理
本⽂的内容主要基于Java API 和注解⽅式配置
2、控制器的声明
2.1、启⽤组件⾃动扫描
Spring配置中的启⽤组件⾃动扫描配合使⽤,将控制器所在的包设置为⾃动扫描的⽬标⽬录
fig;
ller.ControllerScanHook;
@Configuration
@EnableWebMvc
@ComponentScan(basePackageClasses={ControllerScanHook.class})
public class WebConfig extends WebMvcConfigurerAdapter {
}
2.2、使⽤@Controller标注
ller;
import org.springframework.stereotype.Controller;
@Controller
public class HomeController {
}
3、映射请求路径
3.1、在类上使⽤ @RequestMapping声明
这相当于给这个控制器中的所有⽅法定义⼀个跟路径,然后在其⽅法上使⽤ @RequestMapping配置映射时,所有的映射都是相对于类声明上配置的这个跟路径的相对路径
@Controller
@RequestMapping("/appointments")
public class AppointmentsController {
private final AppointmentBook appointmentBook;
@Autowired
public AppointmentsController(AppointmentBook appointmentBook) {
this.appointmentBook = appointmentBook;
}
@RequestMapping(method = RequestMethod.GET)
public Map<String, Appointment> get() {
AppointmentsForToday();
}
@RequestMapping(path = "/{day}", method = RequestMethod.GET)
public Map<String, Appointment> getForDay(@PathVariable @DateTimeFormat(iso = ISO.DATE) Date day, Model model) {
AppointmentsForDay(day);
}
@RequestMapping(path = "/new", method = RequestMethod.GET)
public AppointmentForm getNewForm() {
return new AppointmentForm();
}
@RequestMapping(method = RequestMethod.POST)
public String add(@Valid AppointmentForm appointment, BindingResult result) {
if (result.hasErrors()) {
return "appointments/new";
}
appointmentBook.addAppointment(appointment);
return "redirect:/appointments";
}
}
观察这个案例中的内容,当使⽤ @RequestMapping标注在类上⾯声明了⼀个路径之后,⽅法的配置分为这样⼏种情况:
1)GET⽅式请求路径“/appointments”,将会进⼊ get() ⽅法
2)POST⽅式请求路径“/appointments”,将会进⼊ add() ⽅法
3)GET⽅式请求“/appointment/new”,将会进⼊ getNewForm() ⽅法
4)GET⽅式请求“/appointment/2016-12-06”,将会进⼊ getForDay() ⽅法【参考路径模版】
3.2、在⽅法上使⽤@RequestMapping声明
在上⾯的例⼦中@RequestMapping⽤在了两个地⽅,⾸相在类上声明,作为⼀个“基础”路径,然后在⽅法上的声明是相对于这个基础路径的相对路径。
除了这种⽤法,还可以不在类上⾯标注 @RequestMapping,⽽直接在⽅法上使⽤,这就表⽰绝对路径的声明,例如下⾯这样:
@Controller
public class HomeController {
@RequestMapping(value = "/", method = RequestMethod.GET)
public String home() {
return "home";
}
@RequestMapping(value = "/welcome", method = RequestMethod.GET)
public String welcome() {
return "welcome";
}
}
1)GET⽅式请求“/”,就会进⼊ home()⽅法
2)GET⽅式请求“/welcome”,就会进⼊ welcome() ⽅法
3.3、@GetMapping、@PostMapping、@PutMapping等
Spring框架从4.3开始引⼊了⼀个简化 @ReuqestMapping的注解,也就是:
@GetMapping、@PostMapping、@PutMapping、@DeleteMapping、@PatchMapping
这⼏个注解实际上就是设置了请求类型的 @RequestMapping 注解,与其对应关系可以参考下⾯的⽰例:
@RequestMapping(method = RequestMethod.GET)
@GetMapping
@RequestMapping(path = "/new", method = RequestMethod.GET)
@GetMapping("/new")
@RequestMapping(method = RequestMethod.POST)
@PostMapping
4、获取URL请求参数
4.1、利⽤请求路径获取参数 URI Template Pattern & @PathVariable
在使⽤ @RequestMapping或者@GetMapping等注解标注映射时,可以使⽤URL Template Patterns来设置请求路径,并从中获取参数。
例如,下⾯是⼀个URI的模版:
ample/users/{userId}
注意这个模版,看起来与普通的URL没有什么区别,但是仔细看,其路径的最后⼀部分是 {userId} ,这样⼀个使⽤⼤括号括起来的字符串,这个就是⼀个URI模版,与这个模版对应的实际请求如下:
ample/users/12345
在SpringMVC中,对于在 @RequestMapping中配置的这种请求路径,可以使⽤ @PathVariable注解来获取值:
@GetMapping("/owners/{ownerId}")
public String findOwner(@PathVariable String ownerId, Model model) {
Owner owner = ownerService.findOwner(ownerId);
model.addAttribute("owner", owner);
return "displayOwner";
}
在这个例⼦中的URI路径模版就是“/owners/{ownerId}”,然后在控制器⽅法的参数中使⽤ @PathVariable 注解标注⼀个参数,Spring MVC就会在获取请求i之后⾃动的将{ownerId}所表⽰的内容设置到这个参数中了。
注意,这⾥⽅法的参数名称要与URI中的{var}名称⼀样。
此外,@PathVariable注解可以指定⽅法参数对应的URI模版中占位符的名称:
@GetMapping("/owners/{ownerId}")
public String findOwner(@PathVariable("ownerId") String theOwner, Model model) {
// implementation omitted
}
4.2、获取URL请求参数 @RequestParam
利⽤ @RequestParam可以从传统的URL中获取参数
@RequestMapping(value = "/requestparam", method = RequestMethod.GET)
public String acceptingRequestInput(@RequestParam("bookname") String name, @RequestParam("count") int count) {
System.out.println("bookname: " + name);
System.out.println("count: " + count);
return "requestInput";
}
注意这个⽅法的参数,这个⽅法有两个参数,分别使⽤ @RequestParam注解进⾏标注了,参考上⼀⼩节从路径中获取参数的⽅式,应该能够联想到这种⽅式是如何获取参数的。
对应于这个⽅法的请求路径:
/requestparam?bookname=thinkingjava&count=5
这种传统的URL请求,⼀个“?”后⾯跟着若⼲个键值对参数,可以使⽤ @RequestParam的⽅式获取参数。
5、获取表单数据
获取表单数据可以直接在控制器中的⽅法中给出⼀个模型作为参数即可,表单中的name值对应着模型中的属性值,然后数据会被注⼊到⼀
个⾃动构建的参数对象中。
form表单
<form action="${basePath}pm/usecase/save" method="POST">
<label for="num">Num</label>
<input type="text" id="Num" name="num"><br>
<label for="name">Name</label>
<input type="text" id="name" name="name"><br>
<label for="description">Description</label>
<textarea rows="3" name="description" id="description"></textarea><br>
<label for="status">Status</label>
<select class="form-control"
id="status" name="status">
<option value="1">创建</option>
<option value="2">完成</option>
</select><br>
<label for="author">Author</label>
<input type="text" id="author" name="author"><br>
<label for="complitionDate">ComplitionDate</label>
<input type="date" id="complitionDate" name="complitionDate">
<input type="time" id="complitionTime" name="complitionTime"><br>
<button type="submit" class="btn btn-default">Save</button>
</form>
模型
注意这个模型中的属性名称与表单中的name属性是⼀⼀对应的,如此才能够将值⾃动注⼊到相应的属性中
public class UsecaseViewModel {
public UsecaseViewModel() {
}
private String wid;
private String num;
private String name;
private String description;
private int status;
private String author;
private String complitionDate;
private String complitionTime;
private String createDate;
private String moduleWid;
// getter and setter methods
}
控制器⽅法
此处控制器的参数,直接使⽤这个模型类型,这告诉SpringMVC将相关的数据⾃动构造成这个类型的⼀个对象,然后注⼊到这个⽅法中
@RequestMapping(value = "/pm/usecase/save", method = RequestMethod.POST)
public String saveUsecase(UsecaseViewModel model) {
springmvc的注解有哪些usecaseBus.saveUsecase(model);
return "redirect:/pm/usecase/list/" + ModuleWid();
}
6、控制器返回视图
6.1、返回视图
在SpringMVC中,控制器中的⽅法并不直接返回视图的完整路径,⽽是返回⼀个视图的名称,然后根据在Spring中配置的视图解析器,结合视图名称确定真正的视图。
根据在SpringMVC的配置类中配置的视图解析器:
@Bean
public ViewResolver viewResolver() {
InternalResourceViewResolver viewResolver =
new InternalResourceViewResolver();
viewResolver.setPrefix("/views/");
viewResolver.setSuffix(".jsp");
return viewResolver;
}
上⾯配置的内容表⽰在控制器返回的视图名称加上前缀“/views/”,和后缀“.jsp”,然后到WebContent下寻对应的⽂件。
因此对于下⾯的控制器中返回的视图名称:
@GetMapping("/welcome")
public String welcome() {
return "welcome";
}
其实际对应的视图⽂件应该是在WebContent⽬录下的:/views/welcome.jsp
6.2、携带数据返回视图
上⾯的⽅式只是简单的返回⼀个视图,但在实际开发中通常需要将⼀些数据展⽰到视图中,那么如何将这些数据携带到视图中呢?
观察下⾯的⽅法,这个⽅法的返回值不再是⼀个字符串,⽽是⼀个 ModelAndView 类型,然后在这个⽅法中创建了⼀个ModelAndView 对象,这个构造函数中接受的字符串,就是视图的名称,此外可以向这个对象中添加键值对,这些添加到ModeAndView中的键值对实际上会被添加到Request中,然后被转发给JSP页⾯,这样我们就可以使⽤EL表达式直接获取这些值了。
@RequestMapping(value = "/todo/detail/{wid}")
public ModelAndView todoDetail(@PathVariable String wid) {
ModelAndView mv = new ModelAndView("todoDetail");
TodoDetailViewModel detail = Detail(wid);
mv.addObject("detail", detail);
return mv;
}
在JSP页⾯,可以直接使⽤EL表达式获取,此外还可以使⽤JSTL。
<c:forEach items="${detail.items}" var="item" varStatus="status">
<tr>
<td>${status.index+1 }</td>
<td>${t}</td>
<td>${ateDate}</td>
<td><a class="btn btn-default btn-sm" href="###"
role="button">删除</a></td>
</tr>
</c:forEach>
7、控制器转跳
7.1、控制器之间跳转
使⽤“redirect:”前缀,后⾯跟上@RequestMapping中配置的路径,即可实现控制器之间的跳转
return "redirect:/pm/usecase/list/" + ModuleWid();
7.2、跳转到外部链接
如果需要跳转到外部链接,则需要给出完整的路径,当然“redirect:”前缀也不能丢掉
return "redirect:myhost/absolutepath"
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论