jsp_3 ( jstl)

一、jstl标签库

    1.JSTL概述
        apache提供的,依赖EL,导入jstl-1.2.jar
        四大库:
            core:核心库!!!
            fmt:格式化:日期、数字
            sql:过时了
            xml:过时了

  2.导入标签库
        jar包
        在jsp页面中格式:<%@taglib prefix="前缀" uri="路径"%> 

  3.core  -->  c标签

  (1)out和set
        <c:out>输出
        value:可以是字符串常量,也可以是EL表达式
        default:当要输出的内容为null时,会输出指定default的值
        escapeXml:默认值为true,表示转义
        <c:set>设置
        var:变量名
        value:变量值,可以是EL表达式
        scope:域,默认值为page!!!!
(2)remove
        <c:remove>:删除域变量
        var:变量名
        scope:如果不给出scope,删除所有xxx,如果给出scope,删除指定域的xxx
(3)url
        value:指定一个路径,它会在路径前面自动添加项目名
        <c:url value="/index.jsp"/>,它会自动输出/.../index.jsp

        子标签:<c:param>,用来给url后面加参数,例如:
        <c:url value="/index.jsp">
            <c:param name="username" value="张三"/> <!--可以对参数进行url编码-->
        </c:url>
        结果为:/.../index.jsp?username=%ED%J7%Q1%V7%Z7%Q2

        var:指定变量名,一旦添加了这个属性,那么url标签就不会再输出到页面,而是把生成的url保存到域中
        scope:它与var一起使用,用来保存url
(4)if:对应java中的if语句
        <c:if test="布尔类型">...</c:if>,当test为真时,执行标签体内容
(5)choose:它对应java中的jf..else if...else....

       <c:choose>
            <c:when test="">...</c:when>
            <c:when test="">...</c:when>
            <c:when test="">...</c:when>
            <c:when test="">...</c:when>
            <c:otherwise>...</c:otherwise>
        </c:choose>

(6)forEach
        它用来循环数组,集合,还可以用计数方式来循环

    for ( int i=0 ; i < 10 ; i++){
    }
    ----->
    <c:forEach var="i" begin="1" end="10" step="2">  step:设置步长
     ${i}
     </c:forEach>

     for(String str:s){
     }
     ----->
     <c:forEach items="${s}" var="str">
    ${str}
    </c:forEach>

    循环状态:
    可以使用varStatus来创建循环状态变量
    有如下属性:
        count:循环元素的个数
        index:循环元素的下标
        first:是否为第一个元素
        last:是否为最后一个元素
        current:当前元素
    <c:forEach items="${list}" var="element" varStatus="vs">
        ${element}<br/>${vs.last}
    </c:forEach>

4.fmt库

它是格式化库
<fmt:formatDate value="" pattern=""/>
value:指定一个Date类型的变量
pattern:指定输出的模板,例如:yyyy-MM-dd HH:mm:ss

<fmt:formatNumber value="${num1}" pattern="0.00"> 
    保留小数点后两位(会四舍五入),如果不足位数,则补0
<fmt:formatNumber value="${num1}" pattern="#.##"> 
    保留小数点后两位(会四舍五入),如果不足位数,不补0

5.自定义标签

(1)步骤
    标签处理类(标签也是一个对象,那么首先需要有类)
    tld文件,它是一个xml
    页面中使用<%@taglib%>来指定tld文件的位置
 (2)标签处理类
    SimpleTag接口
        void doTag():每次执行标签时都会调用这个方法
        JspTag getParent():返回父标签(非生命周期方法)
        void setParent(JspTag):设置父标签
        void setJspBody(JspFragment):设置标签体
        void setJspContext(JspContext):设置jsp上下文对象,它儿子是pageContext
        其中doTag()会在其他三个方法之后被调用
3.配置tld文件
    tld文件一般都放在WEB-INF之下,这样保证客户端访问不到

	<taglib version="2.1" xmlns="http://java.sun.com/xml/ns/javaee"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd">
	    <tlib-version>1.0</tlib-version>
	    <short-name>a</short-name>
	    <uri>http://hpsyche/tags/1.0</uri>
		<tlib-version>1.0</tlib-version>
		<short-name>a</short-name>
		<uri>http://hpsyche/tags/1.0</uri>
			<tag>
		        <name>myTag1</name>  //标签名称
		        <tag-class>MyTag1</tag-class> //标签处理类
		        <body-content>empty</body-content> //空标签
		    </tag>
    </taglib>

4.页面中指定tld文件位置
   <%@ taglib prefix="it" uri="http://hpsyche/tags/1.0"%>

5.进阶

    标签体内容
        empty:无标签
        JSP:jsp2.0已经不再支持这个类型了,表示标签体可以是java脚本、标签、el表达式
        scriptless:只能是el表达式,也可以是其他的标签

    不再执行标签下面内容的标签:
    在标签处理类中的doTag()中使用SkipPageException来结束
        Tomcat会调用标签处理类的doTag()方法,然后tomcat得到SkipPageException,它会跳过本页面的其他内容

标签属性:
     步骤:
    1.为标签处理类添加属性,属性至少要有一个set方法,这个set方法会在doTag之前会被tomcat调用,所以在doTag就可以使用属性了
    2.在tld文件对属性进行配置 

	   <attribute>
            <name>test</name>
            <required>true</required>
            <rtexprvalue>true</rtexprvalue>
       </attribute>

注意:this.getJspBody().invoke(null);
            //和this.getJspBody().invoke(this.getJspContext().getOut())功能一致,都是输出本身
二、问题
在自定义标签那里调试了很久,一直出现MyTag cannot be resolved to a type 错误
最后发现直接把MyTag文件放在src下是不可以的,需要将其放在src下的文件夹下。

猜你喜欢

转载自blog.csdn.net/Hpsyche/article/details/81634606