java web 学习笔记 - JSP标签编程
1.JSP标签编程简介
标签编程在开发中并不常见,主要是为了更好的理解struts等框架的标签而打基础,完善相关知识体系。
标签编程分为:
一个继承自TagSupport的标签类,一个在WEB-INFO文件夹下的标签库文件.tld(该库文件主要用来将标签名称与标签类对应起来),
需要在web.xml中编辑标签的URL主要与上面生成的标签库文件对应,在JSP中引用URL,并在文件体中 引用该标签名。
注意:如果提示相应的包找不到,可以在tomcat的lib文件夹下找相应的lib文件,并拷贝到jdk/jre/lib/ext文件夹中。
==========================================源代码 ===========================================================
a.继承自TagSuppor的的标签类
package cn.liys.taglib;
import javax.servlet.jsp.*;
import javax.servlet.jsp.tagext.*;
public class HelloTag extends TagSupport{
public int doStartTag() throws JspException{ //在标签开始时执行
JspWriter out =super.pageContext.getOut();
try {
out.println("<h1>Hello World!</h1>");
}catch (Exception e){
}
return TagSupport.SKIP_BODY;
}
}
b.编写一个标签库文件 .tlb
<?xml version="1.0" encoding="UTF-8"?>
<taglib xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_1.xsd"
version="2.1">
<tlib-version>1.0</tlib-version>
<short-name>firsttag</short-name>
<tag>
<name>hello</name> //标签名
<tag-class>cn.liys.taglib.HelloTag</tag-class> //与标签类对应
<body-content>empty</body-content>//标签体为空
</tag>
</taglib>
c.在web.xml中将标签库文件与标签URL对应
<jsp-config>
<taglib>
<taglib-uri>hello_tag</taglib-uri> //标签库名
<taglib-location>/WEB-INF/hellotag.tld</taglib-location> //标签库的路径
</taglib>
</jsp-config>
d.在jsp文件中将该标签拿来引用
<%@page contentType="text/html" pageEncoding="GBK"%>
<%@taglib prefix="mytag" uri="hello_tag"%> //web.xml中的标签库名
<html>
<head>
</head>
<body>
<h1><mytag:hello/></h1> //标签库中的标签名
</body>
</html>
*******************************************************************************************************************************
2.定义有属性的标签
在标签类中,设置属性,并编写getter,setter方法,在doStartTag中即可使用该属性。
ackage cn.liys.taglib;
import java.util.*;
import java.text.*;
import javax.servlet.jsp.*;
import javax.servlet.jsp.tagext.*;
public class DateTag extends TagSupport{
private String format;
public int doStartTag() throws JspException{
SimpleDateFormat sdf = new SimpleDateFormat(this.format);
JspWriter out =super.pageContext.getOut();
try {
out.println(sdf.format(new Date()));
}catch (Exception e){
}
return TagSupport.SKIP_BODY;
}
public void setFormat(String fmt){
this.format = fmt;
}
public String getFormat(){
return this.format;
}
}
在WEB-INF文件夹中生成 标签库文件 datetag.tld
<?xml version="1.0" encoding="UTF-8"?>
<taglib xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_1.xsd"
version="2.1">
<tlib-version>1.0</tlib-version>
<short-name>firsttag</short-name>
<tag>
<name>date</name>
<tag-class>cn.liys.taglib.DateTag</tag-class>
<body-content>empty</body-content>
<attribute> <!--注意需要在tag中设置属性-->
<name>format</name>
<required>true</required> <!--必输项-->
<rtexprvalue>true</rtexprvalue><!--支持表达式输出-->
</attribute>
</tag>
</taglib>
在web.xml中进行url与标签库文件的对应配置
......
<jsp-config>
<taglib>
<taglib-uri>hello_tag</taglib-uri>
<taglib-location>/WEB-INF/hellotag.tld</taglib-location>
</taglib>
<taglib>
<taglib-uri>date_tag</taglib-uri>
<taglib-location>/WEB-INF/datetag.tld</taglib-location>
</taglib>
</jsp-config>
......
在jsp页面中使用
<%@page contentType="text/html" pageEncoding="GBK"%>
<%@taglib prefix="mytag" uri="date_tag"%>
<html>
<head>
</head>
<body>
<h1><mytag:date format="yyyy-MM-dd HH:mm:ss.SSS"/></h1>
</body>
</html>
*******************************************************************************************************************************
3.标签体的执行
a. 通过标签类的doStartTag函数返回值来决定是否执行标签体。
return TagSupport.EVAL_BODY_INCLUDE; //执行标签体
return TagSupport.SKIP_BODY; //跳过标签体
b.配置对应的标签库文件.tlb(标签,标签名,标签对应的类,标签内容 JSP, 属性....)
...
<tag>
<name>present</name>
<tag-class>cn.liys.taglib.MldnTag</tag-class>
<body-content>JSP</body-content>
<attribute>
<name>name</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<name>scope</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
...
c. web.xml(uri 与 库文件名对应)
<jsp-config>
<taglib>
<taglib-uri>hello_tag</taglib-uri>
<taglib-location>/WEB-INF/hellotag.tld</taglib-location>
</taglib>
</jsp-config>
d. jsp中的代码片段
<%@ taglib prefix="mytag" uri="mldn_tag"%>
.......
<mytag:present name="username" scope="<%=scope%>"> <!--根据属性执行标签类,来判断是否执行标签体-->
<h2><%=scope%>范围存在属性,内容是:“${sessionScope.username}”</h2>
</mytag:present>
.......
*******************************************************************************************************************************
4.迭代标签
通过标签编程,实现list<?>对象的迭代。
判断标签类(判断是否要进行下一步迭代,同上),迭代标签类,标签库文件,web.xml,JSP
迭代标签类: //一下为关键代码段
......
private Iterator<?> iter = null ;
doStartTag( ){
Object value = null ;
....
value = super.pageContext.getAttribute(this.name,PageContext.PAGE_SCOPE) ;
....
if(value!=null && value instanceof List<?>){
this.iter = ((List<?>)value).iterator() ;
if(iter.hasNext()){
// 将属性保存在page属性范围之中
super.pageContext.setAttribute(this.id,iter.next()) ;
return TagSupport.EVAL_BODY_INCLUDE ; //执行标签体
} else {
return TagSupport.SKIP_BODY ;
}
} else {
return TagSupport.SKIP_BODY ;
}
}
public int doAfterBody() //实现迭代循环
throws JspException{
if(iter.hasNext()){
// 将属性保存在page属性范围之中
super.pageContext.setAttribute(this.id,iter.next()) ;
return TagSupport.EVAL_BODY_AGAIN ; // 反复执行doAfterBody()方法
} else {
return TagSupport.SKIP_BODY ;
}
}
....
标签库文件与web.xml的配置同上,此处省略
iteratetag.jsp
<%@ taglib prefix="mytag" uri="mldn"%>
。。。
<% // 此代码只是为了测试,实际中此部分应该由servlet传递
List<String> all = new ArrayList<String>() ;
all.add("www.MLDN.cn") ;
all.add("www.MLDNJAVA.cn") ;
all.add("www.JIANGKER.com") ;
request.setAttribute("all",all) ; // 将内容保存在标签执行
%>
<mytag:present name="all" scope="request">
<mytag:iterate id="url" name="all" scope="request">
<h3>网站:${url}</h3>
</mytag:iterate>
</mytag:present>
*******************************************************************************************************************************
4.简单标签库 SimpleTagSupport
不再需要doStartTag() doAfterBody()等函数,直接一个doTag()函数即可。
public class SimpleDateTag extends SimpleTagSupport {
private String format ; // 日期格式化属性
...
public void doTag() throws JspException,IOException{
SimpleDateFormat sdf = new SimpleDateFormat(this.format) ;
try{
super.getJspContext().getOut().write(sdf.format(new Date())) ;
}catch(Exception e){}
}
...}
Iterator 标签类:
...
Object value = null ;
value = super.getJspContext().getAttribute(this.name,PageContext.PAGE_SCOPE) ;
.....
if(value != null && value instanceof List<?>){
Iterator<?> iter = ((List<?>) value).iterator() ;
while(iter.hasNext()){
super.getJspContext().setAttribute(id,iter.next()) ;
super.getJspBody().invoke(null) ;
}
}
...
jsp页面使用该标签库
...
<% //此处只是测试用,属性应该是servlet返回的
List<String> all = new ArrayList<String>() ;
all.add("www.MLDN.cn") ;
all.add("www.MLDNJAVA.cn") ;
all.add("www.JIANGKER.com") ;
request.setAttribute("all",all) ;
%>
<h1>
<mytag:simpleiterate id="url" name="all" scope="request">
<h2>网站:${url}</h2>
</mytag:simpleiterate>
</h1>
...
*******************************************************************************************************************************
4.标签的动态属性
以一个动态属性相加为例子,tag标签中可以设置n个float 属性,页面将输出这些值相加的结果。
动态属性标签类的片段:
public class DynamicAddTag extends SimpleTagSupport implements DynamicAttributes { //继承简单标签支持类,实现动态属性接口类
private Map<String,Float> num = new HashMap<String,Float>() ; //申明一个Map集合
public void doTag() //根据 setDynamicAttribute 函数取出的动态属性,相加,将结果输出到页面上
throws JspException,
IOException{
Float sum = 0.0f ;
Iterator<Map.Entry<String,Float>> iter = this.num.entrySet().iterator() ;
while(iter.hasNext()){
Map.Entry<String,Float> value = iter.next() ;
sum += value.getValue() ; // 取出每一个内容
}
super.getJspContext().getOut().write(sum + "") ;
}
public void setDynamicAttribute(String uri,
String localName,
Object value)
throws JspException{
//循环 取出设置的每一个动态属性,都保存在Map集合里
num.put(localName,Float.parseFloat(value.toString())) ;
}
}
标签库文件.tld中增加标签配置内容
<tag>
<name>add</name>
<tag-class>org.lxh.tagdemo.DynamicAddTag</tag-class>
<body-content>empty</body-content>
<dynamic-attributes>true</dynamic-attributes> <!--接收动态标签-->
</tag>
web.xml内容省略,uri与标签库文件对应
jsp内容
...
<%@ taglib prefix="mytag" uri="mldn"%>
...
<h2>计算结果:
<mytag:add num1="11.2" num2="12.3" num3="13.5"/>
</h2>
</body>
</html>
java web 学习笔记 - JSP标签编程的更多相关文章
- java web学习笔记-jsp篇
1.java web简介 1.1静态页面与动态页面 表现形式 所需技术 静态网页 网页内容固定,不会更新 html,css 动态网页 网页内容由程序动态显示,自动更新 html,css,DB,ja ...
- java web 学习笔记 jsp内置对象
jsp2 表达式语言的内置对象 使用方式${object.attributename} 或者${object["attributename"]} pageContext pageS ...
- Java Web学习笔记--JSP for循环
JSP for循环 <%@ page language="java" contentType="text/html; charset=UTF-8" %&g ...
- java web 学习笔记 - jsp用的文件上传组件 SmartUpload
---恢复内容开始--- 1. SmartUpload 此控件在jsp中被广泛的使用,而FileUpload控件主要是用在框架中 2. 如果想要使用,需要在tomcat的lib目录中,将SmartUp ...
- Java Web学习笔记之---JSP
Java Web学习笔记之---JSP (一)JSP常用语法 (1)HTML注释 <!--所要注释的内容 --> 在客户端显示一个注释. (2)隐藏注释 <%--所要注释的内容--% ...
- JAVA Web学习笔记
JAVA Web学习笔记 1.JSP (java服务器页面) 锁定 本词条由“科普中国”百科科学词条编写与应用工作项目 审核 . JSP全名为Java Server Pages,中文名叫java服务器 ...
- [原创]java WEB学习笔记66:Struts2 学习之路--Struts的CRUD操作( 查看 / 删除/ 添加) 使用 paramsPrepareParamsStack 重构代码 ,PrepareInterceptor拦截器,paramsPrepareParamsStack 拦截器栈
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
- Java Web学习笔记之---EL和JSTL
Java Web学习笔记之---EL和JSTL (一)EL (1)EL作用 Expression Language(表达式语言),目的是代替JSP页面中复杂的代码 (2)EL表达式 ${变量名} ( ...
- [原创]java WEB学习笔记75:Struts2 学习之路-- 总结 和 目录
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
随机推荐
- Rod Johnson
Spring Framework创始人,著名作者. Rod在悉尼大学不仅获得了计算机学位,同时还获得了音乐学位.更令人吃惊的是在回到软件开发领域之前,他还获得了音乐学的博士学位. 有着相当丰富的C/C ...
- POJ 3104 Drying (二分+精度)
题目链接:click here~~ [题目大意]: 题意:有一些衣服,每件衣服有一定水量,有一个烘干机,每次能够烘一件衣服,每分钟能够烘掉k单位水. 每件衣服没分钟能够自己主动蒸发掉一单位水, 用烘干 ...
- 记录下docker的常用命令
常用命令: docker images:查看本地所有镜像 docker pull centos:7:从仓库中获取镜像 docker ps:列出所有正在运行的容器 docker ps -a:列出所有容 ...
- 如何写好react组件
react 组件方面: 总结 React 组件的三种写法 及最佳实践 [涨经验] React组件编写思路(一) 使用react-router实现单页面应用时设置页面间过渡的两种方式 [翻译]基于 Cr ...
- Mac mysql 运行sql文件中文乱码的问题
别再傻傻的改什么mysql的编码格式了. 是.sql文件的编码有问题,把sql文件的编码格式改成utf-8就行了. mac怎么修改呢? vscode最爽了. 用vscode打开.sql文件,然后点右下 ...
- 深入了解以太坊虚拟机第4部分——ABI编码外部方法调用的方式
在本系列的上一篇文章中我们看到了Solidity是如何在EVM存储器中表示复杂数据结构的.但是如果无法交互,数据就是没有意义的.智能合约就是数据和外界的中间体. 在这篇文章中我们将会看到Solidit ...
- Are you sure you want to continue connecting etc ssh ssh_config StrictHostKeyChecking no
Are you sure you want to continue connecting (yes/no) 每次ssh 进入一台新机器都会跳出如下的提示: The authenticity of ho ...
- (转)Javascript中console.log()用法
原文地址应该是这个吧:http://my.oschina.net/junn/blog/142728 注意:必须要提前打开IE的开发者模式才能看到输入 否则就会报错. IE下可以这个判断: if (co ...
- Rails bootstrap导入
创建: 2018/03/24 完成: 2018/03/24 适用于Sass, Scss. Less的自己网上搜吧 如何判断是不是Sass/Scss?项目里搜 gem 'sass-rails' ,gem ...
- bzoj 1717: [Usaco2006 Dec]Milk Patterns 产奶的模式【后缀自动机】
就是后缀自动机的板子嘛..构造完自动机之后拓扑一下,记录size,对于size大于k的点和ans取max #include<iostream> #include<cstdio> ...