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

Spring MVC @RequestMapping 完整指南:配置、參數綁定、返回值與攔截器

     編輯:Java 綜合教學

1. 核心配置

1.1 web.xml 配置 DispatcherServlet

<servlet>
    <servlet-name>dispatcher</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/spring-mvc/*.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>dispatcher</servlet-name>
    <url-pattern>*.htm</url-pattern>
</servlet-mapping>

所有 .htm 請求將由 DispatcherServlet 處理。框架會自動加載 dispatcher-servlet.xml 或通過 contextConfigLocation 指定的配置文件。

1.2 dispatcher-servlet.xml 關鍵配置

<context:component-scan base-package="com.minx.crm.web.controller"/>
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"
      p:prefix="/WEB-INF/jsp/" p:suffix=".jsp" />
  • component-scan:自動掃描標註 @Controller 的類。
  • viewResolver:配置視圖前綴與後綴,邏輯視圖名 "center" 解析為 "/WEB-INF/jsp/center.jsp"。

2. 處理方法返回值類型

Spring MVC 支持多種返回類型,常見如下:

返回類型說明
ModelAndView攜帶模型數據與視圖名,彈性最高。
Model / ModelMap / Map僅攜帶模型數據,視圖名由請求 URL 推導(前綴+視圖名+後綴)。
String直接指定邏輯視圖名,不受請求 URL 綁定。
void視圖名默認為請求路徑;常配合 PrintWriter 直接輸出響應。
其他類型 + @ResponseBody直接將返回值序列化寫入 HTTP 響應體(如 JSON、純文本)。

示例:String 返回視圖名

@RequestMapping("/welcome")
public String welcomeHandler() {
    return "center"; // 解析為 /WEB-INF/jsp/center.jsp
}

示例:@ResponseBody 直接輸出文本

@RequestMapping(value = "/something", method = RequestMethod.GET)
@ResponseBody
public String helloWorld() {
    return "Hello World"; // 直接寫入響應流
}

3. 參數綁定與常用註解

3.1 路徑變量 @PathVariable

@RequestMapping("/index/{username}")
public String index(@PathVariable("username") String username) {
    System.out.println(username);
    return "index";
}

訪問 /index/tanqimin.htm 可獲取 "tanqimin"。

3.2 請求參數 @RequestParam

@RequestMapping(value = "/login", method = RequestMethod.POST)
public String login(@RequestParam("username") String username) {
    // 自動綁定表單參數 username
    return "login2";
}

3.3 Cookie 值 @CookieValue

@RequestMapping("/readCookie")
public String readCookie(@CookieValue("JSESSIONID") String sessionId) { ... }

3.4 原生 Servlet API 直接注入

方法參數可直接聲明 HttpServletRequest、HttpServletResponse、HttpSession、PrintWriter 等,框架自動注入。

3.5 POJO 自動封裝

表單字段名與 POJO 屬性名一致時,直接在方法簽名中聲明該 POJO 類型參數,Spring 自動實例化並綁定屬性。

public class User {
    private Long id;
    private String username;
    private String password;
    // getter/setter 省略
}

@RequestMapping(value = "/login", method = RequestMethod.POST)
public String login(User user, Map model) {
    model.put("user", user); // 傳遞給視圖
    return "view";
}

4. 請求方法限制

使用 method 屬性區分 GET/POST:

@RequestMapping(value = "/login", method = RequestMethod.GET)
public String showLoginForm() { return "login"; }

@RequestMapping(value = "/login", method = RequestMethod.POST)
public String processLogin(HttpServletRequest request) { ... }

防止重複提交可使用重定向:return "redirect:/login2";

5. 模型數據優先級

在 JSP 中通過 ${key} 取值時,優先級順序:

  1. Model / ModelMap(最後賦值者優先)
  2. HttpServletRequest 屬性
  3. HttpSession 屬性

6. 攔截器配置

6.1 實現 HandlerInterceptor

public class MyInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        // 權限檢查、日誌等;返回 false 中斷請求
        return true;
    }
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        // 控制器執行後、視圖渲染前
    }
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        // 視圖渲染後,釋放資源
    }
}

6.2 XML 配置攔截路徑

<mvc:interceptors>
    <mvc:interceptor>
        <mvc:mapping path="/index.htm" />
        <bean class="com.minx.crm.web.interceptor.MyInterceptor" />
    </mvc:interceptor>
</mvc:interceptors>

7. 國際化 (i18n) 配置

7.1 定義消息源

<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource"
      p:basename="message" />

框架將自動加載 message.properties、message_zh_CN.properties 等。

7.2 多基礎名配置

<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
    <property name="basenames">
        <list>
            <value>message01</value>
            <value>message02</value>
        </list>
    </property>
</bean>

7.3 JSP 中使用

<%@ taglib uri="https://www.springframework.org/tags" prefix="spring" %>
<spring:message code="welcome.text" />

8. 總結最佳實踐

  • 優先使用 String 返回視圖名,解耦 URL 與視圖。
  • 模型數據通過 ModelMap 或 Map 傳遞。
  • RESTful 風格採用 @PathVariable 獲取路徑參數。
  • 表單提交使用 @RequestParam 或 POJO 自動綁定。
  • 攔截器處理橫切關注點(權限、日誌、事務)。
  • 國際化資源統一管理,JSP 中用 <spring:message> 獲取。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved