Struts检索结果分页显示的设计

本文介绍了一种在Struts框架中实现查询结果分页显示的方法。通过PageScroller类管理分页逻辑,结合ActionForm和Action实现了通用的分页功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

StrutsMVC结构就是围绕ActionFormActionJSPActionForward以及各种business beans来设计的。Bean处理后的结果提交给JSP显示时,很可能由于数据行数比较多,需要分页显示。进行分页显示需要知道几个相关参数:需要显示的结果集(一般是数组)、总计分页的页面数量、当前显示的页面编号、该页面显示内容在结果集中的起止id。此外还需要提供在各个分页面之间跳转的链接。

Ø         设计思路:

目的:用一个ActionForm、一个Action以及在struts-config.xmlActionForward信息来实现所有的查询结果分页显示。使这部分代码具有相当的可重用性。

Ø         实现方法:

查询的结果集总是和特定的JSP页面对应的,并且在各个页面之间进行跳转时结果集相对固定,改变的是页面的编号和数据行的内容。引入一个PageScroller类作为辅助,让它与一个结果集关联,通过操作这个辅助类来实现翻页以及页面跳转的功能。这个类具有以下属性:

private int totalRowsAmount; // 要显示的数据总的

private boolean rowsAmountSet; // 是否totalRowsAmount

private int pageSize = 10; // 数,改进时这个参数可以作为配置信息写在config文件中,动态读取。用户可以自定义修改。

private int currentPage = 1; // 默认时的显示页码编号

private int nextPage;

private int previousPage;

private int totalPages; // 总页数

private boolean hasNext; // 是否有下一

private boolean hasPrevious; // 是否有前一

private int pageStartRow;

private int pageEndRow;

有了这个辅助类以后,当用户请求显示查询结果时,处理查询请求的Action把结果集和PageScroller发送给JSP页面,JSP页面根据PageScroller的相关信息决定显示结果集中的某个数据段。初始情况下处理查询请求的Action会把currentPage设为1,即显示第一个页面的内容,在PageScroller中设置当前显示页面的相关的代码如下:    

public void setCurrentPage(int i) {

        currentPage = i;

        nextPage = currentPage + 1;

        previousPage = currentPage - 1;

 

        // 页开始行和束行

        if (currentPage * pageSize < this.totalRowsAmount) {

               pageEndRow = currentPage * pageSize;

               pageStartRow = pageEndRow - pageSize + 1;

        } else {

               pageEndRow = totalRowsAmount;

               pageStartRow = pageSize * (totalPages - 1) + 1;

        }

 

        // 是否存在前和后

        if (nextPage > totalPages) {

               hasNext = false;

        } else {

               hasNext = true;

        }

        if (previousPage <= 0) {

               hasPrevious = false;

        } else {

               hasPrevious = true;

        }

}

第一次反馈的查询结果总是显示第一页的内容,用户如果要查看更多的信息,就要翻页显示。此时不需要重新进行查询,因为查询结果集还保存在session中,PageScroller对象也保存在session中。只要把PageScroller的名称和希望查看的页面编号发送给处理翻页请求的Action,由该Action根据请求的页面编码改变PageScroller的状态,然后再将其发送回JSP页面即可。

因为应用程序中所有的页面分页显示都要通过上述方法实现,因此ActionActionForm需要有一定的通用性。在设计时每个JSP页面的PageScroller实例名称与页面匹配,该名称作为HTMl或表单的参数发送给Action Action中根据PageScroller的名称从session中获取这个对象,然后再根据页面编号对PageScroller的状态进行修改,最后根据PageScroller的名称决定返回到哪个JSP页面进行显示。

PageScrollerForm的相关代码如下:

public class PageScrollerForm extends ActionForm {

private String pagescrollername;

private String showPage;

public String getPagescrollername() {

        return pagescrollername;

}

public void setPagescrollername(String pagesrollername) {

        this.pagescrollername = pagesrollername;

}

public String getShowPage() {

        return showPage;

}

public void setShowPage(String showPage) {

        this.showPage = showPage;

}

}

PageScrollerAction的相关代码如下:

public ActionForward execute(ActionMapping mapping,

               ActionForm form,

               HttpServletRequest request,

               HttpServletResponse response) throws IOException,ServletException{

        String pagescrollername = null;

        int showPage = 1;

//有两种方式可以提交翻页的信息,一是通过表单“转到第X页”的方式,另一种是通过链接“上一页”、“下一页”的方式

        if (form != null) {

               PageScrollerForm psForm = (PageScrollerForm) form;

 

               pagescrollername = psForm.getPagescrollername();

               showPage = Integer.parseInt(psForm.getShowPage());

        }else{

               pagescrollername = request.getParameter("pagescrollername");

               String spage = request.getParameter("showPage");

               showPage = Integer.parseInt(spage);

        }

       

        HttpSession session = request.getSession();

        PageScroller ps = (PageScroller)session.getAttribute(pagescrollername);

        ps.setCurrentPage(showPage);

       

        return mapping.findForward(pagescrollername);

}

 

Ø         实例:

ETM下载系统中,用户提供轨道参数,检索结果需要分页显示。在SearchSubmitAction中处理检索的逻辑。其中execute()方法的部分代码如下所示:

//1清除原先保存在session中的查询结果

session.removeAttribute("etmdata");

session.removeAttribute("etmdataPage");

 

//2Form中获取用户提供的轨道参数

EtmParamForm myform = (EtmParamForm)form;

String path = myform.getPath();

String row = myform.getRow();

String[] date = new String[3];

date[0] = myform.getYear();

date[1] = myform.getMonth();

date[2] = myform.getDay();

 

//3 连接到数据库进行检索

DbEtmSearch dbetmsearch = new DbEtmSearch();

EtmParameters[] result = dbetmsearch.getETMImages(path,row,date);

       

//4 将查询结果与一个PageScroller进行绑定,保存在session

if(result != null){   

PageScroller ps = new PageScroller(result.length);//设置一个分页控制器

              

//将新的查询结果保存在session

session.setAttribute("etmdata",result);

session.setAttribute("etmdataPage",ps);

}                 

return mapping.findForward("next");

上述代码的最后一句mapping.findForward("next")根据struts配置文件中的设置将转到一个JSP页面显示这次查询的结果。此时PageScroller的状态是显示第一页的内容。

JSP页面中,先从session当中取出查询结果以及与它关联的PageScroller

EtmParameters[] result = (EtmParameters[])session.getAttribute("etmdata");

PageScroller ps = (PageScroller)session.getAttribute("etmdataPage");

然后根据PageScroller的状态确定此次需要显示的内容,确定起止行号,用一个for循环显示这个页码中的内容。

if(result != null && ps != null){

        //PageScroller起始计数从1开始,而数组是从0开始的,这里做一个调整。

        int startRow = ps.getPageStartRow() - 1;

        int endRow = ps.getPageEndRow() - 1;

for(int i=startRow;i<=endRow;i++){

           …………

}

上面显示了查询结果的第一页内容,接下来需要显示给用户的是这次查询所得到的数据集的内容,包括总的页面数、当先显示的页面、以及转到其他页面的链接。首先要显示的是页面跳转的链接:

<html:form action="/PageScroll" method="POST">

     <p><html:hidden property="pagescrollername" value="etmdataPage"/></p>

     <p>共有 <font color=black ><%=ps.getTotalPages()%></font> 页 现在是第 <font color=black ><%=ps.getCurrentPage()%></font> 页 转到第

     <html:select property="showPage" size="1">

            <%

                  for(int i=1;i<=ps.getTotalPages();i++){

                       out.println("<option value=" + i + ">" + i + "</option>");       

                  }

            %>

     </html:select>

     <html:submit value="转到"/>

</html:form>

这个form的目的就是将pagescrollernameshowPage这两个参数发送给PageScrollAction,然后由PageScrollActionPageScrollcurrentPage设置为showPage,最后再把结果返回给JSP页面。这次返回给JSP页面的PageScroll状态就发生了改变,显示showPage页的数据。

另外,还要提供“上一页”、“下一页”的链接,这时就不是用Form来传递参数,而是用<html:link>来传递这两个参数。方法如下:

<%

        if(ps.isHasPrevious()){

            java.util.HashMap newparam = new java.util.HashMap();

            newparam.put("pagescrollername",new String("etmdataPage"));

            newparam.put("showPage",new Integer(ps.getCurrentPage() - 1));

            pageContext.setAttribute("newparam", newparam);

 %>

            <html:link action="/PageScroll" name="newparam">上一页&nbsp;&nbsp;</html:link>

<%

        }

%>               

<html:link>传递多个参数,struts提供了一个HashMap的方法将参数的key/value值保存在HashMap中,然后使用name属性将这个HashMap中保存的参数读取出来,以HTML参数的方式发送给ScrollerPageAction执行。上面的<html:link>解析后成为:

<a href=”http://localhost:8008/etm-struts/PageScroll.do?pagescrollername=etmdataPage&showPage=2”>上一页</a>

ScrollerPageAction就可以像读取普通的HTML参数那样用request.getParameter()方法来获取这两个参数。

 

基于数据挖掘的音乐推荐系统设计与实现 需要一个代码说明,不需要论文 采用python语言,django框架,mysql数据库开发 编程环境:pycharm,mysql8.0 系统分为前台+后台模式开发 网站前台: 用户注册, 登录 搜索音乐,音乐欣赏(可以在线进行播放) 用户登陆时选择相关感兴趣的音乐风格 音乐收藏 音乐推荐算法:(重点) 本课题需要大量用户行为(如播放记录、收藏列表)、音乐特征(如音频特征、歌曲元数据)等数据 (1)根据用户之间相似性或关联性,给一个用户推荐与其相似或有关联的其他用户所感兴趣的音乐; (2)根据音乐之间的相似性或关联性,给一个用户推荐与其感兴趣的音乐相似或有关联的其他音乐。 基于用户的推荐和基于物品的推荐 其中基于用户的推荐是基于用户的相似度找出相似相似用户,然后向目标用户推荐其相似用户喜欢的东西(和你类似的人也喜欢**东西); 而基于物品的推荐是基于物品的相似度找出相似的物品做推荐(喜欢该音乐的人还喜欢了**音乐); 管理员 管理员信息管理 注册用户管理,审核 音乐爬虫(爬虫方式爬取网站音乐数据) 音乐信息管理(上传歌曲MP3,以便前台播放) 音乐收藏管理 用户 用户资料修改 我的音乐收藏 完整前后端源码,部署后可正常运行! 环境说明 开发语言:python后端 python版本:3.7 数据库:mysql 5.7+ 数据库工具:Navicat11+ 开发软件:pycharm
MPU6050是一款广泛应用在无人机、机器人和运动设备中的六轴姿态传感器,它集成了三轴陀螺仪和三轴加速度计。这款传感器能够实时监测并提供设备的角速度和线性加速度数据,对于理解物体的动态运动状态至关重要。在Arduino平台上,通过特定的库文件可以方便地与MPU6050进行通信,获取并解析传感器数据。 `MPU6050.cpp`和`MPU6050.h`是Arduino库的关键组成部分。`MPU6050.h`是头文件,包含了定义传感器接口和函数声明。它定义了类`MPU6050`,该类包含了初始化传感器、读取数据等方法。例如,`begin()`函数用于设置传感器的工作模式和I2C地址,`getAcceleration()`和`getGyroscope()`则分别用于获取加速度和角速度数据。 在Arduino项目中,首先需要包含`MPU6050.h`头文件,然后创建`MPU6050`对象,并调用`begin()`函数初始化传感器。之后,可以通过循环调用`getAcceleration()`和`getGyroscope()`来不断更新传感器读数。为了处理这些原始数据,通常还需要进行校准和滤波,以消除噪声和漂移。 I2C通信协议是MPU6050与Arduino交互的基础,它是一种低引脚数的串行通信协议,允许多个设备共享一对数据线。Arduino板上的Wire库提供了I2C通信的底层支持,使得用户无需深入了解通信细节,就能方便地与MPU6050交互。 MPU6050传感器的数据包括加速度(X、Y、Z轴)和角速度(同样为X、Y、Z轴)。加速度数据可以用来计算物体的静态位置和动态运动,而角速度数据则能反映物体转动的速度。结合这两个数据,可以进一步计算出物体的姿态(如角度和角速度变化)。 在嵌入式开发领域,特别是使用STM32微控制器时,也可以找到类似的库来驱动MPU6050。STM32通常具有更强大的处理能力和更多的GPIO口,可以实现更复杂的控制算法。然而,基本的传感器操作流程和数据处理原理与Arduino平台相似。 在实际应用中,除了基本的传感器读取,还可能涉及到温度补偿、低功耗模式设置、DMP(数字运动处理器)功能的利用等高级特性。DMP可以帮助处理传感器数据,实现更高级的运动估计,减轻主控制器的计算负担。 MPU6050是一个强大的六轴传感器,广泛应用于各种需要实时运动追踪的项目中。通过 Arduino 或 STM32 的库文件,开发者可以轻松地与传感器交互,获取并处理数据,实现各种创新应用。博客和其他开源资源是学习和解决问题的重要途径,通过这些资源,开发者可以获得关于MPU6050的详细信息和实践指南
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值