SpringBoot+Gradle+Angular.js 構(gòu)建Web項目

寫在前面

最近需要重構(gòu)一個項目党觅,所以就去研究了關(guān)于SpringBoot搭建web的東西∫形梗基本的技術(shù)棧

  • 基礎(chǔ)的服務(wù)框架 :SpringBoot 1.5.2

  • 持久層的框架:MyBatis 3.4+ 本來使用的是Jpa每篷,寫了一會發(fā)現(xiàn)會有很多關(guān)聯(lián)查詢和分組就改成了MyBatis,之前寫了一個 Mybatis Geneator代碼生成器所以寫起來也很快端圈。

  • 構(gòu)建工具 Gradle 3.0

  • 前端框架 Angular.js

    ?

開始搭建環(huán)境

build.gradle 添加相關(guān)依賴

buildscript {
    ext {
        springBootVersion = '1.5.2.RELEASE'
    }
    repositories {
        mavenLocal()
        maven { url "http://nexus.chachazhan.com/content/groups/public/" }
        mavenCentral()
    }
    dependencies {
        classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
    }
}

apply plugin: 'java'
apply plugin: 'spring-boot'
apply plugin: 'idea'

jar {
    baseName = 'springboot-web-jsp'
    version = '0.0.1-SNAPSHOT'
}

sourceCompatibility = 1.8
targetCompatibility = 1.8

repositories {
    mavenLocal()
    maven { url "http://maven.aliyun.com/nexus/content/groups/public/" }
    mavenCentral()
}

dependencies {
    compile('org.springframework.boot:spring-boot-starter-web')
    testCompile('org.springframework.boot:spring-boot-starter-test')
}

添加相關(guān)的類 焦读,項目結(jié)構(gòu)如下

添加 WebMvcConfig 配置外部靜態(tài)資源

package com.betterlxc.web.demo.conf;

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;

/**
 * Created by LXC on 2017/3/28.
 */
@Configuration
public class WebMvcConfig extends WebMvcConfigurerAdapter {

  /**
   * spring-boot配置外部靜態(tài)資源的方法
   *
   * @param registry
   */
  @Override
  public void addResourceHandlers(ResourceHandlerRegistry registry) {
    registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/");
  }
}

啟動后訪問 http://localhost:8080/

報錯 信息如下

javax.servlet.ServletException: Could not resolve view with name 'index' in servlet with name 'dispatcherServlet'
    at org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1262) ~[spring-webmvc-4.3.7.RELEASE.jar:4.3.7.RELEASE]
    at org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1037) ~[spring-webmvc-4.3.7.RELEASE.jar:4.3.7.RELEASE]
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:980) ~[spring-webmvc-4.3.7.RELEASE.jar:4.3.7.RELEASE]
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:897) ~[spring-webmvc-4.3.7.RELEASE.jar:4.3.7.RELEASE]
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970) ~[spring-webmvc-4.3.7.RELEASE.jar:4.3.7.RELEASE]
    at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:861) ~[spring-webmvc-4.3.7.RELEASE.jar:4.3.7.RELEASE]
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:622) ~[tomcat-embed-core-8.5.11.jar:8.5.11]
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846) ~[spring-webmvc-4.3.7.RELEASE.jar:4.3.7.RELEASE]
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:729) ~[tomcat-embed-core-8.5.11.jar:8.5.11]
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:230) ~[tomcat-embed-core-8.5.11.jar:8.5.11]
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165) ~[tomcat-embed-core-8.5.11.jar:8.5.11]
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) ~[tomcat-embed-websocket-8.5.11.jar:8.5.11]
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:192) ~[tomcat-embed-core-8.5.11.jar:8.5.11]
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165) ~[tomcat-embed-core-8.5.11.jar:8.5.11]
    at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:197) ~[spring-web-4.3.7.RELEASE.jar:4.3.7.RELEASE]
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) ~[spring-web-4.3.7.RELEASE.jar:4.3.7.RELEASE]
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:192) ~[tomcat-embed-core-8.5.11.jar:8.5.11]
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165) ~[tomcat-embed-core-8.5.11.jar:8.5.11]
...

application.properties里已經(jīng)配置

server.port=8080

spring.mvc.view.prefix=/static/
spring.mvc.view.suffix=.jsp

那么問題來了... 為啥會這樣呢 靜態(tài)資源的訪問路徑也配置了。 那肯定是視圖解析器出了問題舱权,我們來配置一下視圖解析器吧

