page.tld
放到WEB-INF下 tomcat是自动加载的。里面如xml。一样解释好就好了。这里有一个pager2的标签名
关联到class类的放到src里、类下。这里命名好了,前台页面调用会用名。
<taglib xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd"
version="2.1">
<!-- 描述 自定义标签版本的一种描述 -->
<description>Pager 1.0 core library</description>
<!-- 显示的名称 导包进行的一个展示 -->
<display-name>Pager core</display-name>
<!-- 版本号 -->
<tlib-version>1.0</tlib-version>
<!-- 短名 -->
<short-name>fkjava</short-name>
<!-- uri :导包 -->
<uri>/pager-tags</uri>
<!-- 定义一个标签 -->
<tag>
<!-- 标签名 -->
<name>pager2</name>
<!-- 标签处理类 -->
<tag-class>link.yixing.util.tag.PagerTag2</tag-class>
<!-- 设置标签为空 -->
<body-content>empty</body-content>
<!-- 定义标签的属性 -->
<attribute>
<!-- 属性名 表示分页的第几页 -->
<name>pageIndex</name>
<!-- 必须的 -->
<required>true</required>
<!-- run time expression value 为true支持EL表达式 -->
<rtexprvalue>true</rtexprvalue>
</attribute>
<!-- 定义标签的属性 -->
<attribute>
<!-- 属性名 表示分页标签 ,每页显示多少条数据 -->
<name>pageSize</name>
<!-- 必须的 -->
<required>true</required>
<!-- run time expression value 为true支持EL表达式 -->
<rtexprvalue>true</rtexprvalue>
</attribute>
<!-- 定义标签的属性 -->
<attribute>
<!-- 属性名 记录分页的总数 -->
<name>recordCount</name>
<!-- 必须的 -->
<required>true</required>
<!-- run time expression value 为true支持EL表达式 -->
<rtexprvalue>true</rtexprvalue>
</attribute>
<!-- 定义标签的属性 -->
<attribute>
<!-- 属性名 -->
<name>submitUrl</name>
<!-- 必须的 -->
<required>true</required>
<!-- run time expression value 为true支持EL表达式 -->
<rtexprvalue>true</rtexprvalue>
</attribute>
<!-- 定义标签的属性 -->
<attribute>
<!-- 属性名 -->
<name>style</name>
<!-- 必须的 -->
<required>false</required>
<!-- run time expression value 为true支持EL表达式 -->
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<!-- 属性名 -->
<name>yxParam</name>
<!-- 必须的 -->
<required>false</required>
<!-- run time expression value 为true支持EL表达式 -->
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
</taglib>
/*这里是上面命名的标签*
* 分页标签
*/
public class PagerTag2 extends SimpleTagSupport {
/** 定义请求URL中的占位符常量 */
private static final String TAG = "{0}";
/** 当前页码 */
private int pageIndex;
/** 每页显示的数量 */
private int pageSize;
/** 总记录条数 */
private int recordCount;
/** 请求URL page.action?pageIndex={0}*/
private String submitUrl;
/** 样式 */
private String style = "sabrosus";
/** 定义总页数 */
private int totalPage = 0;
private String yxParam;
/** 在页面上引用自定义标签就会触发一个标签处理类 */
@Override
public void doTag() throws JspException, IOException {
/** 定义它拼接是终的结果 */
StringBuilder res = new StringBuilder();
/** 定义它拼接中间的页码 */
StringBuilder str = new StringBuilder();
/** 判断总记录条数 */
if (recordCount > 0){ //1499 / 15 = 100
/** 需要显示分页标签,计算出总页数 需要分多少页 */
totalPage = (this.recordCount - 1) / this.pageSize + 1;
/** 判断上一页或下一页需不需要加a标签 */
if (this.pageIndex == 1){ // 首页
str.append("<span class='disabled'>上一页</span>");
/** 计算中间的页码 */
this.calcPage(str);
/** 下一页需不需要a标签 */
if (this.pageIndex == totalPage){
/** 只有一页 */
str.append("<span class='disabled'>下一页</span>");
}else{
String tempUrl = this.submitUrl.replace(TAG, String.valueOf(pageIndex + 1));
// str.append("<a href='"+ tempUrl +"'>下一页</a>");
str.append("<a href='javascript:void(0)' class='" + this.yxParam + "' id='da_"+this.yxParam +"next' url=" + tempUrl +">下一页</a>");
}
}else if (this.pageIndex == totalPage){ // 尾页
String tempUrl = this.submitUrl.replace(TAG, String.valueOf(pageIndex - 1));
//str.append("<a href='"+ tempUrl +"'>上一页</a>");
str.append("<a href='javascript:void(0)' class='" + this.yxParam + "' id='da_"+this.yxParam +"qian' url=" + tempUrl +">上一页</a>");
/** 计算中间的页码 */
this.calcPage(str);
str.append("<span class='disabled'>下一页</span>");
}else{ // 中间
String tempUrl = this.submitUrl.replace(TAG, String.valueOf(pageIndex - 1));
//str.append("<a href='"+ tempUrl +"'>上一页</a>");
str.append("<a href='javascript:void(0)' class='" + this.yxParam + "' id='da_"+this.yxParam +"qian' url=" + tempUrl +">上一页</a>");
/** 计算中间的页码 */
this.calcPage(str);
tempUrl = this.submitUrl.replace(TAG, String.valueOf(pageIndex + 1));
//str.append("<a href='"+ tempUrl +"'>下一页</a>");
str.append("<a href='javascript:void(0)' class='" + this.yxParam + "' id='da_"+this.yxParam +"next' url=" + tempUrl +">下一页</a>");
}
/** 拼接其它的信息 */
res.append("<table width='100%' align='center' style='font-size:13px;' class='"+ style +"'>");
res.append("<tr><td style='COLOR: #0061de; MARGIN-RIGHT: 3px; PADDING-TOP: 2px; TEXT-DECORATION: none'>" + str.toString());
res.append(" 跳转到 <input style='text-align: center;BORDER-RIGHT: #aaaadd 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #aaaadd 1px solid; PADDING-LEFT: 5px; PADDING-BOTTOM: 2px; MARGIN: 2px; BORDER-LEFT: #aaaadd 1px solid; COLOR: #000099; PADDING-TOP: 2px; BORDER-BOTTOM: #aaaadd 1px solid; TEXT-DECORATION: none' type='text' size='2' id='pager_jump_page_size'/>");
res.append(" <input type='button' style='text-align: center;BORDER-RIGHT: #dedfde 1px solid; PADDING-RIGHT: 6px; BACKGROUND-POSITION: 50% bottom; BORDER-TOP: #dedfde 1px solid; PADDING-LEFT: 6px; PADDING-BOTTOM: 2px; BORDER-LEFT: #dedfde 1px solid; COLOR: #0061de; MARGIN-RIGHT: 50px; PADDING-TOP: 2px; BORDER-BOTTOM: #dedfde 1px solid; TEXT-DECORATION: none' value='确定' id='pager_jump_btn'/>");
res.append("</td></tr>");
res.append("<tr align='center'><td style='font-size:13px;'><tr><td style='COLOR: #0061de; MARGIN-RIGHT: 10px; PADDING-TOP: 2px; TEXT-DECORATION: none'>");
/** 开始条数 */
int startNum = (this.pageIndex - 1) * this.pageSize + 1;
/** 结束条数 */
int endNum = (this.pageIndex == this.totalPage) ? this.recordCount : this.pageIndex * this.pageSize;
res.append("总共<font color='red'>"+ this.recordCount +"</font>条记录,当前显示"+ startNum +"-"+ endNum +"条记录。");
res.append("</td></tr>");
res.append("</table>");
res.append("<script type='text/javascript'>");
res.append(" document.getElementById('pager_jump_btn').onclick = function(){");
res.append(" var page_size = document.getElementById('pager_jump_page_size').value;");
res.append(" if (!/^[1-9]\\d*$/.test(page_size) || page_size < 1 || page_size > "+ this.totalPage +"){");
res.append(" alert('请输入[1-"+ this.totalPage +"]之间的页码!');");
res.append(" }else{");
res.append(" var submit_url = '" + this.submitUrl + "';");
res.append(" var url = submit_url.replace('"+ TAG +"', page_size);");
res.append(" $.ajax({");
res.append(" type: 'GET',");
res.append(" url:url,");
res.append(" success: function(data) {");
res.append(" $('#" + this.yxParam + "').html(data);");
res.append(" }");
res.append(" })");
res.append(" }");
res.append("};");
res.append(" $(function(){");
res.append(" $('." + this.yxParam + "').click(function(e){");
res.append(" console.log(this.id);");
res.append(" var url = $('#'+ this.id).attr('url');");
res.append("console.log(url);");
res.append(" $.ajax({");
res.append(" type: 'GET',");
res.append(" url:url,");
res.append(" success: function(data) {");
res.append(" $('#" + this.yxParam + "').html(data);");
res.append(" }");
res.append(" })");
res.append(" })");
res.append(" })");
res.append("</script>");
}else{
res.append("<table align='center' style='font-size:13px;'><tr><td style='COLOR: #0061de; MARGIN-RIGHT: 3px; PADDING-TOP: 2px; TEXT-DECORATION: none'>总共<font color='red'>0</font>条记录,当前显示0-0条记录。</td></tr></table>");
}
this.getJspContext().getOut().print(res.toString());
}
/** 计算中间页码的方法 */
private void calcPage(StringBuilder str) {
/** 判断总页数 */
if (this.totalPage <= 11){
/** 一次性显示全部的页码 */
for (int i = 1; i <= this.totalPage; i++){
if (this.pageIndex == i){
/** 当前页码 */
str.append("<span class='current'>"+ i +"</span>");
}else{
String tempUrl = this.submitUrl.replace(TAG, String.valueOf(i));
//str.append("<a href='"+ tempUrl +"'>"+ i +"</a>");
str.append("<a href='javascript:void(0)' class='" + this.yxParam + "' id=da_"+this.yxParam +i+" url=" + tempUrl +">"+i+"</a>");
}
}
}else{
/** 靠近首页 */
if (this.pageIndex <= 8){
for (int i = 1; i <= 10; i++){
if (this.pageIndex == i){
/** 当前页码 */
str.append("<span class='current'>"+ i +"</span>");
}else{
String tempUrl = this.submitUrl.replace(TAG, String.valueOf(i));
//str.append("<a href='"+ tempUrl +"'>"+ i +"</a>");
str.append("<a href='javascript:void(0)' class='" + this.yxParam + "' id=da_"+this.yxParam +i+" url=" + tempUrl +">"+i+"</a>");
}
}
str.append("...");
String tempUrl = this.submitUrl.replace(TAG, String.valueOf(this.totalPage));
//str.append("<a href='"+ tempUrl +"'>"+ this.totalPage +"</a>");
str.append("<a href='javascript:void(0)' class='" + this.yxParam + "' id=da_"+this.yxParam +this.totalPage+" url=" + tempUrl +">"+this.totalPage+"</a>");
}
/** 靠近尾页 */
else if (this.pageIndex + 8 >= this.totalPage){
String tempUrl = this.submitUrl.replace(TAG, String.valueOf(1));
//str.append("<a href='"+ tempUrl +"'>1</a>");
str.append("<a href='javascript:void(0)' class='" + this.yxParam + "' id=da_"+this.yxParam +1+" url=" + tempUrl +">"+1+"</a>");
str.append("...");
for (int i = this.totalPage - 10; i <= this.totalPage; i++){
if (this.pageIndex == i){
/** 当前页码 */
str.append("<span class='current'>"+ i +"</span>");
}else{
tempUrl = this.submitUrl.replace(TAG, String.valueOf(i));
//str.append("<a href='"+ tempUrl +"'>"+ i +"</a>");
str.append("<a href='javascript:void(0)' class='" + this.yxParam + "' id=da_"+this.yxParam +i+" url=" + tempUrl +">"+i+"</a>");
}
}
}
/** 在中间 */
else{
String tempUrl = this.submitUrl.replace(TAG, String.valueOf(1));
str.append("<a href='"+ tempUrl +"'>1</a>");
str.append("...");
for (int i = this.pageIndex - 4; i <= this.pageIndex + 4; i++){
if (this.pageIndex == i){
/** 当前页码 */
str.append("<span class='current'>"+ i +"</span>");
}else{
tempUrl = this.submitUrl.replace(TAG, String.valueOf(i));
//str.append("<a href='"+ tempUrl +"'>"+ i +"</a>");
str.append("<a href='javascript:void(0)' class='" + this.yxParam + "' id=da_"+this.yxParam +this.yxParam +i+" url=" + tempUrl +">"+i+"</a>");
}
}
str.append("...");
tempUrl = this.submitUrl.replace(TAG, String.valueOf(this.totalPage));
//str.append("<a href='"+ tempUrl +"'>"+ this.totalPage +"</a>");
str.append("<a href='javascript:void(0)' class='" + this.yxParam + "' id=da_"+this.yxParam +this.totalPage+" url=" + tempUrl +">"+this.totalPage+"</a>");
}
}
}
/** setter 方法 */
public void setPageIndex(int pageIndex) {
this.pageIndex = pageIndex;
}
public void setPageSize(int pageSize) {
this.pageSize = pageSize;
}
public void setRecordCount(int recordCount) {
this.recordCount = recordCount;
}
public void setSubmitUrl(String submitUrl) {
this.submitUrl = submitUrl;
}
public void setStyle(String style) {
this.style = style;
}
public void setYxParam(String yxParam){
this.yxParam = yxParam;
System.out.print("fkjava"+yxParam);
}
}
//需要调用分页的页面头加载
<%@ taglib prefix="fkjava" uri="/pager-tags" %>
//调用分页控件。
<fkjava:pager2
pageIndex="${pageModel.pageIndex}"
pageSize="${pageModel.pageSize}"
recordCount="${pageModel.recordCount}"
yxParam="main"
submitUrl="${ctx}/goods/index?pageIndex={0}&category_id=${category_id}"
style="flickr"/> </div>
//调用分页文件的控制层。
PageModel pageModel = new PageModel();
if(pageIndex != null){
pageModel.setPageIndex(pageIndex);
}
if(shopgood.getCategory_id()!=0){ //选择分类后。param中的category_id会传递进shopgood.category_id。这里要传递到前台页面,后面查询跟上参数。当为空时,就为0。Dao层里判断为零时是不启动条件语句的。
mv.addObject("category_id",shopgood.getCategory_id());
}else{
mv.addObject("category_id",0);
}
List<ShopGoods> shopgoods = yixingService.findAllGoods(shopgood,pageModel);
List<ShopCategory> shopcategorys =yixingService.findAllShopCategory("all");
mv.addObject("shopcategorys",shopcategorys);
mv.addObject("shopgoods",shopgoods);
mv.addObject("pageModel", pageModel);
return mv;
//服务层 注意了。这个的参数是pojo对象或者是其他。但在这里就put进Map了。
public List<ShopGoods> findAllGoods(ShopGoods shopgood,PageModel pageModel) {
// TODO Auto-generated method stub
Map<String,Object> params = new HashMap<String,Object>();
params.put("shopgood", shopgood);
int recordCount= shopGoodsDao.selectCountGoods(params);
pageModel.setRecordCount(recordCount);
if(recordCount >0){
params.put("pageModel", pageModel);
}
return shopGoodsDao.selectAllGoods(params);
}
//Dao层 这里没写接口,跳过了,这里是sql动态返回。这里把Map解析出来。再判断
public String selectWhitParam(Map<String,Object> param){
String sql = new SQL(){
{
SELECT("*");
FROM("shop_goods");
if(param.get("shopgood") != null){
ShopGoods shopgood = (ShopGoods) param.get("shopgood");
if(shopgood.getGoods_name() != null && !shopgood.getGoods_name().equals("")){
WHERE(" goods_name LIKE CONCAT ('%',#{shopgood.goods_name},'%') ");
}
if(shopgood.getCategory_id() != 0 ) {
WHERE(" category_id = " + shopgood.getCategory_id());
}
}
}
}.toString();
sql += " order by create_time desc"; //排序应该在分页之前.
if(param.get("pageModel") != null){
sql += " limit #{pageModel.firstLimitParam} , #{pageModel.pageSize} ";
}
System.out.print(sql);
return sql;
}
// 动态查询总数量
public String selectCountWhitParam(Map<String, Object> param){
return new SQL(){
{
SELECT("count(*)");
FROM("shop_goods");
if(param.get("shopgood") != null){
ShopGoods shopgood = (ShopGoods) param.get("shopgood");
if(shopgood.getGoods_name() != null && !shopgood.getGoods_name().equals("")){
WHERE(" goods_name LIKE CONCAT ('%',#{shopgood.goods_name},'%') ");
}
if(shopgood.getCategory_id() != 0 ) {
WHERE(" category_id = " + shopgood.getCategory_id());
}
}
}
}.toString();
}