实现一个自定义<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.今天在这里 ...
随机推荐
- 《Maven实战》第10章 使用Maven进行测试
10.2maven-surefire-plugin插件 [生命周期]的[阶段]与[插件]的[目标]绑定 default生命周期的test阶段:使用单元测试框架运行测试 Maven内置绑定:defaul ...
- 修改Maven源为阿里巴巴的镜像
在C:\Users\Administrator\.m2创建setting.xml文件,内容如下 <settings xmlns="http://maven.apache.org/SET ...
- JQ input标签限制输入数字或字母
<input type="text" maxlength="20" class="input5" onkeyup="val ...
- Kubernetes源码之旅:从kubectl到API Server
概述: Kubernetes项目目前依然延续着之前爆炸式的扩张.急需能够理解Kubernetes原理并且贡献代码的软件开发者.学习Kubernetes源码并不容易.Kubernetes是使用相对年轻的 ...
- react-router路由
1.http://blog.csdn.net/sunshine215/article/details/78296404(react-router v4 使用 history 控制路由跳转) 2.htt ...
- 支付宝VIE的罪与罚
http://tech.ifeng.com/special/tusimple/alibaba/#_www_dt2 雅虎的杨致远.软银的孙正义,都曾是马云阿里巴巴创业路上的贵人,也都曾是相互信任的朋 ...
- C++多态、虚函数、纯虚函数、抽象类
多态 同一函数调用形式(调用形式形同)可以实现不同的操作(执行路径不同),就叫多态. 两种多态: (1)静态多态:分为函数重载和运算符重载,编译时系统就能决定调用哪个函数. (2)动态多态(简称多态) ...
- Myeclipse快捷键的设置以及默认的编码格式
设置默认的编码格式
- LeetCode OJ:First Missing Positive (第一个丢失的正数)
在leetCode上做的第一个难度是hard的题,题目如下: Given an unsorted integer array, find the first missing positive inte ...
- Python基础学习(第5天)
第3课 模块 1.模块(module) Python中一个.py文件就是一个模块,可以调用其它文件中的程序. 例:first.py def laugh(): print '哈哈哈哈哈' second ...