需求是有两个自定义的标签<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. SpringBoot Bean作用域

    Bean在一般容器中都存在以下2种作用域: singleton 默认值,IoC容器只存在单例 prototype 每当从IoC容器中取出一个Bean,则创建一个新的Bean 在Web容器中存在4种作用 ...

  2. Spring_事务-注解代码

    applicationContext.xml <?xml version="1.0" encoding="UTF-8"?><beans xml ...

  3. lastIndexOf 方法 (Array) (JavaScript)

    lastIndexOf 方法 (Array) (JavaScript) 返回指定的值在数组中的最后一个匹配项的索引. 语法         array1.lastIndexOf(searchEleme ...

  4. spring半自动代理

    1.被代理类接口Person.java package com.xiaostudy; /** * @desc 被代理类接口 * * @author xiaostudy * */ public inte ...

  5. Pandas选项和自定义

    Pandas提供API来自定义其行为的某些方面,大多使用来显示. API由五个相关函数组成.它们分别是 - get_option() set_option() reset_option() descr ...

  6. JAR_给别人使用

    1. http://zhidao.baidu.com/link?url=Ru2tGNV5iRsuRYlEdWzmKDRz88aYqHAqQBQy8sCaHWhjJpaJpbTGibEk-zyxegNJ ...

  7. c# 使用事务

    EcAttendanceMatterBLL.OpenTransaction(); DbTransaction Tran = EcAttendanceMatterBLL.Transaction; _wf ...

  8. Python jieba 分词

    环境 Anaconda3 Python 3.6, Window 64bit 目的 利用 jieba 进行分词,关键词提取 代码 # -*- coding: utf-8 -*- import jieba ...

  9. python脚本2_输入2个数比较大小后从小到大升序打印

    #输入2个数,比较大小后,从小到大升序打印 a = input('first: ') b = input('second: ') if a > b: print(b,a) else: print ...

  10. Android两个Activity之间的数据交换

    1. 不带数据 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceS ...