项目demo的构建
model层
model层和entity层功能其实是一样的,名字叫的不同而已。
用了一个插件lombok,可以去plugin上面下载,免去了getter和setter ,直接在最上面加上一个@Data就可以了,然后的话,对id进行序列化;其次对时间date可以做一个JsonFormat的操作,解决相差8小时的问题 @JsonFormat(pattern = “yyyy-MM-dd HH:mm:ss”,timezone=“GMT+8”)
总的来说,写model层的时候,(1)、主要对数据库里面的字段进行了操作,都用private来修饰。(2)、在最前面加上@Data注解,免去了Getter和Setter,用的是lombok插件 (3)、在对Data日期操作的时候采用的JsonFormat,解决相差8小时的问题,因为北京时间对于我们来说是在东八区
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
Mapper层
mapper层和Dao层功能也是一样的,名字不同叫的不同而已,就比如有两只手机,一个是小米手机,还有一个是苹果手机,这两个本质都是手机,只是品牌不一样,叫法不一样而已,功能都是一样的。
mapper层的话,由于是和数据库进行交互的,所以的话,要先加上一个注解mapper,然后的话,再写相对应的参数,比如要返回的类型,函数名称,入参是什么,都在mapper里面写
总的来说的话,先加上@mapper注解,再写上相对应的从数据库里面实现的语句,比如SysUser getPerson(String username);
MapperXml
里面写的是从数据库里面执行刚刚的mapper层里面的语句的SQL文件,简单的语句可以用插件生成,我用的是MybatisCodeHelp,里面写的都是Sql的语句,可以先从自己的本地数据库里面执行一下sql语句能不能执行,然后再到这个MapperXml文件里面,这里提一下,这个MapperXML文件的目录默认是放在resource目录下面的,然后的话,之前是在yml文件里面配置过的,用的也是驼峰形式的, mapUnderscoreToCamelCase: true
mybatis:
type-aliases-package: com.hws.authority.model
mapper-locations: classpath:/mapperxml/*
configuration:
mapUnderscoreToCamelCase: true
Service层
里面的话就是定义一些接口interface,这些接口的话和刚刚那个Mapper里面的内容是一样的,不用加上任何注解
impl
impl里面的话,是一个class,并不是interfance,里面的话,在开头的时候要先加上@Service注解,然后的话,写上刚刚在service层下面实现的方法,有@Overrride,比较方便的一种方式是在service层刚刚写的接口的那个函数后面按下 Alt + Enter 键,就可以在impl下面自动给你写上method实现方法了,然后的话,还要引入刚刚写的Mapper层,并且加上注解@Resource 或者 @Autowired
@Resource
private SysUserMapper sysUserMapper;
总的来说的话,就是service层下的interface层里面不用加任何注解,在impl文件下的实现类里面
(1)、先写上@Service注解,
(2)、然后的话,引入刚刚写的mapper层文件,并且加上注解@Resource
private SysUserMapper sysUserMapper;
(3)、然后加上注解,写的是事务的注解@Transactional
(4)、然后写的内容是method方法
SysUserService文件下面的
public interface SysUserService{
int deleteByPrimaryKey(Integer id);
int insert(SysUser record);
int insertSelective(SysUser record);
SysUser selectByPrimaryKey(Integer id);
int updateByPrimaryKeySelective(SysUser record);
int updateByPrimaryKey(SysUser record);
SysUser getPerson(String username);
}
SysUserServiceImpl下面的
@Service
@Transactional
public class SysUserServiceImpl implements SysUserService{
@Resource
private SysUserMapper sysUserMapper;
@Override
public int deleteByPrimaryKey(Integer id) {
return sysUserMapper.deleteByPrimaryKey(id);
}
@Override
public int insert(SysUser record) {
return sysUserMapper.insert(record);
}
@Override
public int insertSelective(SysUser record) {
return sysUserMapper.insertSelective(record);
}
@Override
public SysUser selectByPrimaryKey(Integer id) {
return sysUserMapper.selectByPrimaryKey(id);
}
@Override
public int updateByPrimaryKeySelective(SysUser record) {
return sysUserMapper.updateByPrimaryKeySelective(record);
}
@Override
public int updateByPrimaryKey(SysUser record) {
return sysUserMapper.updateByPrimaryKey(record);
}
@Override
public SysUser getPerson(String username) {
return sysUserMapper.getPerson(username);
}
}
@Autowired和@Resource的区别
@Resource
1、@Resource 默认是按照byName 自动注入的
2、如果既不指定name属性,也不指定type属性,则默认是按照byName方式进行查找,如果没有找到默认的bean,则回退一个原始的类型进行查找,如果找到就注入
@Autowired
1、默认先按照byType进行匹配,如果发现找到多个bean,则又按照byName的方式进行匹配,如果还有多个,则报出异常
Controller层
1、首先先引入@Controller注解,
2、再写上映射的地址@RequestMapping
3、写上日志的输出,也是注解,用@Slf4j 表示
4、在controller层里面引入之前写的service文件,并且加上@Resource注解
@Resource
private SysUserService sysUserService;
5、在实现的方法上面加上@RequestMapping,作为实现这个方法的映射,@ResponseBody的话,就是返回一个以Json为格式的
6、在返回值那里调用service里面的方法内容
@Controller
@RequestMapping("user")
@Slf4j
public class UserController {
@Resource
private SysUserService sysUserService;
@GetMapping("/{username}")
@ResponseBody
public SysUser getHello(@PathVariable String username){
log.info("UserContoller.user():param(username = "+username+")");
return sysUserService.getPerson(username);
}
}
布局
圣杯布局
导入X-admin
首先的话,由于某一个head里面的配置文件过多,所以把这个head文件里面的内容抽出来,单独作为一个html,然后用th:replace的标签给它加上去,最终的话,index.html文件的head里面只有一行,在SpringBoot加载的时候,默认加载的是templates下面的index.html作为入口,可以直接写http://localhost:8080/ 去访问
注意:第一个header为上述公共部分的文件名,第二个html为th:fragment的值。这样便可以解决公共部分代码的抽取。
<header th:replace="header::html"></header>
head.html
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta name="renderer" content="webkit|ie-comp|ie-stand">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="viewport" content="width=device-width,user-scalable=yes, minimum-scale=0.4, initial-scale=0.8,target-densitydpi=low-dpi" />
<meta http-equiv="Cache-Control" content="no-siteapp" />
<link rel="stylesheet" th:href="@{/xadmin/css/font.css}" />
<link rel="stylesheet" th:href="@{/xadmin/css/xadmin.css}" />
<script type="text/javascript" src="https://cdn.bootcss.com/jquery/3.2.1/jquery.min.js"></script>
<script type="text/javascript"src="https://cdn.bootcss.com/blueimp-md5/2.10.0/js/md5.min.js"></script>
<script th:src="@{/xadmin/lib/layui/layui.js}" charset="utf-8"></script>
<script type="text/javascript" th:src="@{/xadmin/js/xadmin.js}"></script>
<script type="text/javascript" th:src="@{/ztree/jquery.ztree.all-3.5.min.js}"></script>
<script type="text/javascript" th:src="@{/ztree/ztree-menu.js}"></script>
<script type="text/javascript" th:src="@{/my/js/cookie.js}"></script>
<script type="text/javascript" th:src="@{/my/js/permission.js}"></script>
<!-- 让IE8/9支持媒体查询,从而兼容栅格 -->
<!--[if lt IE 9]>
<script src="https://cdn.staticfile.org/html5shiv/r29/html5.min.js"></script>
<script src="https://cdn.staticfile.org/respond.js/1.4.2/respond.min.js"></script>
<![endif]-->
</head>
</html>
引入路由
从index.html文件里面,里面加入的是./welcome.html页面,在浏览器中我们看到管理台右边是404页面,所以这个里面要加一个路由进去,这里顺便搜了一下iframe
iframe定义和用法
iframe 元素会创建包含另外一个文档的内联框架(即行内框架),就类似于一个内嵌的网页
构建步骤以及编写公共的ApiController
1、引入x-admin
2、index.html中iframe
3、编写ApiController.java
4、复制X-admin的user-list.html
5、编写UserController.java
其中iframe可以简单的认为是一个路由,在iframe里面通过编写的ApiController方法,可以实现一些页面的跳转控制
编写ApiController.java
在controlelr层里面加入ApiController,用于公共的API,
1、首先的话,加入@Controller注解,
2、然后的话,加入@RequestMapping,里面的话,加入地址的变量,里面写入${apiURL},(其中的话,apiURL是在.yml文件里面定义的,以后如果有变动在.yml里面修改即可)
@Controller
@RequestMapping("${apiURL}")
public class ApiController {
}
apiURL: /api
SpringMVC返回值类型
**主要有5种,
1、String字符串的形式
2、ModelAndView
public ModelAndView getUserList() {
ModelAndView modelAndView = new ModelAndView();
// 将数据放入modelAndView对象
modelAndView.addObject("userList", userList);
// 将返回的逻辑视图名称放入modelAndView对象
modelAndView.setViewName("userList");
return modelAndView;
3、void**
如果是返回 void 话,就必须要在方法的参数中添加 HttpServletRequest 和 HttpServletResponse 来进行页面的跳转,
比如:
public void test(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 转发到指定页面
request.getRequestDispatcher("xxx").forward(request, response);
// 或者重定向到指定页面
response.sendRedirect("/xxx");
}
4、Map
5、Model