此文已由做者易國強受權網易雲社區發佈。
html
歡迎訪問網易雲社區,瞭解更多網易技術產品運營經驗。前端
隨着spring boot 框架的逐步使用,咱們指望對於一些已有的系統進行改造,作成通用的腳手架,方便在後續新項目中繼續使用。java
本章主要介紹瞭如何採用Spring Boot改造傳統的jsp項目。web
首先,Spring Boot + JSP的方式確定是可使用的。不過官方早就說過不推薦使用jsp來進行前端頁面的開發,官方推薦的是Themeleaf,更加符合如今先後端分離的開發模式。spring
使用Spring Boot + JSP 的方式,主要是注意一下配置上的變化,下面一塊兒來看下。apache
既然咱們選擇Spring Boot的框架,仍是比較推薦採用jar的形式進行打包部署,這樣開發人員能夠更方便的控制tomcat容器(內置默認容器)的參數配置,應用部署也更加簡單。後端
首先,項目pom.xml文件中的packaging類型確保是jar類型。示例以下:tomcat
<groupId>com.netease.ms</groupId><artifactId>common-ms</artifactId><packaging>jar</packaging><version>1.0.0</version>
spring boot的版本可根據使用需求而定,這裏我使用的是目前最新的穩定版本1.5.9.RELEASE。示例以下:安全
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.9.RELEASE</version></parent>
而後,引入starter-web組件,這個組件中會包含內置的tomcat容器。示例以下:mvc
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId></dependency>
此外,還須要加入內置tomcat對jsp文件解析的支持,若是有用到jstl標籤的話,也一併加入相關的依賴。示例以下:
<dependency> <groupId>org.apache.tomcat.embed</groupId> <artifactId>tomcat-embed-jasper</artifactId></dependency><dependency> <groupId>jstl</groupId> <artifactId>jstl</artifactId> <version>${jstl.version}</version></dependency>
加入上述依賴後,注意在build插件中加入以下配置,須要注意的是,這裏spring-boot-maven-plugin插件的版本指定的是1.4.2.RELEASE,本身有測試使用默認的1.5.9.RELEASE或其餘1.5.x版本不行(IDEA直接運行啓動沒問題,打成jar包單獨運行就會報404的錯誤,找不到相關的jsp頁面),至於除1.4.2.RELEASE版本外其餘版本是否可行,筆者並何嘗試,有清楚緣由的讀者歡迎指教。另一個比較關鍵的是,打成jar包後,其實是識別不了webapp目錄的,因此咱們把webapp目錄下的相關文件copy到META_INF/resources下面了。這樣spring boot的fat jar在啓動時是可以識別這個資源路徑的。
<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <version>1.4.2.RELEASE</version> <configuration> <mainClass>test.Application</mainClass> </configuration> <executions> <execution> <goals> <goal>repackage</goal> </goals> </execution> </executions> <dependencies> <!-- spring熱部署,非必須 --> <dependency> <groupId>org.springframework</groupId> <artifactId>springloaded</artifactId> <version>1.2.6.RELEASE</version> </dependency> </dependencies> </plugin> <!-- 忽略無web.xml警告 若是打包成war則須要--> <!--<plugin>--> <!--<groupId>org.apache.maven.plugins</groupId>--> <!--<artifactId>maven-war-plugin</artifactId>--> <!--<configuration>--> <!--<failOnMissingWebXml>false</failOnMissingWebXml>--> <!--</configuration>--> <!--</plugin>--> </plugins> <resources> <!-- 打包時將jsp文件拷貝到META-INF目錄下 --> <resource> <!-- 指定resources插件處理哪一個目錄下的資源文件 --> <directory>src/main/webapp</directory> <!--注意必需要放在此目錄下才能被訪問到 --> <targetPath>META-INF/resources</targetPath> <includes> <include>**/**</include> </includes> </resource> <!-- 其餘資源的拷貝 --> <resource> <directory>src/main/resources</directory> <includes> <include>**/**</include> </includes> <filtering>false</filtering> </resource> </resources> </build>
完成上述配置後,pom.xml文件的必要配置就ok了,接下來咱們把項目中用到的靜態資源由原來的webapp目錄移到src/main/resources目錄下,主要的目錄結構以下圖所示。
最後,咱們在application.properties文件中配置上jsp的解析前綴和後綴,以及靜態資源的映射路徑,以下所示,這裏由於個人jsp存放路徑是WEB-INF/views,因此前綴加上了這個路徑,若是你本身項目下並沒有此路徑,作相應的修改便可,如spring.mvc.view.prefix=/
spring.mvc.view.prefix=/WEB-INF/views/ spring.mvc.view.suffix=.jsp #定義靜態資源的映射路徑 spring.mvc.static-path-pattern=/resources/**
另外傳統的web項目中,確定是有web.xml文件的,關於這個文件,咱們主要是配置了一些servlet、filter以及listener,改爲代碼的方式配置也很簡單,你們能夠參照前面系列文章中介紹進行相應的改寫便可,在此再也不贅述。
還有一個須要提下的地方,就是把咱們傳統的項目改形成spring boot 項目時,每每會以爲很麻煩,其緣由主要是在於spring boot的去xml化,若是把已有的xml中的配置再一點點的改爲java代碼的實現方式,確實會使人崩潰。因此,對於已有項目的改造,儘量的保留原有的xml配置方式,這樣更簡單方便。示例以下:
@ImportResource("classpath:spring/application-context.xml")@SpringBootApplication(scanBasePackages = {"......"})public class CommonMsApplication { ...... }
改造完成後,發現其實spring boot + jsp的方式使用並不複雜,只是在改造傳統項目時,相應的配置須要作些變動。固然,每一個項目使用的組件不盡相同,也許在實際的改造過程當中,會遇到這樣或那樣的問題,耐下心來一步步找到問題緣由,相信也能很快解決的。
不足之處,歡迎指正,謝謝~
更多網易技術、產品、運營經驗分享請點擊。
相關文章:
【推薦】 一個小需求引起的思考