本周问题集锦——基于学生管理和杂项

 这是基于学生信息管理的一个demo,主要是学习sql语句增删改查,多表关系,以及权限分配,分页,过滤器等。由于最近来北京这实习了,租房,买东西,入职不少事情,所以博客一致未更新,也积攒了好多问题,这里就不分类了。头一次在火车上也写代码,唔。还蛮有趣的,而且,我才来没几天,就让我改bug真看得起我哦。那个试了几次,还没有成功。不多说开始正题吧。杂项是值在公司学到的以及其他,一起记录,之后再分类吧。
注:环境为win10(语言英文),jdk14,tomcat9.0.22,ideal2020.3

foreach标签循环报错

循环标签支持异常

请看图:
foreach循环报错
foreach循环报错
 解决:这是我修改后的代码,是正常的,

<c:forEach var=“index_num” begin=“1” end="${page.totalPages}">

原来之所以错误是因为我用varStatus属性,而不是上面的var属性,我只想遍历一个数字,从1开始,然后末尾是EL表达式的值,应该是我粗心写错了。

页面样式失效

 描述:我在完成一个功能时,页面没有问题,然后关掉了ideal,然后晚上拿出来继续做,然后启动就出现了页面样式失效。我确定我没有更改css文件内容和移动位置以及对应的引用文件,浏览器开发者工具,没有任何报错,我就很纳闷,我最讨厌没有任何报错和提示信息的错误。
 之后我想起来了,我加了过滤器,于是我把过滤器注释掉了,果然是过滤器拦截掉了静态资源。
 分析:后来想想不对啊,没有道理啊,我就更改了字符的编码方式,然后我在过滤器中找到了一个语句:(我的过滤器过滤地址为: /*)

	resp.setContentType("text/html;charset=utf-8");

它会导致css文件不被解析或者解析错误,但是我再一想,我之前都是有这个过滤器的,为什么现在才出现问题,我之前都调试几十次了,现在出问题?我怎么也想不懂。但是把它加在需要的输出的地方而不是放在过滤器里,页面样式就生效了。
 详细分析:(此处留空,日后知道后记录)

关于count(*)函数

注意该函数的参数,除了*以外还可以放入字段名,如果是字段名将统计该列不为空的行数。如果是count(*)则统计所有行数,不考虑某一列为空的情况;另外如果是* 换成数字那么查询结果列名更改为对应的列名,如:
count数字为参数
但是并不是按列号来查询,我试了,其中我的第二列数据有一行为空,但是结果还是7,如果是列名那么就是6,所以,暂且理解到这里只会改变查询结果的列名。
效率问题:如果我们用cout()查询某一列,分两种情况:

1.该列没有not null约束,那么他会一行行的检查,浪费时间
2.如果该列有not null约束,那么他会转化为count(*),转换耗费时间

form表单 method为get时,不可在action中拼接参数

做的时候我在get方式提交的表单时,在action拼接了参数,然后导致报错,当时没有截图,也不记得是什么错了,所以只好文字记录。之后改成了post完成的。希望下次可以注意!

关于mybatics 标签的使用

由于是公司里使用mybatics,所以放在这里记录,由于自己没写,不抄别人代码;参考

关于linux的ps命令

ps 参数
列表:

e:显示所有进程
f:全格式
h:不显示标题
l:长格式
w:宽输出
a:显示终端所有进程,包括其他用户的进程
r:只显示正在运行的进程
x:显示没有终端控制的进程

其中常用的为:ps -ef等

ideal快捷键部分

!请注意快捷键冲突,也可以自行更改

定位当前文件所在目录

参阅此图:
定位文件目录

光标返回到上一个停留的地方

ctrl+alt+left

窗口左右切换

alt+left/right

关于修改某个角色的权限问题

 修改某个角色需要先查询该角色有什么权限,然后对应复选框选中,那么就需要有两个结果集做对比,我一开始的思路就是查到两个结果集,然后jsp页面foreach循环嵌套,很明显,不行,会造成菜单的重复。因为肯定要首先展示出完整的菜单列表,然后和角色拥有的对比,而这个逻辑是某个菜单项必须等待所有角色的菜单列表遍历完成才知道结果。
 可以在页面设置标志位,但是我也尝试了,可能我循环放的位置不对,都失败了。
然后,我问了朋友,在菜单实体类中加入一个标志位,用来判断某个角色是否拥有该权限,然后页面就可以只循环一个list了。因为在jsp写小脚本的方式不被推荐,所以我觉得这个方法比较好。反思:为什么我没有想到在实体类中添加判断标志呢?!!

菜单分类

这个依据不同表,自然有不同思路,也是老师的思路。我认为不错,可以记录下。
角色表:
role表
菜单表:
菜单表
中间表:(注意:此表不需要是实体类)
中间表
思路:
这里假设菜单只有两级,多级思路一致。

1.首先查到所有菜单listA1,准备一个空的listB
2.循环遍历listA1,找到所有顶级菜单,这里是upMenuId为0的部分
3.准备一个空的listA2,用来存放与之匹配的二级菜单
4.循环listA1,找到所有upMenuId等于当前menuId的菜单,然后添加进listA2
5.当二级菜单循环完调用一级菜单的setMenuSecondaryList()方法,添加进一级菜单
5.把排序好的菜单放入之前备好的listB并返回
代码:

public List<Menu> queryMenu() {
        List<Menu> menuList = menuDao.queryMenu();
        List<Menu> afterClassifyMenuList = new ArrayList<>();
        for (Menu firstMenu : menuList) {
            if (firstMenu.getUpMenuId() == 0) {
                //一级菜单,准备list存储
                ArrayList<Menu> secondMenuList = new ArrayList<>();
                for (Menu secondMenu : menuList) {
                    if (secondMenu.getUpMenuId().equals(firstMenu.getMenuId())) {
                        secondMenuList.add(secondMenu);
                    }
                }
                //遍历完同一个一级菜单的所有二级菜单
                firstMenu.setSecondaryMenuList(secondMenuList);
                //增加一个已经归类好的一级菜单
                afterClassifyMenuList.add(firstMenu);
            }
        }
        return afterClassifyMenuList;
    }

关于分页

 其实之前学校学的分页都是调用工具类,这次是自己实现,这下对实现原理就知道了。
关于分页必须要的5个参数:

1.当前页数(可以设置首次访问为默认值1)
2.每页展示条数(自己指定)
3.总条数(需要数据库中查)
4.总页数(依据下面公式计算)
5.依据分页查到的结果集

 核心思想就是使用sql中的limit关键字。即 limit ?,?
 当前页数公式:(上述问号对应的值)

(当前页数-1)*每页显示条数,每页展示条数

 总页数公式:

总页数=总条数%每页展示>0 ? 总条数/每页展示条数+1:总条数/每页展示条数。

 这里需要判断是否为第一页,因为总条数小于每页展示条数求余是本身自然大于0.

分页首页问题

我的分页总页数的计算方式:

total % pageSize > 0 ? total / pageSize + 1 : total / pageSize

需要注意的是,如果条数不满足一页的情况,需要进行判断:
分页总页数的计算方式:

    public Integer getTotalPages() {
        //如果数据只有一页
        if (total % pageSize == total && total / pageSize == 0) {
            return 1;
        }
        return total % pageSize > 0 ? total / pageSize + 1 : total / pageSize;
    }

不然,求余结果还是本身,大于0,自然加一,不符合逻辑。

调试的循环

之前犯傻了,我调试的时候,把断点打在循环内部,然后我通过for循环在添加排序好的菜单,但是他的长度一直为1,我觉得不对,怎么会是1呢,应该和之前集合的长度一致才对啊。我忘了,我在循环内部,单击继续就会在进入循环一次,就变成2了,我居然没注意到这个,还好有同事给我说,真的是。太笨了。

非法字符导致无法运行

请检查页面中是否有无法被解析的字符,我之前就是有,删掉之后就可以了。我这里显示的就是很多NULL…

最后

多表操作,可能关系会比较复杂,有点绕,但是也还好,主要是不大熟悉表结构导致的。


就到这,第一次在公司写博客,哈哈哈。
下次见。
sue
2021年3月26日15:45:30 于北京东城区

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值