jsp 自定义标签

来源:互联网 发布:大数据 编辑:程序博客网 时间:2024/06/05 08:39

自定义标签就是 用户自己定制可以使用的例如这样的标签<a></a>在.jsp 文件中使用。自定义标签由三个部分组成: java类(也可以说是servlet类) .tld文件 和 .jsp文件组成。.tld文件中定义的是自定义标签的格式类型。java类则是用来处理从jsp传来的一些信息,从而进行处理。jsp文件则是用来显示的页面。下面是我在课上的几个小例子:

<?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_0.xsd"
version="2.0">
<tlib-version>1.0</tlib-version><!-- 版本号 -->
<short-name>xzxy</short-name> 
<uri>http://www.xzxy.com/jsp/mytaglib</uri>

<tag>
<name>demo1</name>
<tag-class>cn.xzxy.tag.Demo1Tag</tag-class>
<!-- 标签主体内容的类型: 有主体内容scriptless JSP:有主体内容时使用,
但不能在简单标签中使用。JSP能出现啥,主体内容就能出现啥-->
<body-content>scriptless</body-content>
</tag>

<tag>
<name>demo2</name>
<tag-class>cn.xzxy.tag.Demo2Tag</tag-class>
<!-- 标签主体内容的类型:empty没有主体内容-->
<body-content>empty</body-content>
</tag>

</taglib>

taglib中定义的是文本类型的约束,也就是说只能写限定范围内的标签,这里使用的是XMLSchema-instance约束。   short-name用于和jsp页面上的prefix相联系。

uri是和jsp页面上的taglib uri="http://www.xzxy.com/jsp/mytaglib"向联系。  <tag></tag>里面则是自定义标签   name是标签的名字  和short-name一起连用 例如:

short-name 为xzxy  name 为 demo1  那么jsp页面上能够使用的标签就是<xzxy:demo1></xzxy:demo1> 。  <tag-class></tag-class>用于联系标签和java处理类 

<body-content></body-content>用于定义标签的类型比如单标签或者是双标签等。下面来看一下demo1 ,demo2对应的jsp页面:


<%@ taglib uri="http://www.xzxy.com/jsp/mytaglib"  prefix="xzxy" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>控制标签主体内容是否显示</title>
</head>
<body>
  我喜欢
  <hr>
   <xzxy:demo1>sss</xzxy:demo1>
   我喜欢你:<xzxy:demo2/>喜欢睡觉
  
</body>
</html>

对应的java处理类是:

demo1:

public class Demo1Tag extends SimpleTagSupport{
// private JspContext pc;
//
//会在doTag之前执行,由服务器把PageContext对象给你
// public void setJspContext(JspContext pc){
// this.pc = pc;
// }

//由服务器调用,在jsp页面中遇到对应的标签时
//不显示主题内容:啥都不做
public void doTag() throws JspException,IOException{
     
}
}

demo2:

package cn.xzxy.tag;


import java.io.IOException;


import javax.servlet.jsp.JspException;
import javax.servlet.jsp.SkipPageException;
import javax.servlet.jsp.tagext.SimpleTagSupport;


public class Demo2Tag extends SimpleTagSupport{
@Override
public void doTag() throws JspException, IOException {
// TODO Auto-generated method stub
throw new SkipPageException();
}
}

页面的运行结果为:

我喜欢


我喜欢你:

demo1标签对内容不做任何处理,原样输出。demo2中生成了异常,所以单标签之前的内容输出,而单标签之后的内容不输出。

下面是循环打印的标签:

jsp中的主要内容是:

<title>控制 主体内容 循环输出</title>
</head>
<body>

<xzxy:demo3>
?????
</xzxy:demo3>
</body>


对应的java类是:

public class Demo3Tag  extends SimpleTagSupport{
@Override
public void doTag() throws JspException, IOException {
// TODO Auto-generated method stub
/*
* JspFragment jf = getJspBody();//拿到主体内容的片段
* //拿到JspWriter JspWriter out = getJspContext().getOut();

* jf.invoke(out);//主体内容让指定的流输出
*/
// for(int i=0; i<10 ; i++){
// getJspBody().invoke(null);
// }
JspFragment jf = getJspBody();
JspWriter  out = getJspContext().getOut();
for(int i=0 ; i<10 ; i++){
jf.invoke(out);
}


}
}


页面的运行效果是:

????? ????? ????? ????? ????? ????? ????? ????? ????? ?????

将标签中的???打印了10遍 ,我简单解释一下java类中的处理内容 ,getJspBody()是获取jsp文件的主体,invoke(null)调用默认输出流进行输出的操作。

例3:

jsp文件中的内容:

<title>Insert title here</title>
</head>
<body>
<xzxy:demo4>abcdefg</xzxy:demo4>
</body>


对应的java类中的内容:

public class Demo4Tag extends SimpleTagSupport{

@Override
public void doTag() throws JspException, IOException {
// TODO Auto-generated method stub

//临时的带有缓存的输出字符流
StringWriter sw = new StringWriter();
//拿到主体内容
JspFragment jf = getJspBody();
jf.invoke(sw);

//从缓存中取出
String content = sw.getBuffer().toString();// abcdefg
//改为大写输出
JspWriter out = getJspContext().getOut();
out.write(content.toUpperCase());
}
}

这里是从缓存中拿到标签中的内容然后把内容转成大写然后输出,页面的运行效果如下:ABCDEFG

例4:

jsp文件的内容:

<body>
<!-- test标签属性 -->

<xzxy:if test="${1==1}">真</xzxy:if>
<xzxy:if test="${1==2}">假</xzxy:if>
<hr>
<%
pageContext.setAttribute("gender", "female");
%>
<xzxy:if test="${gender=='male'}">男</xzxy:if>
<xzxy:if test="${gender=='female'}">女</xzxy:if>
<hr>
<%
session.setAttribute("user", "段立志");
%>
<xzxy:if test="${sessionScope.user==null }">
<a href="">登陆</a>
<a href="">注册</a>
</xzxy:if>
<xzxy:if test="${sessionScope.user!=null}">
欢迎您:${sessionScope.user }
<a href="">注销</a>
</xzxy:if>
</body>

java类中的内容:

public class IfTag extends SimpleTagSupport{
private boolean test;
//由服务器调用,把页面上的标签的属性值注入进来
public void setTest(boolean test) {//基本类型会自动转换
this.test = test;
}
@Override
public void doTag() throws JspException, IOException {
// TODO Auto-generated method stub
if(test){
getJspBody().invoke(null);//输出主体内容
}
}
}


<xzxy:if test="${gender=='male'}">这里用这个标签判断某一个实体中的gender属性 然后将判断的boolean传到后台的java类中进行判断,然后是否进行下一步操作。java类中的部分操作我都已经标注了注释,所以我这里不再详细阐述。


还有一个小细节就是我之前产生了 The absolute uri: http://java.sun.com/jsp/jstl/core cannot 
be resolved in either web.xml or the jar files deployed with this 
application这样一个错误,我在百度上并没有找到对应的解决方案。后来我发现我把.tld文件写到project的lib文件夹里面了,所以出现了该错误。

如果有同学出现了同样的错误可以借鉴排除一下。关于自定义标签的作用,我想到的就是开发框架中的用途,自定义逻辑的标签可以提供给别人去使用。





页面的运行效果为:



原创粉丝点击