conf目錄下創(chuàng)建一個配置類DefaultConfiguration

package com.betterlxc.web.demo.conf;


import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.view.JstlView;
import org.springframework.web.servlet.view.UrlBasedViewResolver;

/**
 * Created by LXC on 2017/3/28.
 */
@Configuration
public class DefaultConfiguration {

  @Bean
  public UrlBasedViewResolver setupViewResolver() {
    UrlBasedViewResolver resolver = new UrlBasedViewResolver();
    resolver.setPrefix("/static/");
    resolver.setSuffix(".jsp");
    resolver.setCache(true);
    resolver.setViewClass(JstlView.class);
    return resolver;
  }
}

重新 run-bulid

刷新瀏覽器矗晃, 還是報錯了但是錯誤不同。

java.lang.ClassNotFoundException: javax.servlet.jsp.jstl.core.Config
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381) ~[na:1.8.0_121]
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424) ~[na:1.8.0_121]
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331) ~[na:1.8.0_121]
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357) ~[na:1.8.0_121]
    at org.springframework.web.servlet.support.JstlUtils.exposeLocalizationContext(JstlUtils.java:101) ~[spring-webmvc-4.3.7.RELEASE.jar:4.3.7.RELEASE]
    at org.springframework.web.servlet.view.JstlView.exposeHelpers(JstlView.java:135) ~[spring-webmvc-4.3.7.RELEASE.jar:4.3.7.RELEASE]
    at org.springframework.web.servlet.view.InternalResourceView.renderMergedOutputModel(InternalResourceView.java:142) ~[spring-webmvc-4.3.7.RELEASE.jar:4.3.7.RELEASE]
    at org.springframework.web.servlet.view.AbstractView.render(AbstractView.java:303) ~[spring-webmvc-4.3.7.RELEASE.jar:4.3.7.RELEASE]
    at org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1282) ~[spring-webmvc-4.3.7.RELEASE.jar:4.3.7.RELEASE]
    at org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1037) ~[spring-webmvc-4.3.7.RELEASE.jar:4.3.7.RELEASE]
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:980) ~[spring-webmvc-4.3.7.RELEASE.jar:4.3.7.RELEASE]
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:897) ~[spring-webmvc-4.3.7.RELEASE.jar:4.3.7.RELEASE]
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970) ~[spring-webmvc-4.3.7.RELEASE.jar:4.3.7.RELEASE]
    at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:861) ~[spring-webmvc-4.3.7.RELEASE.jar:4.3.7.RELEASE]
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:622) ~[tomcat-embed-core-8.5.11.jar:8.5.11]
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846) ~[spring-webmvc-4.3.7.RELEASE.jar:4.3.7.RELEASE]
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:729) ~[tomcat-embed-core-8.5.11.jar:8.5.11]
    at .....

添加一下 缺少的jar包

compile group: 'javax.servlet', name: 'jstl', version: '1.2'

重新run

再次訪問 發(fā)現(xiàn)直接下載了 因為瀏覽器是不認識jsp中的java代碼的宴倍,jsp是需要先編譯成servlet和html张症。

決定去看一下springboot文檔,發(fā)現(xiàn)文檔中很明確寫到了:

JSP limitations

When running a Spring Boot application that uses an embedded servlet container (and is packaged asan executable archive), there are some limitations in the JSP support.

  • With Tomcat it should work if you use war packaging, i.e. an executable war will work, and will alsobe deployable to a standard container (not limited to, but including Tomcat). An executable jar will notwork because of a hard coded file pattern in Tomcat.

  • With Jetty it should work if you use war packaging, i.e. an executable war will work, and will also bedeployable to any standard container.

  • Undertow does not support JSPs.

  • Creatingacustomerror.jsppagewon’toverridethedefaultviewforerrorhandling,customerror

    pages should be used instead.
    There is a JSP sample so you can see how to set things up.

?

github還提供了一個jsp示例


改動

修改 build.gradle

buildscript {
  ext {
    springBootVersion = '1.5.2.RELEASE'
  }
  repositories {
    mavenLocal()
    maven { url "http://nexus.chachazhan.com/content/groups/public/" }
    mavenCentral()
  }
  dependencies {
    classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
  }
}

apply plugin: 'java'
apply plugin: 'war'
apply plugin: 'spring-boot'
apply plugin: 'idea'

war {
  baseName = 'springboot-web-jsp'
  version = '0.0.1-SNAPSHOT'
}

sourceCompatibility = 1.8
targetCompatibility = 1.8

