笔记:Spring boot+Thymeleaf+spring-data-jpa简单项目搭建

4 篇文章 1 订阅
2 篇文章 0 订阅

笔记整理

  • Spring Boot搭建简单项目,容易上手,无需手动配置繁杂的xml文件,copy大量的重复配置代码。
  • Thymeleaf模板引擎渲染web视图,可完全替代JSP,使用Thymeleaf的主要目标在于提供一种可被浏览器正确显示的、格式良好的模板创建方式,(即创建 .html文件可被浏览器直接浏览)因此也可以用作静态建模。
  • spring-data-jpa可简化数据访问,减少大量sql语句,尤其是基本的增删改查

搭建环境:eclipse、java 1.8.0_111 、spring boot 1.5.10

一、创建项目

1.

这里写图片描述
配置选好及相关信息填好后进行下一步

2.

这里写图片描述
这一步是选择所需要添加的依赖,这边既然是spring boot 整合thymeleafJpa 搭建的web项目,勾选途中相关的库选项即可,然后点击 Next -> Finish。
之后eclipse便会自动下载相关的依赖jar包,期间可能需要等一会儿。若是上一步有少勾选的,也可在建好的项目中的pom.xml文件中手动添加依赖
此处相关依赖有:

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

创建好后,项目基础框架如下图:
这里写图片描述
此时,项目已经可以运行,
spring boot 默认提供静态资源的位置为:src/main/resources/static
而模板放在:src/main/resources/templates

注: Java代码均要写在DemoApplication.java的同级包中或子包中

3.配置application.properties文件
3.1 基本配置:
- spring.datasource.driver-class-name=         # 数据源驱动
- spring.datasource.url=                       # 数据源
- spring.datasource.username=                  # 数据库用户名
- spring.datasource.password=                  # 数据库密码

配置到这儿,已经可以运行简单项目了。

3.2 其他配置
3.2.1 模板引擎配置

若thymeleaf对不严格的HTML标签解析出错时,需要添加:

spring.thymeleaf.mode=LEGACYHTML5

非严格的thymeleaf格式 你可能会发现在默认配置下,thymeleaf对html文件内容要求很严格,比如<meta charset="UTF-8" />, 如果少最后的标签封闭符号/,运行项目访问当前页面时就会报如下异常:

