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-INF\lib。 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包。

posted on 2017-04-22 14:16  芹derella  阅读(192)  评论(0编辑  收藏  举报