控制器Controller
- 控制器负责提供访问应用程序的行为,通常通过接口定义或注解定义两种方法实现。
- 控制器负责解析用户请求,并将其转换为一个模型。
- 在SpringMVC中一个控制器可以包含多个方法。
- 在SpringMVC中,对于Controller的配置方式有很多种。
Controller 实现方式一:实现Controller接口
Controller是一个接口,在org.spring.framework.web.servlet.mvc包下,接口中只有一个方法:
// 实现该接口的类就可以获得控制器功能
public interface Controller {
ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception;
}
测试:
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
// 实现了Controller接口的类,说明这个类就是一个控制器了
public class ControllerTest1 implements Controller {
@Override
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
ModelAndView mv = new ModelAndView();
mv.addObject("msg", "ControllerTest1");
mv.setViewName("test");
return mv;
}
}
- 实现接口Controller定义控制器是较老的方法
- 缺点是一个控制器只有一个方法,如果要多个方法定义则需要定义多个Controller,定义方式比较麻烦。
Controller 实现方式二:使用@Controller注解
- @Controller 注解类型用于声明Spring类的实例是一个控制器
- Spring可以使用扫描机制来找到应用程序中所有基于注解的控制器类,为了保证Spring能找到你的控制器,需要在配置文件中声明组件扫描。
<context:component-scan base-package="com.test.controller"/>
测试:
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller // 代表这个类被Srping接管,被这个注解的类中的所有方法,如果返回值是String,并且有具体页面,那么就会被视图解析器解析
@RequestMapping("/test2")
public class ComtrollerTest2 {
@RequestMapping("/index")
public String index(Model model){
model.addAttribute("msg", "ControllerTest2");
return "test";
}
}
@RequestMapping
- @RequestMapping 注解用于映射URL到控制器或者一个特定的方法。可用于类或者方法上面。
- 最终访问路劲为 host + 类路径 + 方法路径
@Restful 风格
定义Http请求方式,括号传参定义路由和参数
@GetMapping 定义Get请求
@PostMapping 定义Post请求
@PutMapping 定义Put请求
@DeleteMapping 定义Delete请求
@PatchMapping 定义Patch请求
@RequestMapping 可设定请求路径、传参、和Http请求方式
@PathVariable 表示参数可以被路由传参,和@RequestMapping 搭配使用
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;
@Controller
public class RestfulController {
// 原来传参:http://localhost:8080/add?a=1&b=2
// Restful:http://localhost:8080/add/1/2
// 原来Mapping @RequestMapping("/add")
//@RequestMapping(path="/add/{a}/{b}", method = RequestMethod.GET)
//@PathVariable 表示参数可以被路由传参
@GetMapping ("/add/{a}/{b}")
public String test(@PathVariable int a, @PathVariable int b, Model model){
int res = a + b;
model.addAttribute("msg", "test res = " + res);
return "test";
}
// 只能用Post method提交
@PostMapping("/add/{a}/{b}")
public String test2(@PathVariable int a, @PathVariable int b, Model model){
int res = a + b;
model.addAttribute("msg", "test2 res = " + res);
return "test";
}
@RequestMapping("/form")
public String test2(Model model){
return "form";
}
}
下面两种方式结果一样
- @RequestMapping(path="/add/{a}/{b}", method = RequestMethod.GET)
- @GetMapping ("/add/{a}/{b}")
网友评论