MVC 全稱 Model-View-Controller,旨在將數據、視圖、業務邏輯解耦。Spring MVC 是 Spring Framework 後續產出的 MVC 框架,運行依賴 Spring 核心 Jar 包。
Spring MVC 請求處理流程核心是 DispatcherServlet,它負責將請求分發給特定的 Controller。簡化流程如下:
DispatcherServlet 接收並委派給 HandlerMapping 尋找對應 ControllerModelAndViewDispatcherServlet 交給 ViewResolver 解析視圖將 Spring 相關 Jar 包放入 WEB-INF/lib 目錄。
<?xml version="1.0" encoding="UTF-8"?>
<web-app ... version="3.0">
<display-name>SpringMVC</display-name>
<servlet>
<servlet-name>mySpring</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>mySpring</servlet-name>
<url-pattern>*.ms</url-pattern>
</servlet-mapping>
<!-- 編碼過濾器 -->
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
檔案命名規則:[servlet-name]-servlet.xml,置於 WEB-INF 下。
<beans ...>
<!-- HandlerMapping & HandlerAdapter -->
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>
<!-- Controller -->
<bean name="/testSpring.ms" class="com.my.spring.TestSpring"/>
<!-- ViewResolver -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.InternalResourceView"/>
<property name="prefix" value="/view/"/>
<property name="suffix" value=".jsp"/>
</bean>
</beans>
welcome.jsp - 輸入表單:
<form action="testSpring.ms">
input your words: <input type="text" name="words"/>
<input type="submit" value="提交">
</form>
result.jsp - 顯示結果:
${myValue}
package com.my.spring;
public class TestSpring extends AbstractController {
@Override
protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response) throws Exception {
String value = request.getParameter("words");
Map<String, String> model = new HashMap<>();
model.put("myValue", value);
return new ModelAndView("result", model);
}
}
關鍵點:必須繼承 org.springframework.web.servlet.mvc.AbstractController 或實現 Controller 接口,切勿誤用 portlet 包下的同名類。
servlet-api.jar,加入即可。web.xml 語法是否正確。org.springframework.web.servlet.*。