SpringMVC——Controller配置总结,@RequestMapping

本文详细介绍了SpringMVC中两种定义Controller的方法:实现Controller接口和使用@Controller注解。探讨了@RequestMapping注解的使用,如何配置视图解析器,以及如何通过自动扫描组件来管理Controller。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

SpringMVC——Controller配置总结

一、实现Controller的方式

我们在SpringMVC中定义Controller有两种方式,一种是实现接口,另一种是使用注解。

1.实现接口的方式:

新建类实现Controller接口
(注意导包问题:是org.springframework.web.servlet.mvc.Controller包下,接口中只有一个handleRequest()方法)

package com.muhan.controller;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class HelloController implements Controller {
    @Override
    public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
        ModelAndView mv = new ModelAndView();
        mv.addObject("msg","hello SpringMVC!");
        mv.setViewName("hello");
        return mv;
    }
}

在handleRequest里面我们就可以做一些处理,我们可以看到这个方法的返回值是ModelAndView,所以我们需要new 一个ModelAndView对象,让这个视图模型对象去携带参数。

导入Jar包
一般需要这几个jar包:

    <!-- Spring MVC 及 Spring系列包 -->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
      <version>4.3.24.RELEASE</version>
    </dependency>
    <!--Servlet核心-->
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>javax.servlet-api</artifactId>
      <version>4.0.1</version>
    </dependency>
    <!-- JSTL -->
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>jstl</artifactId>
      <version>1.2</version>
    </dependency>

