实现一个自定义<table>标签
需求是有两个自定义的标签<table>和<column>
<table>有个items属性,负责导入数据
package hello; import java.util.HashMap;
import java.util.Map; import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.TagSupport; public class Column extends TagSupport {
private String property;
private String label; public int doStartTag() throws JspException {
if (!(this.getParent() instanceof Table)) {
throw new JspException("Column must be inside table.");
}
Map<String, String> column = new HashMap<String, String>();
column.put("label", label);
column.put("property", property);
Table table = (Table) this.getParent();
table.getColumns().add(column);
return SKIP_BODY;
} public int doEndTag() throws JspException {
return EVAL_PAGE;
} public void setLabel(String label) {
this.label = label;
} public void setProperty(String property) {
this.property = property;
}
}
<column>有property属性负责数据的setter和getter,label负责字段
package hello; import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
import java.util.Map; import javax.servlet.http.HttpServletRequest;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.BodyContent;
import javax.servlet.jsp.tagext.BodyTagSupport; public class Table extends BodyTagSupport {
private List<Map<String, String>> columns = new ArrayList<Map<String, String>>();
private List<Person> personList;
private String url; @Override
public int doStartTag() throws JspException {
columns.clear();
return super.doStartTag();
} @Override
@SuppressWarnings("unchecked")
public int doAfterBody() throws JspException {
try {
BodyContent bc = this.getBodyContent();
JspWriter out = bc.getEnclosingWriter();
HttpServletRequest request = (HttpServletRequest) pageContext
.getRequest();
String orderName = request.getParameter("orderName");
String orderType = request.getParameter("orderType");
orderType = "desc".equals(orderType) ? "desc" : "asc";
out.println("<table id=theObjTable ");
out.println("class=list_table border=\"3\";>");
out.println("<tr class=tr_title>");
for (int i = 0; i < columns.size(); i++) {
Map<String, String> column = columns.get(i);
String label = column.get("label");
String property = column.get("property");
label = label == null ? property : label;// 没有列名的用属性做列名
out.println("<td id='_id_td_" + property + "'>");
out.println(label);
out.println("</td>");
}
out.println("</tr>");
if (personList != null) {
for (int i = 0; i < personList.size(); i++) {
out.println("<tr class=tr_data>");
Person person = personList.get(i);
for (int j = 0; j < columns.size(); j++) {
Map<String, String> colmun = columns.get(j);
String property = colmun.get("property");
String getterStyle = toGetterStyle(property);
String method = "get" + getterStyle;
try {
Method m = person.getClass().getDeclaredMethod(
method);
String value = (String) m.invoke(person);
out.println("<td>" + value + "</td>");
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
} catch (Exception e) {
}
return 0;
} public String toGetterStyle(String column) {
// TODO Auto-generated method stub
if (column.length() == 1)
return column.toUpperCase();
char ch = column.charAt(0);
return Character.toUpperCase(ch) + column.substring(1);
} public List<Map<String, String>> getColumns() {
return this.columns;
} public void setItems(List<Person> personList) {
this.personList = personList; } }
思路:
在<table>设一个List<Map<String, String>> 来存放字段
每个<column>都有一个Map<String, String>存放一个字段,在doEndTag方法中
调用getParent获得<table>对象的getColmun方法获得上面的list,add这个Map
一个循环,把list的字段提出来
一个循环,把column的property加上“get“拼凑方法的字符串,
Method m = person.getClass().getDeclaredMethod( method);
String value = (String) m.invoke(person);
字符串不能作为方法只能反射调用方法
实现一个自定义<table>标签的更多相关文章
- [原创]java WEB学习笔记40:简单标签概述(背景,使用一个标签,标签库的API,SimpleTag接口,创建一个自定义的标签的步骤 和简单实践)
本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...
- dubbo-config-spring自定义xml标签扩展
要实现自定义自定义标签扩展,需要有如下步骤(在spring中定义了两个接口NamespaceHandler.BeanDefinitionParser,用来实现扩展) 1.设计配置属性和JavaBean ...
- Struts2自定义标签4自定义分页标签
第一步:webroot/web-inf下的str.tld文件 <?xml version="1.0" encoding="UTF-8"?> < ...
- element-ui自定义table表头,修改列标题样式
elementUI table表格一般的样式是这样的: 但是要改变表头是比较麻烦的一个事情,但是往往有些项目是需要的比如改成如下样式: 一般直接改起来挺麻烦,好在官网提供了一个方法:render-he ...
- 使用自定义tld标签简化jsp的繁琐操作
最近做一个树形结构的展示,请求目标页面后,后台只返回简单的List,虽然有想过在jsp页面内做一些操作简化,但是太繁琐了,其他的标签又不能满足需求,所以只能自己做一个.使用tld标签可以简化jsp代码 ...
- excel 作图中次横坐标及次纵坐标的调试,以及excel自定义轴标签的步骤方法
在工作中除了要做一些常用的图表之外,不时还会有一切奇怪图表的制作需求. 今天的内容主要记录的是如何对excle图表的次横坐标及次纵坐标进行调试,以及如何自定义调整轴标签 首先看下如何做次纵坐标,工作中 ...
- 自定义JSP标签库及Properties使用
自定义JSP标签库及Properties使用 自定义JSP标签 自定义JSP标签技术是在JSP 1.1版本中才出现的,它支持用户在JSP文件中自定义标签,这样可以使JSP代码更加简洁. 这些可重用的标 ...
- 自定义JSP标签入门
1.编写一个实现Tag接口的java类 package TagDemo; import javax.servlet.http.HttpServletRequest; import javax.serv ...
- 基于Spring的可扩展Schema进行开发自定义配置标签支持
一.背景 最近和朋友一起想开发一个类似alibaba dubbo的功能的工具,其中就用到了基于Spring的可扩展Schema进行开发自定义配置标签支持,通过上网查资料自己写了一个demo.今天在这里 ...
随机推荐
- python数据可视化(持续更新)
1.折线图 import numpy as np import matplotlib.pyplot as plt input_values = [1, 2, 3, 4, 5] s = [1, 4, 9 ...
- JavaEE之动态代理
jdk动态代理主要使用的是java反射机制(既java.lang.reflect包) 动态代理:程序运行时,使用JDK提供工具类(Proxy),动态创建一个类,此类一般用于代理. 代理类需要实现Inv ...
- hdu 5776 sum 前缀和
sum Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)Total Submi ...
- crm开发(基于ssh)(2)
今天内容 1 新增客户 2 客户列表 3 修改客户 4 删除客户 5 分页显示客户列表 Hibernate模板里面的方法 1 新增客户 配置 <mapping resource="cn ...
- mysql中删除完全重复数据的准确SQL语句
删除数据库中重复的记录,只保留一条 DELETE FROM tb_gps_records WHERE id NOT IN (SELECT bid FROM (SELECT min(id) as bid ...
- spring mvc:常用标签库(文本框,密码框,文本域,复选框,单选按钮,下拉框隐藏于,上传文件等)
在jsp页面需要引入:<%@taglib uri="http://www.springframework.org/tags/form" prefix="form&q ...
- 分分享知识-快乐自己: @Component注解的使用
@controller 控制器(注入服务) 用于标注控制层,相当于struts中的action层 @service 服务(注入dao) 用于标注服务层,主要用来进行业务的逻辑处理 @repositor ...
- Eclipse 3.7 极述优化
1.去除不用的jar Eclipse/plugins目录下去除下面的jar和目录 2012/02/17 03:09 14,169 org.eclipse.cvs_1.1.100.v2012020808 ...
- 009——VUE中watch监听属性变化实现类百度搜索栏功能
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- ARM汇编指令集5
为什么需要多寄存器访问指令? ldr/str每周期只能访问4字节内存,如果需要批量读取.写入内存时太慢,解决方案是stm/ld 举例(uboot start.S 537行) stmia sp, ...