一、标签处理类:
package cn.conris.sys.form; import java.io.IOException;
import java.util.Enumeration; import javax.servlet.http.HttpServletRequest;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.SimpleTagSupport;
import javax.servlet.jsp.tagext.TagSupport; import cn.conris.sys.utils.PropertyUtil; public class PageTag extends TagSupport {
private int pageSize = PropertyUtil.getPageSize(); // 每页要显示的记录数
private int pageNo = PropertyUtil.getPageNumber(); // 页号
private int recordCount; // 总记录数
private String url; // 目的地URL public void setPageSize(int pageSize) {
this.pageSize = pageSize;
}
public void setPageNo(int pageNo) {
this.pageNo = pageNo;
}
public void setRecordCount(int recordCount) {
this.recordCount = recordCount;
}
public void setUrl(String url) {
this.url = url;
}
// 主要的逻辑
@Override
public int doStartTag() throws JspException {
if(recordCount == 0){
return super.doStartTag();
} // 总页数
int pageCount = (recordCount + pageSize - 1) / pageSize;
// 页号越界处理
if (pageNo > pageCount) {
pageNo = pageCount;
}
if (pageNo < 1) {
pageNo = 1;
} StringBuilder sb = new StringBuilder(); sb.append("<form name='pageController' id='pageController' action='' method='post'>&nbsp")
.append("<input type='hidden' id='pageNo' name='pageNo' value='" + pageNo + "' />&nbsp"); //------------------------------------ 获取所有請求中的参数
HttpServletRequest request = (HttpServletRequest) pageContext
.getRequest();
Enumeration<String> enumeration = request.getParameterNames();
String name = null;
String value = null;
//把请求中的所有参数当作隐藏表单域在页面中写出)
while (enumeration.hasMoreElements()) {
name = enumeration.nextElement();
value = request.getParameter(name);
// 去除页号
if (name.equals("pageNo")) {
if (null != value && !"".equals(value)) {
pageNo = Integer.parseInt(value);
}
continue;
}
sb.append("<input type='hidden' name='")
.append(name)
.append("' value='")
.append(value)
.append("'/>&nbsp");
}
//---------------------------------------------------- sb.append(" 共" + pageCount + "页,&nbsp")
.append("当前第" + pageNo + "页 &nbsp"); if (pageNo == 1) {
sb.append("首页");
sb.append(" ");
sb.append("上一页&nbsp");
} else {
sb.append("<a href='#' onclick='turnOverPage(1)'>首页</a>&nbsp");
sb.append(" ");
sb.append("<a href='#' onclick='turnOverPage(")
.append((pageNo - 1)).append(")'>上一页</a>&nbsp");
}
sb.append(" ");
if (pageNo == pageCount) {
sb.append("下一页");
sb.append(" ");
sb.append("尾页&nbsp");
} else {
sb.append("<a href='#' onclick='turnOverPage(")
.append((pageNo + 1)).append(")'>下一页</a>&nbsp");
sb.append(" ");
sb.append("<a href='#' onclick='turnOverPage(").append(pageCount)
.append(")'>尾页</a>&nbsp");
} sb.append(" 跳到<select style='width:80px;' onChange='turnOverPage(this.value)'>&nbsp");
for (int i = 1; i <= pageCount; i++) {
if (i == pageNo) {
sb.append(" <option value='")
.append(i)
.append("' selected='selected'>第")
.append(i)
.append("页</option>&nbsp");
} else {
sb.append(" <option value='")
.append(i)
.append("'>第")
.append(i)
.append("页</option>&nbsp");
}
}
sb.append("</select>&nbsp");
sb.append(" &nbsp");
sb.append("</form>&nbsp"); // 生成提交表单的JS
sb.append("<script language='javascript'>");
// sb.append(" //翻页函数/t/n");
sb.append(" function turnOverPage(no){");
sb.append(" var form = document.pageController;");
// sb.append(" //页号越界处理");
sb.append(" if(no").append(">").append(pageCount).append(") {");
sb.append(" no=").append(pageCount).append(";");
sb.append(" }");
sb.append(" if(no").append("< 1){");
sb.append(" no=1;");
sb.append(" }");
sb.append(" form.").append("pageNo").append(".value=no;");
sb.append(" form.action='").append(url).append("';");
sb.append(" form.submit();");
sb.append(" }");
sb.append("</script>"); try {
pageContext.getOut().println(sb.toString());
} catch (IOException e) {
e.printStackTrace();
} return super.doStartTag();
}
}
二、标签库描述文件:
<?xml version="1.0" encoding="UTF-8"?>
<taglib version="2.0" xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee web-jsptaglibrary_2_0.xsd">
<tlib-version>2.0</tlib-version>
<short-name>my</short-name>
<uri>http://conris/ModelSystem</uri>
<tag>
<description>通用分页标签</description>
<name>pager</name>
<tag-class>cn.conris.sys.form.PageTag</tag-class>
<body-content>empty</body-content>
<attribute>
<name>pageNo</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<name>recordCount</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<name>pageSize</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<name>url</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
</taglib>

三\配置web.xml


 <!-- 配置自定义标签 -->
<jsp-config>
<taglib>
<taglib-uri>/mytaglib</taglib-uri>
<taglib-location>/WEB-INF/classes/pageTag.tld</taglib-location>
</taglib>
</jsp-config>

四\把pageSize写在了配置文件里面,这样可以灵活的修改配置。

pageSize=5
pageNumber=1

读取配置文件的工具类

package cn.conris.sys.utils;

import java.io.IOException;
import java.io.InputStream;
import java.util.Properties; public class PropertyUtil {
private static Properties p = new Properties();
private static InputStream inputStream = null;
static {
inputStream = PropertyUtil.class
.getResourceAsStream("/page.properties");
try {
p.load(inputStream);
} catch (IOException e) {
e.printStackTrace();
}
} public static int getPageSize() {
return Integer.parseInt(p.getProperty("pageSize"));
} public static int getPageNumber() {
return Integer.parseInt(p.getProperty("pageNumber"));
} public static void main(String[] args) {
System.out.println(getPageSize());
} }

五,action处理类

public String listmap() {
String name = extendAttribute.getName();
String type = extendAttribute.getType();
List<ExtendAttribute> list = null;
Map<String, String> maps = new HashMap<String, String>();
if (name != null && !name.equals("")) {
maps.put("name", name);
}
if (type != null && !type.equals("")) {
maps.put("type", type);
} list = extendAttributeService.find(maps); String pageNoStr = request.getParameter("pageNo");
int pageNo = PropertyUtil.getPageNumber();
if (pageNoStr != null && !pageNoStr.equals("")) {
pageNo = Integer.parseInt(pageNoStr);
} int recordCount = list.size();
int pageSize = PropertyUtil.getPageSize();
int startNo = (pageNo - 1) * pageSize;
List<ExtendAttribute> result = null;
if (recordCount <= pageSize) {
result = list;
} else {
if(startNo + pageSize>recordCount){
result = list.subList(startNo, recordCount);
}else{
result = list.subList(startNo, startNo + pageSize);
}
} request.setAttribute("recordCount", recordCount);
request.setAttribute("pageNo", pageNo);
request.setAttribute("pageSize", pageSize);
request.setAttribute("list", result);
// request.setAttribute("list", list);
return "success";
}

六\引用分页标签

<div class="pagination pagination-centered">
<mytag:pager pageNo="${pageNo}" recordCount="${recordCount}"
pageSize="${pageSize}" url="ExtendAttributeAction_listmap.action" />
</div>

七\条件查询时,把条件值回显,支持条件分页.

原理:点击分页条,调用action方法后会执行doStartTag()方法,标签会自动添加表单中所有属性值.

action中:   
     request.setAttribute("recordCount", recordCount);
request.setAttribute("pageNo", pageNo);
request.setAttribute("pageSize", pageSize);
request.setAttribute("list", result);
// request.setAttribute("list", list);
request.setAttribute("name", name);
request.setAttribute("type", type);
jsp回显:
<form id="serach" class="form-search"
action="ExtendAttributeAction_listmap.action" method="post">
扩展属性名称: <input type="text" class="input-medium span2" name="name" value="${name }">&nbsp;&nbsp;
扩展属性类型: <select class="drop_down"
name="type">
<c:choose>
<c:when test="${type=='int'}">
<option value="">全部</option>
<option value="int" selected="selected">整型</option>
<option value="float">浮点型</option>
<option value="varchar(256)">字符串型</option>
</c:when>
<c:when test="${type=='float'}">
<option value="">全部</option>
<option value="int">整型</option>
<option value="float" selected="selected">浮点型</option>
<option value="varchar(256)">字符串型</option>
</c:when>
<c:when test="${type=='varchar(256)'}">
<option value="">全部</option>
<option value="int">整型</option>
<option value="float">浮点型</option>
<option value="varchar(256)" selected="selected">字符串型</option>
</c:when>
<c:otherwise>
<option value="">全部</option>
<option value="int">整型</option>
<option value="float">浮点型</option>
<option value="varchar(256)">字符串型</option>
</c:otherwise>
</c:choose> </select>&nbsp;&nbsp;
<button type="submit" class="btn">
<i class="icon-search"></i> 搜索
</button>
</form>
 

SSH自定义标签的更多相关文章

  1. Struts2自定义标签2自定义一个按班级id查询出该班级下的学生,存放进值栈,并遍历出来。

    Struts2自定义标签的流程概念: (1)需要两个类:标签类(继承相应的tag类),基本类(继承Component).标签类专门负责从客户端取得用户输入的一些属性,这个普通的jsp自定义标签一样,取 ...

  2. [JSP]自定义标签库taglib

    自定义标签的步骤 自定义标签的步骤大概有三步: 1.继承javax.servlet.jsp.tagext.*下提供的几个标签类,如Tag.TagSupport.BodyTagSupport.Simpl ...

  3. [Java] JSP笔记 - 自定义标签

    自定义标签的创建步骤: 自定义标签的四大功能: 自定义标签的类结构: 在 1.0 中呢, 可以将 <body-content> 的值设置为 JSP, 2.0中则不允许在自定义标签体中出现j ...

  4. thinkphp自定义标签库

    thinkphp ~ php中 的类, 的成员变量, 本身是没有类型说明的, 那么我怎么知道它的类型呢? 或初始值呢? 通常在类定义中, 如果能给一个初始值的(对于已知简单类型的),最好给一个初始值, ...

  5. 12 自定义标签/JSTL标签库/web国际化/java web之设计模式和案例

    EL应用      自定义一个标签,实现两个字符串的相加 1回顾      1.1servlet生命周期           init(ServletConfig)           service ...

  6. EL函数以及自定义标签的应用

    一.EL函数(调用普通类的静态方法) 编写步骤(自定义EL函数的编写步骤即自定义标签的编写步骤): ①编写一个普通的java类,提供一个静态方法,功能自定,例如下: package cn.wzbril ...

  7. JSTL 自定义标签

    编写描述标签的tld文件,把这个文件放到web-inf/目录下,才能在jsp页面上调用自定义的标签 package test.yz; import java.io.IOException; impor ...

  8. 使用自定义标签模拟jstl的<c:for each>标签

    一.自定义标签的基本编写 下面编写一个自定义标签,它可以输出当前的时间. 1.编写标签类 类可以通过继承SimpleTagSupport类实现一个标签类编写.父类为我们提供了一些编写自定义标签的快捷的 ...

  9. JSP自定义标签/自定义标签打包

    有这样一个业务需求: 当我们在编辑某个用户时,需要设置该用户的角色,在转到编辑页面时,就需要自动勾选上该用户已经选择的角色,如下图: 当我们点击编辑时,会查询用户详细信息,以及角色集合传到编辑页面. ...

随机推荐

  1. GUI编程笔记(java)08:GUI通过鼠标移动到按钮上更改背景色案例

    首先我们看看源代码如下: package cn.itcast_06; import java.awt.Button; import java.awt.Color; import java.awt.Fl ...

  2. Python获取web页面信息

    import sys, urllib2 # req = urllib2.Request(sys.argv[1]) req = urllib2.Request('http://www.sina.com. ...

  3. jsp获取服务端的访问信息

    获取服务端访问信息 public static String getUrl(HttpServletRequest request){ String url = ""; if(req ...

  4. 根据子级ID获取其所有父级

    当前位置>新闻中心>行业资讯 CLASSID CLASSNAME CLASSPID 1 新闻中心 0 2 行业资讯 1 3 公司新闻 1 4 媒体聚焦 0 当前位置<%=navNam ...

  5. datatables定义列宽自适应方法

    不同的分辨率以及浏览器自适应,列表不出现滚动条,表格内容自动换行. 方法:通过定义表格列属性,结合<table>CSS样式和定义的列单元格样式 'td_huanhang'/'td_unhu ...

  6. python learning_curve函数

    这个函数需要引用sklearn包 import sklearn from sklearn.learning_curve import learning_curve 这个函数的调用格式是: learni ...

  7. .Net之美读书系列(二):委托进阶

    这次看书的知识点: 事件访问器 如果一个委托中注册了多个事件且需要获取其返回值的方法 委托的异常处理 委托处理超时的方法 异步委托 事件访问器 职能有: 1.对委托属性进行封装,不再直接该委托变量直接 ...

  8. 关于ASP.Net中路径的问题

    比如你的工程是Webapplication1(url是:http://localhost/webapplication1/webform1.aspx) Request.ApplicationPath ...

  9. 在mipsel-linux平台上的编译应用SQLite-3.5.9

    sqlite 第一个Alpha版本诞生于2000年5月,是实现了SQL 92标准的一个大子集的嵌入式数据库,其以在一个库中组合了数据库引擎和接口,能将所有数据存储于单个文件中.官方测试表明sqlite ...

  10. A题笔记(4)

    No. 1384 这题没啥 不过网考成绩出了,发现我的口语分数相较其他人还挺高的~~~哈哈哈 Code::Blocks 有时在程序运行结束后,.exe 并没有结束,因而之后无论怎么调试和修改代码,运行 ...