开发第一个Web应用程序

  • 项目目录结构说明

    • 启动类@SpringBootApplication

      Spring Boot 1.2.0开始,实际包含3个注解功能
      @Configuration //标明该类使用Spring基于Java的配置
      @ComponentScan //启用组件扫描,Web控制器类和其他组件才能被自动发现并注册为Spring应用程序上下文里的Bean
      @EnableAutoConfiguration //开启了Spring Boot自动配置的魔力,让你不用再写成篇的配置了

    • 使用gradle bootRun命令,来启动

      使用gradle命令来启动
      gradle build
      java -jar build/libs/readinglist-0.0.1-SNAPSHOT.jar

    • 测试类@SpringApplicationConfiguration

      配置类里加载Spring应用程序上下文,标识如何加载Spring的应用程序上下文。

    • 配置文件application.properties

      server.port=8000 //应用启动端口修改

  • 构建过程

    构建插件的主要功能是把项目打包成一个可执行的超级JAR( uber-JAR),包括把应用程序的
    所有依赖打入JAR文件内,并为JAR添加一个描述文件,其中的内容能让你用java -jar来运行应用程序

    • Gradle中的SpringBoot插件

      //依赖插件
      dependencies {
      classpath("org.springframework.boot:spring-boot-gradle-plugin:
      ➥ ${springBootVersion}")
      }
      //使用插件
      apply plugin: 'spring-boot'

      gradle bootRun 运行程序

    • Maven中的SpringBoot插件

      <plugins>
      <plugin>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-maven-plugin</artifactId>
      </plugin>
      </plugins>

      spring-boot:run 运行程序

  • 使用起步依赖:基于功能的依赖

    POM (Project Object Model)
    起步依赖没有版本,起步依赖本身的版本是由正在使用的Spring Boot的版本来决定的,而起步依赖则会决定它们引入的传递依赖的版本。

    依赖树🌲:
    gradle dependencies
    mvn dependency:tree

    • Maven和Gradle对传递依赖版本不同处理的差异

      Maven:总是会用最近的依赖,也就是说,你在项目的构建说明文件里增加的这个依赖,会覆盖传递依赖引入的另一个依赖。
      Gradle:倾向于使用库的最新版本。因此,如果你要使用老版本的Jackon,则不得不把老版本的依赖加入构建,并把Web起步依赖传递依赖的那个版本排除掉。
      例如:
      compile("com.fasterxml.jackson.core:jackson-databind:2.3.1")
      compile("org.springframework.boot:spring-boot-starter-web") {
      exclude group: 'com.fasterxml.jackson.core'
      }
      //如果starter里面传递依赖的jackson库大于2.3.1,就需要做exclude排除掉。而Maven就不用,直接依赖引入就可以了。

      ==========
      排除传递依赖写法:

      Gradle中:
      compile("org.springframework.boot:spring-boot-starter-web") {
      exclude group: 'com.fasterxml.jackson.core'
      }

      Maven中:
      <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
      <exclusions>
      <exclusion>
      <groupId>com.fasterxml.jackson.core</groupId>
      </exclusion>
      </exclusions>
      </dependency>

  • 使用自动配置

    • Web应用程序

      • 1.定义领域模型(Model)

        @Entity:标记JPA实体
        id属性加了@Id和@GeneratedValue:唯一键

      • 2.定义仓库接口

        定义接口并继承JpaRepository<Book, Long> 接口
        //<Book, Long>是实体类、ID
        //继承了18个执行常用持久化操作的方法

        Spring Data提供了很神奇的魔法,只需定义仓库接口,在应用程序启动后,该接口在运行时会自动实现。

        注意:自定义接口方法时,使用特定的命名方式才行:
        比如:findByReader(String reader) 其中reader是一个表属性,这个表示查询的意思。

      • 3.创建Web界面

        Spring MVC控制器就能为应用程序处理HTTP请求。
        Thymeleaf来定义应用程序的视图。

        @Controller
        @RequestMapping("/") //来标记一个Controller

        @RequestMapping(value="/{reader}",method = RequestMethod.GET) //来标记某个方法,处理http请求

        @Autowired 来装载Repository

        方法返回值:
        "readingList" 标记为thymeleaf模版文件,在目录resources/templates 目录下

        "redirect:/{reader}" 标记为重定向的某个http路径方法调用处理

      • 资源文件 resources目录下

        • readBookList.html :模版html文件

          <html>
          <head>
          <title>Reading List</title>
          <link rel="stylesheet" th:href="@{/style.css}"></link>
          </head>
          <body>
          <h2>Your Reading List</h2>
          <div th:unless="{#lists.isEmpty(books)}"> <dl th:each="book :{books}">
          <dt class="bookHeadline">
          <span th:text="{book.title}">Title</span> by <span th:text="{book.author}">Author</span>
          (ISBN: <span th:text="{book.isbn}">ISBN</span>) </dt> <dd class="bookDescription"> <span th:if="{book.description}"
          th:text="{book.description}">Description</span> <span th:if="{book.description eq null}">
          No description available</span>
          </dd>
          </dl>
          </div>
          <div th:if="${#lists.isEmpty(books)}">
          <p>You have no books in your book list</p>
          </div>



          <h3>Add a book</h3>
          <form method="POST">
          <label for="title">Title:</label>
          <input type="text" name="title" size="50"></input>

          <label for="author">Author:</label>
          <input type="text" name="author" size="50"></input>

          <label for="isbn">ISBN:</label>
          <input type="text" name="isbn" size="15"></input>

          <label for="description">Description:</label>

          <textarea name="description" cols="80" rows="5">
          </textarea>

          <input type="submit"></input>
          </form>
          </body>
          </html>

        • style.css

          body {
          background-color: #cccccc;
          font-family: arial,helvetica,sans-serif;
          }
          .bookHeadline {
          font-size: 12pt;
          font-weight: bold;
          }
          .bookDescription {
          font-size: 10pt;
          }
          label {
          font-weight: bold;
          }

    • 自动配置基于条件化配置实现

      条件化配置允许配置存在于应用程序中,但在满足某些特定条件之前都忽略这个配置。

      条件化装载Bean:
      1.使用@Configuration来标记装载Bean的配置类
      2.使用@Bean来标记注入的Bean
      3.使用@Conditional,进行条件化装配,比如有两个一样的Bean,通过条件化配置来匹配某个Bean

      ===
      自动化配置基于条件化配置实现:
      @ConditionalOnClass
      自动配置会做出以下配置决策,例如
       因为Classpath里有Spring Data JPA,所以它会自动配置为根据仓库的接口创建仓库实现。
      因为Classpath里有Thymeleaf,所以Thymeleaf会配置为Spring MVC的视图,包括一个
      Thymeleaf的模板解析器、模板引擎及视图解析器。视图解析器会解析相对于Classpath根
      目录的/templates目录里的模板。
       因 为 Classpath 里 有 Spring MVC ( 归 功 于 Web 起 步 依 赖 ), 所 以 会 配 置 Spring 的
      DispatcherServlet并启用Spring MVC。

XMind - Trial Version

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,033评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,725评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,473评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,846评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,848评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,691评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,053评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,700评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,856评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,676评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,787评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,430评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,034评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,990评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,218评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,174评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,526评论 2 343

推荐阅读更多精彩内容