org.xml.sax.SAXParseException: 元素类型 "meta" 必须由匹配的结束标记 "</meta>" 终止。
    at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(Unknown Source) ~[na:1.8.0_111]
    at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.fatalError(Unknown Source) ~[na:1.8.0_111]
    at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(Unknown Source) ~[na:1.8.0_111]
    at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(Unknown Source) ~[na:1.8.0_111]
    at com.sun.org.apache.xerces.internal.impl.XMLScanner.reportFatalError(Unknown Source) ~[na:1.8.0_111]
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanEndElement(Unknown Source) ~[na:1.8.0_111]
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(Unknown Source) ~[na:1.8.0_111]
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(Unknown Source) ~[na:1.8.0_111]
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source) ~[na:1.8.0_111]
    at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source) ~[na:1.8.0_111]
    at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source) ~[na:1.8.0_111]
    at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(Unknown Source) ~[na:1.8.0_111]
    at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(Unknown Source) ~[na:1.8.0_111]
    at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(Unknown Source) ~[na:1.8.0_111]
    at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl.parse(Unknown Source) ~[na:1.8.0_111]
    at org.thymeleaf.templateparser.xmlsax.AbstractNonValidatingSAXTemplateParser.doParse(AbstractNonValidatingSAXTemplateParser.java:209) ~[thymeleaf-2.1.6.RELEASE.jar:2.1.6.RELEASE]
    at org.thymeleaf.templateparser.xmlsax.AbstractNonValidatingSAXTemplateParser.parseTemplateUsingPool(AbstractNonValidatingSAXTemplateParser.java:134) ~[thymeleaf-2.1.6.RELEASE.jar:2.1.6.RELEASE]
    at org.thymeleaf.templateparser.xmlsax.AbstractNonValidatingSAXTemplateParser.parseTemplate(AbstractNonValidatingSAXTemplateParser.java:116) ~[thymeleaf-2.1.6.RELEASE.jar:2.1.6.RELEASE]
    at org.thymeleaf.TemplateRepository.getTemplate(TemplateRepository.java:278) ~[thymeleaf-2.1.6.RELEASE.jar:2.1.6.RELEASE]
    at org.thymeleaf.TemplateEngine.process(TemplateEngine.java:1104) ~[thymeleaf-2.1.6.RELEASE.jar:2.1.6.RELEASE]
    at org.thymeleaf.TemplateEngine.process(TemplateEngine.java:1060) ~[thymeleaf-2.1.6.RELEASE.jar:2.1.6.RELEASE]
    at org.thymeleaf.TemplateEngine.process(TemplateEngine.java:1011) ~[thymeleaf-2.1.6.RELEASE.jar:2.1.6.RELEASE]
    at org.thymeleaf.spring4.view.ThymeleafView.renderFragment(ThymeleafView.java:335) ~[thymeleaf-spring4-2.1.6.RELEASE.jar:2.1.6.RELEASE]
    at org.thymeleaf.spring4.view.ThymeleafView.render(ThymeleafView.java:190) ~[thymeleaf-spring4-2.1.6.RELEASE.jar:2.1.6.RELEASE]
    at org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1286) ~[spring-webmvc-4.3.14.RELEASE.jar:4.3.14.RELEASE]
    at org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1041) ~[spring-webmvc-4.3.14.RELEASE.jar:4.3.14.RELEASE]
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:984) ~[spring-webmvc-4.3.14.RELEASE.jar:4.3.14.RELEASE]
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:901) ~[spring-webmvc-4.3.14.RELEASE.jar:4.3.14.RELEASE]
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970) ~[spring-webmvc-4.3.14.RELEASE.jar:4.3.14.RELEASE]
    at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:861) ~[spring-webmvc-4.3.14.RELEASE.jar:4.3.14.RELEASE]
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:635) ~[tomcat-embed-core-8.5.27.jar:8.5.27]
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846) ~[spring-webmvc-4.3.14.RELEASE.jar:4.3.14.RELEASE]
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:742) ~[tomcat-embed-core-8.5.27.jar:8.5.27]
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) ~[tomcat-embed-core-8.5.27.jar:8.5.27]
    ...

因此,application.properties配置文件中建议增加下面这段:

spring.thymeleaf.mode=LEGACYHTML5  

spring.thymeleaf.mode的默认值是HTML5,其实是一个很严格的检查,改为LEGACYHTML5可以得到一个可能更友好亲切的格式要求。需要注意的是,LEGACYHTML5需要搭配一个额外的库NekoHTML才可用。
因此,需要引入相关依赖:

<dependency>
    <groupId>net.sourceforge.nekohtml</groupId>
    <artifactId>nekohtml</artifactId>
</dependency>

此外,thymeleaf的其他配置默认如下:

# 是否关闭thymeleaf缓存,关闭后,在开发过程中修改html文件后会立即生效,不需要重新启动spring boot项目
spring.thymeleaf.cache=true 
# 检查模板位置是否存在
spring.thymeleaf.check-template-location=true 
# 支持的文本类型
spring.thymeleaf.content-type=text/html 
# 是否启用MVC视图解析
spring.thymeleaf.enabled=true 
# 模板使用的编码
spring.thymeleaf.encoding=UTF-8 
# 指定名称的模板文件排除解析队列,名称用","隔开
spring.thymeleaf.excluded-view-names= 
# 默认模板配置路径,templates后的"/"不能少
spring.thymeleaf.prefix=classpath:/templates/ 
# 默认模板的后缀
spring.thymeleaf.suffix=.html  
# Order of the template resolver in the chain. 
spring.thymeleaf.template-resolver-order= 
# 指定名称的模板文件才可被解析,名称用","隔开
spring.thymeleaf.view-names= 
3.2.2 Jpa主要配置

添加配置:

spring.jpa.properties.hibernate.hbm2ddl.auto=update

