spring mvc 框架搭建及詳解

来源:http://www.cnblogs.com/s3189454231s/archive/2016/06/29/5626627.html
-Advertisement-
Play Games

現 在主流的Web MVC框架除了Struts這個主力 外,其次就是Spring MVC了,因此這也是作為一名程式員需要掌握的主流框架,框架選擇多了,應對多變的需求和業務時,可實行的方案自然就多了。不過要想靈活運用Spring MVC來應對大多數的Web開發,就必須要掌握它的配置及原理下載地址 。 ...


現 在主流的Web MVC框架除了Struts這個主力 外,其次就是Spring MVC了,因此這也是作為一名程式員需要掌握的主流框架,框架選擇多了,應對多變的需求和業務時,可實行的方案自然就多了。不過要想靈活運用Spring MVC來應對大多數的Web開發,就必須要掌握它的配置及原理下載地址  

  一、Spring MVC環境搭建:(Spring 2.5.6 + Hibernate 3.2.0)

  1. jar包引入

  Spring 2.5.6:spring.jar、spring-webmvc.jar、commons-logging.jar、cglib-nodep-2.1_3.jar

   Hibernate 3.6.8:hibernate3.jar、hibernate-jpa-2.0-api-1.0.1.Final.jar、antlr- 2.7.6.jar、commons-collections-3.1、dom4j-1.6.1.jar、javassist- 3.12.0.GA.jar、jta-1.1.jar、slf4j-api-1.6.1.jar、slf4j-nop-1.6.4.jar、相應資料庫的 驅動jar包

  2. web.xml配置(部分)

[html] view plain copy
  1. <!-- Spring MVC配置 -->  
  2. <!-- ====================================== -->  
  3. <servlet>  
  4.     <servlet-name>spring</servlet-name>  
  5.     <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>  
  6.     <!-- 可以自定義servlet.xml配置文件的位置和名稱,預設為WEB-INF目錄下,名稱為[<servlet-name>]-servlet.xml,如spring-servlet.xml  
  7.     <init-param>  
  8.         <param-name>contextConfigLocation</param-name>  
  9.         <param-value>/WEB-INF/spring-servlet.xml</param-value>  預設  
  10.     </init-param>  
  11.     -->  
  12.     <load-on-startup>1</load-on-startup>  
  13. </servlet>  
  14.   
  15. <servlet-mapping>  
  16.     <servlet-name>spring</servlet-name>  
  17.     <url-pattern>*.do</url-pattern>  
  18. </servlet-mapping>  
  19.     
  20.   
  21.   
  22. <!-- Spring配置 -->  
  23. <!-- ====================================== -->  
  24. <listener>  
  25.     <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>  
  26. </listener>  
  27.     
  28.   
  29. <!-- 指定Spring Bean的配置文件所在目錄。預設配置在WEB-INF目錄下 -->  
  30. <context-param>  
  31.     <param-name>contextConfigLocation</param-name>  
  32.     <param-value>classpath:config/applicationContext.xml</param-value>  
  33. </context-param>  

  3. spring-servlet.xml配置

   spring-servlet這個名字是因為上面web.xml中<servlet-name>標簽配的值為 spring(<servlet-name>spring</servlet-name>),再加上“-servlet”尾碼而 形成的spring-servlet.xml文件名,如果改為springMVC,對應的文件名則為springMVC-servlet.xml。

[html] view plain copy
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <beans xmlns="http://www.springframework.org/schema/beans"       
  3.        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"       
  4.         xmlns:context="http://www.springframework.org/schema/context"       
  5.    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd     
  6.        http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd     
  7.        http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd     
  8.        http://www.springframework.org/schema/context <a href="http://www.springframework.org/schema/context/spring-context-3.0.xsd">http://www.springframework.org/schema/context/spring-context-3.0.xsd</a>">  
  9.   
  10.     <!-- 啟用spring mvc 註解 -->  
  11.     <context:annotation-config />  
  12.   
  13.     <!-- 設置使用註解的類所在的jar包 -->  
  14.     <context:component-scan base-package="controller"></context:component-scan>  
  15.   
  16.     <!-- 完成請求和註解POJO的映射 -->  
  17.     <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" />  
  18.   
  19.     <!-- 對轉向頁面的路徑解析。prefix:首碼, suffix:尾碼 -->  
  20.     <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" p:prefix="/jsp/" p:suffix=".jsp" />  
  21. </beans>  

  4. applicationContext.xml配置下載地址  

[html] view plain copy
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <beans xmlns="http://www.springframework.org/schema/beans"  
  3.         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  4.         xmlns:aop="http://www.springframework.org/schema/aop"  
  5.         xmlns:tx="http://www.springframework.org/schema/tx"  
  6.         xsi:schemaLocation="  
  7.             http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd  
  8.             http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd  
  9.             http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">  
  10.   
  11.     <!-- 採用hibernate.cfg.xml方式配置數據源 -->  
  12.     <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">  
  13.         <property name="configLocation">  
  14.             <value>classpath:config/hibernate.cfg.xml</value>  
  15.         </property>  
  16.     </bean>  
  17.       
  18.     <!-- 將事務與Hibernate關聯 -->  
  19.     <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">  
  20.         <property name="sessionFactory">  
  21.             <ref local="sessionFactory"/>  
  22.         </property>  
  23.     </bean>  
  24.       
  25.     <!-- 事務(註解 )-->  
  26.     <tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true"/>  
  27.   
  28.    <!-- 測試Service -->  
  29.    <bean id="loginService" class="service.LoginService"></bean>  
  30.   
  31.     <!-- 測試Dao -->  
  32.     <bean id="hibernateDao" class="dao.HibernateDao">  
  33.         <property name="sessionFactory" ref="sessionFactory"></property>  
  34.     </bean>  
  35. </beans>  

 

  二、詳解

  Spring MVC與Struts從原理上很相似(都是基於MVC架構),都有一個控制頁面請求的Servlet,處理完後跳轉頁面。看如下代碼(註解)下載地址  

[java] view plain copy
  1. package controller;  
  2.   
  3. import javax.servlet.http.HttpServletRequest;  
  4.   
  5. import org.springframework.stereotype.Controller;  
  6. import org.springframework.web.bind.annotation.RequestMapping;  
  7. import org.springframework.web.bind.annotation.RequestParam;  
  8.   
  9. import entity.User;  
  10.   
  11. @Controller  //類似Struts的Action  
  12. public class TestController {  
  13.   
  14.     @RequestMapping("test/login.do")  // 請求url地址映射,類似Struts的action-mapping  
  15.     public String testLogin(@RequestParam(value="username")String username, String password, HttpServletRequest request) {  
  16.         // @RequestParam是指請求url地址映射中必須含有的參數(除非屬性required=false)  
  17.         // @RequestParam可簡寫為:@RequestParam("username")  
  18.   
  19.         if (!"admin".equals(username) || !"admin".equals(password)) {  
  20.             return "loginError"// 跳轉頁面路徑(預設為轉發),該路徑不需要包含spring-servlet配置文件中配置的首碼和尾碼  
  21.         }  
  22.         return "loginSuccess";  
  23.     }  
  24.   
  25.     @RequestMapping("/test/login2.do")  
  26.     public ModelAndView testLogin2(String username, String password, int age){  
  27.         // request和response不必非要出現在方法中,如果用不上的話可以去掉  
  28.         // 參數的名稱是與頁面控制項的name相匹配,參數類型會自動被轉換  
  29.           
  30.         if (!"admin".equals(username) || !"admin".equals(password) || age < 5) {  
  31.             return new ModelAndView("loginError"); // 手動實例化ModelAndView完成跳轉頁面(轉發),效果等同於上面的方法返回字元串  
  32.         }  
  33.         return new ModelAndView(new RedirectView("../index.jsp"));  // 採用重定向方式跳轉頁面  
  34.         // 重定向還有一種簡單寫法  
  35.         // return new ModelAndView("redirect:../index.jsp");  
  36.     }  
  37.   
  38.     @RequestMapping("/test/login3.do")  
  39.     public ModelAndView testLogin3(User user) {  
  40.         // 同樣支持參數為表單對象,類似於Struts的ActionForm,User不需要任何配置,直接寫即可  
  41.         String username = user.getUsername();  
  42.         String password = user.getPassword();  
  43.         int age = user.getAge();  
  44.           
  45.         if (!"admin".equals(username) || !"admin".equals(password) || age < 5) {  
  46.             return new ModelAndView("loginError");  
  47.         }  
  48.         return new ModelAndView("loginSuccess");  
  49.     }  
  50.   
  51.     @Resource(name = "loginService")  // 獲取applicationContext.xml中bean的id為loginService的,並註入  
  52.     private LoginService loginService;  //等價於spring傳統註入方式寫get和set方法,這樣的好處是簡潔工整,省去了不必要得代碼  
  53.   
  54.     @RequestMapping("/test/login4.do")  
  55.     public String testLogin4(User user) {  
  56.         if (loginService.login(user) == false) {  
  57.             return "loginError";  
  58.         }  
  59.         return "loginSuccess";  
  60.     }  
  61. }  

  以上4個方法示例,是一個Controller里含有不同的請求url,也可以採用一個url訪問,通過url參數來區分訪問不同的方法,代碼下載地址   如下:

