需求是有两个自定义的标签<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>标签的更多相关文章

  1. [原创]java WEB学习笔记40:简单标签概述(背景,使用一个标签,标签库的API,SimpleTag接口,创建一个自定义的标签的步骤 和简单实践)

    本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...

  2. dubbo-config-spring自定义xml标签扩展

    要实现自定义自定义标签扩展,需要有如下步骤(在spring中定义了两个接口NamespaceHandler.BeanDefinitionParser,用来实现扩展) 1.设计配置属性和JavaBean ...

  3. Struts2自定义标签4自定义分页标签

    第一步:webroot/web-inf下的str.tld文件 <?xml version="1.0" encoding="UTF-8"?> < ...

  4. element-ui自定义table表头,修改列标题样式

    elementUI table表格一般的样式是这样的: 但是要改变表头是比较麻烦的一个事情,但是往往有些项目是需要的比如改成如下样式: 一般直接改起来挺麻烦,好在官网提供了一个方法:render-he ...

  5. 使用自定义tld标签简化jsp的繁琐操作

    最近做一个树形结构的展示,请求目标页面后,后台只返回简单的List,虽然有想过在jsp页面内做一些操作简化,但是太繁琐了,其他的标签又不能满足需求,所以只能自己做一个.使用tld标签可以简化jsp代码 ...

  6. excel 作图中次横坐标及次纵坐标的调试,以及excel自定义轴标签的步骤方法

    在工作中除了要做一些常用的图表之外,不时还会有一切奇怪图表的制作需求. 今天的内容主要记录的是如何对excle图表的次横坐标及次纵坐标进行调试,以及如何自定义调整轴标签 首先看下如何做次纵坐标,工作中 ...

  7. 自定义JSP标签库及Properties使用

    自定义JSP标签库及Properties使用 自定义JSP标签 自定义JSP标签技术是在JSP 1.1版本中才出现的,它支持用户在JSP文件中自定义标签,这样可以使JSP代码更加简洁. 这些可重用的标 ...

  8. 自定义JSP标签入门

    1.编写一个实现Tag接口的java类 package TagDemo; import javax.servlet.http.HttpServletRequest; import javax.serv ...

  9. 基于Spring的可扩展Schema进行开发自定义配置标签支持

    一.背景 最近和朋友一起想开发一个类似alibaba dubbo的功能的工具,其中就用到了基于Spring的可扩展Schema进行开发自定义配置标签支持,通过上网查资料自己写了一个demo.今天在这里 ...

随机推荐

  1. Caffe python利用classify.py实现对单通道(灰度图)的数据进行分类

    比如你在mnist的prototxt中定义图输入是单通道的,也就是channel=1,然后如果直接调用classify.py脚本来测试的话,是会报错,错误跟一下类似. Source param sha ...

  2. SPFA算法 - Bellman-ford算法的进一步优化

    2017-07-27  22:18:11 writer:pprp SPFA算法实质与Bellman-Ford算法的实质一样,每次都要去更新最短路径的估计值. 优化:只有那些在前一遍松弛中改变了距离点的 ...

  3. Java 各种锁的小结

    一. synchronized 在 JDK 1.6 之前,synchronized 是重量级锁,效率低下. 从 JDK 1.6 开始,synchronized 做了很多优化,如偏向锁.轻量级锁.自旋锁 ...

  4. python学习笔记(接口自动化框架 V2.0)

    这个是根据上次框架版本进行的优化 用python获取excel文件中测试用例数据 通过requets测试接口.并使用正则表达式验证响应信息内容 生成xml文件测试报告 版本更新内容: 1. 整理了Cr ...

  5. spring mvc:拦截器不拦截静态资源的三种处理方式

    方案一.拦截器中增加针对静态资源不进行过滤(涉及spring-mvc.xml) <mvc:resources location="/" mapping="/**/* ...

  6. yii定时任务(linux)

    yii写好了,计划任务,那么需要测试,测试地址大致: 我的测试文件名称:TestControllers.php, windows环境下: 我的项目在f:\www下, CMD: f:/www/ php ...

  7. ubuntu 编译 vim+lua

    mac $ brew install vim --with-cscope --with-lua --override-system-vim 安装spf13-vim见下面linux部分. 如果安装mac ...

  8. kvm学习篇

    云计算:一种资源的使用模式 弹性,按需付费资源降低成本 公有云:亚马逊.阿里云私有云:混合云: 安装: yum install qemu-kvm qemu-kvm-tools virt-manager ...

  9. Eclipse Android 代码自动提示功能

    Eclipse Android 代码自动提示功能 Eclipse for android 实现代码自动提示智能提示功能,介绍 Eclipse for android 编辑器中实现两种主要文件 java ...

  10. Qt类型转换

    (转自:http://qimo601.iteye.com/blog/1260479) 1.char * 与 const char *的转换 char *ch1="hello11"; ...