澳门新葡亰平台官网下载-平台游戏app > 前端 >
JSP第五篇【JSTL的介绍、core标签库、fn方法库、fmt标签库】

本文实例讲述了jsp之c标签用法。分享给大家供大家参考,具体如下:

JSTL全称为 JSP Standard Tag Library 即JSP标准标签库

核心标签库

JSTL作为最基本的标签库,提供了一系列的JSP标签,实现了基本的功能:集合的遍历、数据的输出、字符串的处理、数据的格式化等等!

它是JSTL中的核心库,为日常任务提供通用支持,如显示和设置变量、重复使用一组项目、测试条件和其他操作(如导入和重定向Web内容)。Core标签按功能可分为4种类型:

  • EL表达式不够完美,需要JSTL的支持!在JSP中,我们前面已经用到了EL表达式,体会到了EL表达式的强大功能:使用EL表达式可以很方便地引用一些JavaBean以及其属性,不会抛出NullPointerException之类的错误!但是,EL表达式非常有限,它不能遍历集合,做逻辑的控制。这时,就需要JSTL的支持了
  • Scriptlet的可读性,维护性,重用性都十分差!JSTL与HTML代码十分类似,遵循着XML标签语法,使用JSTL让JSP页面显得整洁,可读性非常好,重用性非常高,可以完成复杂的功能!
  • 在JSP中不推荐使用scriptlet输出,推荐使用JSP标签。

1 变量维护:

  1. 导入jstl.jar和standard.jar开发包
  2. 在JSP页面中用tablib指令引入需要用到的JSTL标签

(1):设置变量值和对象属性。语法如下:
复制代码 代码如下:

  • core标签库是JSTL的核心标签库,实现了最基本的功能:流程控制、迭代输出等操作
  • core标签库的前缀一般是c

每种设置都有两种方式,总结起来,的4种形式,如下所示:

图片 1image

a. 使用标记属性设置JSP变量
复制代码 代码如下:

  • 简单使用一下

b. 使用标记体设置JSP变量
复制代码 代码如下:标记内容

c. 使用标记属性设置对象属性
复制代码 代码如下:

 <% session.setAttribute("name", "zhongfucheng"); %> //<c:out/>标签支持标签体,default属性上的数据可以写在标签体中 //<c:out value="${name}" escapeXml="true">您要的数据找不着</c:out> <c:out value="${name}" default="您要的数据找不着" escapeXml="true"/>

d. 使用标记体设置对象属性
复制代码 代码如下:标记内容

  • 我们发现上面的代码实现的效果和EL表达式是一样的它出色的地方就多了两个属性,default和escapeXml属性。如果我们用到这两个属性,我们就使用该标签,如果没有用到这两个属性就用EL表达式就可以了。

(2):在指定作用域范围内删除变量。语法如下:
复制代码 代码如下:

图片 2image

2 流程控制:分为条件标签和迭代标签。

  • 该标签有5个属性,用起来有稍微有些复杂了!现在要记住的就是:var属性操作的是Integer、Double、Float、String等类型的数据,target属性操作的是JavaBean或Map对象的数据,scope代表的是Web域,value是值,property是对象的属性

条件标签:

使用var属性

  • 既然var属性只能操作Integer、Double、String等类型,那么存在var属性就一定没有property属性(property代表的是对象的成员属性,Integer、String这些类型哪来的成员变量呀)

  • 下面的代码流程是这样的:创建了一个name的变量,设置的值为zhongfucheng,范围是page

 <c:set var="name" value="fucheng" scope="page"/> ${name}
  • 效果:

图片 3image

  • 当然了,set标签也支持标签体,value的值可以写在标签体里边
 <c:set var="name" scope="page"> zhongfucheng </c:set>
  • 使用var属性和scope属性实现计数器
 <%--由于下面变量需要做加法运算,所以要定义出来,不然服务器是不知道我的变量是Integer类型的--%> <% Integer sessionCount = 0; Integer applicationCount = 0; %> <c:set var="sessionCount" value="${sessionCount+1}" scope="session"/> <c:set var="applicationCount" value="${applicationCount+1}" scope="application"/>
  • 效果:

图片 4image

(1):与Java语言中的if语句的使用方法一样,但不能实现else的功能。

使用target属性

  • 使用target属性与之配对的是property属性,target属性只能操作JavaBean或Map对象,property就是对应的成员变量或key了。
  • 既然target属性操作的是JavaBean或Map对象,那么一定是通过EL表达式来获取到对象了。taget属性如果获取不到数据会抛出异常!使用target属性就一定没有scope属性(scope属性代表的是保存范围,target的值都是获取来的,难道你还能改变人家的范围?)
 <%--创建出JavaBean对象,设置为session范围的属性--%> <jsp:useBean scope="session"/> <%--获取到person对象,设置age属性的值为32--%> <c:set target="${person}" property="age" value="32"/> ${person.age}
  • 效果:

图片 5image

remove标签就相当简单了,只有var和scope属性,代表的是删除域范围的属性

  • 下面简单来测试一下吧:
 <%--创建出JavaBean对象,设置为session范围的属性--%> <jsp:useBean scope="session"/> <%--获取到person对象,设置age属性的值为32--%> <c:set target="${person}" property="age" value="32"/> ${person.age} <br> <%--删除session属性--%> <c:remove var="person" scope="session"></c:remove> ${person.age==null?"存在session的person对象被删除了!":"我还在呢!"}
  • 效果:

图片 6image

该标签主要用来处理程序中产生的异常。

catch标签也十分简单,只有一个var属性,var属性封装了异常的信息!

 <%--创建出JavaBean对象,设置为session范围的属性--%> <jsp:useBean scope="session"/> <c:catch var="message"> <%--target属性只能是EL表达式,现在我是字符串,获取不到对象,肯定会抛出异常的!--%> <c:set target="person" property="age" value="32"/> </c:catch> ${message}
  • 效果:

图片 7image图片 8image

JSTL提供了if标签完成分支语句的实现,test属性是不可或缺的

var和scope属性我看来好像没什么用的(保存执行结果有什么用?)

  • 根据传递过来的参数的不同显示不同的页面!
 <%--如果带过来的名字是zhongfucheng,那么可以登陆--%> <c:if test="${param.name=='zhongfucheng'}"> 用户名:<input type="text" name="username"><br> 密码:<input type="password" name="password"><br> <input type="submit" value="登陆"> </c:if> <%--如果带过来的名字是ouzicheng,那么就是注册--%> <c:if test="${param.name=='ouzicheng'}"> 用户名:<input type="text" name="username"><br> 密码:<input type="password" name="password"><br> <input type="submit" value="注册"> </c:if>
  • 注意地址栏的参数!

图片 9image图片 10image

if标签没有else的功能,如果需要类似于java中的if else流程就需要使用choose标签。

choose标签需要联合when和otherwise标签一起使用!

 <c:choose> <c:when test="${param.name=='zhongfucheng'}"> 你好啊,zhongfucheng </c:when> <c:when test="${param.name=='ouzicheng'}"> 你好啊,ouzicheng </c:when> <c:otherwise> 你是谁啊?别随便过来! </c:otherwise> </c:choose>
  • 效果:

图片 11image图片 12image图片 13image

forEach为循环标签,相当于Java中的while和for

  • 之前我们在使用EL表达式获取到集合的数据,遍历集合都是用scriptlet代码循环,现在我们学了forEach标签就可以舍弃scriptlet代码了。

  • 向Session中设置属性,属性的类型是List集合

 <% List list = new ArrayList<>(); list.add("zhongfucheng"); list.add("ouzicheng"); list.add("xiaoming"); session.setAttribute("list", list); %>
  • 遍历session属性中的List集合,items:即将要迭代的集合。var:当前迭代到的元素
 <c:forEach var="list" items="${list}" > ${list}<br> </c:forEach>
  • 效果:

图片 14image

  • 遍历Map对象有稍微地不一样,我们来看一下,var属性保存的不是每个迭代的对象,而是Map.Entry。
 <% Map map = new HashMap(); map.put("1", "zhongfucheng"); map.put("2", "xiaohong"); map.put("3", "xiaoming"); session.setAttribute("map",map); %> <c:forEach var="me" items="${map}" > ${me.key} ${me.value}<br> </c:forEach>

图片 15image

  • begin默认从0开始、end默认为集合的最后一个元素、step默认为1

  • varStatus代表着当前对象被迭代的信息,它有以下的属性

    • index【返回当前是第几个对象,从0开始计数】
    • count【已经遍历多少个对象了,从1开始计数】
    • first
    • last
    • current
    • begin
    • end
    • step
 <c:forEach var="list" items="${list}" varStatus="varStatus" > ${list}您的下标是:${varStatus.index}<br> </c:forEach>
  • 效果:

图片 16image

该标签类似于String类的split()和for循环的一种集合

它与forEach标签非常相似,都有begin、end、step、items、var、varStatus属性,不同的是forTokens标签的items属性里面是字符串,这个字符串会被delims属性的内容分割成多个字符串!

 <c:forTokens items="zhongfucheng,ouzicheng,xiaoming,xiaohong" var="name" delims="," > ${name} </c:forTokens>
  • 效果图:

图片 17image

import标签类似于JSP行为<jsp:include/>和JSP指令<%include>

import标签的属性:

  1. url【指定要包含的路径,Internet所有的url都可以】
  2. context【访问同一个web容器的其他资源,以"/"开头】
  3. var【保存导入的文件的内容,以String类型存储】
  4. socpe【保存的范围,默认是page】
  5. charEncoding
  6. varReader【保存导入文件的内容,以Reader类型存储】

当然了,import标签功能更加更大!强大在哪里呢?import标签可以引入Internet网页上的内容,也就是说,csdn也可以引入进来!

  • 我们来用一下把!
 <c:import url="http://www.csdn.net" charEncoding="UTF-8" />
  • 我们一看,是没有样式的

图片 18image

  • 打印csdn的源代码
 <c:import url="http://www.csdn.net" charEncoding="UTF-8" var="net"/> CSDN的源码是:<br><br><br><br><br> <c:out value="${net}" escapeXml="true"></c:out>
  • 效果:

图片 19image

  • 在JSP页面进行URL的相关操作时,经常要在URL地址后面附加一些参数。

url标签十分实用!在浏览器禁用Cookie的时候,我们之前学Servlet时解决办法是:response.encodeURL()。url标签也可以实现这样的功能,再配合param标签使用,就十分实用了!

图片 20image

  • 我们配合param标签来使用一下吧
 <c:url value="2.jsp" var="url"> <c:param name="name" value="中国!"> </c:param> </c:url> <a href="${url}">我经过了URL地址重写!</a>
  • 效果:

图片 21image

redirect标签用于实现Redirect功能,当然了,此标签也能够配合param标签使用!

图片 22image

  • 简单使用一下,重定向到2.jsp,带了一个参数
 <c:redirect url="2.jsp" > <c:param name="name" value="zhongfucheng"> </c:param> </c:redirect>
  • 在2.jsp中获取到参数

图片 23image

fmt标签库也叫做国际化标签库。这里就不详细说明了,等我讲到Web 国际化的时候才讲吧!

fn方法库也叫做EL函数库、fn标签库。这个在讲解EL表达式的时候有详细的说明,可转移到我EL表达式的博文中

如果文章有错的地方欢迎指正,大家互相交流。习惯在微信看技术文章的同学,可以关注微信公众号:Java3y

标签有两种语法形式,是以有无标记体来区分的。
无标签体:
复制代码 代码如下:
有标签体:

  标签体

带标记体的
复制代码 代码如下:欢迎光临

(2)
无法单独使用,只能作为的子标签来使用。这三个标签组合起来实现Java中的switch语句的功能。语法如下:

    标签体1


    标签体2


    标签体3

迭代标签:

(1):用于遍历一个对象集合。

  标签体

(2):用于遍历字符串,而且每次遍历结果返回字符串中的一个单词。

  标签体

3 URL管理

(1):用于对URL地址进行编码。

有标签体:

   标签体

如下代码:

点我呀

生成的URL:

无标签体:主要用于编辑上下文URL。
复制代码 代码如下:

如下代码:
复制代码 代码如下:登录
若当前路径为el,则输出为:/el/logon.jsp

(2):向当前JSP页面中引入URL资源(可以是远程序站点上的资源)。Include指令和include动作不能向JSP页引入Web程序以外的资源,引入的资源必须位于当前Web程序中。

以String对象引入的语法:

    标签体使用

如下代码:将外部资源引入到当前JSP页面中.

地址

以Reader对象导入的语法:

    标签体使用其它动作元素

(3):用于HTTP重定向。

无标签体:
复制代码 代码如下:

有标签体:

标签

(4):只能嵌入到、、、标签中作为子元素来使用。此标签主要用于设置URL中将要传入的参数。

无标签体:
复制代码 代码如下:

有标签体:

标签体

4 其它标签:、。

(1):在JSP页面中显示变量内容。

无标签体:
复制代码 代码如下:

有标签体:

标签体

其中:

default: 用于指定当value值为null时,应该输出的值。
escapeXml: 用于设置是否将""、"&"、"'"、"""、这些字符进行转义。
escapeXml默认为true,表示发生转换。
" ">"转换成">"
"&"转换成"&"
"'"转换成"'"
"""转换成"""
(2):用于处理JSP页面错误。

如果JSP页面出错,可以通过对page指令属性的设置将其转到错误处理页面上。标签是对这种错误处理的补充。它的处理方式是将可能发生异常的JSP代码片段嵌入到标记体内,然后使用var属性心不烦接收标记体抛出的异常。

   嵌套动作

使用方法:

   嵌套动作


  内容

最后关于版本问题的讨论

2.4的版本需要jstl.jar和standard.jar,还要注意版本问题,不同版本不能兼容。、
应用部署运行的时候出现JSP异常, 发生在使用JSTL库的时候: According to TLD or attribute directive in tag file, attribute value does not accept any expressions, 可能是因为使用了JSP2.0版本, 同时又没有使用JSTL core库的备用版本(RT库), 以下有两种处理方法:

  1. 如果不想使用web-app_2_4.xsd 和jstl1.1 那么可以按照下面两种方式修改

1). 修改web.xml.
复制代码 代码如下:

改为2.3版本的
复制代码 代码如下:

2). 使用JSTL core RT库

JSTL core库的有两种taglib伪指令, 其中RT库即是依赖于JSP传统的请求时属性值, 而不是依赖于EL来实现(称为EL库.JSP2.0将支持EL)

JSP中使用 在2.3版本都可以,在2.4就不行了, 这是版本不兼容引起的,稍后将介绍servlet的版本。

只要将
复制代码 代码如下:

改为
复制代码 代码如下:

2:如果要使用jstl1.1(推荐) 则按照一下修改,很简单的。

jstl存在1.0和1.1的差异问题,用EL建议需要在1.1的版本下,
使用jstl1.1 只需要将
1.0的为
复制代码 代码如下:
换成:
复制代码 代码如下:

希望本文所述对大家JSP程序设计有所帮助。

下一篇:没有了