文档章节

JSTL自定义标签和核心标签

day戴
 day戴
发布于 2014/06/04 19:54
字数 1807
阅读 2559
收藏 11
点赞 1
评论 0

自定义标签:

jsp中自定义标签使用形式
代码:
1<itcast:showtime/>
itcast 为标签的名字,即tld配置文件的名称
showtime为tld配置文件中tag标签中的name值

2书写java类:
public class ShowTime extends SimpleTagSupport {

 public void doTag() throws JspException, IOException {
  Date now=new Date();
  PageContext pc=(PageContext)getJspContext();   //继承SimpleTagSupport的类中有jspContext的对象,这里强转成pagecontext的对象
  pc.getOut().write(now.toLocaleString());
 }
}

 

java类需要实现simpleTag接口,我们一把继承SimpleTagSupport类
覆盖doTag方法
java类中封装需要执行的java代码即可

3书写配置文件 tld文件
<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>itcast</short-name>  //name和uri只是和jsp建立联系,并没有实际意义
    <uri>www.itcast.cn</uri>
     <tag>
        <name>showtime</name>        //标签的方法名
        <tag-class>text.jsp.ShowTime</tag-class>   //java类的全名
        <body-content>empty</body-content>     //开始标签和结束标签有没有内容
    </tag>
 </taglib>


simpleTag接口中的方法:
void doTag():由服务器调用。在JSP中遇到标签时调用。
JspTag getParent():由程序员调用。获取该标签的父标签对象。没有返回null

以下三个方法的共同特点:由服务器调用,在调用doTag之前就调完了。
void setJspBody(JspFragment jspBody):由服务器调用。传入标签的内容。
void setJspContext(JspContext pc):由服务器调用。传入当前页面的pageContext对象
void setParent(JspTag parent):由服务器调用。传入你的爹。没爹传入null

标签的实际作用:
获得主体内容并输出:
JspFragment jf=getJspBody();
jf.invoke(null);

简易写法:
getJspBody().invoke(null);

1 使得主体内容不显示
<body-content>scriptless</body-content>//主体内容为非脚本

2控制结束标签后的内容不执行
throw new SkipPageException();

3控制主体内容重复运行
在类中写入循环代码即可
循环输出主体内容代码体现:
jsp:<itcast:ShowFor count="5">saq</itcast:ShowFor>  //count为标签属性

itcast.tld:
<tag>
    <name>ShowFor</name>
    <tag-class>text.jsp.ShowFor</tag-class>
    <body-content>scriptless</body-content>
    //配置属性
    <attribute>   
    <name>count</name>//属性名
    <required>true</required>//是否必须输入属性值
    <rtexprvalue>true</rtexprvalue>//是否支持表达式
    </attribute>
</tag>

类:
public class ShowFor extends SimpleTagSupport {
 private int count;
 public void setCount(int count) {
  this.count = count;
 }


 public void doTag() throws JspException, IOException {
  for(int i=0;i<count;i++){
   getJspBody().invoke(null);//输出主体内容,当为null时,就输出主体内容
  }
 }

}


4获取主体内容,并操作主体内容后输出
public void doTag() throws JspException, IOException {
 //获取主体内容
 JspFragment jf=getJspBody();
 //将主体内容写入字符缓存
 StringWriter sw=new StringWriter();
 jf.invoke(sw);
 //调用string的大写转换方法
 String jfString=sw.getBuffer().toString();
 jfString=jfString.toUpperCase();
 //输出
 PageContext pc=(PageContext) getJspContext();
 pc.getOut().write(jfString);
}

 

body-content中的内容:
1 jsp 不考虑,传统标签处理类中
2 empty 传统标签和普通标签都能用,主体中不能有内容
3 scriptless 简单标签使用,要求主体中有内容,但不能有“<”“%”,可以有EL表达式,但不能有java表达式
4 tagdependent 简单标签使用,告诉类,主体标签中的为文本

 

实现if功能的标签:
类:
public class IfSimpleTag extends SimpleTagSupport{
 private Boolean test;

 public void setTest(Boolean test) {
  this.test = test;
 }
 public void doTag() throws JspException, IOException {
  if(test){
   getJspBody().invoke(null);
  }
 }
}

jsp:
<%session.setAttribute("user", "djw");%>
<itcast:if test="${SessionScope.user==null}">
<a href="#">登录</a>
</itcast:if>
<itcast:if test="${SessionScope.user!=null }">
<a href="#">注销</a>
</itcast:if>


实现ifelse功能:
jsp:
<%pageContext.setAttribute("gender", "man");%>
  <itcast:choose>
  <itcast:when test="${gender=='man'}">
   男性
  </itcast:when>
  <itcast:else>
   女性
  </itcast:else>
   </itcast:choose>
父标签类:

public class ChooseSimpleTage extends SimpleTagSupport {
 private Boolean flag=true;
 
 public Boolean getFlag() {
  return flag;
 }

 public void setFlag(Boolean flag) {
  this.flag = flag;
 }

 public void doTag() throws JspException, IOException {
   getJspBody().invoke(null);
 }
}

when类:
public class WhenSimpleTage extends SimpleTagSupport{
 private boolean test;
 
 public void setTest(boolean test) {
  this.test = test;
 }
 public void doTag() throws JspException, IOException {
  if(test){
   getJspBody().invoke(null);
   ChooseSimpleTage cst=(ChooseSimpleTage) getParent();
   cst.setFlag(false);
  }
 }
}
else类:
public class ElseSimpleTage extends SimpleTagSupport {

 public void doTag() throws JspException, IOException {
  ChooseSimpleTage cst=(ChooseSimpleTage) getParent();
  if(cst.getFlag()){
   getJspBody().invoke(null);
  }
 } 
}

for循环标签(简易)
jsp:
<body>
  <%
  List list=new ArrayList();
  list.add("aaa");
  list.add("bbb");
  list.add("ccc");
  pageContext.setAttribute("list", list);
  %>
 <itcast:for items="${list}" var="s">
  ${s}<br/>
 </itcast:for>
  </body>

 处理类:
 private List items;
 private String var;
 public void setItems(List items) {
  this.items = items;
 }
 public void setVar(String var) {
  this.var = var;
 }
 public void doTag() throws JspException, IOException {
  PageContext pc=(PageContext) getJspContext();
  if(items!=null){
   for(Object obj:items){
    pc.setAttribute(var, obj);
    getJspBody().invoke(null);
   }
  }
 }

 for循环增强版:
 jsp:
  <%
  Map map=new HashMap();
  map.put("a", "aaa");
  map.put("b", "bbb");
  map.put("c", "ccc");
  pageContext.setAttribute("map", map);
  %>
 <itcast:for2 items="${map.}" var="me">
  ${me.key}=${me.value}<br/>
 </itcast:for2>

 处理类:
 public class ForSimpleTage2 extends SimpleTagSupport {
 private Object items;
 private String var;
 private Collection collection=new ArrayList();
 public void setItems(Object items) {
  if(items instanceof List){
   collection=(Collection) items;
  }else if(items instanceof Map){
   collection=((Map) items).entrySet();
  }else if(items.getClass().isArray()){
  //基本类型数组不属于Object[],属于基本类型的数组,
  这里的处理方式一并处理了基本类型数组和Object[]类型的数组

   int len=Array.getLength(items);
   for(int i=0;i<len;i++){
    collection.add(Array.get(items, i));
   }
  }
 }
 public void setVar(String var) {
  this.var = var;
 }
 public void doTag() throws JspException, IOException {
  PageContext pc=(PageContext) getJspContext();
   for(Object obj:collection){
    pc.setAttribute(var, obj);
    getJspBody().invoke(null);
   }
 }
 
}

实现html转义的标签:
jsp代码:
 <%
pageContext.setAttribute("s", "<hr/>");
%>
<itcast:filter>
${s}
</itcast:filter>

处理类代码:
public class Filter extends SimpleTagSupport {

 public void doTag() throws JspException, IOException {
  StringWriter sw=new StringWriter();
  getJspBody().invoke(sw);
  String str=sw.getBuffer().toString();
  String new_str=filter(str);
  getJspContext().getOut().write(new_str);
 }

 private String filter(String message) {
   if (message == null)
             return (null);

         char content[] = new char[message.length()];
         message.getChars(0, message.length(), content, 0);
         StringBuilder result = new StringBuilder(content.length + 50);
         for (int i = 0; i < content.length; i++) {
             switch (content[i]) {
             case '<':
                 result.append("&lt;");
                 break;
             case '>':
                 result.append("&gt;");
                 break;
             case '&':
                 result.append("&amp;");
                 break;
             case '"':
                 result.append("&quot;");
                 break;
             default:
                 result.append(content[i]);
             }
         }
         return (result.toString());

 }
}
其中filter方法在tomcat中有例子代码,复制即可
 
 导入标签库:<%@ taglib uri="http://java.sun.com/jstl/core" prefix="c" %>
jsptlcore核心标签:
1   out:
<%
pageContext.setAttribute("s", "<hr/>");
%>
<c:out value="${s}" default="输入错误" escapeXml="true"></c:out>
 default:输入的对象无法找到时输出的值
 escapeXml:自动转义html符号,默认值为true

2 set标签:
<c:set value="上海" var="s" scope="page"></c:set>

3 设置javabean的属性:
<jsp:useBean id="person" class="jsp.core.Person"></jsp:useBean>
<c:set property="name" target="${person }" value="djw"></c:set>
${person.name}

