JSTL

1.什么是JSTL
apache对EL表达式的扩展(也就是说JSTL依赖EL)
JSTL是标签语言!

2.JSTL标签库
一共有四大标签库
core:核心标签库,学习的重点
fmt:格式化标签库
sql:数据库标签库,已经过时
xml:xml标签库,已经过时

3.使用taglib指令导入标签库
除了JSP动作标签外,使用其他第三方的标签库都需要导包
在使用标签的JSP页面中使用taglib指令导入标签库

下面是导入JSTL的core标签库

  <%@taglib prefix="c" uri="http://java.sun.com/jstl/core" %>

prefix=”c”:指定标签库的前缀,这个前缀可以随便给值,但大家都约定俗成使用c
uri=”xx”:指定标签库的uri,它不一定是真实存在的网址,但他可以让JSP找到描述他的文件

core库的c标签

  • out和set
 <c:out value="${a}" default="xxx" escapeXml="false"/>
    -----------
 <c:set var="a" value="hello" scope="request">

相当于设置request.setAttribute(”)
默认值为page,可选有page,request,session,application

  • remove

    <c:remove var="a" scope="page"/>如果不指定域,那就是删除所有域中为a的数据

  • url

    value:指定一个路径,会自动添加项目名
    var:本来要输出的,和scope一起保存url

      <c:url value="/index.jsp"/>

子标签:用来给Url后面添加参数

     <c:url value="/index.jsp">
       <c:param name="username" value="章"/>

可以对参数进行url编码

例子

     <a href="<c:url value="/jsp/b.jsp">
         <c:param name="d" value="陈"/>
       </c:url>">点击到b.jsp</a>

逻辑标签

  • if

    if标签的test属性必须是一个boolean类型的值,如果test的值为true,那么执行if标签的内容,否则不执行

    <c:set var="a" value="hello"/>
    <c:if test="${not empty a}">
       <c:out vlaue="${a}"/>
    </c:if>
  • choose 对应java中的if else中的else
  <c:set var="score" value="${param.score}"/>
    <c:choose>
      <c:when test="${score>100||scope<0">错误的分数</c:when>
      <c:when test="${score>=90"}>A级</c:when>
      <c:when test="${score>=80"}>B级别</c:when>
      <c:otherwise>...</c:otherwise>
      </c:choose>

例子
访问页面时候携带参数?name=chenchenchen即可

   <c:if test="${empty param.name}">
   <c:out value="空"/>
   </c:if>
   ....
   <c:choose>
   <c:when test="${not empty param.name}">
   <c:out value="空"/>
   </c:when>
   <c:otherwise>
   <c:out value="不空"/>
  • forEach

    它用来循环遍历数组、集合
    她还可以用来计数方式来循环

   <c:forEach var="i" begin="1" end="10">
   ${i}</br>
   </c:forEach>

当然还可以调步长
属性:
var表示循环变量
begin:设置循环变量从几开始
end:设置循环变量到几结束
step:设置步长 step=”3”

items 表示遍历谁

  <c:forEach items="${strs}" var="str">
     ${str}<br/>
  </c:forEach>

forEach中的循环状态
可以使用一个varstatus来创建循环状态变量!
count:个数
index:下标
first:是否为第一个元素
last:是否为最后一个元素
current:当前元素

<%
   Map map=new HashMap();
   map.put("x","coco");
   map.put("y","caoxi");
   map.put("z","cyl");
   request.setAttribute("map", map);
%>
  <c:forEach items="${map}" var="e" varStatus="s">
  s.count:${s.count}&nbsp;&nbsp;
  s.index:${s.index}&nbsp;&nbsp;
  first:${s.first}<br>
  </c:forEach>
  • fmt标签

    时间标签
    <fm:formatDate value="${date }" pattern="yyyy-MM-dd HH:mm:ss"/>

    Number标签

<fm:formatNumber value="3333.3346" pattern="0.00000"></fm:formatNumber>不足会补充0
  <fm:formatNumber value="3333.3346" pattern="#.#####"></fm:formatNumber>不会补充

 
4.自定义标签

无标签体

  • 1.步骤

    标签处理类,标签也是一个对象,也需要类
    tld文件,他是一个xml
    页面中使用<%@taglib%>来指定tld文件的位置

  • 2.标签处理类

    SimpleTag接口
    void doTag():每次执行标签都会调用这个方法
    JspTag getParent() 返回父标签
    void setParent(JspTag) 设置父标签
    void setJspBody(JspFragment) 设置标签体
    void setJspContext(JspContext) 设置JSP上下文对象,它儿子是pageContext

    例子

   public class MyTag implements SimpleTag {
   private PageContext pageContext;
   private JspFragment body;
    @Override
    public void doTag() throws JspException, IOException {
       pageContext.getOut().print("这是陈陈的标签");
    }

    @Override
    public JspTag getParent() {
        return null;
    }

    @Override
    public void setJspBody(JspFragment jspbody) {
        this.body=jspbody;

    }

    @Override
    public void setJspContext(JspContext jspcontext) {
        this.pageContext=(PageContext)jspcontext;
    }

    @Override
    public void setParent(JspTag arg0) {
    }
}

zidingyi.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_0.xsd"
  version="2.0">

  <tlib-version>1.0</tlib-version>
  <short-name>coco</short-name>
  <uri>http://chenyalan/2017/tld"</uri>

  <tag>
     <name>myT</name>
     <tag-class>com.cn.jstl.MyTag</tag-class>
     <body-content>empty</body-content>
  </tag>
  </taglib>

jsp
引入

<%@ taglib prefix="c" uri="/WEB-INF/tlds/zidingyi.tld"%>

  <c:myT/>

输出:这是陈陈的标签

还有另外一个继承类

public class MyTag2 extends SimpleTagSupport {
    @Override
    public void doTag() throws JspException, IOException {
    this.getJspContext().getOut().print("接口");
    }
}

有标签体

  • 标签体内容

    empty:无标签体
    JSP:jsp2.0已经不再支持这个类型了
    scriptless:只能是el表达式,也可以是其他的标签
    tagdependent:标签体内容不会被执行,而是直接被赋值给标签处理类

    MyTag3.java

public class MyTag3 extends SimpleTagSupport {

    @Override
    public void doTag() throws JspException, IOException {
      Writer out=this.getJspContext().getOut();//获取当前Jsp页面的输出流
      out.write("*********************************<br>");
      this.getJspBody().invoke(out);
      out.write("<br>*********************************<br>");
    }

}

继续在tld添加

 <tag>
     <name>myT3</name>
     <tag-class>com.cn.jstl.MyTag3</tag-class>
     <body-content>scriptless</body-content>
  </tag>

jsp

 <%
   request.setAttribute("xxx","zzz");
 %>
  <c:myT3>
   ${xxx}
  </c:myT3>

不执行标签下面的标签
       如果想在执行了自定义标签后,不再执行JSP页面下面的东西,那么就需要在doTag()方法中使用SkipPageException

throw new SkipPageException();

自定义标签之有属性的标签

  • 步骤
    1.给你的标签处理类添加属性
    2.在tld文件中对属性进行配置

 public class MyTag4 extends SimpleTagSupport{
    private boolean test;
    public void setTest(boolean test){
        this.test=test;
    }
    @Override
    public void doTag() throws JspException, IOException {
        if(test){
       this.getJspBody().invoke(null);  //如果传递的输出为null,表示使用的就是当前的out
    }
    }
}

继续在tld里添加

    <tag>
     <name>myT4</name>
     <tag-class>com.cn.jstl.MyTag4</tag-class>
     <body-content>scriptless</body-content>
     <!-- 开始部署属性 -->
     <attribute>
       <name>test</name>
       <required>true</required>
       <rtexprvalue>true</rtexprvalue>
     </attribute>
  </tag>

jsp中使用

 <c:myT4 test="${empty param.xxx}">
 <br>dddddd
 </c:myT4>

结果
xxxdds 接口
dddddd

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值