jsp 自定义标签

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


xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
version="2.0">
1.0
xzxy 
http://www.xzxy.com/jsp/mytaglib


demo1
cn.xzxy.tag.Demo1Tag

scriptless


demo2
cn.xzxy.tag.Demo2Tag

empty


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

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

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

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


<%@ taglib uri="http://www.xzxy.com/jsp/mytaglib"  prefix="xzxy" %>




控制标签主体内容是否显示


  我喜欢
 



   sss
   我喜欢你:喜欢睡觉
  


对应的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文件中的内容:

Insert title here


abcdefg


对应的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);//输出主体内容
}
}
}


这里用这个标签判断某一个实体中的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文件夹里面了,所以出现了该错误。

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





页面的运行效果为:



你可能感兴趣的:(jsp 自定义标签)