[java] view plain copy
  1. package controller;  
  2.   
  3. import org.springframework.stereotype.Controller;  
  4. import org.springframework.web.bind.annotation.RequestMapping;  
  5. import org.springframework.web.bind.annotation.RequestMethod;  
  6.   
  7. @Controller  
  8. @RequestMapping("/test2/login.do")  // 指定唯一一個*.do請求關聯到該Controller  
  9. public class TestController2 {  
  10.       
  11.     @RequestMapping  
  12.     public String testLogin(String username, String password, int age) {  
  13.         // 如果不加任何參數,則在請求/test2/login.do時,便預設執行該方法  
  14.           
  15.         if (!"admin".equals(username) || !"admin".equals(password) || age < 5) {  
  16.             return "loginError";  
  17.         }  
  18.         return "loginSuccess";  
  19.     }  
  20.   
  21.     @RequestMapping(params = "method=1", method=RequestMethod.POST)  
  22.     public String testLogin2(String username, String password) {  
  23.         // 依據params的參數method的值來區分不同的調用方法  
  24.         // 可以指定頁面請求方式的類型,預設為get請求  
  25.           
  26.         if (!"admin".equals(username) || !"admin".equals(password)) {  
  27.             return "loginError";  
  28.         }  
  29.         return "loginSuccess";  
  30.     }  
  31.       
  32.     @RequestMapping(params = "method=2")  
  33.     public String testLogin3(String username, String password, int age) {  
  34.         if (!"admin".equals(username) || !"admin".equals(password) || age < 5) {  
  35.             return "loginError";  
  36.         }  
  37.         return "loginSuccess";  
  38.     }  
  39. }  

  其實RequestMapping在Class上,可看做是父Request請求url,而RequestMapping在方法上的可看做是子Request請求url下載地址   ,父子請求url最終會拼起來與頁面請求url進行匹配,因此RequestMapping也可以這麼寫:

[java] view plain copy
  1. package controller;  
  2.   
  3. import org.springframework.stereotype.Controller;  
  4. import org.springframework.web.bind.annotation.RequestMapping;  
  5.   
  6. @Controller  
  7. @RequestMapping("/test3/*")  // 父request請求url  
  8. public class TestController3 {  
  9.   
  10.     @RequestMapping("login.do")  // 子request請求url,拼接後等價於/test3/login.do  
  11.     public String testLogin(String username, String password, int age) {  
  12.         if (!"admin".equals(username) || !"admin".equals(password) || age < 5) {  
  13.             return "loginError";  
  14.         }  
  15.         return "loginSuccess";  
  16.     }  
  17. }  

 

  三、結束語

   掌握以上這些Spring MVC就已經有了很好的基礎了,幾乎可應對與任何開發,在熟練掌握這些後,便可更深層次的靈活運用的技術,如多種視圖技術,例如 Jsp、Velocity、Tiles、iText 和 POI。Spring MVC框架並不知道使用的視圖,所以不會強迫您只使用 JSP 技術。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 什麼是運算符 什麼是運算符?運算符是告訴PHP做相關運算的標識符號。例如,你需要計算123乘以456等於多少,這時候就需要一個符號,告訴伺服器,你需要做乘法運算。 PHP中的運算符有哪些?PHP運算符一般分為算術運算符、賦值運算符、比較運算符、三元運算符、邏輯運算符、字元串連接運算符、錯誤控制運算符 ...
  • 恢復內容開始 輸入需要用scanner機制 代碼: 啟用scanner機制 Scanner input = new Scanner(System.in); //String x= input.next(); //String x = input.nextLine(); //int num = inp ...
  • 簡介 最小(少)原則,是安全的重要原則。最小的許可權,最小的用戶,最少的服務,最少的進程,是最安全的。 系統安全包括:文件系統保護、用戶管理安全、進程的保護以及日誌的管理。 場景 1. 確保服務最少,每個都是有用,而且許可權最小化。 2. 確保用戶最少,每個都是有用,而且許可權最小化。 3. 確保文件許可權 ...
  • 之前已經介紹過, skynet 只是一個輕量框架,不是一個開箱即用的引擎 。能不能用好它,取決於使用者是否清楚知道自己要乾什麼,如果是用 skynet 做網路游戲伺服器,那麼就必須先知道網路游戲伺服器應該如何設計。 在 skynet 發佈版中帶的 example 中,有類似 gate watchdo ...
  • 資源的表現層狀態轉化。 簡單的理解即: 1 URI對應一種"資源"。 2 客戶端與服務端傳輸資源的某種"表現層"。 3 客戶端通過HTTP協議的動詞,對資源進行操作,實現"表現層狀態轉化" 。 ...
  • 上一篇:《 "DDD 領域驅動設計-領域模型中的用戶設計?" 》 開源地址: "https://github.com/yuezhongxin/CNBlogs.Apply.Sample" (代碼已更新) 在之前的項目開發中,只有一個 JsPermissionApply 實體(JS 許可權申請),所以,C ...
  • ZooKeeper 是 Apache 的一個頂級項目,為分散式應用提供高效、高可用的分散式協調服務,提供了諸如數據發佈/訂閱、負載均衡、命名服務、分散式協調/通知和分散式鎖等分散式基礎服務。由於 ZooKeeper 便捷的使用方式、卓越的性能和良好的穩定性,被廣泛地應用於諸如 Hadoop、HBas... ...
  • 隨著唯品會業務的快速發展,訂單量的不斷增長,原有的訂單存儲架構已經不能滿足公司的發展了,特別是在大促高峰期,原訂單庫已經成為搶購瓶頸,已經嚴重製約公司的發展。 唯品會舊訂單庫包含幾十張訂單相關表,舊訂單庫是典型的一主多從架構;主庫容量已接近伺服器物理空間上限,同時也已經達到MySQL的處理上限,很快 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...