笔记整理
- 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
整合thymeleaf
和 Jpa
搭建的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
便能看到结果:
与此同时,数据库中也插入了相应数据: