目錄html
- 介紹Spring
- 介紹Spring Framework
- IOC 和AOP
- Spring MVC介紹
- Hello World
Spring java
Spring Framework Spring框架(Spring:通常都是指這個)程序員
Spring boot Spring快速開發框架web
Spring Cloud Spring 微服務spring
Spring FrameWork 七大核心模塊數據庫
- Spring Core : 核心容器提供與Spring 框架基本功能。核心容器的主要組件時BeanFactory,它是工廠模式的實現。BeanFactory使用控制反轉(loc)
模式將應用程序的配置和依賴性規範與實際的應用程序代碼分開。編程
- Spring Context:Spring上下文是一個配置文件,向Spring框架提供上下文信息。Spring上下文包括企業服務,例如 JNDL, EJB, 電子郵件,國際化,校驗和調度功能。
- Spring AOP:經過配置管理特徵,Spring AOP 模塊直接將面向方面的編程功能集成到了Spring框架中。因此,能夠很容易地使Spring框架管理的任何對象AOP。Spring
AOP 模塊爲基於Spring的應用程序中的對象提供了事務管理服務。經過使用Spring AOP,不用依賴EJB組件,就能夠將聲明性事務管理集成到應用程序中。設計模式
- Spring DAO: JDBC DAO抽象層提供了有意義的異常層次結構,可用該結構來管理異常處理和不一樣數據庫供應商拋出的錯誤消息。異常結構層次簡化了錯誤處理。而且
極大的下降了須要編寫的異常代碼數量(例如打開鏈接和關閉鏈接)。Spring DAO的面向JDBC的異常聽從通用的DAO異常層次結構。服務器
- Spring ORM: Spring框架插入若干個ORM框架,從而提供了ORM的對象關係工具,其中包括JDO,Hibernate和IBatis SQL Map。全部這些都聽從Spring的通用事務和DAO
異常層次結構。微信
- Spring Web:Web 上下文模塊創建在應用程序上下文模塊之上,爲基於web的應用程序提供了上下文。因此,Spring框架支持與Jakarta Struts的集成。
WEB模塊還簡化了處理多部分請求以及將請求參數綁定到域對象的工做。
- Spring Web MVC:mvc框架是一個全功能的構建Web應用程序的mvc的實現。經過策略接口,MVC框架變成爲高度可配置的,MVC容納了大量視圖技術,其中包括JSP POL iText。
對應的JDK版本
- 適用於Spring Framework5.x的JDK8+
- 用於Spring Framework 4.x的JDK6+
- JDK 5+ for Spring Framework 3.x
IOC和AOP
- IOC,控制反轉
不建立對象,可是描述建立它們的方式。在代碼中不直接與對象和服務器鏈接,但在配置文件中描述哪個組件須要那一項服務。容器(在Spring框架中是IOC容器)負責將這些聯繫在一塊兒。
- AOP,面向切面編程
AOP是一種編程技術,它容許程序員在橫切關注點或橫切典型的職責分界線的行爲(例如日誌和事務管理)進行模塊化。AOP的核心構造是方面,它將那些影響多個類的行爲封裝到可重用的模塊中。
Spring Web MVC 是什麼?
Spring Web MVC :是一種基於java的實現了Web MVC設計模式的請求驅動類型的輕量級Web框架,即便用了mvc架構模式的思想,將web層進行職責解耦,基於請求驅動就是指的使用請求-響應模型,框架的目的就是幫咱們簡化開發,Spring Web MVC也就是要簡化咱們平常對WEB的開發
Spring Web MVC能幫咱們作什麼
- 讓咱們能很是簡單的設計出乾淨的Web層和薄薄的Web層(web層就是controoler層)。
- 進行更簡潔的Web層開發。
- 天生與Spring框架集成(如IOC容器,AOP等)。
- 提供強大的約定大於配置的鍥約式的編程支持。
- 能簡單的支持web層的單元測試。
- 支持靈活的URL到頁面控制層的映射。
- 很是容易與其餘視圖集成,如Velocity. FreeMarker 等等,由於模型數據不放在特定的API裏,而是放在一個Model裏(Map數據結構化實現,所以很容易被其它框架使用)。
- 很是靈活的數據驗證,格式化和數據綁定機制,能使用任何對象進行數據綁定,沒必要實現特定的框架API。
- 提供一套強大的JSP標籤庫,簡化jsp開發。
- 支持的靈活本地化,主題等解析。
- 更加簡單的異常處理。
- 對靜態資源的支持。
- 支持Restful風格。
Web開發中的請求-響應模式
所以,在web的世界裏:都是Web客戶發起請求,Web服務器接受,處理並響應。
通常Web服務器是不能主動通知Web客戶端更新內容。
雖然如今有些技術如服務器推(如Comet),還有如今的HEML5 ,websocket能夠實現web服務器主動通知Web客戶端。
SpringMVC 工做原理
上面這張圖很重要,但願你們能好好看。
第一個例子 Hello World!
下載spring框架jar (我使用的版本是 4.x)
依賴jar包:
1》Spring框架框架依賴的jar包:須要添加Apache commons logging 日誌,此處使用的是commons.logging-1.1.1.jar.
2》須要添加jstl標籤庫支持,此處使用的是jstl-1.1.2.jar.
百度網盤:連接:https://pan.baidu.com/s/1oEcAcTXs8dpRRPHpwz1LCw 提取碼:4idj (包括依賴的jar也在裏面)
代碼:
1,新建一個web項目
在web.xml文件中配置
<servlet> <servlet-name>demo1</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>demo1</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping>
自此請求已交給Spring Web MVC 框架處理,所以咱們須要配置Spring 的配置文件,默認DispatcherServlet 會加載WEB-INF/[DispatcherServlet 的servelt的名字 ]-servelt.xml配置文件。
本例子爲 WEB-INF/demo1-servlet.xml。
在Spring配置文件中(demo1-servlet.xml)配置ViewResolver(視圖解析器)demo1-servlet.xml文件須要放在WEB-INF下
<!-- ViewResolver 視圖解析器 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/> <!-- 映射視圖路徑 --> <property name="prefix" value="/WEB-INF/jsp/"/> <!-- 映射視圖後綴 --> <property name="suffix" value=".jsp"/> </bean>
InternalResourceViewResolver :用於支持Servlet,jsp視圖解析
viewClass:JstlView表示 JSP 模板頁面須要使用 JSTL 標籤庫,classpath中必須包含jstl的相關jar包
(若是想換其餘模板引擎,就修改這裏,如:freemarker)
prefix和suffix:查找視圖頁面的前綴和後綴(前綴【邏輯視圖名】後綴),好比傳進來的邏輯視圖名爲hello,則該jsp視圖頁面應該存放在「WEB-INF/JSP/HELLO.JSP」.
開發處理器/頁面控制器(也在demo1-servlet.xml中配置)
<!-- 配置處理器 --> <bean name="/hello" class="indi.xiaoen.demo1.web.HelloWorldController"/>
name:表示若是請求的URL爲 「上下文/hello」,則將會交給該bean進行處理。
class:爲自定義控制器的類路徑。
控制器類:HelloWorldControoler
/** 控制器實現 Controller接口 */ public class HelloWorldController implements Controller { /** * 重寫 handleRequest 方法 */ @Override public ModelAndView handleRequest(HttpServletRequest req, HttpServletResponse resp) throws Exception { //一、收集參數、驗證參數 //二、綁定參數到命令對象 //三、將命令對象傳入業務對象進行業務處理 //四、選擇下一個頁面 ModelAndView mv = new ModelAndView(); //添加模型數據 能夠是任意的POJO對象 mv.addObject("message", "Hello World!"); //設置邏輯視圖名,視圖解析器會根據該名字解析到具體的視圖頁面 mv.setViewName("hello"); return mv; } }
開發視圖頁面
建立/WEB-INF/jsp/hello.jsp 視圖界面
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Hello World</title> </head> <body> 是否獲取到了Request 裏的message :${requestScope.message}<br> 是否獲取到了Session 裏的message :${sessionScope.message} </body> </html>
ModelAndView.addObject 做用範圍是:request
運行項目
- 地址欄輸入:http://localhost:8080/demo1/hello
- 看是否看到hello world
ModelAndView
- 控制器處理方法的返回值若是結果爲:ModelAndView,則其既包含視圖信息,也包含模型數據信息。
- 添加數據模型:
ModelAndView addObject(String attributeName, Object attributeValue)
ModelAndView addAllObjects(Map<String, ?> modelMap)
- 設計視圖
void setViewName(String viewName) void setView(View view)
運行步驟
1、 首先用戶發送請求 http://localhost:8080/demo1/hello——>web 容器,web 容器根據「/hello」路徑映射到 DispatcherServlet(url-pattern 爲/)進行處理; 2、 DispatcherServlet——>BeanNameUrlHandlerMapping 進行請求處處理的映射,BeanNameUrlHandlerMapping 將 「/hello」路徑直接映射到名字爲「/hello」的 Bean 進行處理,即 HelloWorldController,BeanNameUrlHandlerMapping 將其包裝爲 HandlerExecutionChain(只包括 HelloWorldController 處理器,沒有攔截器); 3、 DispatcherServlet——> SimpleControllerHandlerAdapter,SimpleControllerHandlerAdapter 將 HandlerExecutionChain 中的處理器(HelloWorldController)適配爲 SimpleControllerHandlerAdapter; 4、 SimpleControllerHandlerAdapter — — > HelloWorldController 處理器 功 能 處 理 方 法 的 調 用 , SimpleControllerHandlerAdapter 將會調用處理器的 handleRequest 方法進行功能處理,該處理方法返回一 個 ModelAndView 給 DispatcherServlet; 5、 hello(ModelAndView 的邏輯視圖名)——>InternalResourceViewResolver, InternalResourceViewResolver 使用 JstlView,具體視圖頁面在/WEB-INF/jsp/hello.jsp; 6、 JstlView(/WEB-INF/jsp/hello.jsp)——>渲染,將在處理器傳入的模型數據(message=HelloWorld!)在視圖中展現出 來; 7、 返回控制權給 DispatcherServlet,由 DispatcherServlet 返回響應給用戶,到此一個流程結束。
POST中文亂碼解決方案(wen.xml文件中配置)
<!--使用Spring框架自帶的字符過濾器--> <filter> <filter-name>CharacterEncodingFilter</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>CharacterEncodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
ok ,但願你們好好看。而後有疑問能夠評價或加我微信18179068936來諮詢。謝謝你們!