java:tag 自定义标签应用
一,tag类
1.1 TagMy标签类,格式化当前日期并输出
package com.dkt.tag; import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date; import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.TagSupport; /*
* doStartTag() SKIP_BODY执行doEndTag()跳过标签体
* EVAL_BODY_INCLUDE 执行标签体
* doAfterBody() EVAL_BODY_AGAIN 循环执行标签体
* SKIP_BODY 不执行标签体,执行doEndTag()
* doEndTag() SKIP_PAGE 不执行jsp剩余的页面
* EVAL_PAGE 执行剩余的页面
*
*/
public class TagMy extends TagSupport{
private String format;
public int doStartTag() {
SimpleDateFormat simpleDateFormat = new SimpleDateFormat(format);
String nowdate = simpleDateFormat.format(new Date());
JspWriter out = pageContext.getOut();
try {
out.print("Hello 世界!!");
out.print(nowdate);
} catch (IOException e) {
e.printStackTrace();
}
return super.SKIP_BODY;
}
public int doAfterBody() throws JspException {
return super.doAfterBody();
}
public int doEndTag() throws JspException {
return super.doEndTag();
}
public String getFormat() {
return format;
}
public void setFormat(String format) {
this.format = format;
} }
1.2 ForTag 标签类,自定义<c:foreach>标签,循环输出
package com.dkt.tag; import javax.servlet.jsp.tagext.TagSupport; public class FroTag extends TagSupport{
private int start;
private int end;
private String var; public int doStartTag(){
System.out.println("doStartTag()"+start);
if(start<=end){
pageContext.setAttribute(var, start);
start++;
return super.EVAL_BODY_INCLUDE;
}else {
return super.SKIP_BODY;
}
//执行doAfterBody()
}
public int doAfterBody() {
if(start<=end){
pageContext.setAttribute(var, start);
start++;
System.out.println("doAfterBody()"+start);
return super.EVAL_BODY_AGAIN;
}else {
return super.SKIP_BODY;
}
}
public int doEndTag(){
System.out.println("doEndTag()"+start);
return super.EVAL_PAGE;
}
public int getStart() {
return start;
}
public void setStart(int start) {
this.start = start;
}
public int getEnd() {
return end;
}
public void setEnd(int end) {
this.end = end;
}
public String getVar() {
return var;
}
public void setVar(String var) {
this.var = var;
}
}
1.3 IteratorTag标签类,迭代集合,全部循环输出显示在页面
package com.dkt.tag; import java.util.ArrayList;
import java.util.Iterator; import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.TagSupport; public class IteratorTag extends TagSupport{
private String scope;
private String var;
private ArrayList list = null; Iterator it = null;
public int doStartTag() {
/*if (("page").equals(scope)) {
list = (ArrayList)pageContext.getAttribute(list,pageContext.PAGE_SCOPE);
}else if(("request").equals(scope)){
list = (ArrayList)pageContext.getAttribute(list,pageContext.REQUEST_SCOPE);
}else if(("session").equals(scope)){
list = (ArrayList)pageContext.getAttribute(list,pageContext.SESSION_SCOPE);
}else if(("application").equals(scope)){
list = (ArrayList)pageContext.getAttribute(list,pageContext.APPLICATION_SCOPE);
}*/
it = list.iterator();
return super.EVAL_BODY_INCLUDE;
} public int doAfterBody() {
if (it.hasNext()) {
Object next = it.next();
pageContext.setAttribute(var, next);
return super.EVAL_BODY_AGAIN;
}else {
return super.SKIP_BODY;
}
}
public int doEndTag() throws JspException {
return super.doEndTag();
} public String getScope() {
return scope;
}
public void setScope(String scope) {
this.scope = scope;
}
public String getVar() {
return var;
}
public void setVar(String var) {
this.var = var;
}
public ArrayList getList() {
return list;
}
public void setList(ArrayList list) {
this.list = list;
}
}
1.4 QueryTag 标签类,根据表名,查询数据库,并由表格输出到页面
package com.dkt.tag; import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException; import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.TagSupport; import com.dkt.util.DButil; public class QueryTag extends TagSupport{ private String tableName;
public int doStartTag() {
DButil dButil = new DButil();
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
conn = dButil.createConn();
String sql = "select * from "+tableName;
try {
ps = conn.prepareStatement(sql);
ResultSetMetaData rsmd = ps.getMetaData();//得到表结构
rs = ps.executeQuery();
JspWriter out = pageContext.getOut();
out.print("<table border='1px' width='60%' align='center'><tr>");
for (int i = 0; i < rsmd.getColumnCount(); i++) {//字段数量
out.print("<th>"+rsmd.getColumnName(i+1)+"</th>");//字段名字
}
out.print("</tr>");
while(rs.next()){
out.print("<tr>");
for (int i = 0; i < rsmd.getColumnCount(); i++) {
out.print("<td>"+rs.getObject(i+1)+"</td>");
}
out.print("</tr>");
} out.print("</table>");
} catch (SQLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return super.SKIP_BODY;
}
public int doAfterBody() throws JspException {
return super.doAfterBody();
}
public int doEndTag() throws JspException {
return super.doEndTag();
}
public String getTableName() {
return tableName;
}
public void setTableName(String tableName) {
this.tableName = tableName;
} }
二,hellotag.tld
文件 hellotag.tld 放在WEB-INF目录下,与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>hello</short-name>
<uri>hello</uri>
<!-- TagMy自定义标签类 -->
<tag>
<name>hello</name> <!-- 标签名 -->
<tag-class>com.dkt.tag.TagMy</tag-class>
<body-content>empty</body-content> <!-- 是否有标签体 jsp/empty -->
<!-- 有属性的标签定义 -->
<attribute>
<name>format</name>
<required>true</required><!-- 表示标签是否必须 -->
<rtexprvalue>true</rtexprvalue><!-- 表示是否可以使用表达式 el/jsp -->
</attribute>
</tag>
<!-- FroTag -->
<tag>
<name>formy</name>
<tag-class>com.dkt.tag.FroTag</tag-class>
<body-content>jsp</body-content>
<attribute>
<name>start</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<name>end</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<name>var</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
<!-- IteraterTag -->
<tag>
<name>iteratormy</name>
<tag-class>com.dkt.tag.IteratorTag</tag-class>
<body-content>jsp</body-content>
<attribute>
<name>list</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<name>scope</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<name>var</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
<!-- 查询数据库的表并输出 -->
<tag>
<name>query</name>
<tag-class>com.dkt.tag.QueryTag</tag-class>
<body-content>empty</body-content>
<attribute>
<name>tableName</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
</taglib>
三,jsp
index.jsp 开启服务器,直接访问项目下的index.jsp页面即可显示自定义标签
在jsp页面导入自定义标签
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@page import="com.dkt.entity.UserInfo"%>
<%@ taglib uri="hello" prefix="hello" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>"> <title>My JSP 'index.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head> <body> <hello:hello format="yyyy-MM-dd HH:mm:ss a"/><br/>
<hr/>
formy:<hello:formy end="10" var="item1" start="1">
${item1 }----
</hello:formy>
<hr/>
iterator:<%
ArrayList list = new ArrayList();
list.add(new UserInfo(0,"小白","123456","",""));
list.add(new UserInfo(1,"小白111","353456","",""));
list.add(new UserInfo(2,"小白222","532456","",""));
list.add(new UserInfo(3,"小白333","532356","",""));
list.add(new UserInfo(4,"小白444","123536","","")); request.setAttribute("list",list);
%>
<hello:iteratormy var="item2" scope="request" list="${list}">
${item2.name}+++${item2.password }<br/>
</hello:iteratormy>
<hr/> <hello:query tableName="goods_table2"/>
<hr> </body>
</html>
四,web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
java:tag 自定义标签应用的更多相关文章
- 杂项-Java:自定义标签
ylbtech-杂项-Java:自定义标签 1.返回顶部 1. 一般我们说自定义标签是指JSP自定义标签.自定义标签在功能上逻辑上与javaBean 类似,都封装Java 代码.自定义标签是可重用的组 ...
- java JSP自定义标签
来至: http://blog.csdn.net/jiangwei0910410003/article/details/23915373 http://blog.csdn.net/jiangwei09 ...
- Java Web 自定义标签
1. 自定义标签 由于在JSP页面中直接嵌入Java代码会导致页面开起来非常混乱,不方便和美工等配合工作,为此,JSP提供了自定义标签技术,可以代替直接嵌入Java代码的方式提供动态逻辑,但自定义 ...
- Java jsp 自定义标签
1 自定义标签 1.1 引入 需求: 向浏览器输出当前客户的IP地址 (只能使用jsp标签) 1.2 第一个自定义标签开发步骤 1)编写一个普通的java类,继承SimpleTagSupport类,叫 ...
- 权限管理(java+struts2(自定义标签)实现)--------->全代码演示
地址:http://blog.chinaunix.net/uid-24343152-id-3673026.html 最近由于项目不是很紧所以总结了之前做了n遍的权限管理功能.以便之后系统copy之用. ...
- jsp tld 的tag 自定义标签扩展
引入方式 <%@ taglib prefix="bgt" uri="/WEB-INF/tlds/bgt.tld" %> 写法示例如下: <?x ...
- Java Spring Boot VS .NetCore (十一)自定义标签 Java Tag Freemarker VS .NetCore Tag TagHelper
Java Spring Boot VS .NetCore (一)来一个简单的 Hello World Java Spring Boot VS .NetCore (二)实现一个过滤器Filter Jav ...
- [Java] JSP笔记 - 自定义标签
自定义标签的创建步骤: 自定义标签的四大功能: 自定义标签的类结构: 在 1.0 中呢, 可以将 <body-content> 的值设置为 JSP, 2.0中则不允许在自定义标签体中出现j ...
- jsp如何自定义tag的标签库?
虽然和上一次的使用自定义的tld标签简化jsp的繁琐操作的有点不同,但是目的也是一致的.自定义tag比较简单. 1.新建tag标签 在WEB-INF目录下新建一个tags的文件夹,是自定义tag标签的 ...
随机推荐
- poj2479 Maximum sum
http://poj.org/problem?id=2479 题目大意:给定一组n个整数:a ={a1, a2,…,我们定义一个函数d(a)如下: 你的任务是计算d(A).输入由T(<=30)测 ...
- 再看javascript执行上下文、变量对象
突然看到一篇远在2010年的老文,作者以章节的形式向我们介绍了ECMA-262-3的部分内容,主要涉及到执行上下文.变量对象.作用域.this等语言细节.内容短小而精悍,文风直白而严谨,读完有酣畅淋漓 ...
- [bug]微信小程序使用 <scroll-view> 和 box-shadow 引起页面抖动
背景 为了实现点点点动态loading效果,并且方便使用(只需要给一个空元素加一个.loading),有如下代码: .loader { background-color: #fff; font-siz ...
- python基础知识input到while循环
j周笔记 输入与输出 1.输入 input ('请输入内容')= 字符串 2.输出 print(输出到控制台) 变量vairable 变量就是相当于我们人的名字 1.名字 ...
- 构建RequestDelegate管道
1. 创建 Context.cs using System; using System.Threading.Tasks; namespace MyPipeline { public class Con ...
- .Net Core命令行配置-配置介绍
1.使用VS2017 创建一个控制台应用程序,选中控制台应用(.NET Core) 2. 使用程序包管理控制台键入 Install-Package Microsoft.AspNetCore -Vers ...
- C# - 反射与编译
编译 首先了解下,如何区分编译生成的 .dll的版本方法1:ILSpy反编译工具 通过 assembly属性,release版本没有或仅有如下一种属性 [assembly: Debuggable(De ...
- POJ 1111
#include<iostream> #define MAXN 30 using namespace std; char _m[MAXN][MAXN]; bool mark[MAXN][M ...
- 维特比算法(Viterbi)-实例讲解(暴力破解+代码实现)
1.简介 维特比算法是一个通用的求序列最短路径的动态规划算法,也可以用于很多其他问题,比如:文本挖掘.分词原理.既然是动态规划算法,那么就需要找到合适的局部状态,以及局部状态的递推公式.在HMM中,维 ...
- 下拉菜单;手风琴;九宫格的Jquery的使用实例
下拉菜单;手风琴;九宫格的Jquery的使用实例 1.下拉菜单 效果如图: 代码如下: <!DOCTYPE html> <html lang="en"> & ...