• JSTL和EL


    jsp标签是什么


    sun公司制定的一种用来替换jsp页面中的java代码的一种技术,通过使用简单的标签(类似于html标签)来代替java代码,jsp页面会变得更加简洁,利于维护。

    EL表达式是什么


    是一套简单的计算规则,一般用于给jsp标签的属性赋值,也可以直接输出。

    EL表达式的基本语法 ${ el表达式 }


    第一种:访问bean属性

    ${str};找到绑定名为str的对应的值

    1. ${ user.name }:

    jsp引擎会依次从pageContext、request、session、application查找绑定名为user的对象,如果找到了就不再向下查找,否则,继续向下查找。找到后,调用该对象的getName(),方法并输出其值;

    1)如果依据绑定名称找不到数据,输出””;

    2)如果值为null,会输出””;

    3)如果属性名错误,会报错

    2. 也可以使用${ user["name"] },效果相同。

    允许[ ]里面出现绑定名,${ user[propname] },注意propname没有引号,表示变量。还允许[ ]里面出现下标(从1开始),用于访问数组中的的某个元素的值

    <body style="font-size:30px;font-style:italic;">
        <%
            User user = new User();
            user.setName("tom");
            user.setAge(20);
            user.setInterest(new String[]{"cooking","snooker","football"});
            request.setAttribute("user",user);
        %>
        name:${user["name"]}<br/>
        <%
            request.setAttribute("propname","name");
        %><br/>
        name:${user[propname]}<br/>
        interest:${user.interest[0]}
    </body>

    3.指定查找的范围

    ${pageScope.user.name}      只到request中去找,不再依次到4个范围查找了

    ${requestScope.user.name}

    ${sessionScope.user.name}

    ${applicationScope.user.name}

    第二种:获得请求参数值

    a、${ param.username }等价于request.getParameter("username");

    b、${ paramValues.interest }等价于request.getParameterValues("interest");

    <html>
        <body style="font-size:30px;font-style:italic;">
            username:${param.username}<br/>
            city:${paramValues.city[1]}
        </body>
    </html>

    第三种:进行简单的计算,计算的结果可以用来给jsp标签的属性赋值,也可以直接输出

    1. 算数运算  +  -  *  /,但要注意,“+”不能连接字符串,+操作只能求和。

    2. 关系运算  "==" , "!=" , ">" , "<" ,">=" , "<=" 可以使用对应的"eq","nq","lt","gt","le","ge"代替。

    3. 逻辑运算  "&&","||","!",可以使用"and","or","not"代替。

    4. empty运算  判断一个字符串是否为空,集合内容是否为空,以及绑订的对象是否存在。  以下四种情况,结果为true:  1)空字符串  2)空的集合  3)null值  4)找不到值

    <body style="font-size:30px;font-style:italic;">
      算术运算:
        ${1+1}<br/>
        ${"100" + "200"}<br/>
      关系运算:
        ${1>0}<br/>
        <%request.setAttribute("str","abc");%>
        ${"abc" == str}<br/>
      逻辑运算:
        ${1
    <3 && 2>0 }<br/>   empty运算:<br/>     空字符串:  ${empty ""}<br/>     空的集合:  <%  List list1 = new ArrayList();request.setAttribute("list1",list1);%>            ${empty list1 }<br/>     null值:  ${empty null}<br/>
               <% request.setAttribute("obj",null); %>

               ${empty obj}<br/>
        找不到值: ${empty aaa}
    
    </body>

    jsp核心标签的使用 


    jstl(java standard taglib )java标准标签库。sun制定了标签规范,但没有任何的实现。早期都是自己实现开发这些标签。后来,apache开发一些常用的标签,捐献给了sun,sun将其命名为jstl。

    编程步骤

    1. 需要将jstl标准标签库相关的jar文件copy到WEB-INFlib。 jstl.jar ,standard.jar。注意:在J2EE5中不需要导入这两个jar包。J2EE5中已经包含了这两个jar包。J2EE1.4中需要导入这两个jar包。

    2. 在jsp文件当中,使用taglib指令导入标签。<%@taglib uri="http://java.sun.com/jsp/jstl/core"  prefix="c" %>

        注意:uri命名空间:为了区分同名元素。

      package也相当于命名空间。容器会根据命名空间的描述去找相应的标签文件。uri的值在standard.jar->META-INF->c.tld文件中<uri>标记中

        prefix属性:命名空间的前缀。因为有很多的标签,不需要都导入。这里用的是核心标签。prefix="c"表示以c为开头的。即导入了c.tld和c-1.0.tld文件中的标签。

    运行原理

    容器根据前缀找到命令空间,找到tld文件。(标签描述文件)。标签实际上就是一个占位符(什么都做不了),在标签的描述文件中根据标签名对应的标签类

    <c:if> ---> prefix=”c”--->uri-->c.tld--->IfTag

    <name>if</name>

    <tag-class>

    org.apache.taglibs.standard.tag.rt.core.IfTag

    </tag-class>

    然后实例化标签类,执行标签类中的方法

    使用标签

    <c:if  test="" var="" scope="">

    标签体:可以是html,java代码(少写)</c:if>

    test属性:当值为true,容器会执行标签体的内容,为false,则不执行。test属性一般使用el表达式来赋值。

    var属性:指定一个绑订名。

    scope属性:指定一个绑订范围。

    var属性和scope属性用于将test的结果绑订到指定的对象上。绑定对象可以是:pageContext,request,session,application。

    <%@taglib uri="http://java.sun.com/jsp/jstl/core"  prefix="c" %>
    <html>
        <body style="font-size:30px;font-style:italic;">
            <%
                User user = new User();
                user.setName("龙儿");
                user.setGender("m");
                request.setAttribute("user",user);
            %>          
            姓名:${user.name}<br/>
            性别:<c:if test="${user.gender == 'm'}"></c:if>  <c:if test="${user.gender =='f'}"></c:if><br/>
            性别:<c:if test="${user.gender =='m'}" var="rs" scope="request"></c:if>  <c:if test="${!rs}"></c:if>
    </body>            

    <c:choose>

    用于分支,当某个条件满足,执行某一个分支。每一个分支条件用when标签来表示。        

    <c:when test=""> 可出现多次,只用于<c:choose>。test属性: 当值为true,执行标签体的内容

    <c:otherwise> 只出现1次,只用于<c:choose> 当其它分支都不满足条件,则执行该标签体的内容。

    <body style="font-size:30px;font-style:italic;">
        <%
            User user = new User();
            user.setName("龙儿");
            user.setGender("x");
            request.setAttribute("user",user);
        %>   
                 性别:<c:choose>
                <c:when test="${user.gender == 'm'}"></c:when>
                <c:when test="${user.gender == 'f'}"></c:when>
                <c:otherwise>保密</c:otherwise>
            </c:choose>
    </body>

    <c:forEach items="" var=""  varStatus="">

    用于遍历集合。

    items属性:指定要遍历的集合。

     var属性: 指定一个绑订名,jsp引擎会从集合当中取一个对象,绑订到 pageContext对象上。

    varStatus属性:指定一个绑订名,对应的绑订值是一个java对象,封装了遍历时的一些信息,包括当前遍历的对象的下标(index)以及是第几次(count)遍历。

    <body style="font-size:30px;font-style:italic;">
        <table border="1" width="60%" cellpadding="0"    cellspacing="0">
            <tr>
                <td>姓名</td>
                <td>性别</td>
                <td>index</td>
                <td>count</td>
            </tr>
            <c:forEach items="${users}" var="u"  varStatus="s">
                <tr class="row${s.index % 2 + 1}">
                <td>${u.name}</td>
                <td>${u.gender}</td>
                <td>${s.index}</td>
                <td>${s.count}</td>
                </tr>
            </c:forEach>
        </table>
     </body>

    <c:url>

    当用户禁止cookie以后,会自动在地址后面添加sessionId。当使用绝对路径时,会自动在地址前添加应用名。value属性:指定地址。在表单提交、链接当中,可以使用该标签。

    <c:set var="" scope="" value="">绑订一个对象到指定的范围。value属性: 绑订值。

    <c:remove var="" scope="">  解除绑订

    <c:catch var="">处理异常,会将异常信息封装成一个对象,绑订到pageContext对象上。

    <c:import url="">url指定一个jsp文件的地址,jsp会在运行时调用这个jsp。

    <c:redirect url="">重定向到另外一个地址。url属性指定重定向的地址。

    <c:out value="" default="" escapeXml="">

    用于输出el表达式的值。

    value属性: 指定输出的值

    default属性: 指定缺省值。

    escapeXml属性: 设置成true,会将value中的特殊字符替换成相应的实体。缺省值就是true。

    自定义标签


    step1、先写一个java类,继承SimpleTagSupport类

    step2、覆盖 doTag方法,在该方法里面,编写相应的处理逻辑。

    step3、在.tld文件里面,描述这个标签。注意该文件请放在WEB-INF文件下(与web.xml同级),运行时会自动加载

    JSP页面

    想要定义一个<c1:hello >的jsp标签。有两个属性:info(要打印的内容),qty(打印次数)

    <%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
    <%@taglib prefix="c1" uri="http://www.test.com/mytag" %>
    <html>
        <body>
            <c1:hello info="hello wold" qty="100" />
        </body>
    </html>

    java HelloTag

    /**
     * 标签有哪一些属性,标签类也会有对应的属性,
     * 并且属性名称要一致,类型匹配,要有对应的set方法。
     */
    
    public class HelloTag extends SimpleTagSupport {
        private String info;
        private int qty;
    
        public HelloTag() {
            System.out.println("HelloTag's constructor...");
        }
    
        public void setInfo(String info) {
            System.out.println("setInfo..." + info);
            this.info = info;
        }
    
        public void setQty(int qty) {
            System.out.println("setQty..." + qty);
            this.qty = qty;
        }
    
        @Override
        public void doTag() throws JspException, IOException {
            System.out.println("HelloTag's doTag...");
            PageContext ctx = (PageContext)getJspContext();
            // pageContext提供了获得其它八个隐含对象的方法。
            JspWriter out = ctx.getOut();
            for(int i = 0; i < qty; i++){
                out.println(info + "<br/>");
            }
        }
    
    }

    tld描述文件 myTag.cld

    <?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">
        <!-- 定义 taglib指令中的uri和prefix属性 -->
        <tlib-version>1.1</tlib-version>
        <short-name>c1</short-name>
        <uri>http://www.test.com/mytag</uri>
        <!---开始定义标记 -->
        <tag>
            <!-- 标记名 -->
            <name>hello</name>
            <!-- 处理这个Tag的相应的类的名称 -->
            <tag-class>tag.HelloTag</tag-class>
            <!-- 
                可以有三个值:empty、scriptless、JSP
                empty: 标签没有标签体。
                scriptless:标签可以有标签体,但是,标签体的内容不能够出现java代码(<%  %>,<%=  %>,<%!   %>)。
                JSP:标签有标签体,并且,标签体的内容可以是java代码。 但是,只有复杂标签技术才支持。简单标签技术只支持 empty,scriptless。
            -->
               <body-content>empty</body-content>
            <!--开始定义标记的属性--->
              <attribute>
                <!-- 属性的名称 -->
                   <name>info</name>
                <!-- 表示这个属性是不是必须的 -->
                <required>true</required>
                <!--   当rtexprvalue为true,表示可以动态赋值,即可以使用el表达式来赋值 -->
                <rtexprvalue>false</rtexprvalue>
            </attribute>
            <attribute>
                   <name>qty</name>
                   <required>true</required>
                   <rtexprvalue>true</rtexprvalue>
            </attribute>
        </tag>
    </taglib>

    如果使用javaee5.0,如何使用el表达式和jstl


    1. 程序使用的规范应该与容器使用的规范一致。比如:javaee5.0对应的servlet规范是servlet2.5,tomcat6.0实现了servlet2.5规范。javaee1.4对应的servle规范是servlet2.4,tomcat5.5实现了servlet2.4规范。

    2. 不再需要拷贝jstl对应的jar包。

  • 相关阅读:
    C
    O
    扩展KMP
    扩欧与乘法逆元
    E
    D
    [LeetCode] Same Tree 深度搜索
    [LeetCode] Remove Duplicates from Sorted List 链表
    [LeetCode] Balanced Binary Tree 深度搜索
    [LeetCode] Remove Nth Node From End of List 快慢指针
  • 原文地址:https://www.cnblogs.com/qin-derella/p/6747735.html
Copyright © 2020-2023  润新知