目录
让某个控制层返回JSON格式的数据(在SpringMVC中)
在SSM项目中为什么要使用Ajax?(在使用@ResponseBody注解时)
框架概念
什么是框架?
简单来说,就是别人是实现的一套规范的接口和类的集合。
为什么要使用框架?(优势)
在实际开发中,往往需要重复大量的代码,而框架就是为节省时间的模板代码,一旦方法使用正确,开发人员就只需要关注实际的业务需求逻辑即可,最后达到高效和低出错的效果。
在JAVA中有哪些框架?
Spring,SpringMVC,MyBatis,MyBatisPlus,Hibernate,JPA等。
主流的框架模式有哪些?
-
SSH(Spring+Stucts2+Hibernate)注意:之后Stucts2被SpringMVC取代
-
SSM(Spring+SpringMVC+MyBatis)
如何使用框架?
- 导入对应的框架jar文件。
- 要进行适当配置。
- 引用其中的内容。
为什么有些大公司现在仍然保留老旧的SSM?
现目前Java后端最流行的就是SpringBoot框架,但是早在它诞生之前,一些大公司的项目一直沿用SSM的项目,如果要推翻重做,往往需要耗费大量的成本。
主流框架
Spring
什么是Spring以及作用?
它是一个轻量级开源的Java框架,也是管理项目中对象的容器。
同时也是其它框架的粘合器,目的就是解耦。
Spring的核心是什么?
-
IOC控制反转
-
AOP面向切面编程
Spring自动化注入的简化方法?
@Autowrie
User user
此方法无需在Spring配置文件中设置autowire,可以节省代码量。
Spring的核心注解主要有哪些?
- 在类上加注解
注解方法 | 作用 |
---|---|
@Component | 定义为普通组件 |
@Controller | 定义一个类为控制层组件 |
@Service | 定义一个类为业务层组件 |
@Repository | 定义一个类为持久层(数据访问层)组件 |
- 在属性上加注解
注解方法 | 作用 |
---|---|
@Autowired | 优先使用byType方式从Spring容器中获取对应类型的对象自动装配 |
@Qualifier(value="某个对象的id") | 配合@Autowired注解,使用bayName方式获取某个对象id的bean进行装配 |
@Resource(name="某个对象的id") | 优先使用byName方式,从Spring容器中检索name为指定名的对象进行装配,如果没有则尝试 (相当于@Autowired+@Qualifler(value="某个对象的id")) |
MVC
什么是MVC?
MVC设计思想并不是某个语言特有的设计思想,而是一种通用的模式。
MVC的组成有哪些?
- Model模型
- View视图
- Controller控制器
为什么要使用MVC?(优势)
主要目的是降低系统的耦合度,提高它的可扩展性和维护性。
SpringMVC
什么是SpringMVC?
SpringMVC是Spring框架中位于Web开发中的一个模块,是Spring基于MVC设计模式设计的轻量级Web框架。
为什么要使用SpringMVC?
在传统的实现后台业务逻辑中,Servlet实现繁杂,而SpringMVC则可以有效简化,所以它可以替代Servlet。
SpringMVC的实现原理是什么?
最核心的是就是可以配置DispatcherServlet,它在指定映射(通常设置为/或*.do)接收某个请求后,调用相应的模型处理得到结果,再通过视图解析器,跳转到指定页面,将结果进行渲染。
SpringMVC核心的实现过程?
- 它对该请求进行解析,指定某个Controller中的某个方法,这些方法通常返回一个字符串。
- 该字符串是一个页面的名称,所以再通过视图解析器,将该字符串解析为某个视图的名称,跳转到该视图页面。
SpringMVC在项目中的使用?
-
创建webapp项目。
-
添加依赖(spring-webmvc)。
-
配置初始化Spring。
-
配置SpringMVC。
-
在WEB-INF目录下创建一个pages目录,在其中创建一个welcome.jsp页面。
-
编写控制层代码。
-
访问。(项目根目录+项目名+controller路径名+方法路径名)
SpringMVC相关注解有哪些?
注解方法 | 作用 |
---|---|
@Controller | 只能写在类上,表示该类属于一个控制器 |
@RequestMapping("/请求映射名") @RequestMapping(value="/请求映射 @RequestMapping(path="/请求映射名") | 默认写一个属性或value或path后的值,都表示访问该类或该方法时的请求映射 |
@GetMapping("/请求映射名") | 相当于@RequestMapping(value="/请求映射名"),method=RequestMethod.GET() |
@PathVariable | 映射中的/{path}就是获取路径中的hello或error,将其赋值给形参 |
@RequestParam(value="传递的参数名",defaultValue="没有传递参数的默认值") | 该注解写在某个方法的某个参数上 |
配置Spring+SpringMVC用到的关键类有哪些?
中文名 | 类名 | 配置位置 |
---|---|---|
Spring监听器 | ContextLoaderListener | 在web.xml |
内部资源视图解析器 | InternalResoruesViewResolver | 在springmvc.xml中 |
请求分发Servlet | DispatcherServlet | 在web.xml |
字符编码过滤器 | CharaterEncodingFilter | 在web.xml |
SSM项目的搭建
- 创建基于Maven的webapp项目。
- 修改web.xml版本为4.0,创建java、resoureces目录、项目包结构、WEB-INF下的页面目录。
- 导入依赖。(spring-webmvc,spring-jdbc,mybatis,mybais-spring,mysql,druid,jstl)
- 配置Spring(创建application.xml,配置web.xml)
- 配置SpringMVC(创建springmvc.xml,配置web.xml)
- 配置MyBatis(创建mybatis-config.xml(官网),在application.xml中注入)
- 执行sql语句。
备注:通过db.properties文件保存连接数据库的信息
- 在resources目录下新建db.properties文件
DB_DRIVER_CLASS_NAME=com.mysql.cj.jdbc.Driver DB_URL=jdbc:mysql://localhost:3306/bookdb?serverTimezone=Asia/Shanghai DB_USERNAME=root DB_PASSWORD=root
- 在application.xml中读取properties文件
<!--读取properties文件--> <context:property-placeholderlocation="classpath:db.properties"></context:property-placeholder>
- 读取时使用EL表达式访问其中的键
<!--Druid数据源DruidDataSource--> <beanclass="com.alibaba.druid.pool.DruidDataSource"id="druidDataSource"> <propertyname="driverClassName"value="${DB_DRIVER_CLASS_NAME}"></property> <propertyname="url"value="${DB_URL}"></property> <propertyname="username"value="${DB_USERNAME}"></property><propertyname="password"value="${DB_PASSWORD}"></property> </bean>
MyBatis
MyBatis是什么?
它是一个半自动化的ORM框架。
MyBatis的作用是什么?
免去几乎所有的JDBC中的模板代码以及设置参数获取结果集的工作。
MyBatis怎么使用?
使用XML文件或注解的形式,将SQL语句映射为持久层(dao层)中的方法。
MyBatis配置文件常用设置有哪些?
<?xmlversion="1.0"encoding="UTF-8"?>
<!DOCTYPEconfiguration
PUBLIC"-//mybatis.org//DTDConfig3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!--设置-->
<settings>
<!--开启驼峰命名映射-->
<settingname="mapUnderscoreToCamelCase"value="true"/>
<!--开启SQL日志-->
<settingname="logImpl"value="STDOUT_LOGGING"/>
</settings>
</configuration>
ORM
ORM是什么?
ORM框架就是对象关系映射框架,用于简化JDBC。
ORM作用是什么?
创建Java对象,将其属性和数据库表中的字段名之间构建映射关系。
主流的ORM框架有哪些?
- Hibernate
- JPA
- MyBatis
- MyBatisPlus
BootStrap
BootStrap的基本使用步骤?
- 下载bootstrap的文件夹和jquery,保存到webapp根目录下。
- 最后导入css和js就可使用了。
怎么解决无法引入静态资源的问题?
问题描述:由于在web.xml中,SpringMVC的核心类DispatcherServlet(请求分发器)的映射设置成了"/",表示所有请求,包含静态资源的请求都会交给SpringMVC处理。
解决步骤:
- 在webapp目录下,新建一个目录,通常命名为static。将项目中的静态资源文件都保存于此。
- 在springmvc.xml中
<!--映射静态资源目录--> <!--location表示要映射的静态资源目录--> <!--mapping表示最终通过哪种方式进行访问。这里表示只要以/static开头的请求,都可以访问静态资源目录--> <mvc:resourcesmapping="/static/**"location="/static/"></mvc:resources> <!--开启注解驱动,有这个标签,SpringMVC就能区分哪个是资源文件,哪个是Controller--> <mvc:annotation-driven></mvc:annotation-driven>
让某个控制层返回JSON格式的数据(在SpringMVC中)
- 添加依赖(jackson-databind)
- 在该控制层类上架上@ResponseBody注解(该注解可以加在类上和方法上)
Ajax
在SSM项目中为什么要使用Ajax?(在使用@ResponseBody注解时)
便于前端页面对得到的数据进行错误数据的判断和正确数据的规范显示。
Ajax的基本格式是什么?
$.ajax({
url:"访问地址",
data:{
"提交的参数名":"实际值",
"提交的参数名":"实际值"
},
type:"get/post",
success:function(res){
//成功后的回调函数,res为访问后的结果,必须是json格式
}
});
在SpringMVC中使用Session
方式一:@SessionAttributes注解
- 定义
@SessionAttributes({"参数1","参数2"})//表示在session中保存两个参数
- 使用
mode.addAttribute("参数1",对象)//mode为Mode对象
- 销毁
sessionStatus.setComplete();//调用setComplete()方法,将session设置为完成状态
方式二:HttpServletRequest参数
- 加入依赖
<!--如果要使用servlet相关内容-->
<dependency>
<groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>4.0.1</version>
</dependency>
- 使用
req.getSession().setAttribute("参数名",对象);
- 销毁
req.getSession().invalidate();
拦截器
为什么要使用拦截器?
每次请求controller时,都要经过的一个类,这个类就可以定义为拦截器。
拦截器如何实现?
- 导入servlet依赖
<dependency> <groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>4.0.1</version> </dependency>
- 自定义一个类,实现拦截器HandlerInterceptor接口(根据需求重写preHandle、postHandle、afterCompletion)
- 在springmvc.xml中配置拦截器
<!--配置拦截器们--> <mvc:interceptors> <!--配置某个拦截器--> <mvc:interceptor> <!--设置要拦截的请求,这里的/**表示拦截一切请求--> <mvc:mappingpath="/**"/> <!--设置不拦截的请求--> <!--放行登录和注册页--> <mvc:exclude-mappingpath="/login"/> <mvc:exclude-mappingpath="/register"/> <!--放行静态资源--> <mvc:exclude-mappingpath="/static/**"/> <!--放行用户模块--> <mvc:exclude-mappingpath="/sysAdmin/**"/> <!--注入指定的拦截器--> <beanclass="com.hqyj.ssm02.interceptor.MyInterceptor"></bean> </mvc:interceptor> </mvc:interceptors>
单元测试JUnit
如何使用JUnit?
- 导入依赖(普通项目只需引入junit,Spring环境还需引入JUnit)
- 创建单元测试类所在目录(一般会自动创建一个默认的test目录)
- 使用
- 在test/java目录下,新建一个类
- 在类上加入
在类中创建公开的无返回值的无参数方法,加入@Test注解@ContextConfiguration("classpath:application.xml") @RunWith(SpringJUnit4ClassRunner.class)
如何运行测试类?
- 在该方法上右键运行,运行的是当前方法。
- 在类中空白处右键运行,运行的是当前类中的所有方法。
#{}和${}
两者的区别有哪些?
相同点:在mybatis的sql映射文件中,可以使用#{}和${}表示sql语句中的参数。
不同点:#{}相当于预处理,会将参数用?占位后传值;(可防止sql注入)
${}相当于拼接,会将参数原样拼接。
分页
分页如何实现?
核心:分页组件PageHelper
步骤:
- 导入依赖
<!--分页组件--> <dependency> <groupId>com.github.pagehelper</groupId><artifactId>pagehelper</artifactId><version>5.3.2</version> </dependency>
- 在mybatis的配置文件中
<!--设置分页插件--> <plugins> <plugininterceptor="com.github.pagehelper.PageInterceptor"> <!--保证翻页不会超出范围--> <propertyname="reasonable"value="true"/> </plugin> </plugins>
- 使用
- 通过PageHelper类调用静态方法startPage(当前页数,每页显示的记录数)
- 开启分页查询所有,返回集合
- 创建PageInfo分页模型对象,构造方法的参数为查询出的集合,设置泛型。
- 根据需要调用对象的方法。
MyBatisPlus
什么是MyBatisPlus?
MyBatis-Plus (简称MP)是一个MyBatis的增强工具,在MyBatis的基础上只做增强不做改变,为简化开发、提高效率而生。
MyBatisPlus两个核心接口是?
- BaseMapper(封装了大量数据访问层的方法。)
- IServcie中(封装了大量业务流程层的方法。)
在SpringBoot环境下,如何使用?
- SpringBoot项目只需引入几个依赖(devtools,lombok,spring-web,mysql-driver)。
- 导入SpringBoot集成MyBatisPlus依赖。
<!--SpringBoot集成MyBatisPlus--> <dependency> <groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.3.1</version> </dependency>
- 配置application.properties文件。
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver spring.datasource.url=jdbc:mysql://localhost:3306/gamedb? serverTimezone=Asia/Shanghai spring.datasource.username=root spring.datasource.password=root #开启sql日志 mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl #无需加入开启驼峰命名映射,MyBatisPlus默认使用驼峰命名进行属性-字段映射 #mybatis-plus.configuration.map-underscore-to-camel-case=true
- 根据数据表创建实体类。(注意:默认使用驼峰命名对字段和属性进行映射,生成字段不一,需要在属性名上加入@TableField(value = "字段名"))
- 编写数据访问层接口。(可以不用写@Repository,继承BaseMapper接口,设置泛型)
- 在SpringBoot的启动类中,扫描数据访问层所在包。
BaseMapper接口(定义了常用的增删改查方法)
常用方法
方法名 | 参数 | 作用 |
---|---|---|
selectList(Wrapperwrapper) | 条件构造器 | 根据条件查询集合,如果实参为null表示查询所有,返回List集合 |
selectById(Serializableid) | 主键 | 根据主键查询单个对象,返回单个对象 |
selectOne(Wrapperwrapper) | 条件构造器 | 条件查询单个对象,返回单个对象 |
insert(T entity) | 实体对象 | 添加单个实体 |
updateById(T entity) | 实体对象 | 根据实体对象单个修改,对象必须至少有一个属性和主键 |
update(T entity,Wrapperwrapper) | 实体对象和条件构造器 | 根据条件修改全部,对象必须至少有一个属性 |
deleteById(Serializableid/T entity) | 主键/实体对象 | 根据主键删除单个对象 |
deleteBatchIds(Collectionids) | 主键集合 | 根据集合删除 |
delete(Wrapper wrapper) | 条件构造器 | 根据条件删除,如果实参为null表示无条件删除所有 |
IService接口
常用方法
方法 | 作用 |
---|---|
list() | 无条件查询所有 |
list(Wrapper wrapper) | 条件查询所有 |
page(Page page) | 无条件分页查询,Page是分页模型对象 |
page(Page page,Wrapperwrapper) | 条件分页查询,Page是分页模型对象 |
getById(Serializable id) | 根据主键查询单个对象 |
save(T entity) | 添加 |
updateById(T entity) | 修改,参数至少有一个属性值和主键 |
saveOrUpdate(T entity) | 添加或修改。如果实参对象的主键值不存在则添加,存在则修改 |
update(T entity,Wrapper wrapper) | 条件修改,条件为null则修改全部数据 |
removeById(Serializable id/Tentity) | 根据主键或包含主键的对象删除 |
removeBatchByIds(Collectionids) | 根据集合删除 |
remove(Wrapper wrapper) | 根据条件删除,条件为null则删除全部 |
MyBatisPlus中的逻辑删除和物理删除
什么是物理删除?
将数据真正删除。delete from表where id=值。
什么是逻辑删除?
数据不删除,而是打个"被删除"的标记。额外添加一个是否被删除的字段"deleted",其值为
0或1,0表示未删除,1表示已删除。而删除时,其实就是修改"deleted"字段为0
逻辑删除在MyBatisPlus中的实现过程
- 在表中添加一个新字段(deleted:默认为0表示未删除,1表示已删除)
- 在实体类中对应属性,添加@TableLogic注解(该注解表示该字段是逻辑删除字段)
备注:实现原理就是调用IService接口中的list()方法查询所有时,会在条件中加入deleted=0。
调用IService接口中的删除时,会执行修改。
Thymeleaf
Thymeleaf是什么?
SpringBoot官方建议使用的页面模板引擎,代替之前的JSP。
用法
- 添加依赖。
<!--thymeleaf页面模板引擎--> <dependency> <groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId><version>2.7.3</version> </dependency>
- 在temlates目录下创建一个HTML页面。(在页面的HTML标签中,加入xmlns:th="http://www.thymeleaf.org"属性。)
- thymeleaf具体使用。
- 双标签中的输出变量:th:text。
- 单标签中设置value的值:th:value。
- 遍历:th:each。
- 超链接获取全局路径:th:href="@{/}"。
- 表单提交路径:th:action="@{/}"
- 判断:th:if
Spring Data JPA
什么是JPA?
- 是一个全自动ORM框架。可以不用编写SQL语句,就能实现对数据库的持久化操作。
- 是一套Java访问数据库的规范,由一系列接口和抽象类构成。
- 如今常说的JPA,通常指Spring Data JPA。
怎么使用JPA?
- 创建SpringBoot项目,选择依赖(Spring Data JPA)
- 编辑配置文件,设置要连接的数据库信息。
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver spring.datasource.url=jdbc:mysql://localhost:3306/bookdb?serverTimezone=Asia/Shanghai spring.datasource.username=root spring.datasource.password=root #设置数据库类型 spring.jpa.database=mysql #打印SQL语句 spring.jpa.show-sql=true
- 创建实体类(类上加@Entity注解。主键属性上加(@Id注解标明主键,@GeneratedValue(strategy = GenerationType.IDENTITY)设置MySQL数据库主键生成策略,数据库设置为自增)其他属性名与字段名一致或驼峰命名法。(如果字段名多个单词之间用_,使用驼峰命名法。如果不相同,使用@Column(name="字段名")注解指定该属性对应的字段名))
- 数据访问层接口(类上加@Repository注解继承JpaRepository<实体类型,主键类型>接口)
请求方式设计:RESTFul风格
什么是RESTFul风格?
用不同的请求方式去访问同一个URL地址时,执行不同的操作。
RESTFul风格具体使用?
- 在请求映射的命名上,统一用小写字母的名词形式表示当前位于哪个模块。如/user、/book_info
- 访问时如果要传参,使用"/模块名/参数"方式,配合controller中的@PathVariable获取。
个人总结
在这个阶段,框架的知识体量比较大,虽然看起来增加了很多新的知识,但是大部分考验的都是前面基础性的知识,对于每种框架的理解,既要区分也要结合使用,相信多多练习对于项目的编写能力会有大大的提高的,加油吧!