說明:文章內容全部截選自實驗大樓教學【Spring MVC 簡易教學】
Spring MVC 屬於SpringFrameWork 的後續產品,已經融合在Spring Web Flow 裡面,是一個強大且靈活的Web 框架。 Spring MVC 提供了一個 DispatcherServlet 作為前端控制器來指派請求。透過策略接口,Spring 框架是高度可配置的。 Spring MVC 還包含多種視圖技術,如 Java Server Pages(JSP)、Velocity、Tiles、iText 和 POI 等。 Spring MVC 分離了控制器、模型物件、分派器以及處理程序物件的角色,這種分離讓它們更容易進行自訂。
Spring MVC 框架主要由 DispatcherServlet、處理器映射器、處理器適配器、處理器(控制器)、視圖解析器、視圖組成。
Spring MVC 高階的請求處理工作流程如下(圖來自Spring 官網):
細分後,Spring MVC 執行流程如下,共包含八個步驟:
Spring MVC 相關介面解釋:
(1)DispatcherServlet
前端控制器,所有的請求都有經過它來統一分發,請求會被分發給對應的Handler。
(2)HandlerMapping(處理器映射器)
解析請求鏈接,然後根據請求鏈接找到執行這個請求的類別(HandlerMapping 所說的 handler)。
(3)HandlerAdapter(處理器適配器)
呼叫特定的方法對使用者發送的請求來處理。
(4)Controller
Controller 將處理使用者請求,Controller 處理完使用者請求,則傳回 ModelAndView 物件給 DispatcherServlet 前端控制器。
從宏觀角度考慮,DispatcherServlet 是整個 Web 應用的控制器;從微觀考慮,Controller 是單一 Http 請求處理過程中的控制器。
(5)ViewResolver(視圖解析器)
解析 MdoelAndView,將 MdoelAndView 中的邏輯視圖名稱變為一個真正的 View 對象,並將 MdoelAndView 中的 Model 取出。
前面簡單的介紹了 Spring MVC ,以下以簡單的使用者註冊為例,來了解 Spring MVC 的一些基本原理和運用。
Spring MVC 的相關檔案放在實驗大樓的伺服器中,請開啟實驗環境桌面上的Xfce ,輸入下面的程式碼取得:
wget
輸入下面的指令解壓縮.zip 檔案:
unzip Spring-jars.zip
在Eclipse 新建一個Web 工程(Dynamic Web Project),命名為SpringMVCTest
。
注意勾選 “自動產生 web.xml” 這個選項。
將 /home/shiyanlou/Spring-jars/
路徑下的全部 jar 套件拷貝到專案的 WebContent/WEB-INF/lib/
目錄下。
修改web.xml 檔案內容如下:
<?xml version="1.0" encoding="UTF-8"?> <web-app> <display-name>SpringMVCTest</display-name> <!-- 配置 Spring MVC DispatchcerServlet 前端控制器 --> <servlet> <servlet-name>springmvc</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <!-- contextConfigLocation 是参数名称,该参数的值包含 Spring MVC 的配置文件路径 --> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/springmvc-config.xml</param-value> </init-param> <!-- 在 Web 应用启动时立即加载 Servlet --> <load-on-startup>1</load-on-startup> </servlet> <!-- Servlet 映射声明 --> <servlet-mapping> <servlet-name>springmvc</servlet-name> <!-- 监听当前域的所有请求 --> <url-pattern>/</url-pattern> </servlet-mapping> <!-- 添加 register.jsp 为首页 --> <welcome-file-list> <welcome-file>register.jsp</welcome-file> </welcome-file-list> </web-app>
在web.xml 中設定了DispatchcerServlet
,DispatchcerServlet 載入時需要一個Spring MVC 的設定文件,預設會去WEB-INF
下尋找對應的[servlet-name]-servlet.xml
文件,如本例中預設查找的是springmvc-servlet.xml
。
Spring MVC 的設定檔可以放在任何地方,用servlet 的子元素init-param
描述即可,請參閱上述範例程式碼,這時DispatchcerServlet 就會去找 /WEB-INF/springmvc-config.xml
。
在WebContent/WEB-INF/
目錄下新建Spring MVC 設定檔springmvc-config.xml
,配置Spring MVC 的Controller,添加如下程式碼:
<?xml version="1.0" encoding="UTF-8"?> <beans> <annotation-config></annotation-config> <!-- 配置自动扫描的包,完成 Bean 的创建和自动依赖注入的功能 --> <component-scan></component-scan> <!-- 这两个类用来配置 annotation 类型的处理器映射器和处理器适配器 --> <bean></bean> <bean></bean> <!-- 配置视图解析器 --> <bean> <property></property> <property></property> </bean> </beans>
上述設定檔中, Spring 使用了掃描機制來尋找應用程式所有基於註解的控制器類,在本例中,掃描的是 com.shiyanlou.springmvc.controller
套件及其子包下的所有Java 檔案。
同時配置了 annatation 類型的處理器映射器 DefaultAnnotationHandlerMapping 和處理器適配器 AnnotationMethodHandlerAdapter,DefaultAnnotationHandlerMapping 根據請求查找映射,AnnotationMethodHandlerAdapter 完成對控制器類別的 @RequestMapping 標註方法(下面會介紹)的呼叫。
最后配置的视图解析器 InternalResourceViewResolver 用来解析视图,将 View 呈现给用户。视图解析器中配置的 prefix
表示视图的前缀, suffix
表示视图的后缀。
注:在 Spring4.0 之后,如果不配置处理映射器、处理器适配器和视图解析器,会使用默认的。
在项目目录 /Java Resources/src
的包 com.shiyanlou.springmvc.entity
下新建类 User.java
,包含 id、username、password 和 age 属性,代码如下:
package com.shiyanlou.springmvc.entity; import java.io.Serializable; public class User implements Serializable { private static final long serialVersionUID = 1L; private Integer id; private String username; private String password; private Integer age; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } }
在包 com.shiyanlou.springmvc.controller
下新建 Controller 类 UserController.java
,具体解释注释已经给出,代码如下:
package com.shiyanlou.springmvc.controller; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.RequestMapping; import com.shiyanlou.springmvc.entity.User; /** * UserController 是一个基于注解的控制器 * 可以同时处理多个请求动作 */ @Controller public class UserController { /** * RequestMapping 用来映射一个请求和请求的方法 * value="/register" 表示请求由 register 方法进行处理 */ @RequestMapping(value="/register") public String Register(@ModelAttribute("form") User user, Model model) { // user:视图层传给控制层的表单对象;model:控制层返回给视图层的对象 // 在 model 中添加一个名为 "user" 的 user 对象 model.addAttribute("user", user); // 返回一个字符串 " success" 作为视图名称 return "success"; } }
(1)register.jsp
在 WebContent
目录下新建一个 JSP 页面命名为 register.jsp,代码如下:
nbsp;html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <meta> <title>register page</title>
(2)success.jsp
在 WebContent/WEB-INF
目录下新建文件夹 views
,并在该路径下新建一个 JSP 页面命名为 success.jsp,代码如下:
nbsp;html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <meta> <title>success page</title> <h5>login was successful</h5> <p> name:${requestScope.user.username}<br> password:${requestScope.user.password}<br> age:${requestScope.user.age}<br> </p>
注:由于在线环境的资源问题,这里启动 tomcat 比较慢,需要大家耐心等待几分钟。如果遇到 Tomcat 启动超时的问题,请按照下图的方法延长 Tomcat 的启动时间。
右击 SpringMVCTest 工程,Run As->Run on Server,保持默认选项不变,点击 Finish,一会儿即可看到结果:
输入注册信息,点击注册按钮,结果如下:
以上是Spring MVC 簡介及入門小範例(圖文詳解)的詳細內容。更多資訊請關注PHP中文網其他相關文章!