4设置map的值:
<%
    Map map=new HashMap();
    map.put("a", "aaa");
    pageContext.setAttribute("map", map);
     %>
     <c:set property="b" value="bbb" target="${map }"></c:set>
     ${map.a}<br/>
     ${map.b }


5从指定域中删除数据

 <c:set var="s1" value="pp" scope="page"></c:set>
 <c:remove var="s1" scope="page"/>
 入股scope不设置,则为所有域范围

6 除咯i异常:
<c:catch>
    
</c:catch>

7 循环遍历:
<c:forEach items="" begin="" end="" step=""> 需要遍历的内容</c:forEach>
items:需要遍历的对象
begin:起始索引
end:结束索引
step: 遍历间隔 默认为1

foreach 遍历集合数组和表格集合:
<%
     List<Person> list=new ArrayList<Person>();
     list.add(new Person("djw","男","上海"));
     list.add(new Person("www","男","北京"));
     pageContext.setAttribute("p", list);
      %>
      <table border="1">
       <tr>
       <th>姓名</th>
       <th>性别</th>
       <th>城市</th>
       </tr>
       <c:forEach items="${p}" var="fp" varStatus="vs">
       //varStatus是指向一个对象,该对象记录着当前元素的一些信息
       //int getIndex  元素的索引
       //int getCount 元素的位数
       //boolean isFirst 是否是第一个元素
       //boolean isLast 是否为最后一个元素
       <tr>
       <td>
       ${fp.name}
       </td>
       <td>
       ${fp.gender}
       </td>
       <td>
       ${fp.city}
       </td>
       </tr>
       </c:forEach>
      </table>

8 遍历字符串标签:

 <%
pageContext.setAttribute("s", "2014-06-11");
%>
<c:forTokens items="${s }" delims="-" var="p">
${p}<br/>
</c:forTokens>

9 包含标签:
</c:forTokens>
<c:import url="/3.jsp"></c:import>       包含本应用中的地址
  <c:import url="http://www.baidu.com"></c:import> 包含外部地址

10转发:
 <c:redirect url="/3.jsp"></c:redirect>

11  url(这里完成了中文参数的编码和url的重写)
<c:url value="/3.jsp" var="url"></c:url>
<c:param name="username" value="djw"></c:param>
//上面语句相当调用了(
<%
pageContext.setAttribute("url", request.getContextPath()+"/3.jsp");
%>)这个语句
<a href="url"></a>

© 著作权归作者所有

共有 人打赏支持
day戴
粉丝 0
博文 46
码字总数 42402
作品 0
南汇
程序员
JavaWeb12-HTML篇笔记(二)

Ø 为什么学习JSTL: JSTL和EL结合 替换页面中<%%> Ø JSTL版本: JSTL1.0 :不支持EL表达式. JSTL1.1 和 1.2 :支持EL表达式. Ø JSTL的标签库:包含了五类标签. core(核心标签),fmt(国际化标签)...

我是小谷粒 ⋅ 05/28 ⋅ 0

web项目中web.xml的作用

每个javaEE工程中都有web.xml文件,那么它的作用是什么呢?它是每个web.xml工程都必须的吗? 一个web中可以没有web.xml文件,也就是说,web.xml文件并不是web工程必须的。 web.xml文件是用来...

ChinaHYF ⋅ 04/27 ⋅ 0

(一)SpringMVC之配置DispatcherServlet的一些坑

DispatcherServlet是SpringMVC的核心控制器,就像是SpringMVC的心脏,几乎所有的请求都会经过这个控制器,通过它,大大的降低了模块之间的耦合度。所有学SpringMVC的同学们第一步肯定都是先配...

Java攻城玩家 ⋅ 06/03 ⋅ 0

JSTL jar包依赖关系与版本差异

jsp中使用JSTL,需要哪些jar包 jstl.jar和standard.jar standard.jar是JSP标准标签库,和jstl.jar 1.0版本中一起使用, 但在jstl-1.2.jar就不再需要了...

bithup ⋅ 2017/04/12 ⋅ 0

JSP 学习总结---学习笔记

什么是JSP 1)为什么说,Servlet是一个动态Web开发技术呢? Servlet是基于服务端的一种动态交互技术, HttpServletRequest表示客户端到服务端的对象 HttpServletResponse表示服务端到客户端的...

知止内明 ⋅ 04/18 ⋅ 0

关于Tomcat配置域名的默认访问页面

近来需要上线一个对接支付宝支付的电商项目,需要去支付宝平台审核支付网站,所以需要配置正式域名的默认访问地址,折腾了一点时间,所以在这里记录一下。 1.配置80端口,在tomcat的server....

Nojur ⋅ 05/25 ⋅ 0

如何让JSP不解析类似#{}的特殊字符

