Maven是apache下的開源項目,Maven主要服務於基於Java平臺的項目構建、依賴管理和項目信息管理。html
一個項目全部的配置都放在POM文件中:定義項目的類型、名字、管理依賴關係,定製插件的行爲等等。看下我本身寫的小demo中pom中配置以下:java
在POM中,groupId、artifactId、packaging、version叫作maven座標,它能惟一的肯定一個項目。有了maven座標,咱們就能夠用它來指定咱們的項目所依賴的其餘項目、插件、或者父項目。mysql
Maven經常使用的插件好比compiler插件、surefire插件、jar插件。好比說jar插件包含創建jar文件的目標,compiler插件包含編譯源代碼和單元測試代碼的目標,surefire插件則是運行單元測試的目標。爲何須要這些插件呢?由於maven自己不會作太多的事情,它不知道怎麼樣編譯或者怎麼樣打包。它把構建的任務交給插件去作。插件定義了經常使用的構建邏輯,可以被重複利用。這樣作的好處是,一旦插件有了更新,那麼全部maven用戶都能獲得更新。web
生命週期指項目的構建過程,它包含了一系列的有序的階段,而一個階段就是構建過程當中的一個步驟,好比package階段、compiler階段等。那麼生命週期階段和上面說的插件目標之間是什麼關係呢?插件目標能夠綁定到生命週期階段上,一個生命週期能夠綁定多個插件目標。當maven在構建過程當中逐步的經過每一個階段時,會執行該階段全部的插件目標。目前生命週期階段有clean、vavidate、compiler、test、package、verify、install、site、deploy階段。redis
實際開發中咱們會有複雜多的依賴關係,由於被依賴的jar文件會有本身的依賴關係,那麼咱們是否是也得把間接依賴的jar文件也都定義在POM中呢?答案是不須要,由於maven提供了傳遞依賴的特性,會把依賴的jar文件它所依賴的庫也自動添加進來。算法
Maven倉庫分爲中央倉庫、本地倉庫以及私服庫:spring
中央倉庫就是遠程倉庫,倉庫中jar由專業團隊(maven團隊)統一維護。中央倉庫的地址:http://repo1.maven.org/maven2/sql
至關於緩存,工程第一次會從遠程倉庫(互聯網)去下載jar 包,將jar包存在本地倉庫(電腦上的某個文件夾)。第二次不須要從遠程倉庫去下載。先從本地倉庫找,若是找不到纔會去遠程倉庫找。數據庫
在公司內部架設一臺私服,其它公司架設一臺倉庫,對外公開。apache
maven下載地址:http://maven.apache.org/download.cgi,apache-maven-3.5.2.bin.zip便可,將maven下載到本地並解壓。
注意:安裝maven以前須要安裝jdk,maven3以上的版本要求jdk7以上
右鍵「個人電腦」屬性-> "高級"下面的"環境變量"->"新建",變量填MAVEN_HOME 值填寫你maven的解壓目錄,將路徑複製過去便可,配置path 值填寫 %MAVEN_HOME%\bin;
打開CMD命令行,輸入mvn -v
看到jdk和maven的安裝路徑即表示安裝成功
到%MAVEN_HOME%\conf目錄下,找到並打開settings.xml配置文件,找到< localRepository>標籤,修改本地倉庫地址:
找到< mirror>,配置maven鏡像:
這個能夠看做遠程倉庫或者中央倉庫,因爲maven中的jar下載是從網絡中下載因此有時候網很差的時候就會出現下載速度過慢帶來的不便利。鏡像的配置做用就是選擇jar下載的來源,咱們一開始默認是使用國外的鏡像,因此不免會出現網絡很差的狀況,訪問外網自己就可能不快,這裏配置的是國內阿里的鏡像倉庫,這個倉庫是比較好的,下載jar速度仍是很快的。
如上圖配置,選擇本地maven倉庫
如上圖配置,
1:表示IDEA 會實時監控項目的 pom.xml 文件,進行項目變更設置。
2:表示VM參數和jdk版本。
3:表示Maven 導入依賴包的時候是否自動下載源碼和文檔。
這三個屬性目的是標識你的項目的惟一性
項目建立好以後,點擊右下角的 「Auto-Import」
Modules:可看到此項目無任何適配服務組件(由於是手工建立Maven,沒有選擇任何Maven模板)--所以須要咱們進行添加。
選擇Web(爲此項目添加Web服務組件,這即是一個Web項目了)
選擇「main」目錄
在後面加上webapp。好了,點OK,Web的資源目錄便設置好了。
下面設置web的描述文件目錄:(設置在webapp目錄下)
Aftifacts: 這個Aftifacts描述了當前項目發佈的信息。如今進行添加,從Modeles中選擇。
說明:1: 如今Artifacts已有了發佈的項目了(idea中準確的說應是Modele) 2:output root目錄描述了當前項目的編譯目錄及適配服務。
肯定以後當前項目的結構:
添加Tomcat服務器:
部署:
注:若找不到Arifact,請參考部署項目中的Modules的配置。若是沒有爲項目配置Web服務組件,那麼就沒有Artifact。(當前項目連Web項目都不是,哪兒來的Artifact,又部署什麼呢?)
修改idea服務的熱部署:
On Update action (當代碼改變的時候,須要IDEA爲你作什麼)裏面有四個選項(通常選Update classes and resources):
-Update resources :若是發現有更新,並且更新的是資源文件(*.jsp,*.xml等,不包括java文件),就會馬上生效
-Update classes and resources : 若是發現有更新,這個是同時包含java文件和資源文件的,就會馬上生效
這裏須要注意一下:在運行模式下,修改java文件時不會馬上生效的;而debug模式下,修改java文件時能夠馬上生效的。固然,兩種運行模式下,修改resources資源文件都是能夠馬上生效的。
-Redploy : 從新部署,只是把原來的war刪掉,不重啓服務器
-Restart : 重啓服務器
On Frame deactivation:(當失去焦點[好比你最小化了IDEA窗口],須要IDEA爲你作什麼)
-Do nothing : 不作任何事 (通常推薦這個,由於失去焦點的概率太大)
-Update resources : 失去焦點後,修改的resources文件都會馬上生效
-Update classes and resources : 失去焦點後,修改的java ,resources文件都會馬上生效(與On update action中的Update classes and resources同樣,也是運行模式修改的java文件不會生效,debug模式修改的java文件會馬上生效)
在Modules中加入tomcat依賴:
至此在idea開發工具中搭建的Maven Web項目已初步完成
Redis是一個開源的使用ANSI C語言編寫、遵照BSD協議、支持網絡、可基於內存亦可持久化的日誌型、Key-Value數據庫,並提供多種語言的API。它一般被稱爲數據結構服務器,由於值(value)能夠是字符串(String), 哈希(Map), 列表(list), 集合(sets) 和有序集合(sorted sets)等類型。
Redis 是徹底開源免費的,遵照BSD協議,是一個高性能的key-value數據庫。
Redis 與其餘 key - value 緩存產品有如下三個特色:
Redis支持數據的持久化,能夠將內存中的數據保持在磁盤中,重啓的時候能夠再次加載進行使用。
Redis不只僅支持簡單的key-value類型的數據,同時還提供list,set,zset,hash等數據結構的存儲。
Redis支持數據的備份,即master-slave模式的數據備份。
性能極高–Redis能讀的速度是110000次/s,寫的速度是81000次/s。
豐富的數據類型 – Redis支持二進制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 數據類型操做。
原子 – Redis的全部操做都是原子性的,同時Redis還支持對幾個操做全並後的原子性執行。
豐富的特性 – Redis還支持 publish/subscribe, 通知, key 過時等等特性。
Redis和數據庫結合使用,使用策略以下
Java使用redis需導入jedis和spring-data-redis這兩個jar包,由於spring與redis能夠完美整合,全部這裏需注意spring、jedis和spring-data-redis的版本,版本不一致運行時會異常。通過調試以上版本可使用。
如下是redis鏈接池和jedis的配置
redis注入
SSM框架,是Spring+SpringMVC+Mybatis的縮寫,是繼承SSH框架以後,目前比較主流的Java EE企業級框架,適用於搭建各類大型的企業級的應用系統
Spring是一個開源框架,Spring是於2003年興起的一個輕量級的Java開發框架,由Rod Johnson在其著做Expert One-On-One J2EE Development and Design中闡述的部分理念和原型衍生而來。它是爲了解決企業應用開發的複雜性而建立的。Spring使用基本的JavaBean來完成之前只可能由EJB完成的事情。然而,Spring的用途不只限於服務器端的開發。從簡單性、可測試性和鬆耦合的角度而言,任何Java應用均可以從Spring中受益。 簡單來講,Spring是一個輕量級的控制反轉(IOC)和麪向切面(AOP)的容器框架
IOC:控制反轉也叫依賴注入。利用了工廠模式將對象交給容器管理,你只須要在spring配置文件總配置相應的bean,以及設置相關的屬性,讓spring容器來生成類的實例對象以及管理對象。在spring容器啓動的時候,spring會把你在配置文件中配置的bean都初始化好,而後在你須要調用的時候,就把它已經初始化好的那些bean分配給你須要調用這些bean的類(假設類名是A),分配的方法就是調用A的setter方法來注入,而不須要你在A裏面new這些bean了
首先,須要說明的一點,AOP只是Spring的特性,它就像OOP同樣是一種編程思想,並非某一種技術,AOP能夠說是對OOP的補充和完善。OOP引入封裝、繼承和多態性等概念來創建一種對象層次結構,用以模擬公共行爲的一個集合。當咱們須要爲分散的對象引入公共行爲的時候,OOP則顯得無能爲力。也就是說,OOP容許你定義從上到下的關係,但並不適合定義從左到右的關係。例如日誌功能。日誌代碼每每水平地散佈在全部對象層次中,而與它所散佈到的對象的核心功能毫無關係。在OOP設計中,它致使了大量代碼的重複,而不利於各個模塊的重用。將程序中的交叉業務邏輯(好比安全,日誌,事務等),封裝成一個切面,而後注入到目標對象(具體業務邏輯)中去
自定義一個「操做日誌」的註解
定義一個切面類
Spring MVC屬於Spring Framework的後續產品,已經融合在Spring Web Flow裏面,它原生支持的Spring特性,讓開發變得很是簡單規範。Spring MVC 分離了控制器、模型對象、分派器以及處理程序對象的角色,這種分離讓它們更容易進行定製
下面這個是它主要的工做原理圖:
MyBatis本是apache的一個開源項目iBatis, 2010年這個項目由apache software foundation 遷移到了google code,而且更名爲MyBatis 。MyBatis是一個基於Java的持久層框架。iBATIS提供的持久層框架包括SQL Maps和Data Access Objects(DAO)MyBatis消除了幾乎全部的JDBC代碼和參數的手工設置以及結果集的檢索。MyBatis使用簡單的XML或註解用於配置和原始映射,將接口和Java的POJOs(Plain Old Java Objects,普通的 Java對象)映射成數據庫中的記錄。能夠這麼理解,MyBatis是一個用來幫你管理數據增刪改查的框架。
他的結構以下圖所示:
在maven的pom.xm配置文件中定義SSM所須要的jar包及版本
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.yiwei.devManager</groupId> <artifactId>DevManager</artifactId> <version>1.0-SNAPSHOT</version> <packaging>war</packaging> <name>DevManager</name> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <!-- spring版本號 --> <spring.version>4.0.2.RELEASE</spring.version> <!-- MyBatis版本號 --> <mybatis.version>3.4.2</mybatis.version> <!-- log4j日誌文件管理包版本號 --> <slf4j.version>1.7.7</slf4j.version> <log4j.version>1.2.17</log4j.version> <jedis.version>2.9.0</jedis.version> <spring.data.redis.version>1.7.1.RELEASE</spring.data.redis.version> <hibernate-validator.version>5.3.4.Final</hibernate-validator.version> </properties> <dependencies> <dependency> <groupId>javax</groupId> <artifactId>javaee-api</artifactId> <version>7.0</version> <scope>provided</scope> </dependency> <dependency> <groupId>org.glassfish.web</groupId> <artifactId>javax.servlet.jsp.jstl</artifactId> <version>1.2.2</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <!-- 表示開發的時候引用,發佈的時候不會加載此包 --> <scope>test</scope> </dependency> <!-- spring核心包 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-oxm</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-tx</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aop</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context-support</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>${spring.version}</version> </dependency> <!-- spring/redis --> <dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-redis</artifactId> <version>1.7.2.RELEASE</version> </dependency> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>2.9.0</version> </dependency> <!-- mybatis核心包 --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>${mybatis.version}</version> </dependency> <!-- mybatis/spring包 --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>1.3.1</version> </dependency> <!-- javaee jar包 --> <dependency> <groupId>javax</groupId> <artifactId>javaee-api</artifactId> <version>7.0</version> </dependency> <!-- mysql數據庫鏈接jar包 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.30</version> </dependency> <!-- jdbc jar包,用來在applicationContext.xml中配置數據庫 --> <dependency> <groupId>commons-dbcp</groupId> <artifactId>commons-dbcp</artifactId> <version>1.2.2</version> </dependency> <!-- JSTL標籤類 --> <dependency> <groupId>jstl</groupId> <artifactId>jstl</artifactId> <version>1.2</version> </dependency> <!-- 日誌文件管理包 --> <!-- log start --> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>${log4j.version}</version> </dependency> <!-- 格式化對象,方便輸出日誌 --> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.1.41</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>${slf4j.version}</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>${slf4j.version}</version> </dependency> <!-- log end --> <!-- JSON --> <dependency> <groupId>org.codehaus.jackson</groupId> <artifactId>jackson-mapper-asl</artifactId> <version>1.9.13</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-core</artifactId> <version>2.1.0</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.1.0</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-annotations</artifactId> <version>2.1.0</version> </dependency> <dependency> <groupId>net.sf.json-lib</groupId> <artifactId>json-lib</artifactId> <version>2.2.3</version> <classifier>jdk15</classifier> </dependency> <!-- 上傳組件包 --> <dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.3.1</version> </dependency> <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.4</version> </dependency> <dependency> <groupId>commons-codec</groupId> <artifactId>commons-codec</artifactId> <version>1.9</version> </dependency> <!-- mqtt paho --> <dependency> <groupId>org.eclipse.paho</groupId> <artifactId>org.eclipse.paho.client.mqttv3</artifactId> <version>1.2.0</version> </dependency> <!-- redis start --> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>${jedis.version}</version> </dependency> <dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-redis</artifactId> <version>${spring.data.redis.version}</version> </dependency> <!-- redis end --> <!-- 參數認證 --> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-validator</artifactId> <version>${hibernate-validator.version}</version> </dependency> <!-- aspectj AOP --> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjrt</artifactId> <version>1.8.10</version> </dependency> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>1.8.10</version> </dependency> </dependencies> <build> <plugins> <plugin> <!-- 自動生成mybatis文件的插件 --> <groupId>org.mybatis.generator</groupId> <artifactId>mybatis-generator-maven-plugin</artifactId> <version>1.3.2</version> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>6</source> <target>6</target> </configuration> </plugin> </plugins> </build> </project>
entity就是MVC架構中的模型(Model)層,這裏是普通的Java對象(POJO),主要做用就是數據的臨時存儲,這個UserInfo對象通常和數據庫中的UserInfo表結構保持一致
webapp下面的.jsp、.html文件就是視圖(View)層
能夠看到是用註解的方式在代碼中來聲明這是一個控制器@Controller
,用@Autowired
來自動實例化這個UserDao的對象(這就是剛纔說到的控制反轉),而第二個@RequestMapping
表示的是這個方法的入口。最後,這個控制器經過返回ModelAndView對象到視圖。
jdbc.properties:
log4j.properties:日誌配置文件
redis.properties:
spring的配置:Spring-mybatis.xml、spring-redis.xml
springMVC的配置:spring-mvc.xml
mybatis文件夾裏是mybatis對數據庫操做的映射文件
最後,再說一下,JavaEE工程中,全部請求的入口來源都是web.xml
這個文件
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" version="4.0"> <display-name>Archetype Created Web Application</display-name> <!-- Spring和Mybatis的配置文件 --> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring-mybatis.xml, classpath:spring-redis.xml</param-value> </context-param> <!-- 編碼過濾器 --> <filter> <filter-name>encodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <async-supported>true</async-supported> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> <init-param> <param-name>forceEncoding</param-name> <param-value>true</param-value> </init-param> </filter> <filter-mapping> <filter-name>encodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <!-- 用cors解決先後端分離的跨域問題過濾器 --> <filter> <filter-name>corsFilter</filter-name> <filter-class>com.yiwei.filter.CorsFilter</filter-class> <init-param> <param-name>allowOrigin</param-name> <param-value>http://localhost:8080</param-value> </init-param> <init-param> <param-name>allowMethods</param-name> <param-value>>GET,POST,PUT,DELETE,OPTIONS</param-value> </init-param> <init-param> <param-name>allowCredentials</param-name> <param-value>true</param-value> </init-param> <init-param> <param-name>allowHeaders</param-name> <param-value>Content-Type,X-Token</param-value> </init-param> </filter> <filter-mapping> <filter-name>corsFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <!-- 用來過濾rest中的方法,在隱藏域中的put/delete方式,注意 因爲執行順序緣由 必定要放在編碼過濾器下面,不然會出現編碼問題 --> <filter> <filter-name>HiddenHttpMethodFilter</filter-name> <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class> <init-param> <param-name>methodParam</param-name> <param-value>_method</param-value> </init-param> </filter> <filter-mapping> <filter-name>HiddenHttpMethodFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <!-- Spring監聽器 --> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <!-- 防止Spring內存溢出監聽器 --> <listener> <listener-class>org.springframework.web.util.IntrospectorCleanupListener</listener-class> </listener> <listener> <listener-class>com.yiwei.listener.Listener</listener-class> </listener> <!-- Spring MVC Servlet --> <servlet> <servlet-name>SpringMVC</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring-mvc.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> <async-supported>true</async-supported> </servlet> <servlet-mapping> <servlet-name>SpringMVC</servlet-name> <!-- 此處能夠配置成*.do,對應Struts的後綴習慣 --> <!-- 第一種: *.action,全部以*.action結尾的訪問,都由DispatcherServlet解析 第二種:/ ,全部訪問的地址都由DispatcherServlet解析,對於這種配置會出現一個問題,那就是靜態文件的訪問不須要,DispatcherServlet進行解析(由於訪問靜態文件直接返回便可,不用再由處理器處理)。可是這種方式能夠實現RESTful風格的url 第三種:/* ,這種配置不對,使用這種配置,最終要轉發到一個jsp頁面時,仍然會由DispatcherServlet解析jsp的地址,不能根據jsp的頁面找到Handler,會報錯--> <url-pattern>/</url-pattern> </servlet-mapping> <welcome-file-list> <welcome-file>/login.jsp</welcome-file> </welcome-file-list> </web-app>