repositories {
  mavenLocal()
  maven { url "http://maven.aliyun.com/nexus/content/groups/public/" }
  mavenCentral()
}

dependencies {
  compile('org.springframework.boot:spring-boot-starter-web')
  compile group: 'javax.servlet', name: 'jstl', version: '1.2'
  compile group: 'org.apache.tomcat.embed', name: 'tomcat-embed-jasper', version: '8.5.11'
  compile('org.springframework.boot:spring-boot-starter-tomcat')

  testCompile('org.springframework.boot:spring-boot-starter-test')
}

WebApplication類 繼承 SpringBootServletInitializer

package com.betterlxc.web.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.support.SpringBootServletInitializer;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.stereotype.Controller;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;

/**
 * Created by LXC on 2017/3/28.
 */


@Controller
@EnableWebMvc
@ComponentScan(basePackages = {"com.betterlxc.web.demo.conf", "com.betterlxc.web.demo.mvc.controller"})
@SpringBootApplication
public class WebApplication extends SpringBootServletInitializer {

  public static void main(String[] args) {
    SpringApplication.run(WebApplication.class, args);
  }

  @Override
  protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
    return application.sources(WebApplication.class);
  }
}

使用 war的插件后 目錄結(jié)構(gòu)會發(fā)生一些變化

重新訪問 http://localhost:8080/

SpringBoot其實不推薦使用jsp鸵贬,可使用其他的模版引擎俗他,例如freemarker ,Beetl

demo源碼

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市阔逼,隨后出現(xiàn)的幾起案子兆衅,更是在濱河造成了極大的恐慌,老刑警劉巖嗜浮,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件羡亩,死亡現(xiàn)場離奇詭異,居然都是意外死亡周伦,警方通過查閱死者的電腦和手機夕春,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來专挪,“玉大人及志,你說我怎么就攤上這事片排。” “怎么了速侈?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵率寡,是天一觀的道長。 經(jīng)常有香客問我倚搬,道長冶共,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任每界,我火速辦了婚禮捅僵,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘眨层。我一直安慰自己庙楚,他們只是感情好,可當我...
    茶點故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布趴樱。 她就那樣靜靜地躺著馒闷,像睡著了一般。 火紅的嫁衣襯著肌膚如雪叁征。 梳的紋絲不亂的頭發(fā)上纳账,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天,我揣著相機與錄音捺疼,去河邊找鬼疏虫。 笑死,一個胖子當著我的面吹牛帅涂,可吹牛的內(nèi)容都是我干的议薪。 我是一名探鬼主播尤蛮,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼媳友,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了产捞?” 一聲冷哼從身側(cè)響起醇锚,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎坯临,沒想到半個月后焊唬,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡看靠,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年赶促,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片挟炬。...
    茶點故事閱讀 40,040評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡鸥滨,死狀恐怖嗦哆,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情婿滓,我是刑警寧澤老速,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站凸主,受9級特大地震影響橘券,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜卿吐,卻給世界環(huán)境...
    茶點故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一旁舰、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧嗡官,春花似錦鬓梅、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至紧阔,卻和暖如春坊罢,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背擅耽。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工活孩, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人乖仇。 一個月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓憾儒,卻偏偏與公主長得像,于是被迫代替她去往敵國和親乃沙。 傳聞我的和親對象是個殘疾皇子起趾,可洞房花燭夜當晚...
    茶點故事閱讀 44,979評論 2 355

推薦閱讀更多精彩內(nèi)容

  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,822評論 6 342
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)警儒,斷路器训裆,智...
    卡卡羅2017閱讀 134,659評論 18 139
  • 《Spring Boot開發(fā):從0到1》 大綱結(jié)構(gòu)v2.0 第一部分Spring Boot基礎(chǔ) 第1章 Sprin...
    光劍書架上的書閱讀 10,956評論 1 70
  • 好久沒有消息的小D突然發(fā)了條消息,剛生完第二個寶寶蜀铲。原來這么久一直在響應(yīng)國家號召边琉,生二胎〖侨埃看著朋友圈的圍觀點贊祝賀...
    正在忘記過去閱讀 202評論 0 0
  • 那扇窗变姨,燈火闌珊浮云眼 空嘆息,故人辭去無音訊 亂葉飛厌丑,難捱心中幾悲傷 后來定欧,找不見你蹤跡 雪花飄别伏,皚皚白雪刺淚眼...
    焦志歡閱讀 224評論 0 0