首先来介绍下什么是web:
Web(全球广域网)是指由互联网上的各种资源构成的一个全球性的信息系统。它是一种基于客户端-服务器模型的网络应用系统,通过HTTP(超文本传输协议)进行通信。
Web的基础是超文本和超链接技术。超文本是指以文本为基础,通过标记语言(如HTML)实现文字、图像、音频、视频等媒体元素的混合展示的技术。超链接是指通过使用URL(统一资源定位符)将不同的文档或资源相互连接起来,使用户可以方便地在不同资源之间跳转导航。
Web的主要组成部分包括:
- 网页(Web Page)2网站(Website)3浏览器(Browser)4服务器(Server)5URL(Uniform Resource Locator)
web开发所需要具备的知识:
1:一定量的Java语言基础(基本语法,逻辑控制,面向对象,集合,等)
2: 数据库知识(任意的库的管理工具、数据库表列主键外键等概念、查询语句、导入导出、ER图等知识)
3:丰富的SpringBoot知识(依赖管理、ORM、切面、DAO→service→controller开发流程
)
web开发的环境配置:
1:安装idea,idea会自带jdk可直接使用。idea的下载链接为https://www.jetbrains.com/idea。。安装后即可使用
2:搭建本地仓库以作为开发时存储项目文件的地方。本地仓库可随意安装在任意磁盘中。命名尽量避免为中文。
3:安装mySql数据库检测安装,可能会有一些依赖安装,按提示安装即可
安装完会有配置,其中密码验证方式,必须选择传统验证(Legacy),强密码方式navicat无法连接root根用户密码要牢记,开发环境建议使用123456或654321,生产环境不要使用易于猜测的密码其他配置一般按默认即可
参考: https://www.modb.pro/db/53520
4安装Navicat,并打补丁
安装完成后打开navicat,点击连接输入root用户密码并连接到mysql,创建practices数据库。字符集utf8 -- UTF-8 Unicode,排序utf8_bin
开发流程:
1:开始
构建项目&依赖模块
pom. xml
2:配置
开发配置,数据源、ORM、前端模板等
application . yml
pom . xnl
3:建模
分析业务对象,创建对应实体类
编码
以下几部分,每个业务循环进行
4:部署
本地(非开发机)或腾讯云等云服务器
项目各项层:
1:持久层
Repository接口
2:业务层
Service接口及其lmpl实现类
3:控制器
RestController
4:junit测试
业务层或持久层
关于具体的相关配置文件:pom.xml
项目对象模型(Project Object Model)是Maven工程的基本工作单元,包含了项目的基本信息,用于描述项目如何构建,声明项目依赖。若需要添加其他依赖,可在pom中添加。
pom文件中指定源码文件编码为UTF-8
pom中配置maven打包跳过测试,或忽略测试失败
application.yml
application.properties→application.yml,应用程序配置文件的格式由properties修改为yml,yml文件的结构更为清晰
yml中配置数据源,包括驱动类、数据库地址、用户名、密码等
yml中配置数据库架构变化时的更新策略为update:必要时才更新。其他还有全部删除后更新、每次会话删除更新等。开发时配置为update;在项目部署后,可将该项配置为none,避免在生产数据库中更新造成数据丢失
yml中配置jpa的show-sql为true,方便开发时在控制台查看和定位问题
为不同的环境添加个性化的应用程序配置文件
比如开发环境下的application-dev.yml和生产环境下的application-prd.yml,将共同的配置留在application.yml中
不同环境的yml文件,指定个性化配置
比如端口号生产环境80、开发环境8xxx,比如不同的数据源地址、用户名密码等
在默认的yml配置文件中,指定当前生效的配置文件,只需要指定后缀
可以选择启动测试一下,如果出现Started XXXApplication in xxx seconds,表示运行成功
在现代的Web应用开发中,前端模板引擎扮演着非常重要的角色,它能够有效地将数据和界面展示逻辑分离,提高前端页面的可维护性和灵活性。Thymeleaf作为一款优秀的前端模板引擎,在Java Web开发中得到了广泛的应用。本文将介绍Thymeleaf的整合和使用,帮助开发者更好地利用Thymeleaf开发Java Web应用。
1. Thymeleaf简介
Thymeleaf是一款优秀的Java模板引擎,它的设计目标是成为一款严格遵循Web标准的模板引擎,并且具有易学易用的特点。Thymeleaf的语法类似于HTML,使得开发者可以很容易地上手并进行模板的编写。同时,Thymeleaf支持与Spring框架无缝集成,能够方便地在Spring MVC等项目中使用。
2. Thymeleaf的整合
2.1 Maven依赖配置
首先,我们需要在项目的pom.xml文件中添加Thymeleaf的Maven依赖配置,如下所示:
xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
这样就可以通过Maven将Thymeleaf引入到项目中。
2.2 Spring Boot配置
如果你是基于Spring Boot进行开发,Thymeleaf的整合会更加简单。在Spring Boot项目中,只需要添加Thymeleaf依赖,Spring Boot会自动对Thymeleaf进行配置,无需额外的配置文件。
2.3 Spring MVC配置
对于传统的Spring MVC项目,我们需要在Spring的配置文件(如applicationContext.xml)中进行Thymeleaf的配置,包括视图解析器等相关配置,以确保Spring MVC能够正确识别和解析Thymeleaf模板。
3. Thymeleaf的使用
3.1 模板文件
Thymeleaf模板文件通常以.html为后缀,其语法类似于HTML,并且可以嵌入表达式、迭代、条件判断等逻辑。以下是一个简单的Thymeleaf模板示例:
html
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<title>Thymeleaf示例</title>
</head>
<body>
<h1 th:text="${title}">默认标题</h1>
<ul>
<li th:each="item : ${items}" th:text="${item}">Item</li>
</ul>
</body>
</html>
3.2 控制器
在Spring MVC中,我们可以通过控制器将数据传递给Thymeleaf模板,例如:
java
@Controller
public class SampleController {
@GetMapping("/sample")
public String sample(Model model) {
model.addAttribute("title", "欢迎使用Thymeleaf");
model.addAttribute("items", Arrays.asList("Item1", "Item2", "Item3"));
return "sample"; // 返回Thymeleaf模板的名称
}
}
3.3 属性绑定
Thymeleaf还支持属性绑定,比如设置HTML标签的属性值、CSS样式等,以及表单数据绑定等功能,能够很好地与前端页面交互。
4. 总结
Thymeleaf作为一款强大而灵活的前端模板引擎,在Java Web开发中有着广泛的应用。本文介绍了Thymeleaf的整合和使用方法,包括Maven依赖配置、Spring Boot和Spring MVC的整合配置以及模板的编写和控制器的使用。希望通过本文的介绍,读者能够更好地掌握Thymeleaf的使用技巧,提高Web应用的开发效率。
定义错误页面:
添加首页(resources/templates/index.html)及相应Controller--添加控制器注解
--添加index方法--添加路由注解
添加404和500页面
运行测试,分别访问首页、制造错误访问其他两个页面
步骤:
1:添加Thymleaf依赖
2:完成error页面
head>
<meta charset="UTF-8"><title>出错啦</title></head>
<body><div >
<div >
<h2 th:text="${title} ">出错了</h2>
<p>对不起,服务器内部错误,请联系管理员......./p></div>
<div th :utext="'< !--'" th : remove="tag"></div>
<div th:utext="'错误的URL地址: '+$ {url} " th:remove="tag"></div>
<div th:utext="'错误信息: '+$ {exception.message} " th:remove="tag"></div><ul th : remove="tag">
<li th:each="st: ${exception.stackTrace}
" th :remove="taa"><span th:utext="${st} " th: remo
ve="tag"></ span></ li
</ul>
<div th: utext="'--> ; '" th: remove="tag"></ di
V>
</ div>
</body>
</ html >
增加接口专用错误处理类
1:添加handlers文件夹,并添加专用于RESTful接口异常的处理类ApiExceptionHandler
2:使用注解指定处理的类型为RestController
3:在内部定义一个类型ExceptionWrapper专用于包装异常信息
4:添加异常处理方法,同样使用ExceptionHandler注解,返回异常包装类对象6在完成接口开发后,制造异常以测试该异常处理类
创建实体类:
操作步骤:
1.添加entities文件夹,创建实体类基类BaseEntity
UUID的id
无参构造器
getter和setter,这里要添加setter,因为如果要在前端传id到后端的时候,需要set方法,否则得不到正确的
id,比如发布文章时传递类别id
使用@MappedSuperclass注解类,这是JPA 的注解,用于父类使用@Id注解id ,表示该字段映射的列为主键
使用@GeneratedValue( generator = “uid2")注解id,表示id使用uuid2类型作为生成器来自动生成id的值,uuid 已弃用
使用@GenericGenerator(name = "uuid2" , strategy = "uuid2")注解id,指定UUID的生成策略,与上一个注解搭配使用,二者均不可缺少
使用eColumn( columnDefinition = “BINARY(16)")注解id,指定数据库对应的列类型为binary(16),与
varchar 相比binary可以减少该列存储的值的体积
2.在文件夹中添加User类
继承BaseEntity。使用 @Entity注解User类,标识该类为实体类,还可以通过@Table注解指定表名,默认不指定则与类名相同。具体的字段可参考3.2业务对象模型,另外还要加 password 、 updateTime字段
使用@Temporal(TemporalType.TIMESTANP)注解Date类型字段(下同),从数据库获取带有日期和时间的值,若为DATE则仅带日期不带时间,若为TIME则仅带时间不带日期
使用@Getter和@Setter注解(生成各个字段的 getter和setter )。添加无参构造器,为必要的字段赋初值
添加整数常量-1/0/1/2,代表4种不同身份:禁止访问、管理员、教师、学生,使用@Transient注解,表示映射时忽略
3.在文件夹中添加Course类。继承 BaseEntity
使用@Entity 注解Course类
添加字段,具体参考3.2节业务对象模型,外键字段如teacherId 忽略(下同),后面使用注解完成外键关联。使用@Getter和@Setter注解(生成各个字段的getter和setter )
添加无参构造器,为必要的字段赋初值
4.完成 User类和Course类的一对多实体关系(教师与课程关联)
在Course类中添加一个User类型的字段teacher,并使用@ManyTo0ne注解,表示多个课程对应─名教师
eacher")注解,表示一名教师可对应多个课程,每个课程对象使用teacher 字段关联User(教师)表
对于主次关系,写有mappedBy的一方为次,另一方为主,只有在主动方关联对象才会被保存到数据库。分别在两个类中生成对应的getter和setter
5.解决二者的json序列化无限递归问题
。为user类的关系字段courses的getter 添加@JsonManagedReference注解,该注解用于父级角色
在Course类teacher 字段的getter上添加eJsonBackReference注解,该注解用于子级,且不能注解集合类型。@JsonManagedReference注解的字段会被序列化而@JsonBackReference注解的字段会被忽略
6.完成 User类和Course类的多对多实体关系(学生与课程关联)
在Course类中添加一个List<User>类型的字段students,并使用 @ManyToMany注解,课程可注册多名学生。在User类中添加一个List<Course>类型字段enrolledCourses,并使用@ManyToMany(mappedBy
="students")注解,表示学生可学习多门课程,并设置与Course表的students关联
分别在两个表生成对应的getter和setter
7.解决二者的json序列化无限递归问题
为User 类的关系字段enrolledCourses的的getter添加@JsonIgnore注解。为Course类关系字段students 的getter添加@JsonIgnore注解
8.在文件夹中添加Chapter类
继承 BaseEntity,并使用@Entity 注解。添加字段,具体参考3.2节业务对象模型。生成各个字段的getter和setter。添加无参构造器,为必要的字段赋初值
9.完成 Course类和Chapter类的一对多实体关系
在chapter 类中添加一个Course类型的字段course,并使用@ManyToOne注解
在Course类中添加一个List<Chapter>类型的字段chapters,并使用@OneToMany(mappedBy="course")注解。分别在两个表生成对应的getter和setter
10.解决Chapter类和Course类的json序列化无限递归问题
为Chapter类的关系字段course 的gettter添加@JsonBackReference 注解。为Course类的chapters字段的getter添加@JsonManagedReference注解
11.在文件夹中添加Option类和Question类
继承BaseEntity ,并使用@Entity 注解
0ption类使用@Table(name = "options" )注解,防止sQL关键字冲突。添加字段,具体参考3.2节业务对象模型
生成各个字段的getter和setter。添加无参构造器,为必要的字段赋初值
Question中添加整数常量0/1/2,代表3种题目类型:单选、判断、不定项选择,使用@Transient注解12.完成 Option类和Question类的一对多实体关系
在Option类中添加一个Question类型的字段question,并使用@ManyToOne注解
在Question类中添加一个List<0ption>类型的字段options,并使用@OneToMany(cascade =
CascadeType .PERSIST,mappedBy = "question")注解,注解中级联的持久化可使添加题目同时添加选项。分别在两个表生成对应的getter和setter
13.完成Chapter类和Question类的一对多实体关系
在Question类中添加一个Chapter类型的字段chapter,并使用@ManyToOne 注解
在Chapter类中添加一个List<Question》类型的字段questions,并使用 @OneToMany(mappedBy ="chapter")注解
分别在两个表生成对应的getter和setter
14.解决Chapter 类和Question类的json序列化无限递归问题。为Question类的关系字段chapter的gettter添加@JsonBackReference注解。为Chapter 类的 questions字段的 getter 添加@JsonManagedReference 注解15.解决Option类和Question类的json序列化无限递归问题
为0ption类的关系字段question的 gettter添加@JsonBackReference 注解。为Question类的options字段的getter添加@JsonManagedReference注解
15.解决Option类和Question类的json序列化无限递归问题
为0ption类的关系字段question 的gettter添加@JsonBackReference注解。为Question类的options字段的 getter添加@JsonManagedReference注解16.在文件夹中添加Result类
继承BaseEntity ,并使用@Entity 注解。添加字段,具体参考3.2节业务对象模型。生成各个字段的getter和setter。添加无参构造器,为必要的字段赋初值
添加整数常量0/1/2/3/4,代表正确、少选、多选、错选、未做5种结果类型,使用@Transient注解17.完成 Result类和User 类的一对多实体关系,并解决json无限递归问题
在Result类中添加一个User类型的字段student,并使用@ManyToOne 注解
在User类中添加一个List<Result>类型的字段results,并使用@OneToMany(mappedBy = "student")注解。分别在两个表生成对应的getter和setter。为Result 类的student的 getter 添加@JsonBackReference 注解
为User 类的字段results 的getter添加@JsonManagedReference 注解
18,按同样的做法完成Question类和Result类的一对多实体关系,并解决 json无限递归问题19.完成 Result类和0ption类的多对多实体关系,并解决json无限递归问题
参考第6和第7个项完成设置
20.在文件夹中添加Applicant类、完成其与User类和Course类的一对多实体关系并解决json递归问题,步骤与上述一致21.运行显示创建表的语句,启动成功即可,在数据库中可查看生成的表