需求是有两个自定义的标签<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. SQLServer行列转换PIVOT函数中聚合函数的使用意义及选择

    例子:https://blog.csdn.net/wikey_zhang/article/details/76849826 DECLARE @limitDay INT;SET @limitDay = ...

  2. 不常用的gcd公式

    gcd(a^m-b^m,a^n-b^n)=a^(gcd(m,n))-b^(gcd(m,n))

  3. yii2: 上传图片,生成目录

    1.单个文件上传 首先建立一个模型models/UploadForm.php,内容如下 namespace app\models; use yii\base\Model; use yii\web\Up ...

  4. Robot Framework(一)

    一. 定义 Robot Framework是一款python编写的功能自动化测试框架,具有良好的可扩展性,支持关键字驱动,可以同时测试多种类型的客户端或者接口,可以进行分布式测试执行 二. Robot ...

  5. 解决Oracle数据库IP地址改变创建数据库的问题

    方案一 查了相关的资料后才知道,只要修改安装Oracle的目录下面的listener.ora和tnsnames.ora里面的内容即可.看图看图  修改什么内容呢?看图看图. 就是HOST地址改一下就可 ...

  6. 用fail2ban阻止ssh暴力破解root密码

    安装fail2ban工具来实现防暴力破解,防止恶意攻击,锁定恶意攻击IP. 1.如果是centos系统,先yum安装fail2ban [root@VM_152_184_centos /]# yum - ...

  7. language model ——tensorflow 之RNN

    代码结构 tf的代码看多了之后就知道其实官方代码的这个结构并不好: graph的构建和训练部分放在了一个文件中,至少也应该分开成model.py和train.py两个文件,model.py中只有一个P ...

  8. python:webbrowser

    import webbrowser webbrowser.open_new_tab('www.baidu.com')

  9. react: menuService

    1.获取菜单对象 static findCurrentItem(items, currentState, currentItem) { _.forEach(items, function (item) ...

  10. 为什么选择MpVue进行小程序的开发

    前言 mpvue是一款使用Vue.js开发微信小程序的前端框架.使用此框架,开发者将得到完整的 Vue.js 开发体验,同时为H5和小程序提供了代码复用的能力.如果想将 H5 项目改造为小程序,或开发 ...