在web.xml中配置DispatcherServlet

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xmlns="http://java.sun.com/xml/ns/javaee"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
         http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
         id="WebApp_ID" version="3.0">

  <!--1.注册DispatcherServlet-->
  <servlet>
    <servlet-name>springmvc</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <!--关联一个springmvc的配置文件:【servlet-name】-servlet.xml-->
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath:springmvc-servlet.xml</param-value>
    </init-param>
    <!--启动级别-1-->
    <load-on-startup>1</load-on-startup>
  </servlet>

  <!--/ 匹配所有的请求;(不包括.jsp)-->
  <!--/* 匹配所有的请求;(包括.jsp)-->
  <servlet-mapping>
    <servlet-name>springmvc</servlet-name>
    <!--这里使用 / ,不要用 /*-->
    <url-pattern>/</url-pattern>
  </servlet-mapping>
</web-app>

然后再配置springmvc-servlet.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd">


    <!--注册自己写的Controller-->
    <bean id="/hello" class="com.muhan.controller.HelloController"/>

    <!--视图解析器-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="InternalResourceViewResolver">
        <!--前缀-->
        <property name="prefix" value="/WEB-INF/jsp/"/>
        <!--后缀-->
        <property name="suffix" value=".jsp"/>
    </bean>
</beans>

在WEB-INF/jsp下编写hello.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
	//获取ModelAndView传来的msg
    ${msg}
</body>
</html>

启动Tomcat测试
在这里插入图片描述
方式一总结:实现Controller接口的这种方式定义Controller控制器的这种方式比较老。它是有很大的弊端的,只能定义一个方法。如果我们像定义多个方法就必须去写多个Controller。所以是非常麻烦的。

2.使用注解@Controller定义控制器

@Controller注解就是spring中用于声明控制器的注解,之前我们还用过@Component,@Repository,@Service这三个注解,实际的作用都是一样的,但是一般我们@Controller是用来声明Controller控制器的,规范来说一般我们SpringMVC中的控制器要使用@Controller
在这里插入图片描述
使用了@Controller后我们就必须在springmvc-servlet.xml中配置一个自动扫描包下注解的组件,当然视图解析器也是必须要配置的

<?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
        http://www.springframework.org/schema/context/spring-context-4.3.xsd
        http://www.springframework.org/schema/mvc
        http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd">


    <!-- 自动扫描指定的包,下面所有注解类交给IOC容器管理 -->
    <context:component-scan base-package="com.muhan.controller"/>

    <!--视图解析器-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="InternalResourceViewResolver">
        <!--前缀-->
        <property name="prefix" value="/WEB-INF/jsp/"/>
        <!--后缀-->
        <property name="suffix" value=".jsp"/>
    </bean>
</beans>

然后我们就可以修改我们自定义的Controller类了

package com.muhan.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class HelloController{
	//@RequestMapping("/hello2")的参数表示的是请求的url,就是说在网页上请求hello2才会走我们的Controler处理
    @RequestMapping("/hello2")
    public String hello(Model model){
        model.addAttribute("msg","hello SpringMVC2!");
        //返回视图位置,在返回的时候会经过我们在springmvc-servlet.xml中的视图解析器,给我们hello加上前缀和后缀
        return "hello";
    }
}

然后启动Tomcat,测试
在这里插入图片描述

二、@RequestMapping

在上面的@Controller注解实现Controller控制器中,我们使用到了@RequestMapping注解。
@RequestMapping注解用于映射url到控制器类或者一个特定的处理程序方法。可以使用到类上或者方法上。作用到类上时表示类中所有的响应请求的方法都应该以该地作为父路经。

@RequestMapping使用在方法上:

@Controller
public class HelloController{
    @RequestMapping("/test1")
    public String hello(Model model){
        return "hello";
    }
}

我们启动Tomcat测试,注意观察访问路径
在这里插入图片描述
@RequestMapping使用在类上:

@Controller
@RequestMapping("/all")
public class HelloController{
    @RequestMapping("/test1")
    public String hello(Model model){
        return "hello";
    }
}

启动Tomcat测试,注意观察访问路径
在这里插入图片描述
我们可以发现如果@RequestMapping使用在类上就必须先指定类的路径再指定方法的路径

<think>嗯,用户这次问的是Spring框架中@GetMapping和@RequestMapping注解的区别和用法。从用户提供的站内引用来看,用户已经做了一些功课,引用了4个资料,主要集中在注解的功能和关系上。用户可能正在学习SpringMVC,需要明确这两个核心注解的使用场景。用户引用的资料1和2明确指出@GetMapping是基于@RequestMapping的封装,专门处理GET请求,而引用3提到Spring新版本用@GetMapping等注解替代了老版@RequestMapping的部分功能。这些信息都是准确的,但用户可能需要更系统的对比。我上次给用户回答过类似问题吗?查看记录,用户之前问的是"Spring框架中关于注解的相关知识",这次具体聚焦到两个注解的区别。看来用户的学习路径是从宏观转向微观了。需要特别注意引用4提到"扩展"但内容不完整,这可能是用户遇到的资料缺口。我应该把常见扩展点也涵盖进去,比如参数处理、URL变量匹配这些实战细节。用户提供的资料里有个有趣的细节:引用1提到@GetMapping源码确实是用@RequestMapping(method=GET)实现的。这个实现差异值得展开说明,因为涉及Spring的注解设计哲学——用特定注解简化配置。考虑到用户正在对比学习,应该用表格呈现核心区别会更直观。但要注意避免直接复制资料内容,而是结合工程实践补充:-在RESTful设计中@GetMapping的表意更明确-老项目迁移时@RequestMapping的兼容性优势-混用时可能出现的覆盖问题另外用户没问但可能需要的知识点:1派生注解的性能差异(其实没有)2能否自定义类似的组合注解3在SpringBoot中的特殊表现这些放在相关问题里提示比较合适。最后检查三点:1是否明确@GetMapping是组合注解的本质2是否强调method属性的关键作用3是否给出足够明确的代码示例尤其第二个代码示例要展示两者等效性,这是用户引用资料里没直接呈现的。</think> 好的,我们来详细解析 Spring 框架中 `@GetMapping` 和 `@RequestMapping` 这两个核心注解的功能、用法以及关键区别。 **核心概念与功能** 1. **`@RequestMapping` (更通用、更基础)** * **功能:** 这是一个*元注解*,用于将*任意*类型的 HTTP 请求(GET、POST、PUT、DELETE、PATCH 等)映射到特定的控制器方法或类上。它是 Spring MVC 中最基础、最灵活的请求映射注解。 * **用法:** * 可以标注在控制器类上(作为通用前缀)或方法上。 * 必须指定 `method` 属性来定义处理的 HTTP 请求方法(例如 `RequestMethod.GET`)。 * 可以指定 `value` 或 `path` 属性来定义请求 URL 路径模式。 * 可以指定 `params`、`headers`、`consumes`、`produces` 等属性进行更精细的条件匹配。 * **示例 (映射 GET 请求):** ```java @Controller public class MyController { @RequestMapping(value = "/users", method = RequestMethod.GET) public String getUsers(Model model) { // ... 处理获取用户列表的逻辑 return "userList"; } } ``` 2. **`@GetMapping` (更具体、更方便)** * **功能:** 这是一个*组合注解*(或称为*派生注解*),专门用于将 **HTTP GET** 请求映射到特定的控制器方法上。 * **本质:** 它是在 `@RequestMapping` 的基础上创建的,可以看作是 `@RequestMapping(method = RequestMethod.GET)` 的**快捷方式**和语法糖。查看源码即可确认[^1][^2]: ```java @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) @Documented @RequestMapping(method = RequestMethod.GET) // 核心在这里 public @interface GetMapping { // ... 其他属性继承自@RequestMapping (如 value, path) } ``` * **用法:** * 通常只标注在控制器方法上(虽然技术上也能标在类上,但不如 `@RequestMapping` 常见)。 * 只需要指定 `value` 或 `path` 属性来定义 GET 请求的 URL 路径模式。 * 同样可以指定 `params`、`headers`、`consumes`、`produces` 等属性进行更精细的条件匹配(因为这些属性是从 `@RequestMapping` 继承来的)。 * **示例:** ```java @RestController // 常用于RESTful API, 内部使用@Controller + @ResponseBody @RequestMapping("/api") // 类级别的@RequestMapping定义通用前缀 public class UserApiController { @GetMapping("/users") // 等价于 @RequestMapping(value = "/users", method = RequestMethod.GET) public List<User> getAllUsers() { // ... 获取所有用户数据 (返回JSON/XML等) return userService.findAllUsers(); } @GetMapping("/users/{id}") public User getUserById(@PathVariable Long id) { // ... 根据ID获取用户 (返回JSON/XML等) return userService.findUserById(id); } } ``` **核心区别总结** | 特性 | `@RequestMapping` | `@GetMapping` | | :--------------------------- | :----------------------------------------------------- | :------------------------------------------------------------------ | | **核心作用** | 通用的 HTTP 请求映射 | **专门**用于 HTTP **GET** 请求映射 | | **灵活性** | **极高**,可配置任意 HTTP 方法 (`method`属性必需) | **较低**,固定用于 GET 方法 | | **本质** | 元注解 (基础注解) | **组合注解** (基于 `@RequestMapping(method = RequestMethod.GET)` 派生)[^1][^2] | | **代码简洁性** | 需明确指定 `method = RequestMethod.GET` | 更**简洁**,只需关注 URL 路径 (不需要指定 `method`) | | **表达清晰度** | 需阅读 `method` 属性才能确定处理的方法 | **意图更明确**,一看就知道处理 GET 请求 | | **引入版本** | Spring 早期版本就存在 | Spring **4.3** 引入[^3] | | **常用级别** | 类 (定义前缀) / 方法 | **主要**用于方法 | | **语义** | “这个 URL 路径 *可以* 处理某种类型的请求” | “这个 URL 路径 *专门* 用来处理 GET 请求” | | **是否可替代对方** | 可以(通过设置`method`) | **不能**(无法用于非 GET 请求) | | **类路径映射** | 很常见(作为前缀) | 不太常见(意义不大,仅限制该路径下所有方法的默认请求方法?通常用类级别的 `@RequestMapping`) | **最佳实践建议** 1. **优先使用特定方法注解 (`@GetMapping`, `@PostMapping`, `@PutMapping`, `@DeleteMapping`, `@PatchMapping`):** 在 Spring 4.3+ 中,为处理特定 HTTP 方法(GET、POST、PUT、DELETE、PATCH)时,**强烈推荐**使用这些专用的组合注解。它们让代码更简洁、意图更清晰、可读性更高[^2][^3]。这是目前的主流做法。 2. **保留 `@RequestMapping` 的场景:** * **处理同一个URL路径的多种HTTP方法 (非RESTful风格):** 虽然不鼓励(更推荐RESTful风格,即不同方法对应不同注解),但如果真的需要在同一个方法上处理 GET 和 POST 等(根据业务需求,这种情况在现代开发中较少见),则必须使用 `@RequestMapping(method = {RequestMethod.GET, RequestMethod.POST})`。 * **控制器类级别的通用路径前缀:** 使用 `@RequestMapping("/yourPrefix")` 标注控制器类仍然是非常标准且推荐的做法,为该类中所有方法提供一个基础路径。 * **处理自定义HTTP方法 (非常罕见):** 理论上可以映射其他非标准HTTP方法(如果有需求)。 * **需要精细匹配 (`headers`, `consumes`, `produces`, `params`):** 当组合注解无法满足某些特殊匹配条件(需要同时指定多个且其中一个在组合注解中没有)时。 **简单来说:** * `@GetMapping` 就是为了让你的 `@RequestMapping` 只处理 GET 请求的代码写得更简单、更易懂。 * 在新项目中,能直接用 `@GetMapping` (或其他 `XxxMapping`) 的地方就用它。 * `@RequestMapping` 依然不可或缺,尤其是在类级别定义路径和需要处理复杂映射逻辑的情况下。 **
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值