美文网首页
5. Spring MVC: Controller 及Restf

5. Spring MVC: Controller 及Restf

作者: Messix_1102 | 来源:发表于2022-02-01 09:46 被阅读0次

    控制器Controller

    1. 控制器负责提供访问应用程序的行为,通常通过接口定义或注解定义两种方法实现。
    2. 控制器负责解析用户请求,并将其转换为一个模型。
    3. 在SpringMVC中一个控制器可以包含多个方法。
    4. 在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}")

    相关文章

      网友评论

          本文标题:5. Spring MVC: Controller 及Restf

          本文链接:https://www.haomeiwen.com/subject/hafvcrtx.html