此配置是hibernate的配置属性,其主要作用是:自动创建、更新、验证数据库表结构。该参数的几种配置如下:

  • create:每次加载hibernate时都会删除上一次的生成的表,然后根据你的model类再重新来生成新表,哪怕两次没有任何改变也要这样执行,这就是导致数据库表数据丢失的一个重要原因。
  • create-drop:每次加载hibernate时根据model类生成表,但是sessionFactory一关闭,表就自动删除。
  • update:最常用的属性,第一次加载hibernate时根据model类会自动建立起表的结构(前提是先建立好数据库),以后加载hibernate时根据model类自动更新表结构,即使表结构改变了但表中的行仍然存在不会删除以前的列,在数据库中而是增加新的字段列。要注意的是当部署到服务器后,表结构是不会被马上建立起来的,是要等应用第一次运行起来后才会。
  • validate:每次加载hibernate时,验证创建数据库表结构,只会和数据库中的表进行比较,不会创建新表,但是会插入新值。

注意:慎选update,create,create-drop型。因为如果有其它程序也用到了同一个数据库,就没法保证同步了,会导致其它程序没法正常启动和运转。任何对数据模型的修改,应通过工作流程通知到相关人员知晓,而不是让程序自动改掉。
一个人单独开发时可根据需求切换。

此外,可添加:

spring.jpa.show-sql = true

用来运行项目时可以在控制台输出jpa转化的具体的sql语句,方便查看和测试

到目前为止,基本配置文件完成,可以开始建立项目

二、项目启动运行

由于spring boot默认使用Tomcat作为web服务器,只需引入上述依赖中的spring-boot-starter-web便是可,这使得搭建一个web项目变得更加简单,项目创建好后,只需启动XxxApplication.java文件的main方法即可。此处启动的是DemoApplication.java中的main方法

三、 MVC模式下项目搭建

1. model类

model类创建需要使用相关jpa注解,常用注解可参考链接

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

@Entity
public class User {
    @Id
    @GeneratedValue
    private Long id;

    @Column(nullable = false)
    private String name;

    @Column(length = 10)
    private Integer age;

    public User(String name, Integer age) {
        this.name = name;
        this.age = age;
    }
    //省略get、set方法
}

在上述配置下,此时运行项目,数据库便会自动创建User表:
数据库

2.数据访问接口(仓储层)

User类的对应数据访问接口

import org.springframework.data.jpa.repository.JpaRepository;
import com.ziv.model.User;

public interface UserRepository extends JpaRepository<User, Long> {

}

此接口需要继承JpaRepository接口,并修改泛型,第一个为对应model类的类名(此处为User),第二个为对应model类的主键的类型(此处为Long)

3.Controller(控制层)
3.1 Controller基础注解
  • @Controller: 修饰class,用来创建处理http请求的对象
  • RestController:Spring4之后加入的注解,原来在@Controller中返回json需要@ResponseBody来配合,如
    果直接用@RestController替代@Controller就不需要再配置@ResponseBody,默认返回json格式。
  • RequestMapping:配置url映射

若一个Controller类中有Web页面需要渲染,类注解只能用@Controller,否则报错

3.2 Controller简单代码编写
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

import com.ziv.model.User;
import com.ziv.repository.UserRepository;

@Controller
public class DemoController {
    @Autowired
    private UserRepository userRep;

    @RequestMapping("/hello")
    public String showDemo(Model model){
        User user = new User("DouDo",26);
        userRep.save(user);
        model.addAttribute("User", user);
        return "Hello";
        /*返回的Hello为模板路径,默认配置下只要写`src/main/resources/templates/`路径后的路径,
        且不需要写后缀(".html")*/
    }
}
4. 视图层
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Demo Test</title>
</head>
<body>
    <h1 th:text="'name: '+${User.name}"></h1>
    <h1 th:text="'age: '+${User.age}"></h1>
</body>
</html>

到此,一个简单的spring boot整合Thymeleaf+spring-data-jpa项目便创建好了,运行DemoApplication.java类中的main方法启动程序,在浏览器输入http://localhost:8080/hello便能看到结果:
这里写图片描述

与此同时,数据库中也插入了相应数据:
这里写图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值