JSP第五篇【JSTL的介绍、core标签库、fn方法库、fmt标签库】

什么是JSTL

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

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

为何要使用JSTL

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

使用JSTL标签库步骤:

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

core标签库

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

c:out

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

	<c:out value="${name}" default="您要的数据找不着" escapeXml="true"/>

	

复制代码
  • 咱们发现上面的代码实现的效果和EL表达式是同样的,**它出色的地方就多了两个属性,default和escapeXml属性。**若是咱们用到这两个属性,咱们就使用该标签,若是没有用到这两个属性就用EL表达式就能够了。

c:set

  • 该标签有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}

复制代码
  • 效果:

  • 固然了,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"/>

复制代码
  • 效果:

使用target属性

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

复制代码
  • 效果:

c:remove

remove标签就至关简单了,只有var和scope属性,表明的是删除域范围的属性微信

  • 下面简单来测试一下吧:
<%--建立出JavaBean对象,设置为session范围的属性--%>
	<jsp:useBean id="person" class="domain.Person" 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对象被删除了!":"我还在呢!"}


复制代码
  • 效果:

c:catch

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

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

<%--建立出JavaBean对象,设置为session范围的属性--%>
	<jsp:useBean id="person" class="domain.Person" scope="session"/>
	
	<c:catch var="message">
	
	    <%--target属性只能是EL表达式,如今我是字符串,获取不到对象,确定会抛出异常的!--%>
	    <c:set target="person" property="age" value="32"/>
	
	</c:catch>
	
	${message}

复制代码
  • 效果:

c:if

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

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

  • 根据传递过来的参数的不一样显示不一样的页面!
<%--若是带过来的名字是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>

复制代码
  • 注意地址栏的参数!


c:choose

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>

复制代码
  • 效果:


c:forEach

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>

复制代码
  • 效果:

  • 遍历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>

复制代码

  • 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>

复制代码
  • 效果:


c:forTokens

该标签相似于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>

复制代码
  • 效果图:


c:import

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" />

复制代码
  • 咱们一看,是没有样式的

  • 打印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>

复制代码
  • 效果:


c:param

  • 在JSP页面进行URL的相关操做时,常常要在URL地址后面附加一些参数。<c:param>标签能够嵌套在<c:import>、<c:url>或<c:redirect>标签内,为这些标签所使用的URL地址附加参数。

  • <c:param>标签在为一个URL地址附加参数时,将自动对参数值进行URL编码,例如,若是传递的参数值为“中国”,则将其转换为“%d6%d0%b9%fa”后再附加到URL地址后面,这也就是使用<c:param>标签的最大好处


c:url

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

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


复制代码
  • 效果:


c:redirect

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

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

复制代码
  • 在2.jsp中获取到参数


fmt标签库

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

fn方法库

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

若是文章有错的地方欢迎指正,你们互相交流。习惯在微信看技术文章的同窗,能够关注微信公众号:Java3y

相关文章
相关标签/搜索