自定义标签就是 用户自己定制可以使用的例如这样的标签在.jsp 文件中使用。自定义标签由三个部分组成: java类(也可以说是servlet类) .tld文件 和 .jsp文件组成。.tld文件中定义的是自定义标签的格式类型。java类则是用来处理从jsp传来的一些信息,从而进行处理。jsp文件则是用来显示的页面。下面是我在课上的几个小例子:
version="2.0">
taglib中定义的是文本类型的约束,也就是说只能写限定范围内的标签,这里使用的是XMLSchema-instance约束。 short-name用于和jsp页面上的prefix相联系。
uri是和jsp页面上的taglib uri="http://www.xzxy.com/jsp/mytaglib"向联系。
short-name 为xzxy name 为 demo1 那么jsp页面上能够使用的标签就是
<%@ taglib uri="http://www.xzxy.com/jsp/mytaglib" prefix="xzxy" %>
我喜欢
我喜欢你:
对应的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中的主要内容是:
对应的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文件中的内容:
对应的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文件的内容:
<%
pageContext.setAttribute("gender", "female");
%>
<%
session.setAttribute("user", "段立志");
%>
登陆
注册
欢迎您:${sessionScope.user }
注销
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);//输出主体内容
}
}
}
还有一个小细节就是我之前产生了 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文件夹里面了,所以出现了该错误。
如果有同学出现了同样的错误可以借鉴排除一下。关于自定义标签的作用,我想到的就是开发框架中的用途,自定义逻辑的标签可以提供给别人去使用。
页面的运行效果为: