【归纳总结】SpringMVC之HandlerMethod

本文详细介绍了SpringMVC的HandlerMethod,包括导包、配置DispatcherServlet、注解使用、@RequestMapping的详细映射规则、Handler方法的返回值类型以及转发和重定向操作。重点讲解了如何通过注解实现URL映射、请求参数和头的限制,以及返回JSON数据的方法。
Python3.8

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

SpringMVC简介

MVC的任务:将包含业务数据的模块与显示模块的视图解耦。

SpringMVC和JavaEE的区别
在这里插入图片描述
SpringMVC的核心功能
在这里插入图片描述


SpringMVC的使用

1️⃣导包

①spring-webmvc

会导入Spring的五个核心包,MVC的两个核心包,和日志

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>5.2.10.RELEASE</version>
        </dependency>

在这里插入图片描述

②servlet-api

        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>servlet-api</artifactId>
            <version>3.0-alpha-1</version>
            <scope>provided</scope>
        </dependency>

2️⃣配置DispatcherServlet

在web.xml中配置:

    <servlet>
        <servlet-name>dispatcherServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:application.xml</param-value>
        </init-param>
    </servlet>
    <servlet-mapping>
        <servlet-name>dispatcherServlet</servlet-name>
        <!--除了web资源根路径下的jsp文件,其余所有都经过dispatcherServlet-->
        <url-pattern>/</url-pattern>
    </servlet-mapping>

3️⃣配置注解

在application.xml中配置:

<mvc:annotation-driven/>

该标签帮我们注册了HandlerMapping和HandlerAdapter

4️⃣注册Handler

新建一个类,在类上添加@controller注解


@RequestMapping

1️⃣url路径映射

就是建立请求url和handler方法之间的映射关系

① 最基础的映射

直接给直接加个value值

    @RequestMapping("hello")
    public ModelAndView hello(){
        ModelAndView modelAndView = new ModelAndView("/WEB-INF/hello.jsp");
        modelAndView.addObject("result","SpringMVC");
        return modelAndView;
    }

② 多个请求映射到一个HandlerMethod

给value值传一个String数组

    @RequestMapping({"hello1","hello2","hello3"})
    public ModelAndView hello(){
        ModelAndView modelAndView = new ModelAndView("/WEB-INF/hello.jsp");
        modelAndView.addObject("result","SpringMVC");
        return modelAndView;
    }

③ 使用通配符*来映射

表示hello后面可以加任何文字:

    @RequestMapping("hello*")
    public ModelAndView hello(){
        ModelAndView modelAndView = new ModelAndView("/WEB-INF/hello.jsp");
        modelAndView.addObject("result","SpringMVC");
        return modelAndView;
    }

表示hello下的任意子域名

    @RequestMapping("hello/*")
    public ModelAndView hello(){
        ModelAndView modelAndView = new ModelAndView("/WEB-INF/hello.jsp");
        modelAndView.addObject("result","SpringMVC");
        return modelAndView;
    }

2️⃣窄化请求

就是在类上使用@RequestMapping注解

@Controller
@RequestMapping("hi")
public class HelloController {

3️⃣请求方法限定

限定HandlerMethod映射的请求url对应的请求方法

在@RequestMapping注解中添加method属性即可

    @RequestMapping(value = "hello/*", method = RequestMethod.POST)
    public ModelAndView hello(){
        ModelAndView modelAndView = new ModelAndView("/WEB-INF/hello.jsp");
        modelAndView.addObject("result","SpringMVC");
        return modelAndView;
    }

这样写后,就只有post请求可以访问过来了

也可以直接使用@PostMapping注解(@GetMapping)

    @PostMapping("hello")
    public ModelAndView hello(){
        ModelAndView modelAndView = new ModelAndView("/WEB-INF/hello.jsp");
        modelAndView.addObject("result","SpringMVC");
        return modelAndView;
    }

4️⃣请求参数限定

    @GetMapping (value = "hello", params = {"username","password"})
    public ModelAndView hello(){
        ModelAndView modelAndView = new ModelAndView("/WEB-INF/hello.jsp");
        modelAndView.addObject("result","SpringMVC");
        return modelAndView;
    }

这样请求必须要携带username和password两个参数才能进来

5️⃣请求头限定

①限定需要的请求头

    @RequestMapping(value = "hello", headers = {"abc","def"})
    public ModelAndView hello(){
        ModelAndView modelAndView = new ModelAndView("/WEB-INF/hello.jsp");
        modelAndView.addObject("result","SpringMVC");
        return modelAndView;
    }

则请求报文需要abc和edf两个请求头

②限定请求头ContentType的值

Content-Type代表发送端(客户端|服务器)发送的实体数据的数据类型

    @RequestMapping(value = "hello", consumes = "text/html")
    public ModelAndView hello(){
        ModelAndView modelAndView = new ModelAndView("/WEB-INF/hello.jsp");
        modelAndView.addObject("result","SpringMVC");
        return modelAndView;
    }

③限定请求头Accept的值

Accept代表发送端(客户端)希望接受的数据类型

    @RequestMapping(value = "hello", produces = "text/html")
    public ModelAndView hello(){
        ModelAndView modelAndView = new ModelAndView("/WEB-INF/hello.jsp");
        modelAndView.addObject("result","SpringMVC");
        return modelAndView;
    }

Handler方法的返回值

1️⃣ModelAndView

刚刚一直在用

2️⃣void(不推荐)

3️⃣String

实际上就是返回的值作为ViewName,Model直接写到形参中

    @RequestMapping("hey")
    public String hey(Model model){
        model.addAttribute("result","SpringMVC");
        return "/WEB-INF/hello.jsp";
    }

4️⃣Json(重点)

将返回值写成Object,然后导入依赖

        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.11.3</version>
        </dependency>

然后在方法上加上@ResponseBody注解

    @RequestMapping("hello")
    @ResponseBody
    public Object hello(){
        Vo1 vo1 = new Vo1();
        vo1.setUsername("octavius");
        vo1.setPassword("123456");
        return vo1;
    }

也可以在类上用@RestController注解替换@Controller注解,这样这个类下的所有方法都返回Object对象时都会自动转换成Json数据

@RestController
@RequestMapping("hi")
public class HelloController {

    @RequestMapping("hello")
    /*@ResponseBody*/
    public Object hello(){
        Vo1 vo1 = new Vo1();
        vo1.setUsername("octavius");
        vo1.setPassword("123456");
        return vo1;
    }
}

转发和重定向

@Controller
@RequestMapping("hi")
public class HelloController {

    @RequestMapping(value = "hello", produces = "text/html")
    public ModelAndView hello(){
        ModelAndView modelAndView = new ModelAndView("/WEB-INF/hello.jsp");
        modelAndView.addObject("result","SpringMVC");
        return modelAndView;
    }

    @RequestMapping("myforward")
    public String hey1(){

        return "forward:/hello";
    }

    @RequestMapping("myredirect")
    public String hey2(){

        return "redirect:/hello";
    }
}

建议:冒号后面加上斜杠,否则就是相对于Handler的路径

您可能感兴趣的与本文相关的镜像

Python3.8

Python3.8

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值