JavaEE复习
第一章 概述
什么是 MVC 开发模式?
MVC 模式是 Web 开发中最常用的分层开发模式,即模型-视图-控制器模式。
=========================================================================================================
模型 Model:
应用的实体类,用于在内存中暂时存储数据,并在数据变化时通知控制器。
=========================================================================================================
视图 View:
主要用来解析、处理、显示内容,并进行模板的渲染。
=================================================
控制器 Controller:
处理浏览器的请求,决定如何调用业务层的数据增、删、改、查等业务操作,以 及如何将结果返回给视图进行渲染。
=================================================
什么是 Maven?
Maven 是一种基于项目对象模型(POM),通过配置文件(pom.xml)来管理项目构建的一种软件项目管 理工具。
=================================================
什么是 Spring starter Spring Boot ?
为了简化配置,提供了非常多的 starter,它先打包好与常用模块相关的所有 jar 包, 并完成自动配置,这使得开发时不需要过多关注框架配置,只需关注业务逻辑即可。
=================================================
=================================================
新建三个SpringBoot时候三个starter组件的作用
Spring Boot Devtools 项:用于项目热部署
Spring Web 项:用于构建Web应用程序
Thymeleaf 项:网页模板引擎
=================================================
编程式注解
@SpringBootApplication 入口类 用 @SpringBootApplication 注解
@ResponseBody(可以写在类、方法不用在参数上面)返回结果不会被解析为跳转路径,而是转为json格式数据
@RequestBody 用在参数上面
@Controller 如果需要返回到指定页面,则需要用@Controller 注解控制器类
@RequestMapping 注解用于配置 URL 映射 即确定请求所对应的处理方法
=================================================
MVC模式的基本体系结构
=================================================
项目结构中的主要文件夹和功能
第二章 Thymeleaf基本用法
什么是 Thymeleaf?
Thymeleaf 是一个服务器端 Java 模板引擎,适用于 Web 和独立环境,能够处理 HTML,XML, JavaScript,CSS 甚至纯文本等。Thymeleaf 主要目标是为开发工作流程带来优雅的自然模板。
=================================================### 常用表达式功能和基本用法
=================================================
=================================================
=================================================
常用标签
◼ th:action 指定表单提交地址
◼ th:value 给value属性赋值
◼ th:text:文本标签,用于进行文本替换
◼ th:object 获取对象
◼ th:if 当条件为 true 则显示。
◼ th:unless 当条件为 false 则显示。
◼ th:each 遍历集合
=================================================
第三章 Thymeleaf高级用法
布局页功能上的区别
布局页中用 th:fragment 定义模板片段, 其他页面用 th:insert 引用片段
=================================================
几个校验注解
@Min(value) 被注释的元素必须是一个数字,其值必须大于等于指定的最小值
@Max(value) 被注释的元素必须是一个数字,其值必须小于等于指定的最大值
@Length(min=, max=) 被注释的字符串的大小必须在指定的范围内
@NotEmpty 被注释的字符串的必须非空
@NotBlank 被注释的字符串的必须非空
=================================================
第四章 SpringBoot控制层
参数传递方法
无注解获取参数
要求:HTTP 请求的参数名要和后台方法参数名一致,顺序无所谓
=================================================
使用 @RequestParam 获取参数
=================================================
使用 @PathVariable 获取参数
=================================================
@RequestBody 获 取 json : 必 须 POST 方 式 提 交 且 必 须 与 contentType= “application/json” 配合使用
@DateTimeFormat 获取格式化日期参数 一些系统中日期格式约定为 yyyy-MM-dd
=================================================
=================================================
什么是 Filter Filter ?
即过滤器,它是 Servlet 技术中最实用的技术,Web 开发人员通过 Filter 技术,对 web 服 务器管理的所有 web 资源等进行拦截,从而实现一些特殊的功能。
=================================================
什么是 Interceptor?
Interceptor 即拦截器,它提供了一种机制可以使开发者在一个 Action 执行的前后执行一段代码, 也可以在一个 Action 执行前阻止其执行。基于 Java 的反射机制,是 AOP 的一种运用。
=================================================
过滤器与拦截器的区别:
① 拦截器是基于 java 反射机制来实现的,而过滤器是基于函数回调来实现的。
② 拦截器不依赖 servlet 容器,过滤器依赖于 servlet 容器。
③ 拦截器只对 Action 起作用,过滤器可以对所有请求起作用。
④ 拦截器可以访问 Action 上下文和值栈中的对象,过滤器不能。
⑤ 在 Action 的生命周期中,拦截器可以多次调用,而过滤器只能在容器初始化时调用一次。
=================================================
什么是 session?
session 是一种记录服务器和客户端会话状态的机制。主要用来存储所有访问过该服务器的客户端的 用户信息,从而实现保持用户会话状态。
=================================================
什么是 token?
token 是服务端生成的一串字符串,作为客户端进行请求的一个令牌。当第一次登录后,服务器生成 一个 token 便将其返回给客户端,以后客户端只需带上这个 token 前来请求数据即可,无需再次带上 用户名和密码。
=================================================
拦截器Intercepter
定义Intercepter
基本框架
=================================================
拦截器配置类!(注解@Configuration 表明是一个配置类)
=================================================
定义获取session****(两种形式)****
=================================================
=================================================
第五章 JPA技术基础
什么是 ORM?
=================================================
什么是 JPA?
JPA (Java Persistence API) 是一种 Java 持久化 API,用于对象的持久化,是一种非常强大的 ORM 解决方案。JPA 通过简单约定好接口方法的规则自动生成相应的 JPQL 语句,然后映射成 POJO 对象。
=================================================
实体类的一些常用注解
@Entity | 声明类为实体类,不能掉! 指定当前类是实体类,对应数据库中的一个表。 |
---|---|
@Id | 表示该属性作为表的主键 定当前字段是主键。 |
@Data(Lombok 插件) | lombok注解 |
@GeneratedValue | 指定主键的生成方式。 属性:strategy 指定主键生成策略。 GenerationType.IDENTITY:自增,底层数据库必须支持自增(mysql)序列GenerationType.SEQUENCE:底层数据库必须支持序列(oracle) GenerationType.TABLE:JPA提供的一种策略,通过生成一张表的方式完成主键自增,这张表存储了下一次添加的主键的值 GenerationType.AUTO:由程序自动选择一种策略(默认) |
@Column | 指定实体类属性和数据库表之间的对应关系。 nullable:是否可以为空 unique:是否唯一 |
控制器编程常用注解
@RestController | @RestController注解相当于@ResponseBody + @Controller 无法解析jsp,HTML页面 |
---|---|
@Controller | 如果需要返回到指定页面(jsp html等),则需要用@Controller 注解控制器类 |
@Autowired | 自动注入,即对象只需声明,不用new就能使用 |
@GetMapping | 是@RequestMapping(method = RequestMethod.GET)的缩写。 |
@PostMapping | @RequestMapping(method = RequestMethod.POST)的缩写。 |
Repository 层常用 crud 方法
findAll() findById(id).get() getById() deleteById() delete() save()
第六章 JPA技术实践
如何理解 Entity 层、DAO 层、Service 层和 Controller 层?
=================================================
Entity 层:
实体层(也称为 pojo 层),也就是所谓的 Model,是数据库在项目中的类,该文件包含
实体类的属性和对应属性的 set、get 方法;
=================================================
DAO 层:
持久层,主要与数据库进行交互,如 CRUD 等操作。DAO 层会调用 Entity 层。
=================================================
Service 层:主要负责业务模块的逻辑应用设计。一般先设计接口,再创建实现该接口的类。service
层调用 DAO 层,接收 DAO 层返回的数据。
=================================================
Controller 层:控制层,负责具体的业务模块流程的控制。负责前后端交互,接受前端请求,调用Service 层,接收 Service 层返回的数据,最后返回具体的页面和数据到客户端。
=================================================
Repository 仓库、服务层接口和实现(要求基本的 CRUD 功能)
仓库
*
第 7 章 JPA 高级用法
=================================================
什么是 JPQL?
JPQL:全称 Java Persistence Query Language,是一种和 SQL 非常类似的对象查询语言,它最终会被编译成针对不同底层数据库的 SQL 查询,从而屏蔽不同数据库的差异。
补充:JPQL 支持的操作是:select、update、delete,不支持 insert
=================================================
1 对多,写出实体类,完成数据库表的自动映射
几个注解
@OneToMany | 写在 1 端 cascade =CascadeType.ALL 赋予级联的所有权限(慎用) fetch=FetchType.EAGER 在查询主对象时同时加载关联对象 |
---|---|
@ManyToOne | 写在多端 |
@JsonIgnore | 该注解写在1的一方:解决json数据死循环 |
@Transactional**** | 涉及删除、修改,需要加上 |
@Modifying**** | 涉及删除、修改,需要加上 |
@Query | 查询常用注解 |
(识别 JPQL 写法和原生 SQL 写法的不同,注意参数占位符序号从 1 开始)
根据JPA命名规则定义的函数要能转化为对应的JPQL片段表示
Keyword | Sample | 对应的 JPQL 片段 |
---|---|---|
And | findByLastnameAndFirstname | … where x.lastname = ?1 and x.firstname = ?2 |
Not | findByLastnameNot | … where x.lastname <> ?1 |
IgnoreCase | findByFirstnameIgnoreCase | … where UPPER(x.firstame) = UPPER(?1) |
编程题1
仓库Repository
public interface UserRepository extends JpaRepository<User, Long> { User是实体模型 Long是主键类型
// JpaRepository 自动实现了很多内置的CURD方法
// 可直接调用而不用自己写代码,例如:
// List<T> findAll();
// Optional<T> findById(id);
// User save(user);
// void delete(user);
// void deleteById(id);
// long count();
// boolean existsById(id);
}
服务层接口
public interface UserService { //名字自取
public List<User> getUserList(); //User是实体模型 getUserList() 根据实体类变换
public User findUserById(Long id); //User也是实体模型 findUserById(Long id) Long是主键类型 id 是主键名称
public void save(User user); //User是实体模型名
public void edit(User user); //User是实体模型名
public void delete(Long id); //Long是主键类型, id 是主键名称
}
接口的实现
@Service //声明类为服务实现类 //别忘了!!!
public class UserServiceImp implements UserService{
@Autowired // 自动注入(不需要自己new对象)
private UserRepository userRepository; //声明仓库以调用
@Override //方法的实现
public List<User> getUserList() {
return userRepository.findAll(); //直接调用Repository内置的CURD方法
}
@Override
public User findUserById(Long id) {
return userRepository.findById(id).get(); //直接调用Repository内置的CURD方法
}
@Override
public void save(User user) {
userRepository.save(user); //直接调用Repository内置的CURD方法
}
@Override
public void edit(User user) { //保存修改的对象
userRepository.save(user); //直接调用Repository内置的CURD方法 //注意这里还是save()方法
}
@Override
public void delete(Long id) {
userRepository.deleteById(id); //直接调用Repository内置的CURD方法
}
}
编程题2
1端
@Entity //表明是实体类
@Data //lombok插件
public class Category implements Serializable { //序列化
@Id //声明主键
@GeneratedValue(strategy = GenerationType.IDENTITY) //自增模式
private Long id; // 定义主键
private String name;
@JsonIgnore //写在一端,防止json
@OneToMany(mappedBy="category", cascade = CascadeType.ALL, fetch = FetchType.EAGER)
private List<Book> books = new ArrayList<Book>(); //把多端初始化一下
}
多端
@Entity //声明实体类
@Data //lombok插件
@JsonIgnoreProperties(value = { "hibernateLazyInitializer", "handler" }) //写在多端
public class Book implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String title;
@JoinColumn(name="category_id") //属性映射的外键名,不写也是自动默认为category_id
@ManyToOne //写在多端(category属性负责维护外键)
private Category category; //用一下一端
}