程序概述:
- 开发工具:IntelliJ IDEA;
- 使用框架Spring Boot;
- 程序功能:读书列表应用,用户可以添加自己喜欢的书目,在页面上会显示用户添加的所有书目。
- 所用技术:SpringBoot、Maven、Web、JPA、H2、Thymeleaf
项目构建
构建SpringBoot框架:浏览器输入http://start.spring.io,将会看到以下页面:
下载完成过后解压,用Idea打开即可看到
- :
代码详情
- 完成后的项目完整结构
- :
- 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>Reading List</name>
<description>Reading List Demo</description>
<parent> <!--从spring-boot-starter-parent继承版本号-->
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.4.1.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</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>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
- 模型类Book
package readinglist;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
/**
* Created by hp on 2016/11/1.
*/
@Entity //表明它是一个JPA实体
public class Book {
@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 getReader() {
return reader;
}
public void setReader(String reader) {
this.reader = reader;
}
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;
}
}
- ReadingListApplication.java——应用启动入口
package readinglist;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
//应用程序的启动类
@SpringBootApplication //开启组件扫描和自动配置
public class ReadingListApplication extends WebMvcConfigurerAdapter{
public static void main(String[] args) {
SpringApplication.run(ReadingListApplication.class, args); //负责启动引导应用程序
}
}
- ReadingListController——项目的控制器
package 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;
/**
* Created by hp on 2016/11/1.
*/
@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}";
}
}
- ReadingListRepository——仓库类,负责向数据库存储数据
package readinglist;
import org.springframework.data.jpa.repository.JpaRepository;
import java.util.List;
/**
* Created by hp on 2016/11/1.
*/
//只要定义了仓库接口,SpringBoot会在运行时自动实现
public interface ReadingListRepository extends JpaRepository<Book,Long> {
//两个参数:仓库操作的领域对象类型,ID属性的类型
List<Book> findByReader(String reader);
}
- style.css——一个简单的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;
}
- readingList.html——项目的页面
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:th="http://www.thymeleaf.org">
<head>
<title>Reading List</title>
<link rel="stylesheet" th:href="@{/style.css}"/>
</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"/><br/>
<label for="author">Author:</label>
<input type="text" name="author" size="50"/><br/>
<label for="isbn">ISBN:</label>
<input type="text" name="isbn" size="15"/><br/>
<label for="description">Description:</label><br/>
<textarea name="description" cols="80" rows="5"></textarea><br/>
<input type="submit"/>
</form>
</body>
</html>
- ReadingListApplicationTests——项目的测试类,用作测试项目框架是否完整。
package readinglist;
import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
@RunWith(SpringRunner.class)
@SpringBootTest //此注解会自动搜索带有@SpringBootApplication的配置类
public class ReadingListApplicationTests {
@Test
@Ignore
public void contextLoads() {
}
}
- application.properties——SpringBoot的配置文件,本应用中为空。
运行效果
- 点击运行过后会看到以下页面:
- 在下方的表单里输入一组测试数据,点击提交会看到如下结果: