[SSM+layui]汽车出租系统06_加载左侧菜单(角色里面 type为1的就是超级管理员(这里)简单json如何转变成标准json)List和ArrayList的区别项目中空指针错误怎么解决(代码
Posted 平凡加班狗
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[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,如果是private,这个方法在别的类打点调用就出不来,因为private修饰的类里面的方法只能在本类中用)
这样就可以直接调用了
至此,左边菜单加载出来的全部编码工作完成
以上是关于[SSM+layui]汽车出租系统06_加载左侧菜单(角色里面 type为1的就是超级管理员(这里)简单json如何转变成标准json)List和ArrayList的区别项目中空指针错误怎么解决(代码的主要内容,如果未能解决你的问题,请参考以下文章
[SSM+layui]汽车出租系统011_菜单管理-修改头文件报错
[SSM+layui]汽车出租系统03_项目环境搭建(添加外部的servlet-api.jar)
[SSM+layui]汽车出租系统07_RBAC权限管理及表分析说明怎么设置权限联合主键sql语句分析distinct去重
[SSM+layui]汽车出租系统011_菜单管理-删除有子节点就不能删改了xml要重启服务删除菜单的时候关联关系也要删除通过模型驱动获取值
[SSM+layui]汽车出租系统013_角色(Role)管理CRUD(增删改查)批量删除的实现角色关联菜单搜索和替换操作要勾上区分大小写,否则会出问题