我的习惯是直接贴代码,语言表达能力不好,懒得写。但是我贴代码会贴全,这样就不会让其他人跟我一样,有时候找不到使用的方法,还有去百度或者调整半天。真心觉得给部分代码如果有问题,很烦人,有时候很难找到问题。
这里struts 中action的调用就不详细讲解了,不懂先去了解,再回来看。
注意:火狐浏览器点击分页按钮请求一次,会调用两次action,其他浏览器不会,找了很久,没有解决方法,如果有人知道,欢迎指点。
后台action类:
import java.util.List; import java.util.Map; @SuppressWarnings("serial") public class UserListAction extends ActionSupport { private UserService adminUserService; private List<TbUser> userList = null; private Page page = new Page(); @SuppressWarnings("unchecked") @Override public String execute() throws Exception { log.info("查找用户列表"); // 每页显示条数 page.setEveryPage(3); // 获取数据 Map<String, Object> map = adminUserService.findUserByPage(page); userList = map.get("list") == null ? null : (List<TbUser>) map.get("list"); page = map.get("page") == null ? null : (Page) map.get("page"); return "success"; } public UserService getAdminUserService() { return adminUserService; } public void setAdminUserService(UserService adminUserService) { this.adminUserService = adminUserService; } public List<TbUser> getUserList() { return userList; } public void setUserList(List<TbUser> userList) { this.userList = userList; } public Page getPage() { return page; } public void setPage(Page page) { this.page = page; } }
page类
public class Page { /** 是否有上一页 */ private boolean hasPrePage; /** 是否有下一页 */ private boolean hasNextPage; /** 每页的数量 */ private int everyPage; /** 总页数 */ private int totalPage; /** 当前页 */ private int currentPage; /** 起始点 */ private int beginIndex; /** 总记录数 */ private int totalCount; /** 开始的页数 */ private int startPage; /** 结束的页数 */ private int endPage; /** * @return totalCount */ public int getTotalCount() { return totalCount; } /** * @param totalCount */ public void setTotalCount(int totalCount) { this.totalCount = totalCount; } public Page() { } public Page(int everyPage) { this.everyPage = everyPage; } public Page(boolean hasPrePage, boolean hasNextPage, int everyPage, int totalPage, int currentPage, int beginIndex, int totalCount, int startPage, int endPage) { this.hasPrePage = hasPrePage; this.hasNextPage = hasNextPage; this.everyPage = everyPage; this.totalPage = totalPage; this.currentPage = currentPage; this.beginIndex = beginIndex; this.totalCount = totalCount; this.startPage = startPage; this.endPage = endPage; } public int getBeginIndex() { return beginIndex; } public void setBeginIndex(int beginIndex) { this.beginIndex = beginIndex; } public int getCurrentPage() { return currentPage; } public void setCurrentPage(int currentPage) { this.currentPage = currentPage; } public int getEveryPage() { return everyPage; } public void setEveryPage(int everyPage) { this.everyPage = everyPage; } public boolean getHasNextPage() { return hasNextPage; } public void setHasNextPage(boolean hasNextPage) { this.hasNextPage = hasNextPage; } public boolean getHasPrePage() { return hasPrePage; } public void setHasPrePage(boolean hasPrePage) { this.hasPrePage = hasPrePage; } public int getTotalPage() { return totalPage; } public void setTotalPage(int totalPage) { this.totalPage = totalPage; } public int getStartPage() { return startPage; } public void setStartPage(int startPage) { this.startPage = startPage; } public int getEndPage() { return endPage; } public void setEndPage(int endPage) { this.endPage = endPage; } }
page工具类
public class PageUtil { // 静态方法 public static Page createPage(Page page, int totalRecords) { return createPage(page.getEveryPage(), page.getCurrentPage(), totalRecords); } // 创建Page对象 public static Page createPage(int everyPage, int currentPage, int totalRecords) { everyPage = getEveryPage(everyPage); currentPage = getCurrentPage(currentPage); int beginIndex = getBeginIndex(everyPage, currentPage); int totalPage = getTotalPage(everyPage, totalRecords); boolean hasNextPage = hasNextPage(currentPage, totalPage); boolean hasPrePage = hasPrePage(currentPage); int pageScope[] = getShowScope(currentPage, 10, totalPage); return new Page(hasPrePage, hasNextPage, everyPage, totalPage, currentPage, beginIndex, totalRecords, pageScope[0], pageScope[1]); } // 返回每页显示数目 private static int getEveryPage(int everyPage) { return everyPage == 0 ? 10 : everyPage; } // 返回当前页 private static int getCurrentPage(int currentPage) { return currentPage == 0 ? 1 : currentPage; } // 返回开始的索引 private static int getBeginIndex(int everyPage, int currentPage) { return (currentPage - 1) * everyPage; } // 返回总页数 private static int getTotalPage(int everyPage, int totalRecords) { int totalPage = 0; if (totalRecords % everyPage == 0) totalPage = totalRecords / everyPage; else totalPage = totalRecords / everyPage + 1; return totalPage; } // 返回是否有上一页。false:没有;true:有 private static boolean hasPrePage(int currentPage) { return currentPage == 1 ? false : true; } // 返回是否有下一页。false:没有;true:有 private static boolean hasNextPage(int currentPage, int totalPage) { return currentPage == totalPage || totalPage == 0 ? false : true; } private static int[] getShowScope(int currentPage, int showNum, int totalPage) { // 初始化开始页 int startPage = currentPage <= 6 ? 1 : currentPage - 5; // 初始化结束页 int endPage = showNum + startPage - 1; if (endPage > totalPage) { endPage = totalPage; } startPage = endPage - showNum + 1; if (startPage <= 0) { startPage = 1; } return new int[] { startPage, endPage }; } }
显示数据的Jsp页面:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib prefix="s" uri="/struts-tags"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>用户列表</title> </head> <body> <ul> <s:iterator id="user" value="userList" status="statu"> <li> <s:property value="#statu.count" /> <s:property value="#user.userId" /> <s:property value="#user.userName" /> </li> </s:iterator> </ul> <div> <!--页码--> <!-- 分页组件 --> <%@ include file="page.jsp"%> <!--页码 End--> </div> </body> </html>
通用page页面:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib prefix="s" uri="/struts-tags"%> <!-- 分页组件 --> <s:if test="page.hasPrePage || page.hasNextPage"> <div class="turnpage"> <!-- 首页 --> <s:url id="goto" includeParams="none"> <s:param name="page.currentPage" value="1" /> </s:url> <s:a href="%{goto}" title="首页"> <span>首页</span> </s:a> <!-- end首页 --> <!-- 上一页 --> <s:if test="page.hasPrePage"> <s:url id="goto"> <s:param name="page.currentPage" value="%{page.currentPage - 1}" /> </s:url> <s:a href="%{goto}" title="上一页" id="prePage" > <span>上一页</span> </s:a> </s:if> <s:else> <span>上一页</span> </s:else> <!-- end上一页 --> <%-- 页面显示 --%> <s:if test="page.totalPage <= 10"> <s:bean name="org.apache.struts2.util.Counter" id="counter"> <s:param name="first" value="1" /> <s:param name="last" value="page.totalPage" /> </s:bean> <s:iterator value="#counter"> <s:url id="goto"> <s:param name="page.currentPage" value="top" /> </s:url> <s:if test="top == page.currentPage"> <a class="cur"><span><s:property /></span></a> </s:if> <s:else> <s:a href="%{goto}"> <span><s:property /></span> </s:a> </s:else> </s:iterator> </s:if> <s:else> <s:bean name="org.apache.struts2.util.Counter" id="counter"> <s:param name="first" value="%{page.currentPage - 4 >= 1 ? (page.currentPage > page.totalPage - 5 ? ( page.totalPage - 9 ) :( page.currentPage - 4 )) : 1}" /> <s:param name="last" value="%{page.currentPage + 5 <= page.totalPage ? (page.currentPage < 5 ? ( page.currentPage + (10 - page.currentPage) ) : (page.currentPage + 5)) : page.totalPage}" /> </s:bean> <s:iterator value="#counter"> <s:url id="goto"> <s:param name="page.currentPage" value="top" /> </s:url> <s:if test="top == page.currentPage"> <a class="cur"><span><s:property /></span></a> </s:if> <s:else> <s:a href="%{goto}"> <span><s:property /></span> </s:a> </s:else> </s:iterator> <!--如果还有更多,显示... --> <s:if test="page.totalPage != #counter.last"> <span>...</span> </s:if> <s:url id="goto"> <s:param name="page.currentPage" value="page.totalPage" /> </s:url> <s:a href="%{goto}" title="page.currentPage"> <span><s:property value="page.totalPage"/></span> </s:a> </s:else> <!-- 下一页 --> <s:if test="page.hasNextPage"> <s:url id="goto"> <s:param name="page.currentPage" value="%{page.currentPage + 1}" /> </s:url> <s:a href="%{goto}" title="下一页"> <span>下一页</span> </s:a> </s:if> <s:else> <span>下一页</span> </s:else> <!-- end下一页 --> <%-- 尾页 --%> <s:url id="goto"> <s:param name="page.currentPage" value="page.totalPage" /> </s:url> <s:a href="%{goto}" title="尾页"> <span>尾页</span> </s:a> <%-- end尾页 --%> <!-- 信息 当前页: <s:property value="page.currentPage" /> / <s:property value="page.totalPage" /> 每 页: <s:property value="page.everyPage" /> 条 共 计: <s:property value="page.totalCount" /> 条 end信息 --> <%--如果总页数少于100页,显示一个select选择跳转框 --%> <s:if test="page.totalPage <= 100"> <s:bean name="org.apache.struts2.util.Counter" id="counter"> <s:param name="first" value="1" /> <s:param name="last" value="page.totalPage" /> </s:bean> <select onchange="window.location.href = this.options[this.selectedIndex].value;" size="1"> <s:iterator value="#counter"> <s:url id="goto"> <s:param name="page.currentPage" value="top" /> </s:url> <s:if test="top == page.currentPage"> <option value="<s:property value="%{goto}"/>" selected="selected"> 第 <s:property /> 页 </option> </s:if> <s:else> <option value="<s:property value="%{goto}"/>"> 第 <s:property /> 页 </option> </s:else> </s:iterator> </select> </s:if> </div> </s:if>
相关推荐
5. **JSP页面**:在JSP页面上,使用`<s:iterator>`标签遍历数据,使用`<s:url>`和`<s:a>`标签创建分页链接。同时,根据总页数计算上一页、下一页的链接。 四、优化与扩展 1. **缓存优化**:如果数据变化不频繁,...
本主题主要讲解如何在Struts2中实现一个通用的数字分页功能。 首先,我们要理解分页的基本概念。分页是将大量数据分成若干页进行显示,用户可以通过点击页码或使用导航按钮来切换不同页。分页通常涉及两个关键参数...
7. **JSP/Freemarker标签库**:在视图层,可以使用Struts2提供的`s:iterator`标签或自定义的分页标签来方便地遍历和展示数据,同时生成分页链接。 8. **URL参数**:为了支持用户点击分页链接,我们需要在URL中传递...
Struts2提供了一些内置的标签库,如`s:iterator`用于遍历查询结果,`s:url`和`s:param`用于生成分页链接。同时,我们还需要显示一些分页信息,如总页数、上一页、下一页等,这些可以通过自定义Struts2标签实现。 4....
- `listcertificate.jsp`使用Struts标签库(例如`<s:iterator>`和`<s:url>`等)遍历ArrayList并展示数据,同时生成分页链接。 通过这种方式实现的分页,可以有效避免一次性加载所有数据带来的性能问题,提高系统...
在STRUTS2中,你可以使用`<s:iterator>`标签遍历分页数据,而`<s:url>`和`<s:a>`标签则用于生成分页链接。JavaScript可以通过绑定事件监听器,比如jQuery的`click`事件,来监听用户对分页控件的操作,并发送异步请求...
在JSP页面中,通常会用到`<s:iterator>`标签遍历Action中传递过来的当前页数据,并提供上一页、下一页、跳转到指定页等按钮。这些按钮的链接需要携带当前页数作为参数,以便服务器端能够正确处理请求。 6. **URL...
6. **标签库的使用**:在JSP中,我们可以使用Struts的`<s:url>`和`<s:a>`标签创建分页链接。例如,创建一个链接到下一页的按钮,我们可以这样做: ``` <s:url action="paginationAction" namespace="/" ...
编写JSP页面,使用Struts2的标签库(如s:iterator和s:property)来遍历和显示查询结果。同时,创建分页导航链接,允许用户跳转到其他页面。这部分需要处理好参数传递,确保页码信息正确传递到Action。 6. **添加...
- 视图层可能使用JSP、HTML、CSS和JavaScript构建用户界面,也可能使用Struts的标签库如`<s:form>`、`<s:textfield>`等简化开发。 8. **测试**: - 对Action类进行单元测试,确保每个方法都能正常工作。 - 使用...
这通常通过s:iterator标签结合s:url和s:param标签实现。同时,需要处理上一页、下一页、首页和末页的逻辑。 六、最佳实践 1. 尽量避免一次性加载所有数据,以减少内存占用和提高性能。 2. 分页参数应通过POST请求...
这里使用了Struts2的`<s:iterator>`标签来遍历查询结果列表`recordList`,并在循环体内显示每一条记录。 2. **页码导航**: ```html <s:iterator begin="%{beginPageIndex}" end="%{endPageIndex}" var="num"> ...
2. **数据绑定**:在Freemarker模板中,可以使用`<@s.action>`或`<@s.property>`等标签来直接访问Struts2 Action中的属性,实现数据绑定。 3. **自定义标签**:`BasePagenationTag.java`表明可能存在自定义Struts2...
- **Struts标签库**: - **Bean标签库**:用于操作Bean。 - **HTML标签库**:提供HTML元素的标签支持。 - **Logic标签库**:支持逻辑控制结构,如if-else条件判断等。 - **Struts开发环境搭建**: - **Java平台...
1. **Struts2 Tag库**:Struts2提供了一套丰富的标签库,如<s:textfield>用于创建输入字段,<s:submit>用于提交表单等。开发者可以根据需求扩展这些标签,实现自定义功能,例如添加验证规则或特定的样式。 2. **...
- **2.7 Struts标签库** - **2.7.1 Bean标签库**:这部分介绍了Bean标签库的功能,如创建、操作Bean对象。 - **2.7.2 HTML标签库**:这部分讲解了HTML标签库的作用,即生成动态HTML表单。 - **2.7.3 Logic标签库*...
**2.7 Struts标签库** - **2.7.1 Bean标签库** - Bean标签库提供了对bean的操作支持,例如获取bean的属性值等。 - **2.7.2 HTML标签库** - HTML标签库提供了一系列生成HTML元素的方法,如表单元素等。 - **2.7.3 ...
同时,JSP页面作为视图层,会利用Struts2的标签库(例如`s:form`、`s:textfield`等)来生成表单和展示数据,提高开发效率和代码可读性。 此外,为了保证网站的安全性,开发者可能还应用了Struts2的安全插件,如防止...