理論及實例介紹
1、Maven理論:
Maven是apache下的開源項目,Maven主要服務於基於Java平台的項目構建、依賴管理和項目信息管理。
1.1、Maven的幾個核心概念
1.1.1、POM(Project Object Model)
一個項目所有的配置都放在POM文件中:定義項目的類型、名字、管理依賴關系,定制插件的行為等等。看下我自己寫的小demo中pom中配置如下:
在POM中,groupId、artifactId、packaging、version叫做maven坐標,它能唯一的確定一個項目。有了maven坐標,我們就可以用它來指定我們的項目所依賴的其他項目、插件、或者父項目。
1.1.2、Maven插件
Maven常用的插件比如compiler插件、surefire插件、jar插件。比如說jar插件包含建立jar文件的目標,compiler插件包含編譯源代碼和單元測試代碼的目標,surefire插件則是運行單元測試的目標。為什么需要這些插件呢?因為maven本身不會做太多的事情,它不知道怎么樣編譯或者怎么樣打包。它把構建的任務交給插件去做。插件定義了常用的構建邏輯,能夠被重復利用。這樣做的好處是,一旦插件有了更新,那么所有maven用戶都能得到更新。
1.1.3、Maven生命周期
生命周期指項目的構建過程,它包含了一系列的有序的階段,而一個階段就是構建過程中的一個步驟,比如package階段、compiler階段等。那么生命周期階段和上面說的插件目標之間是什么關系呢?插件目標可以綁定到生命周期階段上,一個生命周期可以綁定多個插件目標。當maven在構建過程中逐步的通過每個階段時,會執行該階段所有的插件目標。目前生命周期階段有clean、vavidate、compiler、test、package、verify、install、site、deploy階段。
1.1.4、Maven依賴關系
實際開發中我們會有復雜多的依賴關系,因為被依賴的jar文件會有自己的依賴關系,那么我們是不是也得把間接依賴的jar文件也都定義在POM中呢?答案是不需要,因為maven提供了傳遞依賴的特性,會把依賴的jar文件它所依賴的庫也自動添加進來。
1.1.5、Maven庫
Maven倉庫分為中央倉庫、本地倉庫以及私服庫:
1.1.5.1、中央倉庫:
中央倉庫就是遠程倉庫,倉庫中jar由專業團隊(maven團隊)統一維護。中央倉庫的地址:http://repo1.maven.org/maven2/
1.1.5.2、本地倉庫:
相當於緩存,工程第一次會從遠程倉庫(互聯網)去下載jar 包,將jar包存在本地倉庫(電腦上的某個文件夾)。第二次不需要從遠程倉庫去下載。先從本地倉庫找,如果找不到才會去遠程倉庫找。
1.1.5.3、私服:
在公司內部架設一台私服,其它公司架設一台倉庫,對外公開。
2、Maven安裝及使用:
第一步:下載maven
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速度還是很快的。
第五步:配置IDE(這里用的是IDEA)
如上圖配置,選擇本地maven倉庫
如上圖配置,
1:表示IDEA 會實時監控項目的 pom.xml 文件,進行項目變動設置。
2:表示VM參數和jdk版本。
3:表示Maven 導入依賴包的時候是否自動下載源碼和文檔。
3、Maven創建Java WEB項目:
第一步:如下圖
第二步:如下圖
這三個屬性目的是標識你的項目的唯一性
第三步:點擊“Next”,然后“Finish”
項目創建好之后,點擊右下角的 “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項目已初步完成
4、Redis理論:
4.1、簡介:
Redis是一個開源的使用ANSI C語言編寫、遵守BSD協議、支持網絡、可基於內存亦可持久化的日志型、Key-Value數據庫,並提供多種語言的API。它通常被稱為數據結構服務器,因為值(value)可以是字符串(String), 哈希(Map), 列表(list), 集合(sets) 和有序集合(sorted sets)等類型。
4.2、特點:
Redis 是完全開源免費的,遵守BSD協議,是一個高性能的key-value數據庫。
Redis 與其他 key - value 緩存產品有以下三個特點:
Redis支持數據的持久化,可以將內存中的數據保持在磁盤中,重啟的時候可以再次加載進行使用。
Redis不僅僅支持簡單的key-value類型的數據,同時還提供list,set,zset,hash等數據結構的存儲。
Redis支持數據的備份,即master-slave模式的數據備份。
4.3、優勢:
性能極高–Redis能讀的速度是110000次/s,寫的速度是81000次/s。
豐富的數據類型 – Redis支持二進制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 數據類型操作。
原子 – Redis的所有操作都是原子性的,同時Redis還支持對幾個操作全並后的原子性執行。
豐富的特性 – Redis還支持 publish/subscribe, 通知, key 過期等等特性。
4.4、緩存策略:
Redis和數據庫結合使用,使用策略如下
4.4.1、讀取數據
4.4.2、更新數據(常用數據,變動性不強,並發不高)
4.4.3、更新數據(並發較高)
5、Redis實例:
5.1、jar包導入:
Java使用redis需導入jedis和spring-data-redis這兩個jar包,因為spring與redis可以完美整合,所有這里需注意spring、jedis和spring-data-redis的版本,版本不一致運行時會異常。經過調試以上版本可以使用。
5.2、Spring與Redis集成配置文件:
以下是redis連接池和jedis的配置
redis注入
5.3、定義redisDao接口和實現類:
6、SSM理論:
SSM框架,是Spring+SpringMVC+Mybatis的縮寫,是繼承SSH框架之后,目前比較主流的Java EE企業級框架,適用於搭建各種大型的企業級的應用系統
6.1、Spring:
Spring是一個開源框架,Spring是於2003年興起的一個輕量級的Java開發框架,由Rod Johnson在其著作Expert One-On-One J2EE Development and Design中闡述的部分理念和原型衍生而來。它是為了解決企業應用開發的復雜性而創建的。Spring使用基本的JavaBean來完成以前只可能由EJB完成的事情。然而,Spring的用途不僅限於服務器端的開發。從簡單性、可測試性和松耦合的角度而言,任何Java應用都可以從Spring中受益。 簡單來說,Spring是一個輕量級的控制反轉(IOC)和面向切面(AOP)的容器框架
6.1.1、控制反轉(IOC)是什么?
IOC:控制反轉也叫依賴注入。利用了工廠模式將對象交給容器管理,你只需要在spring配置文件總配置相應的bean,以及設置相關的屬性,讓spring容器來生成類的實例對象以及管理對象。在spring容器啟動的時候,spring會把你在配置文件中配置的bean都初始化好,然后在你需要調用的時候,就把它已經初始化好的那些bean分配給你需要調用這些bean的類(假設類名是A),分配的方法就是調用A的setter方法來注入,而不需要你在A里面new這些bean了
6.1.2、面向切面(AOP)是什么?
首先,需要說明的一點,AOP只是Spring的特性,它就像OOP一樣是一種編程思想,並不是某一種技術,AOP可以說是對OOP的補充和完善。OOP引入封裝、繼承和多態性等概念來建立一種對象層次結構,用以模擬公共行為的一個集合。當我們需要為分散的對象引入公共行為的時候,OOP則顯得無能為力。也就是說,OOP允許你定義從上到下的關系,但並不適合定義從左到右的關系。例如日志功能。日志代碼往往水平地散布在所有對象層次中,而與它所散布到的對象的核心功能毫無關系。在OOP設計中,它導致了大量代碼的重復,而不利於各個模塊的重用。將程序中的交叉業務邏輯(比如安全,日志,事務等),封裝成一個切面,然后注入到目標對象(具體業務邏輯)中去
自定義一個“操作日志”的注解
定義一個切面類
6.2、SpringMVC:
Spring MVC屬於Spring Framework的后續產品,已經融合在Spring Web Flow里面,它原生支持的Spring特性,讓開發變得非常簡單規范。Spring MVC 分離了控制器、模型對象、分派器以及處理程序對象的角色,這種分離讓它們更容易進行定制
下面這個是它主要的工作原理圖:
6.3、Mybatis:
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是一個用來幫你管理數據增刪改查的框架。
他的結構如下圖所示:
7、SSM實例:
7.1、第一步:
在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>
7.2、第二步:
7.2.1、定義項目的目錄結構
7.2.2、首先看MVC的架構:
7.2.2.1、Model:
entity就是MVC架構中的模型(Model)層,這里是普通的Java對象(POJO),主要作用就是數據的臨時存儲,這個UserInfo對象一般和數據庫中的UserInfo表結構保持一致
7.2.2.3、View:
webapp下面的.jsp、.html文件就是視圖(View)層
7.2.2.4、Controller:
可以看到是用注解的方式在代碼中來聲明這是一個控制器@Controller
,用@Autowired
來自動實例化這個UserDao的對象(這就是剛才說到的控制反轉),而第二個@RequestMapping
表示的是這個方法的入口。最后,這個控制器通過返回ModelAndView對象到視圖。
7.2.2.5、數據庫訪問層
7.2.2.5.1、Mapper:
7.2.2.5.2、DAO:
7.2.2.5.3、Service:
7.2.3、然后看resources目錄下的配置文件:
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>