我在使用JSP页面时发现如下问题,如果一个JSP页面中包含类似#{},${}等特殊字符的话(此类特殊字符包裹在 中),如果通过controller直接返回给该JSP页面,则该JSP页面可正常显示为#{}而不会去...

码上中国博客 ⋅ 04/24 ⋅ 0

thymeleaf、freemaker、jsp、html的理解?

大家好最近突然有点困惑了,thymeleaf、freemaker、jsp、html,大学时学习的是jsp,我就以为jsp跟html一样是一种前端表现一种界面,后来接触了freemaker现在学习springboot有接触了thymeleaf...

樱木花道VS康 ⋅ 05/27 ⋅ 0

JavaWeb开发比较重要的面试题

JavaWeb开发比较重要的面试题 1. 编码转换:怎样将GB2312编码的字符串转换为ISO-8859-1编码的字符串? 答:示例代码如下: String s1=”你好”; String s2=new String(s1.getBytes(“GB2312”...

xj_9264 ⋅ 05/06 ⋅ 0

【J2EE】之常用的接口和协议

前言 初接触J2EE,会遇到很多之前没有遇到过的术语,下面我们来简单地汇总一下这些接口和协议吧。 各大接口和协议详解 JDBC 1.定义:Java数据库连接 2.地位:用于Java应用程序连接数据库的标...

m18633778874 ⋅ 04/26 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

10个免费的服务器监控工具

监控你的WEB服务器或者WEB主机运行是否正常与健康是非常重要的。你要确保用户始终可以打开你的网站并且网速不慢。服务器监控工具允许你收集和分析有关你的Web服务器的数据。 有许多非常好的服...

李朝强 ⋅ 33分钟前 ⋅ 0

压缩工具之zip-tar

zip 支持目录压缩。使用yum安装zip包,使用yum安装unzip包 zip 1.txt.zip 1.txt #将1.txt文件压缩,新生成的压缩文件为1.txt.zip,原文件保留 zip -r 123.zip 123/ #-r对目录操作。将123/目录...

ZHENG-JY ⋅ 33分钟前 ⋅ 0

Dubbo @Activate注解使用和实现解析

Activate注解标识一个扩展是否被激活和使用,可以放在定义的类上和方法上,dubbo用它在SPI扩张类定义上,标识这个扩展实现激活的条件和时机,先看下定义: /** * Activate * <p/> * ...

哲别0 ⋅ 40分钟前 ⋅ 0

6.5 zip压缩工具 tar打包 打包并压缩

1.tar tar命令格式 [-zjxcvfpP] filename tar -z:表示同时用gzip压缩。 -j:表示同时用bzip2压缩。 -J:表示同时用xz压缩。 -x:表示解包或者解压缩。 -t:表示查看tar包里的文件。 -c:表示建...

oschina130111 ⋅ 42分钟前 ⋅ 0

Linux系统工程狮养成记

如今的社会,随着时代的发展,出现了很多职业,像电子类,计算机类的专业,出现了各种各样的工程师,有算法工程师,java工程师,前端工程师,后台工程师,Linux工程师,运维工程师等等,不同...

六库科技 ⋅ 48分钟前 ⋅ 0

Linux 机器的渗透测试命令备忘表

如下是一份 Linux 机器的渗透测试备忘录,是在后期开发期间或者执行命令注入等操作时的一些典型命令,设计为测试人员进行本地枚举检查之用。 此外,你还可以从这儿(https://gbhackers.com/c...

寰宇01 ⋅ 50分钟前 ⋅ 0

windows 安装java开发环境,配置jdk

下载jdk安装文件 链接:https://pan.baidu.com/s/1UEKPjnAdMqNj612B39Pfsg 密码:ipqx 如果javac无法使用 1,检查环境变量名称中是否有空格。。。,去除后即可 2,将JAVA_HOME替换为原始路径...

阿豪boy ⋅ 51分钟前 ⋅ 0

简析log4j的实现方式

刚加入新公司,对日志的要求比较严格,对此特意花了几天时间看了一下log4j的源码,大概了解了一下log4j的实现方式,总结如下: log4j的实现分为两个步骤:log4j.xml的加载,logger的使用 这里...

zdatbit ⋅ 今天 ⋅ 0

win环境下jdk7与jdk8共存配置

1.jdk安装包 jdk安装包 安装步骤略 2.jdk等配置文件修改 在安装JDK1.8时(本机先安装jdk1.7再安装的jdk1.8),会将java.exe、javaw.exe、javaws.exe三个文件copy到了C:\Windows\System32,这...

泉天下 ⋅ 今天 ⋅ 0

windows profesional 2017 build problem

.net framework .... https://stackoverflow.com/questions/43330915/could-not-load-file-or-assembly-microsoft-build-frameworkvs-2017...

机油战士 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部