下面对自定义标签的应用时通过jsp直接引用的,没有配置在工程中的web.xml中。而且省去了数据返回的java类,只是着重描述了对标签的定义
1、首先定义一个标签的描述文件lightweight-tag.tld,该文件必须放在工程的类路径下,一般和项目的web.xml文件一起就行了。其内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN" "http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">
<taglib>
<tlib-version>1.0</tlib-version>
<jsp-version>1.2</jsp-version>
<short-name>nt</short-name>
<description>my Form Tag Library Descriptor</description>
<!-- table tag -->
<tag>
<name>table</name>
<tag-class>ssh.tag.TableTag</tag-class>
<body-content>JSP</body-content>
<description>table tag</description>
<attribute>
<name>items</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<name>url</name>
<required>true</required>
</attribute>
</tag>
<!-- column tag -->
<tag>
<name>grid</name>
<tag-class>ssh.tag.ColumnTag</tag-class>
<body-content>JSP</body-content>
<description>column tag</description>
<attribute>
<name>label</name>
<required>true</required>
</attribute>
<attribute>
<name>property</name>
<required>true</required>
</attribute>
</tag>
</taglib>
配置文件中标签类的java类一定要写对
2、标签类TableTag.java的内容为:
package ssh.tag;
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;
@SuppressWarnings("serial")
public class TableTag extends BodyTagSupport{
private List<Map<String, String>> columns = new ArrayList<Map<String,String>>();
private Object items; //存储数据,可能为集合类型或者数组类型
private String url; //取排序数据的 URL
public int doStartTag() throws JspException{ //标签开始时执行
columns.clear(); //清空colums
return super.doStartTag();
}
@SuppressWarnings("unchecked")
public int doAfterBody() throws JspException{ //标签体结束后执行
try {
BodyContent bc = getBodyContent(); //获取标签体
JspWriter out = bc.getEnclosingWriter();//获取out对象
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=theObjectTable"); //输出<table>标签
out.println(" class=list_table style='table-layout:fixed;'>");
out.println("<tr class=tr_title >"); //输出<tr>标签
out.println("<script>var colums = []; </script>");
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"); //列对应的 POJO 属性
label = label == null ? property : label; //默认使用属性名作为列名
out.println("<td id='_id_td_" + property + "'>"); //输出 <td> 标签
out.println("<font class='resizeDivClass'"); //输出 <font> 标签
out.println(" onmousedown='MouseDownToResize(this);');");
out.println(" onmousemove='MouseMoveToResize(this);'");
out.println(" onmouseup='MouseUpToResize(this);'></font>");
out.println("<span onclick=\"sort('"+property + "');\"");
out.println(" style=\"cursor:pointer; \">");
out.println(label); //输出列名
if (property.equals(orderName)) { //如果按本列排序
out.println("<img src='images/'"+orderType +".gif' border=0 />"); //排序图标
}
out.println("</span");
out.println("</td>");
out.println("<script>columns[columns.length]='_id_td_"+property+"';</script>");
}
out.println(" </tr>"); //输出</tr>标签
if (items !=null) {
for (Object obj:(Iterable)items) { //遍历所有数据
out.println(" <tr class=tr_data>"); //输出<tr>标签
for (int i = 0; i < columns.size(); i++) { //遍历所有数据列
Map<String, String> column = columns.get(i);
String property = column.get("property"); //POJO属性名
String getterStyle = toGetterStyle(property); //使首字母大写
try {
String getter = "get" + getterStyle; //get方法名
String is = "is" + getterStyle; //boolean的getter方法
Method method = null;
try {
method = obj.getClass().getMethod(getter); //getter方法
} catch (Exception e) {
// TODO: handle exception
}
if (method == null) {
method = obj.getClass().getMethod(is); //boolean的getter方法
}
method.setAccessible(true); //是getter方法可见
Object value = method.invoke(obj); //得到getter方法的返回值
out.println("<td><span title='"+value+"'>" + value + "</span></td>"); //输出数据
} catch (Exception e) {
throw new JspException(e);
}
}
out.println(" </tr>");
}
}
out.println("</table>");
} catch (Exception e) {
throw new JspException("Error: "+ e.getMessage());
}
return SKIP_BODY;
}
//使字符串首字母大写
private String toGetterStyle(String column) {
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 columns;
}
public void setColumns(List<Map<String, String>> columns) {
this.columns = columns;
}
public Object getItems() {
return items;
}
public void setItems(Object items) {
this.items = items;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
}
标签类ColumnTag.java的内容为:
package ssh.tag;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.TagSupport;
@SuppressWarnings("serial")
public class ColumnTag extends TagSupport{
private String property; //列对应的POJO属性
private String label; //列名,在JSP中显示用
public int doStartTag() throws JspException{ //标签开始时执行
if (!(this.getParent() instanceof TableTag)) { //如果不在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); //保存POJO属性名
TableTag tableTag = (TableTag) this.getParent(); //获取父标签table
tableTag.getColumns().add(column); //添加该列
return SKIP_BODY;
}
public int doEndTag() throws JspException {
return EVAL_PAGE;
}
public String getProperty() {
return property;
}
public void setProperty(String property) {
this.property = property;
}
public String getLabel() {
return label;
}
public void setLabel(String label) {
this.label = label;
}
}
3、引用自定义标签的jsp文件table.jsp内容为:
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">
<%@ page language="java" pageEncoding="utf-8"%>
<%@ taglib uri="http://java.sun.com/jstl/core_rt" prefix="c"%>
<%@ taglib uri="/WEB-INF/lightweight-tag.tld" prefix="nt"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>my tag table</title>
</head>
<body>
<nt:table items="${myPage.list}" url="table.jsp">
<nt:grid label="学号" property="stuId"></nt:grid>
<nt:grid label="姓名" property="stuName"></nt:grid>
<nt:grid label="性别" property="stuSex"></nt:grid>
<nt:grid label="出生年月" property="stuBir"></nt:grid>
<nt:grid label="家庭住址" property="stuAdd"></nt:grid>
</nt:table>
</body>
</html>
这里省去了返回数据的java类,这里的property="stuId",对应的是返回对象的属性名,切勿写错
分享到:
相关推荐
本实例将深入探讨如何实现一个简单的JSP自定义标签。 首先,自定义标签的实现主要依赖于两个核心概念:Tag接口和TagSupport类。`Tag`接口定义了自定义标签必须实现的方法,如`doStartTag()`和`doEndTag()`,它们...
本教程将深入探讨JSP自定义标签的使用,同时结合实例介绍分页和下拉框绑定值的封装。 一、JSP自定义标签基础 1. **定义标签库(Tag Library)**:自定义标签首先需要定义一个TLD(Tag Library Descriptor)文件,它...
本篇学习笔记将深入探讨JSP自定义标签的相关概念、创建方法以及实际应用。 一、概述 1.1 使用简单标签机制 JSP自定义标签提供了类似HTML标签的语法结构,通过自定义标签,开发者可以封装复杂的Java代码,使得页面...
总之,JSP自定义标签是提高JSP开发效率和代码复用性的重要工具,通过创建和使用自定义标签,我们可以构建出更加模块化、易于维护的Web应用程序。结合Tomcat这样的Servlet容器,可以快速地部署和测试这些自定义组件。
在JavaServer Pages (JSP) 开发中,自定义标签库是提高代码可重用性和模块化的重要手段。本文将详细讲解如何利用JSP自定义标签库实现...理解这些文件的作用和相互关系,对于掌握JSP自定义标签库的开发和应用至关重要。
在使用JSP自定义标签时,开发者可能会遇到一些报错问题,这通常涉及到项目结构、类路径设置或自定义标签的编译与打包方式。在本文中,我们将深入探讨这些问题,以及如何解决“JspException”这个特定异常。 首先,...
总结来说,通过学习和实践JSP自定义标签,我们可以构建高效、灵活的Web应用程序,比如这里的分页系统,它不仅简化了页面的开发,还增强了系统的扩展性和可维护性。在实际项目中,结合良好的设计原则和最佳实践,...
本教程将深入探讨JSP自定义标签的实例与详细讲解。 一、JSP自定义标签概述 JSP自定义标签是类似于HTML标签的自定义组件,但它们提供了更强大的功能,可以封装Java代码,提供复杂的业务逻辑。自定义标签通过TLD(Tag...
在Java Server Pages (JSP) 2.0版本中,自定义标签和自定义标签函数极大地扩展了JSP开发的灵活性和可重用性。这些特性允许开发者创建可复用的组件,使代码更加清晰,易于维护。本文将深入探讨JSP 2.0中的自定义标签...
本资源“jsp自定义标签大全.rar”提供了一套全面的JSP自定义标签的实例和指南,旨在帮助开发者深入理解和应用这一特性。 **JSP自定义标签的基本概念** JSP自定义标签不同于标准动作标签(如<jsp:include>或<jsp:...
【jsp自定义标签库注意事项】 在Java服务器页面(JSP)开发中,自定义标签库是一种强大的工具,它能够帮助开发者创建可重用的代码片段,提高代码的可读性和可维护性。以下是对JSP自定义标签库的详细解释和使用注意...
综上所述,“权威实用jsp自定义标签demo,checkbox,radio>”教程旨在帮助开发者掌握如何创建和使用与选择器相关的自定义标签,从而提升JSP开发的效率和质量。通过学习这个教程,你可以了解到自定义标签的核心概念、...
一、JSP自定义标签基础 JSP自定义标签是JSP技术的一部分,它允许开发者创建自己的标签,以扩展HTML或XML文档。这些自定义标签可以封装复杂的Java代码,使JSP页面更加清晰,易于理解和维护。自定义标签由两部分组成:...
通过学习和实践这一技术,开发者可以更好地利用JSP自定义标签的灵活性,提高Web应用的开发效率和质量。同时,了解源码和工具的运用也是提升编程技能的关键,这能帮助我们深入理解底层机制,从而编写出更加高效和可靠...
本资料"掌握jsp自定义标签chm版"全面讲解了这一核心概念,旨在帮助开发者深入理解和熟练应用JSP自定义标签。 1. **自定义标签概述** JSP自定义标签是扩展JSP功能的一种方式,允许开发者创建自己的标签库,类似于...
总结起来,"JSP自定义Table标签demo"是一个教育性的示例,它演示了如何利用JSP自定义标签的灵活性和强大功能,来创建复杂且可复用的组件,如动态表格。通过学习和理解这个demo,开发者可以提升自己的JSP开发能力,...
### jsp自定义嵌套标签:定义与使用详解 在JavaServer Pages(JSP)技术中,自定义标签是扩展其功能的一种强大手段。而自定义嵌套标签,则是在此基础上进一步提升灵活性和重用性的机制。本文将深入探讨自定义嵌套...
总的来说,JSP自定义标签是构建动态Web应用程序的强大工具,它提高了代码的复用性和可维护性。通过理解和熟练掌握自定义标签的使用,开发者可以更好地设计和实现复杂的企业级应用。在实际项目中,可以根据需求选择...
JSP自定义标签是JavaServer ...通过上述介绍,我们可以看出,JSP自定义标签是一种强大的工具,它可以帮助我们构建更清晰、更易于维护的Web应用程序。通过熟练掌握自定义标签的使用,可以提升项目的整体质量和开发效率。