首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

Spring MVC 註解驅動開發:@Controller 與 @RequestMapping 核心用法詳解

     編輯:Java 綜合教學

從傳統 XML 配置到註解驅動的演進

Spring 2.5 引入註解支持,徹底改變了 Controller 開發方式:無需實現特定介面、無需在 XML 中逐一定義 Bean 與 URL 映射,僅需幾個核心註解即可完成請求路由、參數綁定、視圖解析。

核心註解速查

註解作用位置核心功能
@Controller類標識 Spring MVC 控制器,自動被組件掃描註冊為 Bean。
@RequestMapping類/方法定義 URL 映射路徑,支援 method、params、headers、consumes/produces 細粒度匹配。
@RequestParam方法參數綁定請求參數,支援 required、defaultValue。
@PathVariable方法參數綁定 URI 模板變量(REST 風格)。
@ModelAttribute方法/參數綁定表單對象到模型,或預先放入模型數據。
@ResponseBody方法直接輸出返回值為響應體(JSON/XML),配合 `HttpMessageConverter`。

Handler 方法簽名極靈活:支援的參數類型

  • 原生 Servlet API:`HttpServletRequest`、`HttpServletResponse`、`HttpSession`。
  • 請求參數:`@RequestParam` 綁定基本類型/字串/集合。
  • 命令/表單對象:POJO 自動綁定請求參數(需 setter)。
  • 模型對象:`Map`、`Model`、`ModelMap` 向視圖傳遞數據。
  • 校驗結果:`Errors`/`BindingResult` 緊跟命令對象參數之後。
  • 會話狀態:`SessionStatus` 標記會話完成。

返回值類型多樣

  • `ModelAndView`:攜帶模型數據與視圖名。
  • `String`:邏輯視圖名(配合 `ViewResolver`)。
  • `void`:自行操作 `HttpServletResponse` 輸出。
  • POJO + `@ResponseBody`:直接序列化為 JSON/XML。

啟用註解驅動的必要配置

<!-- web.xml -->
<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:spring-mvc.xml</param-value>
  </init-param>
</servlet>
<servlet-mapping>
  <servlet-name>springmvc</servlet-name>
  <url-pattern>*.do</url-pattern>
</servlet-mapping>
<!-- spring-mvc.xml -->
<context:component-scan base-package="com"/> <!-- 掃描 @Controller -->

<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
  <property name="prefix" value="/WEB-INF/jsp/"/>
  <property name="suffix" value=".jsp"/>
</bean>

<!-- 註解驅動核心(Spring 3.0+ 建議用 mvc:annotation-driven 替代) -->
<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"/>
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"/>

ModelAndView 深度解析

@RequestMapping("/list")
public ModelAndView list() {
    ModelAndView mav = new ModelAndView(); // 無參構造,稍後設置 view/model
    mav.addObject("studentList", studentList); // 向模型放入數據
    mav.setViewName("student/list"); // 邏輯視圖名 -> /WEB-INF/jsp/student/list.jsp
    return mav;
}

添加模型數據的三種方式:

  1. `addObject(Object)`:自動推導名稱(類名首字母小寫,集合用元素類名+s)。
  2. `addObject(String name, Object)`:顯式指定模型鍵名(推薦)。
  3. `addAllObjects(Map)`:批量合併 Map 內容。

完整 Demo:學生增刪改查

Controller:

@Controller
@RequestMapping("/student")
public class StudentController {
    private static List<Student> studentList = new ArrayList<>();
    static {
        studentList.add(new Student(1, "張三", 11));
        studentList.add(new Student(2, "李四", 12));
        studentList.add(new Student(3, "王五", 13));
    }

    @RequestMapping("/list")
    public ModelAndView list() { ... }

    @RequestMapping("/preSave")
    public ModelAndView preSave(@RequestParam(value="id", required=false) String id) {
        ModelAndView mav = new ModelAndView();
        if (id != null) {
            mav.addObject("student", studentList.get(Integer.parseInt(id)-1));
            mav.setViewName("student/update");
        } else {
            mav.setViewName("student/add");
        }
        return mav;
    }
}

JSP 視圖(使用 JSTL `` 遍歷、`${student.name}` 取值):

<%@ taglib prefix="c" uri="https://java.sun.com/jsp/jstl/core"%>
<table>
  <c:forEach var="student" items="${studentList}">
    <tr>
      <td>${student.id}</td>
      <td>${student.name}</td>
      <td>${student.age}</td>
      <td><a href="preSave.do?id=${student.id}">修改</a></td>
    </tr>
  </c:forEach>
</table>

測試驗證

訪問 `https://localhost:8080/SpringMvc02/` 自動重定向到列表頁,點擊「添加/修改」跳轉對應表單,流程打通。

列表頁 添加頁 修改頁

下一步預告

下篇將實現 `save.do` 處理表單提交,講解 `@ModelAttribute` 數據綁定與 `BindingResult` 校驗。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved