EL 表达式tag<%@ taglib prefix="c" uri="http://java./jsp/jstl/core" %>
分 类 功能分类 标签名称 Core 表达式操作 out set remove catch 流程控制 if choose when otherwise 迭代操作 forEach forTokens
分 类 功能分类 标签名称 Core URL操作 import param url redirect <c:out> <c:out>主要用来显示数据的内容,就像是 <%= scripting-language %> 一样,例如: Hello ! <c:out value="${username}" /> 语法 语法1:没有本体(body)内容 <c:out value="value" [escapeXml="{true|false}"] [default="defaultValue"] /> 语法2:有本体内容 <c:out value="value" [escapeXml="{true|false}"]> default value </c:out> 属性 名 称 说 明 EL 类 型 必 须 默认值 value 需要显示出来的值 Y Object 是 无 default 如果value的值为null,则显示default的值 Y Object 否 无 escapeXml 是否转换特殊字符,如:< 转换成 < Y boolean 否 true 注意:假若value为null,会显示default的值;假若没有设定default的值,则会显示一个空的字符串。 说明 一般来说,<c:out>默认会将 <、>、’、” 和 & 转换为 <、>、'、" 和 &。假若不想转换时,只需要设定<c:out>的escapeXml属性为fasle就可以了(见表7-3)。 表7-3 字符 Entity < < > > ’ ' ” " & & 范例 <c:out value="Hello JSP 2.0 !! " /> <c:out value="${ 3 + 5 }" /> <c:out value="${ param.data }" default="No Data" /> <c:out value="<p>有特殊字符</p>" /> <c:out value="<p>有特殊字符</p>" escapeXml="false" /> 1.在网页上显示 Hello JSP 2.0 !! ; 2.在网页上显示 8; 3.在网页上显示由窗体传送过来的data参数之值,假若没有data参数,或data参数的值为null时,则网页上会显示No Data; 4.在网页上显示“<p>有特殊字符</p>”; 5.在网页上显示“有特殊字符”。 <c:set> <c:set>主要用来将变量储存至JSP范围中或是JavaBean的属性中。 把1+1的结果2储存到number变量中。如果<c:set>没有value属性,此时value之值在<c:set>和</c:set>之间,本体内容看下面的范例: <c:set var="number" scope="session"> <c:out value="${1+1}" /> </c:set> 范例 <c:set var="number" scope="request" value="${1 + 1}" /> <c:set var="number" scope="session" > ${3 + 5} </c:set> <c:set var="number" scope="request" value="${ param.number }" /> <c:set target="User" property="name" value="${ param.Username}" /> 1.将2存入Request范围的number变量中; 2.将8存入Session范围的number变量中; 3. 假若 ${param.number}为null时,则移除Request范围的number变量;若${param.number}不为null时,则将 ${param.number}的值存入Request范围的number变量中; 4.假若 ${param.Username}为null时,则设定User(JavaBean)的name属性为null;若不为null时,则 ${param.Username}的值存入User(JavaBean)的name属性(setter机制)。 注意 上述范例的3.中,假若 ${param.number}为null时,则表示移除Request范围的number变量。 <c:remove> <c:remove>主要用来移除变量。 语法 <c:remove var="varName" [scope="{ page|request|session|application }"] /> 属性 名 称 说 明 EL 类型 必须 默认值 var 欲移除的变量名称 N String 是 无 scope var变量的JSP范围 N String 否 page 说明 <c:remove>必须要有var属性,即要被移除的属性名称,scope则可有可无,例如: c:remove var="number" scope="session" /> 将number变量从Session范围中移除。若我们不设定scope,则<c:remove>将会从Page、Request、Session及Application中顺序寻找是否存在名称为number的数据,若能找到时,则将它移除掉,反之则不会做任何的事情。 范例 <%@ page contentType="text/html;charset=GB2312" %> <%@ taglib prefix="c" uri="http://java./jsp/jstl/core" %> <html> <head> <title>CH7 - Core_set_remove.jsp</title> </head> <body> <h2><c:out value="<c:set>和<c:remove> 的用法" /></h2> <c:set scope="page" var="number"> <c:out value="${1+1}"/> </c:set> <c:set scope="request" var="number"> <%= 3 %> </c:set> <c:set scope="session" var="number"> 4 </c:set> 初始设置 <table border="1" width="30%"> <tr> <th>pageScope.number</th> <td><c:out value="${pageScope.number}" default="No Data" /></td> </tr> <tr> <th>requestScope.number</th> <td><c:out value="${requestScope.number}" default="No Data" /></td>
</tr> <tr> <th>sessionScope.number</th> <td><c:out value="${sessionScope.number}" default="No Data" /></td> </tr> </table></br> <c:out value='<c:remove var="number" scope="page" />之后'/> <c:remove var="number" scope="page" /> <table border="1" width="30%"> <tr> <th>pageScope.number</th> <td><c:out value="${pageScope.number}" default="No Data" /></td> </tr> <tr> <th>requestScope.number</th> <td><c:out value="${requestScope.number}" default="No Data" /></td> </tr> <tr> <th>sessionScope.number</th> <td><c:out value="${sessionScope.number}" default="No Data" /></td> </tr> </table></br> <c:out value='<c:remove var="number" />之后'/> <c:remove var="number" /> <table border="1" width="30%"> <tr> <th>pageScope.number</th> <td><c:out value="${pageScope.number}" default="No Data" /></td> </tr> <tr> <th>requestScope.number</th> <td><c:out value="${requestScope.number}" default="No Data" /></td> </tr> <tr> <th>sessionScope.number</th> <td><c:out value="${sessionScope.number}" default="No Data" /></td> </tr> </table> </body> 一开始各在Page、Request和Session三个属性范围中储存名称为number的变量。然后先使用<c:remove var="number" scope="page" />把Page中的number变量移除,最后再使用<c:remove var="number" />把所有属性范围中number的变量移除。 <c:catch> <c:catch>主要用来处理产生错误的异常状况,并且将错误信息储存起来 语法 <c:catch [var="varName"] > … 欲抓取错误的部分 </c:catch> 属性 名 称 说 明 EL 类型 必须 默认值 var 用来储存错误信息的变量 N String 否 无 说明 <c:catch>主要将可能发生错误的部分放在<c:catch>和</c:catch>之间。如果真的发生错误,可以将错误信息储存至varName变量中,例如: <c:catch var="message"> : //可能发生错误的部分 </c:catch> 另外,当错误发生在<c:catch>和</c:catch>之间时,则只有<c:catch>和</c:catch>之间的程序会被中止忽略,但整个网页不会被中止。 范例 <%@ page contentType="text/html;charset=GB2312 " %> <%@ taglib prefix="c" uri="http://java./jsp/jstl/core" %> <html> <head> <title>CH7 - Core_catch.jsp</title> </head> <body> <h2><c:out value="<c:catch> 的用法" /></h2> <c:catch var="error_Message"> <% String eFormat = "not number"; int i = Integer.parseInt(eFormat); %> </c:catch> ${error_Message} </body> 输出结果 <c:catch>的用法 java.lang.NumberFormatException:For input string:"number" 如果把<c:catch>拿掉,会输出如下 流程控制========================================== 流程控制分类中包含四个标签:<c:if>、<c:choose>、<c:when>和<c:otherwise> <c:if> <c:if>的用途就和我们一般在程序中用的if一样。 语法 语法1:没有本体内容(body) <c:if test="testCondition" var="varName" [scope="{page|request|session|application}"]/ > 语法2:有本体内容 <c:if test="testCondition" [var="varName"] [scope="{page|request|session|application}"]> 本体内容 </c:if> 属性 名 称 说 明 EL 类 型 必 须 默认值 test 如果表达式的结果为true,则执行本体内容,false则相反 Y boolean 是 无 var 用来储存test运算后的结果,即true或false N String 否 无 scope var变量的JSP范围 N String 否 page 说明 <c:if> 标签必须要有test属性,当test中的表达式结果为true时,则会执行本体内容;如果为false,则不会执行。例如:${param.username = = 'admin'},如果param.username等于admin时,结果为true;若它的内容不等于admin时,则为false。 接下来看下列的范例: <c:if test="${param.username = = 'admin' }"> ADMIN您好!! //body部分 </c:if> 如果名称等于admin,则会显示"ADMIN您好!! "的动作,如果相反,则不会执行<c:if>的body部分,所以不会显示"ADMIN您好!! //body部分"。另外<c:if>的本体内容除了能放纯文字,还可以放任何JSP程序代码(Scriptlet)、JSP 标签或者HTML码。 除了test属性之外,<c:if>还有另外两个属性var和scope。当我们执行<c:if>的时候,可以将这次判断后的结果存放到属性var里;scope则是设定var的属性范围。哪些情况才会用到var和scope这两个属性呢?例如:当表达式过长时,我们会希望拆开处理,或是之后还须使用此结果时,也可以用它先将结果暂时保留,以便日后使用。 流程控制待续 迭代操作========================================== 迭代(Iterate)操作主要包含两个标签:<c:forEach>和<c:forTokens> <c:forEach> <c:forEach> 为循环控制,它可以将集合(Collection)中的成员循序浏览一遍。运作方式为当条件符合时,就会持续重复执行<c:forEach>的本体内容。 语法 语法1:迭代一集合对象之所有成员 <c:forEach [var="varName"] items="collection" [varStatus="varStatusName"] [begin="begin"] [end="end"] [step="step"]> 本体内容 /c:forEach> 语法2:迭代指定的次数 <c:forEach [var="varName"] [varStatus="varStatusName"] begin="begin" end="end" [step="step"]> 本体内容 </c:forEach> 属性 名 称 说 明 EL 类型 必须 默认值 var 用来存放现在指到的成员 N String 否 无 items 被迭代的集合对象 Y Arrays Collection Iterator Enumeration Map String 否 无 varStatus 用来存放现在指到的相关成员信息 N String 否 无 begin 开始的位置 Y int 否 0 end 结束的位置 Y int 否 最后一个成员 step 每次迭代的间隔数 Y int 否 1 限制 ·假若有begin属性时,begin必须大于等于 0 ·假若有end属性时,必须大于begin 范例 String atts[] = new String [5]; atts[0]="hello"; atts[1]="this"; atts[2]="is"; atts[3]="a"; atts[4]="pen"; request.setAttribute("atts", atts); %> <c:forEach items="${atts}" var="item" begin="1" end="4" step="2" > ${item}</br> </c:forEach> </body> <c:forEach>中指定的集合对象atts将会从第2个成员开始到第5个成员,并且每执行一次循环都会间隔一个成员浏览。因此结果是只显示atts[1]和atts[3]的内容 另外,<c:forEach>还提供varStatus属性,主要用来存放现在指到之成员的相关信息。例如:我们写成varStatus="s",那么将会把信息存放在名称为s的属性当中。varStatus属性还有另外四个属性:index、count、first和last,它们各自代表的意义如下 属 性 类 型 意 义 index number 现在指到成员的索引 count number 总共指到成员的总数 first boolean 现在指到的成员是否为第一个成员 last boolean 现在指到的成员是否为最后一个成员 我们可以使用varStatus属性取得循环正在浏览之成员的信息,下面为一个简单的范例 <%@ page contentType="text/html;charset=GB2312" %> <%@ taglib prefix="c" uri="http://java./jsp/jstl/core" %> <html> <head> <title>CH7 - Core_forEach3.jsp</title> </head> <body> <h2><c:out value="<c:forEach> varStatus 的四种属性" /></h2> <% String atts[] = new String [5]; atts[0]="hello"; atts[1]="this"; atts[2]="is"; atts[3]="a"; atts[4]="pen"; request.setAttribute("atts", atts); %> <c:forEach items="${atts}" var="item"varStatus="s"> <h2><c:out value="${item}"/>的四种属性:</h2> index:${s.index}</br> count:${s.count}</br> first:${s.first}</br> last:${s.last}</br> </c:forEach> </body> </html> <c:forTokens> <c:forTokens> 用来浏览一字符串中所有的成员,其成员是由定义符号(delimiters)所分隔的。 语法 <c:forTokens items="stringOfTokens" delims="delimiters" [var="varName"] [varStatus="varStatusName"] [begin="begin"] [end="end"] [step="step"]> 本体内容 </c:forTokens> 属性 说明 <c:forTokens>的begin、end、step、var和varStatus用法都和<c:forEach>一样,因此,笔者在这里就只介绍items和delims两个属性:items的内容必须为字符串;而delims是用来分割items中定义的字符串之字符。 范例 <c:forTokens items="A,B,C,D,E" delims="," var="item" > ${item} </c:forTokens> 上面范例执行后,将会在网页中输出ABCDE。它会把符号“,”当做分割的标记,拆成5个部分,也就是执行循环5次,但是并没有将A,B,C,D,E中的“,”显示出来。items也可以放入EL的表达式,如下: <% String phoneNumber = "123-456-7899"; request.setAttribute("userPhone", phoneNumber); %> <c:forTokens items="${userPhone}" delims="-" var="item" > ${item} </c:forTokens> 这个范例将会在网页上打印1234567899,也就是把123-456-7899以“-”当做分割标记,将字符串拆为3份,每执行一次循环就将浏览的部分放到名称为item的属性当中。delims不只指定一种字符来分割字符串,它还可以一次设定多个分割字符串用的字符。如下面这个范例: <c:forTokens items="A,B;C-D,E" delims=",;-" var="item" > ${item} </c:forTokens> 此范例会在网页输出ABCDE,也就是说,delims可以一次设定所有想当做分割字符串用的字符。其实用<c:forEach>也能做到分割字符串,写法如下 <c:forEach items="A,B,C,D,E" var="item" > ${item} </c:forEach> 上述范例同样也会在网页输出ABCDE。<c:forEach>并没有delims这个属性,因此<c:forEach>无法设定分割字符串用的字符,而<c:forEach>分割字符串用的字符只有“,”,这和使用<c:forTokens>,delims属性设为“,”的结果相同。所以如果使用<c:forTokens>来分割字符串,功能和弹性上会比使用<c:forEach>来得较大。 URL操作 ============================================================= JSTL包含三个与URL操作有关的标签,它们分别为:<c:import>、<c:redirect>和<c:url>。它们主要的功能是:用来将其他文件的内容包含起来、网页的导向,还有url的产生 <c:import>也支持FTP协议,假设现在有一个FTP站台,地址为ftp.javaworld.com.tw,它里面有一个文件data.txt,那么可以写成如下方式将其内容显示出来: <c:import url="ftp://ftp.cse.yzu.edu.tw/data.txt" /> 如果是使用相对地址,假设存在一个文件名为Hello.jsp,它和使用<c:import>的网页存在于同一个webapps的文件夹时,<c:import>的写法如下: <c:import url="Hello.jsp" /> 如果以“/”开头,那么就表示跳到web站台的根目录下,以Tomcat为例,即webapps目录。假设一个文件为hello.txt,存在于webapps/examples/images里,而context为examples,可以写成以下方式将hello.txt文件包含进我们的JSP页面之中: <c:import url="images/hello.txt" /> 接下来如果要包含在同一个服务器上,但并非同一个web站台的文件时,就必须加上context属性。假设此服务器上另外还有一个web站台,名为others,others站台底下有一个件夹为jsp,且里面有index.html这个文件,那么就可以写成如下方式将此文件包含进来: 文 <c:import url="/jsp/index.html" context="/others" />
注意 被包含文件的web站台必须在server.xml中定义过,且<Context>的crossContext属性值必须为true,这样一来,others目录下的文件才可以被其他 web站台调用。 erver.xml的设定范例如下: s : <Context path="/others" docBase="others" debug="0" reloadable="true" crossContext="true"/> : 除此之外,<c:import>也提供var和scope属性。当var属性存在时,虽然同样会把其他文件的内容包含进来,但是它并不会输出至网页上,而是以String的类型储存至varName中。scope则是设定varName的范围。储存之后的数据,我们在需要用时,可以将它取出来,代码如下: <c:import url="/images/hello.txt" var="s" scope="session" /> 我们可以把常重复使用的商标、欢迎语句或者是版权声明,用此方法储存起来,想输出在网页上时,再把它导入进来。假若想要改变文件内容时,可以只改变被包含的文件,不用修改其他网页。 另外,可以在<c:import>的本体内容中使用<c:param>,它的功用主要是:可以将参数传递给被包含的文件,它有两个属性name和value,如表 名 称 说 明 EL 类 型 必 须 默认值 name 参数名称 Y String 是 无 value 参数的值 Y String 否 本体内容 这两个属性都可以使用EL,所以我们写成如下形式: <c:import url="http://java." > <c:param name="test" value="1234" /> </c:import> 这样的做法等于是包含一个文件,并且所指定的网址会变成如下: 范例 下面为一用到<c:import>、<c:param>及属性范围的范例 Core_import.jsp <%@ page contentType="text/html;charset=GB2312" %> <%@ taglib prefix="c" uri="http://java./jsp/jstl/core" %> <html> <head> <title>CH7 - Core_import.jsp</title> </head> <body> <h2><c:out value="<c:import> 的用法" /></h2> <c:set var="input1" value="使用属性范围传到Core_imported.jsp中" scope="request"/>包含core_imported.jsp中<hr/> <c:import url="Core_imported.jsp"charEncoding="GB2312" > <c:param name="input2" value="使用<c:param>传到Core_imported.jsp中"/> </c:import><hr/> ${output1} </body> </html> 程序中,分别使用<c:set>和<c:param>来传递参数。 Core_imported.jsp <%@ page contentType="text/html;charset=GB2312" %> <%@ taglib prefix="c" uri="http://java./jsp/jstl/core" %> <%@ taglib prefix="fmt" uri="http://java./jsp/jstl/fmt" %> <html> <head> <title>CH7 - Core_imported.jsp</title> </head> <body> <fmt:requestEncoding value="GB2312" /> <c:set var="output1" value="使用属性范围传到Core_import.jsp中" scope="request"/> ${input1}</br> <c:out value="${param.input2}" escapeXml="true" /> </body> </html> Core_imported.jsp是被包含的文件,它会把从Core_import.jsp传来的参数分别输出到页面上,必须注意的是input1参数是使用属性范围来传递的,因此可以直接用${input1}来得到参数,而input2则必须使用${param.input2}来得到参数。 此外,笔者还使用<c:set>来传递值给Core_import.jsp,这就是<c:param>无法做到的动作,<c:param>只能从包含端抛给被包含端,但是在属性范围中,可以让包含端也能得到被包含端传来的数据 Core_import.jsp的执行结果如图 待续。。。。。。。。 |
|