<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 指定的配置文件。
<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"。Spring MVC 支持多種返回類型,常見如下:
| 返回類型 | 說明 |
|---|---|
ModelAndView | 攜帶模型數據與視圖名,彈性最高。 |
Model / ModelMap / Map | 僅攜帶模型數據,視圖名由請求 URL 推導(前綴+視圖名+後綴)。 |
String | 直接指定邏輯視圖名,不受請求 URL 綁定。 |
void | 視圖名默認為請求路徑;常配合 PrintWriter 直接輸出響應。 |
其他類型 + @ResponseBody | 直接將返回值序列化寫入 HTTP 響應體(如 JSON、純文本)。 |
@RequestMapping("/welcome")
public String welcomeHandler() {
return "center"; // 解析為 /WEB-INF/jsp/center.jsp
}
@RequestMapping(value = "/something", method = RequestMethod.GET)
@ResponseBody
public String helloWorld() {
return "Hello World"; // 直接寫入響應流
}
@RequestMapping("/index/{username}")
public String index(@PathVariable("username") String username) {
System.out.println(username);
return "index";
}
訪問 /index/tanqimin.htm 可獲取 "tanqimin"。
@RequestMapping(value = "/login", method = RequestMethod.POST)
public String login(@RequestParam("username") String username) {
// 自動綁定表單參數 username
return "login2";
}
@RequestMapping("/readCookie")
public String readCookie(@CookieValue("JSESSIONID") String sessionId) { ... }
方法參數可直接聲明 HttpServletRequest、HttpServletResponse、HttpSession、PrintWriter 等,框架自動注入。
表單字段名與 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";
}
使用 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";
在 JSP 中通過 ${key} 取值時,優先級順序:
Model / ModelMap(最後賦值者優先)HttpServletRequest 屬性HttpSession 屬性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 {
// 視圖渲染後,釋放資源
}
}
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/index.htm" />
<bean class="com.minx.crm.web.interceptor.MyInterceptor" />
</mvc:interceptor>
</mvc:interceptors>
<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource"
p:basename="message" />
框架將自動加載 message.properties、message_zh_CN.properties 等。
<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
<property name="basenames">
<list>
<value>message01</value>
<value>message02</value>
</list>
</property>
</bean>
<%@ taglib uri="https://www.springframework.org/tags" prefix="spring" %>
<spring:message code="welcome.text" />
String 返回視圖名,解耦 URL 與視圖。ModelMap 或 Map 傳遞。@PathVariable 獲取路徑參數。@RequestParam 或 POJO 自動綁定。<spring:message> 獲取。