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标签的 ...
随机推荐
- git install
wget -O git-master.zip https://codeload.github.com/git/git/zip/master unzip git-master.zip cd git-ma ...
- 安装Apache时端口号被占用解决方案
有些朋友的电脑在安装Apache是会遇到端口冲突的问题.以下是一种解决方案 1.打开控制面板的管理工具 2.打开IIS 3.观察网站下的端口号 4.点击绑定 5.更改端口号 6.重新启动即可
- Ubuntu“无法打开锁文件(Could not get lock)”问题解决
用apt-get安装软件时提示: 无法获得锁 /var/lib/dpkg/lock - open(11:资源暂时不可用) 无法锁定管理目录(/var/lib/dpkg/),是否有其他进程正占用它? 其 ...
- 【xsy1131】tortue FFT
题目大意: 一次游戏要按N个按键.每个按键阿米巴有P[i]的概率按错.对于一串x个连续按对的按键,阿米巴可以得分 $f(x)=tan(\dfrac{x}{N})\times e^{arcsin(0.8 ...
- 【bzoj3224】【Tyvj 1728】 普通平衡树 树状数组
您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作:1. 插入$x$数2. 删除$x$数(若有多个相同的数,因只删除一个)3. 查询$x$数的排名(若有多个相同的数,因输出最小 ...
- Ubuntu之tar与curl操作
1,压缩备份: tar cfvj /tmp/test.tar.bz2 /tmp/test tar cfvz /tmp/test.tar.gz /tmp/test tar xfvj /tmp/tes ...
- (转)rootvg镜像
步骤1:查看当前还未加入到其它vg的可用PV # lspv hdisk0 00027c6a0507fe17 rootvg ...
- linux 可执行文件与写操作的同步问题
当一个可执行文件已经为write而open时,此时的可执行文件是不允许被执行的.反过来,一个文件正在执行时,它也是不允许同时被write模式而open的.这个约束很好理解,因为文件执行和文件被写应该需 ...
- java数据结构之递归算法
概述程序调用自身的编程技巧称为递归( recursion).递归做为一种算法在程序设计语言中广泛应用.递归有直接递归和间接递归•直接递归:函数在执行过程中调用本身.•间接递归:函数在执行过程中调用其它 ...
- C/C++ -- Gui编程 -- Qt库的使用 -- 信号与槽 -- 欢迎界面
程序运行先显示一个对话框,确定进入主程序 1.新建Qt工程,类MyWidget,基类QWidget 2.新建设计师界面类MyDialog,基类QDialog 3.-----main.cpp----- ...