zoukankan      html  css  js  c++  java
  • SpringMVC-Controller&RestFul

    Controller与RestFul

    1. Controller

    1. 控制器Controller

    • 控制器复杂提供访问应用程序的行为,通常通过接口定义或注解定义两种方法实现。
    • 控制器负责解析用户的请求并将其转换为一个模型。
    • 在Spring MVC中一个控制器类可以包含多个方法
    • 在Spring MVC中,对于Controller的配置方式有很多种

    2. 利用接口定义控制器

    1. 实现Controller接口

    在类中重写ModelAndView方法实现功能

    package com.wang.controller;
    
    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 httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
            ModelAndView mv = new ModelAndView();
    
            //设置视图的属性
            mv.addObject("msg", "ControllerTest1");
            //设置跳转的页面
            mv.setViewName("test");
    
            return mv;
        }
    }
    

    2. 在spring配置文件中注册请求的bean

    其中, name对应请求的路径, class对应处理请求的类

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xmlns:context="http://www.springframework.org/schema/context"
           xmlns:mvc="http://www.springframework.org/schema/mvc"
           xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans.xsd
           http://www.springframework.org/schema/context
           https://www.springframework.org/schema/context/spring-context.xsd
           http://www.springframework.org/schema/mvc
           https://www.springframework.org/schema/mvc/spring-mvc.xsd">
    
        <context:component-scan base-package="com.wang.controller"/>
    
        <mvc:default-servlet-handler/>
    
        <mvc:annotation-driven/>
    
        <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"
              id="internalResourceViewResolver">
            <property name="prefix" value="/WEB-INF/jsp/"/>
            <property name="suffix" value=".jsp"/>
        </bean>
    
        <bean name="/t1" class="com.wang.controller.ControllerTest1"/>
    
    </beans>
    

    3. 编写前端jsp

    <%--
      Created by IntelliJ IDEA.
      User: Wang
      Date: 2020/9/8
      Time: 14:17
      To change this template use File | Settings | File Templates.
    --%>
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>ControllerTest</title>
    </head>
    <body>
    
    <h1>${msg}</h1>
    
    </body>
    </html>
    

    4. 注意

    • 实现Controller接口是一个较老的办法, 最好不要使用它!

    • 要在web.xml中配置DispatcherServlet

      <?xml version="1.0" encoding="UTF-8"?>
      <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
               xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
               xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
               version="4.0">
      
          <!--配置DispatcherServlet-->
          <servlet>
              <servlet-name>springmvc</servlet-name>
              <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
              <init-param>
                  <param-name>contextConfigLocation</param-name>
                  <param-value>classpath:springmvc-servlet.xml</param-value>
              </init-param>
              <load-on-startup>1</load-on-startup>
          </servlet>
          
          <servlet-mapping>
              <servlet-name>springmvc</servlet-name>
              <url-pattern>/</url-pattern>
          </servlet-mapping>
      
      </web-app>
      
    • 缺点: 一个控制器中只能写一个方法!

    3. 利用注解实现控制器

    1. 在spring配置文件中声明组件扫描

    <context:component-scan base-package="com.wang.controller"/>
    

    2. 在Spring配置文件中配置三大件与静态资源过滤

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xmlns:context="http://www.springframework.org/schema/context"
           xmlns:mvc="http://www.springframework.org/schema/mvc"
           xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans.xsd
           http://www.springframework.org/schema/context
           https://www.springframework.org/schema/context/spring-context.xsd
           http://www.springframework.org/schema/mvc
           https://www.springframework.org/schema/mvc/spring-mvc.xsd">
    
        <context:component-scan base-package="com.wang.controller"/>
    
        <mvc:default-servlet-handler/>
    
        <mvc:annotation-driven/>
    
        <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"
              id="internalResourceViewResolver">
            <property name="prefix" value="/WEB-INF/jsp/"/>
            <property name="suffix" value=".jsp"/>
        </bean>
    
    </beans>
    

    3. 在类中利用注解实现

    两个关键注解

    • @Controller
      • 代表这个类会被Spring接管, 这个注解的类中的所有方法, 如果返回值是String, 并且有具体的页面可以跳转, 那么就会被视图解析器解析!
    • @RequestMapping("/...")
    package com.wang.controller;
    
    import org.springframework.stereotype.Controller;
    import org.springframework.ui.Model;
    import org.springframework.web.bind.annotation.RequestMapping;
    
    //代表这个类会被Spring接管, 这个注解的类中的所有方法, 如果返回值是String, 并且有具体的页面可以跳转, 那么就会被视图解析器解析!
    @Controller
    public class ControllerTest2 {
    
        //映射访问路径
        @RequestMapping("/t2")
        public String test1 (Model model) {
    
            model.addAttribute("msg", "ControllerTest2");
    
            //此处的返回的字符串与要跳转的页面名一致!
            return "test";
        }
    
    }
    

    4. 注意

    可以使两个请求指向同一个视图, 但是返回不同的页面结果, 从而实现视图的复用, 控制器与视图之间是弱耦合关系

    package com.wang.controller;
    
    import org.springframework.stereotype.Controller;
    import org.springframework.ui.Model;
    import org.springframework.web.bind.annotation.RequestMapping;
    
    //代表这个类会被Spring接管, 这个注解的类中的所有方法, 如果返回值是String, 并且有具体的页面可以跳转, 那么就会被视图解析器解析!
    @Controller
    public class ControllerTest2 {
    
        //映射访问路径
        @RequestMapping("/t2")
        public String test2 (Model model) {
    
            model.addAttribute("msg", "ControllerTest2");
    
            //此处的返回的字符串与要跳转的页面名一致!
            return "test";
        }
    
        //映射访问路径
        @RequestMapping("/t3")
        public String test3 (Model model) {
    
            model.addAttribute("msg", "ControllerTest3");
    
            //此处的返回的字符串与要跳转的页面名一致!
            return "test";
        }
    
    }
    

    4. RequestMapping

    ResquestMapping可以加在类或者方法上(源码中的@Target)

    同时注解了类和方法, 则存在父子关系

    package com.wang.controller;
    
    import org.springframework.stereotype.Controller;
    import org.springframework.ui.Model;
    import org.springframework.web.bind.annotation.RequestMapping;
    
    @Controller
    @RequestMapping("/c3")
    public class ControllerTest3 {
    
        //此时要访问/c3/t1才能访问到下面写的资源
        @RequestMapping("/t1")
        public String test3(Model model) {
            model.addAttribute("msg", "ControllerMapping");
            return "test";
        }
    }
    

    2. RestFul风格

    1. 原来的url风格

    url: http://localhost:8080/add?a=1&b=2

    package com.wang.controller;
    
    import org.springframework.stereotype.Controller;
    import org.springframework.ui.Model;
    import org.springframework.web.bind.annotation.RequestMapping;
    
    @Controller
    public class RestFulController {
    
        //原来的
        //http://localhost:8080/add?a=1&b=2
        //由于此处要求有两个参数, url必须传参, 否则报500错误
        @RequestMapping("/add")
        public String test(int a, int b, Model model) {
            int res = a + b;
            model.addAttribute("msg", "结果为" + res);
            return "test";
        }
    
    }
    

    2. RestFul风格

    1. 简单的RestFul

    在Spring MVC中可以使用 @PathVariable 注解,让方法参数的值对应绑定到一个URI模板变量上

    url: http://localhost:8080/add/1/2

    package com.wang.controller;
    
    import org.springframework.stereotype.Controller;
    import org.springframework.ui.Model;
    import org.springframework.web.bind.annotation.PathVariable;
    import org.springframework.web.bind.annotation.RequestMapping;
    
    @Controller
    public class RestFulController {
    
        //使用RestFul风格, 变量用 / 分隔
        //此时的url: http://localhost:8080/add/1/2
        @RequestMapping("/add/{a}/{b}")
        public String test(@PathVariable int a, @PathVariable int b, Model model) {
            int res = a + b;
            model.addAttribute("msg", "结果为" + res);
            return "test";
        }
    
    }
    

    2. 使用method属性指定请求类型

    用于约束请求的类型,可以收窄请求范围。指定请求谓词的类型如GET, POST, HEAD, OPTIONS, PUT, PATCH, DELETE, TRACE等

    package com.wang.controller;
    
    import org.springframework.stereotype.Controller;
    import org.springframework.ui.Model;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.PathVariable;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestMethod;
    
    @Controller
    public class RestFulController {
    
        /*
        此注解与下面的注解等价, 都是以get方法去提交
        @RequestMapping(value = "/add/{a}/{b}", method = RequestMethod.GET)
        */
        @GetMapping("/add/{a}/{b}")
        public String test(@PathVariable int a, @PathVariable int b, Model model) {
            int res = a + b;
            model.addAttribute("msg", "结果为" + res);
            return "test";
        }
    
    }
    

    3. 总结

    pring MVC 的 @RequestMapping 注解能够处理 HTTP 请求的方法, 比如 GET, PUT, POST, DELETE 以及 PATCH。

    *所有的地址栏请求默认都会是 HTTP GET 类型的。*

    方法级别的注解变体有如下几个:组合注解

    @GetMapping
    @PostMapping
    @PutMapping
    @DeleteMapping
    @PatchMapping
    

    @GetMapping 是一个组合注解,平时使用的会比较多!

    它所扮演的是 @RequestMapping(method =RequestMethod.GET) 的一个快捷方式。

    RestFul的特点:

    • 简洁(用 / 分隔)
    • 高效(支持缓存)
    • 安全(无法看到传递的参数名)
  • 相关阅读:
    大型网站的可伸缩性架构如何设计?
    前端路由跳转基本原理
    强大的CSS:用纯css模拟下雪的效果
    package.json 和 package-lock.json 文件说明
    CSS 继承深度解析
    EJS-初识
    百度前端学院-基础学院-第20到21天之setTimeOut与setInterval
    百度前端学院-基础学院-第20到21天
    es6字符串方法
    字符串方法之padStart和padEnd
  • 原文地址:https://www.cnblogs.com/wang-sky/p/13633040.html
Copyright © 2011-2022 走看看