[SSM+layui]汽车出租系统06_加载左侧菜单(角色里面 type为1的就是超级管理员(这里)、简单json如何转变成标准json)、List和ArrayList的区别、项目中空指针错误怎么解决

加载左侧菜单

在这里插入图片描述
首先pid=0的不展示,即不属于菜单,因为菜单里面本来就应该没有它,这是我们应该要达成的一个共识,
如果它作为根节点的话是非常不美观的,想象一下就很可怕
接着继续往下
我们要把哪个当做根节点呢
在这里插入图片描述
我们应该把pid=1的当做根节点
第一步我们登录进来肯定是要先查询这些菜单
所以首先要加一个查询方法
即要去在增加查询订单方法,修改下面的两个文件即dao层(在SSM里面dao层就是这两个文件的结合)
在这里插入图片描述
在这里插入图片描述
对应的,在xml里面也要去加一个方法
在这里插入图片描述
在这里插入图片描述
== and available=#{available} 这一段的意义是什么,后面我们再来看 ==
其实就是 我们后面去调用这个查询的时候,给它一个参数,
这个参数大概率就是1 ,只是这里用#{available},就没有写死
因为也不是百分百就是1,很好理解,就是不写死,你自己传进来

我们写代码的时候,不仅仅要考虑这个方法在此时的应用,在其它地方也可能会用到这个方法,
怎么样让它更为通用,更为好用不用再二次更改是我们需要考虑的
接着下一步
在这里插入图片描述
然后接着再创建我们的MenuService(Dao创建完当然就是Service啦,不然干嘛)
注意,不管是service还是dao,都是要写两个的,一个是接口,一个是实现接口的具体类
在这里插入图片描述
接口
在这里插入图片描述

我们要想一个问题,不同的用户进来,看到的菜单是一样的吗?
应该是不一样的
所以我们这么写合理吗,所有用户将来都是用这个查询合理吗?
在这里插入图片描述
显而易见,是不合理的,所以我们需要改,那么怎么改呢?
复杂的我们先不想那么多,大不了后面再写一个这样的方法
首先这么写的肯定也是对的,只是是给谁用而已
能够看到所有菜单的是谁,一定是超级管理员
所以这里写超级管理员就行
在这里插入图片描述
type为1就是超级管理员
所以我们只需要判断当前登录的用户是不是超级管理员
也就是说只要去看它的type 是不是为 1 就行
那么接口我们也完善一下
在这里插入图片描述
具体实现类
在这里插入图片描述
想一下,这里面要不要加注解?
要不要?
肯定要啊
在这里插入图片描述
在这里插入图片描述
接下来就是控制器

新建一个控制器
在这里插入图片描述

因为返回的是json数据
在这里插入图片描述

既然是json数据,我们完全可以用另外一种controller
如下
(因为返回的是json数据,所以我们可以用@RestController,这样更方便)
在这里插入图片描述
因为用这个controller,跳转的时候会有问题
所以我们专门再定义一个用@controller去修饰的类,专门去进行跳转
在这里插入图片描述
在这里插入图片描述

这个SysCntroller里面就是的注解就使用@Controller了,而不是使用@RestController
在这里插入图片描述
特别要注意,以前没有这么写过,这是一种新的写法,要善于学习
很有可能在项目的有些地方或者有些公司就是这么写的,而你看不懂,那岂不是很尴尬

后期开发中@Restcontroller用得也是比较多的
@Restcontroller的好处是什么
好处就是避免了我们要写两个注解
@Restcontroller 里面的所有方法返回的数据都是json

使用 @Controller 修饰类,可以根据需要返回各种我们所需的数据(json(方法上使用@ResponseBod,ModelAndView,静态页面),
而使用RestController修饰类,最后返回结果都会被解析成json字符串,适合所有的方法返回值都是json数据

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
简单json如何转变成标准json

简单json如何转变成标准json

为什么要转,因为在这个**@RestControoler里面只支持标准的json,不支持简单的json**
首先,Menu.java 即这个model里面的属性是满足不了我们将简单json转换成标准json的
所以我们要新建一个类
我们要想办法把id和pid承接起来
在这里插入图片描述

在这里插入图片描述
复制
粘贴过来
在这里插入图片描述
在这里插入图片描述
这样修改完之后,加上get 和 set

然后再提供 构造器,还是那句话,提供了有参构造之后,一定要提供无参构造

在这里插入图片描述
为了更好调试,也可以加上toString方法

接下来写控制器里面的代码
在这里插入图片描述
把上面的HH 方法 这测试的删掉,看下面的代码
在这里插入图片描述

在这里插入图片描述

因为登录的时候我们一定会把,当前登录名放到session域里面去,所以,这里就可以直接通过

User user = (User) WebUtils.getHttpSession().getAttribute("user");

这行代码获取到,当前登录的对象,后面的代码都可以这样获取到登录者的信息
在这里插入图片描述
List和ArrayList的区别

List是一个接口,而ArrayList是List接口的一个实现类。 

       ArrayList类是继承AbstractList抽象类和实现List接口的一个实现类。 

       因此,List接口不能被构造,也就是我们说的不能创建实例对象,但是我们可以像下面那样为List接口创建一个指

向自己的对象引用,而ArrayList实现类的实例对象就在这充当了这个指向List接口的对象引用

在这里插入图片描述

在这里插入图片描述
现在市面上所有的框架都是推荐使用包装类型,用基本数据类型可能会引起报错,到时候很麻烦
在这里插入图片描述
注意代码是活的,不要照搬照抄,应该有自己的理念
比如这里这个字段就需要具体根据数据库里面的字段属性来写
可能不需要这段 三元表达式
在这里插入图片描述

这样就构造完成了
下一步做什么呢
我们想想,现在我们的数据是这样的,我们循环它的时候,我们应该做点什么
在这里插入图片描述
下一步做什么呢?
我们想想,现在我们的数据是这样的,我们循环它的时候,我们应该做点什么
首先我们要把pid=1的当做根节点
具体做法就是遍历它,一旦发现pid=1 就加入到根节点的阵容当中来即往children里面塞
在这里插入图片描述
直接放就是根节点(pid=1就是根节点)
怎么去理解,注意看下图去理解一下
在这里插入图片描述

运行看看

在这里插入图片描述
下面我们运行试试看,获取到json

下面刷新一下
效果就出来了,菜单都查出来了
在这里插入图片描述

空指针错误怎么解决

注意如果菜单没有加载出来并且报了这个错,看看如何解决
在这里插入图片描述
特别是初学者,会找这个错误找一天,都还不一定能够错在哪
找很久没到,大概率是因为方向错了,一直在纠结n1或者n2 是不是为null
其实很简单,是初始化的时候没有new 即没有初始化,只是声明了
解决办法如下
在这里插入图片描述
在这里插入图片描述
着重看一下我们自己设置的图标,以此来判断我们写的有没有生效
其实评判一段代码写得好不好,其实有一个标准就是看它里面的硬编码多不多
我们要尽可能的减少硬编码
在这里插入图片描述
所以这种代码,后期我们把它换掉
下面接着上面说的尽可能硬编码来优化一下
在这里插入图片描述
在这里插入图片描述
这些都写到常量类里面去
并且完善一下这些常量
在这里插入图片描述
完整如下
在这里插入图片描述

封装代码

在这里插入图片描述
为啥要封装,这样不是挺好的吗?
封装是为了提高复用性
除了这个,还有一个很重要的地方,就是可以传参,可以变成活的
比如这里我们默认根节点pid是1的菜单,
在这里插入图片描述
如果我们万一以后有个需求,就是要查找pid为0的呢?总会有万一,所以这里写成活的会好很多
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
不过这个自动生成的方法写在这里不美观,我们想想把它放哪去
最好的放在这里来
还记得什么叫静态内部类
我们可以在这创建一个静态内部类
在这里插入图片描述
在这里插入图片描述
静态内部类里面到底方法是可以直接调用的

在这里插入图片描述
内部类的调用太麻烦了,我们还是按照标准,新建一个类吧
在这里插入图片描述
然后把代码放进这个类来
注意修饰符是public
(注意这里的修饰符是public,如果是private,这个方法在别的类打点调用就出不来,因为private修饰的类里面的方法只能在本类中用)
这样就可以直接调用了
在这里插入图片描述
至此,左边菜单加载出来的全部编码工作完成

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值