二,springboot——简单项目实战

一,概述

springboot 的本质还是spring,他们之间的区别就在与简化了一些配置文件的操作和依赖的管理;

举个例子:

比如你从商家买了一个结构复杂的桌子,按照spring的模式,它会把零件发给你,组装是你自己的事情。而这张桌子是在你组装好后才能使用它多种多样的功能。

而按照springboot的模式,他相当于直接把这个桌子发给你,你只需要知道你想要桌子的型号和功能,买回来就能很快速的使用。

二,重点介绍;

(1)起步依赖;

(2)自动配置;

  问题来了,什么是起步依赖呢?依赖我们知道,他在我们利用Maven开发时具有很重要的作用,从概念中我们或许可以知道他的意义:告诉Spring Boot需要什么功能,它就能引入需要的库;我的理解是,在头疼的众多依赖中,springboot设计了一种方法,他可以有效的提供给你想要的依赖而不会出现版本冲突,或依赖缺失等令我们抓耳挠腮的问题。

自动配置设计是springboot的高度自动化的特点,至于有多高,下面的学习中我们将慢慢领悟。

三,开始第一个程序

(1)开发环境:安装有sts插件的eclipse

(2)Thymeleaf来定义Web视图;

(3)数据持久化:Spring Data JPA;

(4)数据库:嵌入式的H2数据库;

(5)功能:构建以个简单的阅读列表应用程序。

四,具体步骤(很具体,具体到令人发指)

1,打开eclipse,安装sts插件:

(1)Help--->Eclipse MarkePlace--->Populer

  找到Spring Tool Suite (STS) for Eclipse点击安装

(呀!竟然找不到,没关系,没有什么是一个链接解决不了的:https://blog.csdn.net/zhen_6137/article/details/79383941

(好吧!插件安装失败,咱们改用IDEA吧!)

打开IDEA:new -->project--->Spring Initializer 

Project SDK :Java版本

Service URL选择默认。

 

 

 

 

 

不知不觉中我们就涉及到了起步依赖的操作,没错,简单到令人发指,你只需要点几下就够了。当然也有复杂的。

来来来,热腾腾,新鲜的组织架构程上来了喂!

 

ReadinglistApplication:应用程序的启动引导类(bootstrap class)也是主要的启动配置类。

来来来,咱们细细的琢磨琢磨,这个类存在的意义:

虽然大佬想让你少些配置文件但不是让你不写配置文件,即使让写也不让你写那么难的,到底说是好人啊,膜拜之!

所以在这里你需要少量的配置来启动配置,毕竟自动性极强的声控灯你也得插上插头吧!于是乎,该类就应运而生,主要作用就是配置和引导

具体代码:

 画面清晰,一个注解一个main方法,我就大胆的包产到户,注解用于加载配置,main方法用于启动引导。

一查资料,嘿,大致是点意思


@SpringBootApplication 开启了Spring的组件扫描和Spring Boot的自动配置功能。实际
上, @SpringBootApplication 将三个有用的注解组合在了一起。


(1)Spring的 @Configuration :标明该类使用Spring基于Java的配置。虽然本书不会写太多
配置,但我们会更倾向于使用基于Java而不是XML的配置。


(2)Spring的 @ComponentScan :启用组件扫描,这样你写的Web控制器类和其他组件才能被
自动发现并注册为Spring应用程序上下文里的Bean。本章稍后会写一个简单的Spring MVC
控制器,使用 @Controller 进行注解,这样组件扫描才能找到它。


(3)Spring Boot 的 @EnableAutoConfiguration : 这 个 不 起 眼 的 小 注 解 也 可 以 称 为
@Abracadabra,就是这一行配置开启了Spring Boot自动配置的魔力,让你不用再写成
篇的配置了。


在Spring Boot的早期版本中,你需要在 ReadingListApplication 类上同时标上这三个注
解,但从Spring Boot 1.2.0开始,有 @SpringBootApplication 就行了


测试方法日后祥述。

pom.xml文件详情。

<?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.manning</groupId>
    <artifactId>readinglist</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>readinglist</name>
    <description>Demo project for Spring Boot</description>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.5.RELEASE</version>
        <relativePath/> 
        <!-- 从 spring-boot-starter-parent继承版本号 -->
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <!-- 起步依赖 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>com.h2database</groupId>
            <artifactId>h2</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <!--运用Spring Boot插件 -->
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

总结:

(1)依赖是不需要写版本号的,但不是说没有版本号,他的版本号是从 spring-boot-starter-parent继承来的,并可进行重写和过滤操作,相当方便。

(2)以spring-boot-starter开头的依赖都是起步依赖,这是他和其他依赖区分的标识。

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

 

2,创建实体(定义领域模型)

package com.manning.readinglist;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

@Entity  //@Entity 注解表明它是一个JPA实体
public class Book {

    // id 属性加了 @Id 和 @GeneratedValue 注解,说明这个字段是实体的唯一标识,并且这个字段的值是自动生成的.
    @Id
    @GeneratedValue(strategy= GenerationType.AUTO)
    private Long id;
    private String reader;
    private String isbn;
    private String title;
    private String author;
    private String description;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getIsbn() {
        return isbn;
    }

    public void setIsbn(String isbn) {
        this.isbn = isbn;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getAuthor() {
        return author;
    }

    public void setAuthor(String author) {
        this.author = author;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }
}

 

3,定义仓库接口,(与数据库实现交互) 

package com.manning.readinglist;

import org.springframework.data.jpa.repository.JpaRepository;

import java.util.List;

public interface ReadingListRepository extends JpaRepository<Book, Long> {
    List<Book> findByReader(String reader);
}

  通过扩展 JpaRepository , ReadingListRepository 直接继承了18个执行常用持久化操作的方法。 JpaRepository 是个泛型接口,有两个参数:仓库操作的领域对象类型,及其ID属性的类型。此外,我还增加了一个 findByReader() 方法,可以根据读者的用户名来查找阅读列表。如果你好奇谁来实现这个 ReadingListRepository 及其继承的18个方法,请不用担心,Spring Data提供了很神奇的魔法,只需定义仓库接口,在应用程序启动后,该接口在运行时会自动实现。

4,控制层实现

package com.manning.readinglist;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import java.util.List;
@Controller
@RequestMapping("/")
public class ReadingListController {
    private ReadingListRepository readingListRepository;
    @Autowired
    public ReadingListController(
            ReadingListRepository readingListRepository) {
        this.readingListRepository = readingListRepository;
    }

    @RequestMapping(value="/{reader}", method=RequestMethod.GET)
    public String readersBooks(
            @PathVariable("reader") String reader,
            Model model) {
        List<Book> readingList =
                readingListRepository.findByReader(reader);
        if (readingList != null) {
            model.addAttribute("books", readingList);
        }
        return "readingList";
    }
    @RequestMapping(value="/{reader}", method=RequestMethod.POST)
    public String addToReadingList(
            @PathVariable("reader") String reader, Book book) {
        book.setReader(reader);
        readingListRepository.save(book);
        return "redirect:/{reader}";
    }
}

 

5,前端实现

<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>


<hr/>

<h3>Add a book</h3>
<form method="POST">
    <label for="title">Title:</label>
    <input type="text" name="title" size="50"></input><br/>
    <label for="author">Author:</label>
    <input type="text" name="author" size="50"></input><br/>
    <label for="isbn">ISBN:</label>
    <input type="text" name="isbn" size="15"></input><br/>
    <label for="description">Description:</label><br/>
    <textarea name="description" cols="80" rows="5"></textarea><br/>
    <input type="submit"></input>
</form>

</body>
</html>

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;
}

运行:

当前课程中博客项目的实战源码是我在 GitHub上开源项目 My-Blog,目前已有 3000 多个 star:本课程是一个 Spring Boot 技术栈的实战类课程,课程共分为 3 大部分,前面两个部分为基础环境准备和相关概念介绍,第三个部分是 Spring Boot 个人博客项目功能的讲解,通过本课程的学习,不仅仅让你掌握基本的 Spring Boot 开发能力以及 Spring Boot 项目的大部分开发使用场景,同时帮你提前甄别和处理掉将要遇到的技术难点,认真学完这个课程后,你将会对 Spring Boot 有更加深入而全面的了解,同时你也会得到一个大家都在使用的博客系统源码,你可以根据自己的需求和想法进行改造,也可以直接使用它来作为自己的个人网站,这个课程一定会给你带来巨大的收获。作者寄语本课程录制于 2020 年,代码基于 Spring Boot 2.x 版本。到目前为止,Spring Boot 技术栈也有一些版本升级,比如 Spring Boot 2.7 发版、Spring Boot 3.x 版本发布正式版本。对于这些情况,笔者会在本课程实战项目的开源仓库中创建不同的代码分支,保持实战项目的源码更新,保证读者朋友们不会学习过气的知识点。课程特色 课程内容紧贴 Spring Boot 技术栈,涵盖大部分 Spring Boot 使用场景。开发教程详细完整、文档资源齐全、实验过程循序渐进简单明了。实践项目页面美观且实用,交互效果完美。包含从零搭建项目、以及完整的后台管理系统和博客展示系统两个系统的功能开发流程。技术栈新颖且知识点丰富,学习后可以提升大家对于知识的理解和掌握,对于提升你的市场竞争力有一定的帮助。实战项目预览    
评论 21
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值