现在的位置: 首页 > 综合 > 正文

天乙社区用户列表显示分析

2018年02月21日 ⁄ 综合 ⁄ 共 3636字 ⁄ 字号 评论关闭

今天我们来看看社区中用户列表是如何展现的,主要是分析分页机制是如何实现的。进入用户列表界面的方法是用webmasetr(社区管理员,密码:12345)登录,然后点击社区首页右上角的管理即可。

展现的界面如下:


该界面对应的文件是userShow.jsp,看到userShow.jsp中<body>的onload属性设置为:loadUserShowListPage()。该函数用ajax来更新请求,输出位置是userShowListDiv这个div,发出的请求是userShow且指定action为list。来看userShow.java中的list方法,其中先创建了一个Pages类对象且设置了其一些属性(setPage设置要跳转到的页号,setPerPageNum设置每页显示的记录数),其中filename属性用来保存请求的url地址,其会在后面的userShowList.jsp中的自定义分页标签中用到,主要用来设置分页页码超链接的herf属性。然后设置了UserShow(该请求的处理类)中的pageList属性。
研究PageList,PageList是专门用来分页显示查询记录的类,让我们看看它在这里(查询用户信息时)是如何工作的。首先在UserShow中pageList的是通过UserService()的方法来取得的,且带有两个参数,第一个参数groupID表示要查询的是哪一组(类别)的用户,第二参数是要用到的分页器,主要用来计算起始记录是哪一个,在list方法中之前已经设置了其page属性和perPageNum属性。看UserServiceImp中的findUserInfosByGroupID方法,其中先设置了要取得的记录总数,用executeCount方法设置了要查询的起始记录号。接着,用UserInfoDao的方法取得当前页要显示的那段记录。在UserInfoHibernateDAO中可看到所查询的表是UserInfo,且在查询过程中设定了所取记录集的起始记录和最大记录。findUserInfosByGroupID方法中取得查询的结果后,用该结果和pages来设置pageList的对应属性后就返回。
回到list方法中,最后返回"userShowList"(即返回userShowList.jsp)。这样在userShow.jsp的userShowListDiv中就会显示userShowList.jsp。

看看userShowList.jsp中是如何使用pageList的。先取出pageList.objectList(即查询结果)的值来循环显示用户列表。要注意的是在用户列表下面的一行是显示分页,分页的输出用到pageList.pages和自定义标签<bbscs:pages>。

我们直接看到实现<bbscs:pages>标签的组件类Page.java中,看到其start方法,首先是Pages pages = (Pages) this.getStack().findValue(value); 这一句从值栈取得了标签中value属性所指定的pageList.pages对象。
start函数很长,但只是对应不同情况的大量类似代码的重复而已。自定义标签输出内容按是否使用url重写(即urlRewrite是否为真)分为两种情况。我们先来看不使用url重写的情况,此部分代码从Page.java的475行开始。简单来说就是主要输出一些<a>标签,且点击这些链接后都执行loadUserShowListPageUrl这个javaScript函数,该函数作用就是用ajax更新用户列表。该函数定义在userShow.jsp文件中,之所以是执行这个函数是因为在userShowList.jsp中<bbscs:pages>标签的javaScript属性指定了。
若总共有两条记录(共一页),当前页是第一页,则用来分页的自定义标签<bbscs:pages value="%{pageList.pages}" javaScript="loadUserShowListPageUrl"/>输出的内容实际上是:
<span> <a href="javascript:;" onclick="loadUserShowListPageUrl('userShow.bbscs?ajax=shtml&action=list&groupID=0&page=1&total=2');"><strong>1</strong></a></span>
这里只有一页,是最简单的情况,如果有多页,则会输出更多的<a>标签。

关键是这里loadUserShowListPageUrl函数的参数要如何构造,这个参数就是userShow的url地址,前半部分就是filename,大概是userShow?action=list&ajax=shtml&groupID=0&,关键是在此基础上还需要加两个参数,page和total,这两个参数的添加,通过getArgPage()方法和argTotal属性来获得page和total两个字段。而这两个字段的值是通过pages的方法来获得的。不过这里要说的是在这个loadUserShowListPageUrl的参数url后面加total参数其实是没有用的,因为在最后执行的UserShow请求的list方法中,会重新创建pages对象,且没有设置其totalNum属性,所以url中的total参数根本没用上,新建的pages中totalNum属性仍然是默认的-1,到了serviceImp中又会用dao的方法到数据库中重新查询总记录数给totalNum赋值。
可以在BaseAction中把total的属性默认值设为-1。然后在UserShow.java的list方法中在pages.setPage(this.getPage());后加一句pages.setTotalNum(this.getTotal());,这样这个url中的total参数就可以发挥作用了。当然不改,程序也不会出错。

分页的输出样式大概是 << < 页码部分 > >> 这个样子。
若设置2页为一行,共6页,则显示的样子如下:

其中“<<”和“>>”表示跳转到第一页和最后一页,“<”和“>”表示跳转到上一页和下一页。若当前行是第一行,则没有<< <这两个选项。若当前行是最后一行,则没有> >>这两个选项。要注意的是在html代码中“<<”用“&laquo;”表示,“<”用“&#8249;”表示,“>”用“&#8250;”表示,“>>”用“&raquo;”表示。
其中的“页码部分”用来显示一行页码,一行的页面个数由cum决定。每个页码都有自己的所在行。页码部分显示的就是当前页所在的那一行页码。其中当前页的页码会突出显示。
与分页有关的几个关键属性的设置位置如下:
每页的记录数PerPageNum由userShow.java中的list方法中指定
一行的页数的pageSep由PageTag.java中的pageSep指定
useUrlRewrite由pages.java中的useUrlRewrite属性指定

让我们再来看看当使用url重定向时是怎么做的,当使用url重定向又会按<bbscs:pages>中是否指定了javaScript属性分为两种情况。指定了则<a>中会有javaScript属性,没指定则<a>中不会有javaScript属性,另外herf属性的值指定为tmpFileName,其中tmpFileName是将fileName中的{page}替换为当前页号,{total}替换为总页数后的结果。
但是这个替换似乎在这里根本没有起作用,因为filename中根本没{page}或者{total}这样的子串,替换前后tmpFileName不会有任何变化。程序中也似乎找不到把Pages的useUrlRewrite属性设为true的地方。在后台管理界面中也没有相关的设置选项。这个属性到底是在哪里设置的呢?暂时未知。
若直接把pages.java中的useUrlRewrite属性改为true,即指定使用url重写,则分页不能正常工作,因为这时每个分页的链接发出的url请求中都没有指定page参数,而默认是跳转到第一页,所以会一直停留在第一页无法改变。
让我们看看什么是url重写,url重写的目的是什么?url重写就是首先获得一个进入的URL请求,然后把它重新写成网站可以处理的另一个URL的过程。url重写的作用在于:1缩短url,隐藏实际路径提高安全性。2易于用户记忆和键入。3易于被搜索引擎收录。
也许作者是想让用户可以直接通过在浏览器中输入请求的地址来跳转到用户列表页。但是若在浏览器直接输入userShow?action=list&ajax=shtml&groupID=0这样的请求都会返回404错误页面。

抱歉!评论已关闭.