1.JSTL简介和环境搭建
JSTL是java中的一个定制标记库集,实现了jsp页面的代码复用,书写jsp的页面时可读性更强,剩下的步骤则是下载jar包,导入即可。
2.第一个JSTL小程序
JSTL在基本配置导入jar后,使用前还需导入标签库
在uri中之所以能找到该http,是因为导入了jar,否则是找不到的。prefix=”c”,里面的名字可以自定义,一般为“c”。
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<c:out value="this is my first JSTL Demo"></c:out>
</body>
</html>
运行上面结果就会在页面输出我们value里的那句话
3.JSTL的好帮手-EL表达式
JSTL标签的value属性的属性值可以为变量和常量
变量需要通过EL表达式来获取.
1.什么是EL表达式
全名为Exoression Language
经常与JSTL配合使用,使得JSP页面更直观,写法更简单
普通写法:<%=session.getValue("name") %>
EL表达式:<c:out value="${sessionScope.name}"/>
2.EL表达式的格式
用美元符号"$"定界,内容包括在花括号"{}"中;
EL表达式的基本格式:${表达式}
EL表达式中的"."与"[]"运算符:
通常情况两者通用,eg:${user.sex}等同于${user["sex"]}
其中"[]"还可以用来进行集合元素中的定位${booklist[0].price}。
不通用的情况:
1、包含特殊符号:
如${user.first-name}则为错误的写法,正确的:${user["first-name"]};
2、通过变量动态的取值时:
${user[param]}---param可以是name or sex or others,是用户传入的情况。
而"."不能动态取值,它的写法是:${user.name}or${user.sex}or...
4.EL变量
当el表达式没有指定范围时,默认会从jsp四个内置对象中取值,顺序是Page>Request>Session>Application,如果全都取不到值不会输出null,会输出一个空字符串。
5. EL自动类型转换
要取得文本框中的输入,我们需要做类型转换
EL的运算符,EL的“+”运算符和Java中的“+”运算符不一样,它不能实现两个字符串的链接,如果这两个字符串是不能转化为数值型的字符串,就将抛出异常,如果要使用两个字符串连接(拼接)的话就要${表达式}${表达式}连接不需要“+”符号。
EL隐式对象
6. EL运算符
<% String username="null"; request.setAttribute("username", username); %>
<c:out value="${empty username}"></c:out>
//如果username为null或者"",则返回true;如果username为"有内容",则返回false。
注意属性需要先set进4个内置对象中,不然会调用不了
7. JSTL标签之out标签
JSTL的核心标签库标签共13个,从功能上分类分为4类:
表达式控制标签:out set remove catch
流程控制标签:if choose when otherwise
循环标签:forEach forTokens
URL操作标签:import url redirect
JSTL标签之out标签
变量输出default设置默认值
escapexml = “false”,设置后即可输出转义字符
<!-- 使用out标签输出常量 -->
<c:out value="This is first JSTL demo"></c:out><br>
<!-- 使用out标签输出变量 -->
<% session.setAttribute("name", "John"); %>
<!-- 直接输出变量 -->
<c:out value="${name }"></c:out><br>
<!-- 当变量不存在时,通过default属性输出默认值 -->
<c:out value="${username }" default="error"></c:out><br>
<!-- 设置输出转义后的字符需要escapeXml属性值设置成false,escapeXml默认值:true -->
<c:out value="< out标签 >" escapeXml="false"></c:out>
8.JSTL标签之set标签
set标签的用法:
- 存值到scope中,scope就是我们之前说的四种配置,request,session等等,可将值以变量形式存放在指定范围中(2种形式)举例:
<body>
<c:out value="这是我第一个web页面!" />
<c:set value="today" var="day" scope="session"/>
<c:out value="${day}" />
</body>
<c:set var="today" scope="session">today值</c:set>
<c:out value="${today}" />
- 存值到javabean的属性当中,需要配合target属性指定对象并且通过property属性指定要赋值为对象中的哪个属性,存到javabean中需要有java实体类,jsp需要引入
<useBean>
标签,设置属性的值可以写到value中,也可以写到标签的内容里面。
<c:set target="${student}" property="sName" value="薛江波"></c:set>
<c:out value="${student.sName}" /><br>
<c:set target="${student}" property="age" value="1"></c:set>
<c:out value="${student.age}" />
<c:set target="${student}" property="sAdress" >世界</c:set>
<c:out value="${student.sAdress}" />
这里注意一个错误,当把年龄设置成int类型时,不在属性里直接写value,而是在两个<set>
之间置入值时会报错。
9.JSTL标签之remove标签
remove只能移除某个变量;不能移除某个对象中的某一个属性,要删除只能移除整个对象
var属性是必选的,scope是可选的
<c:set value="today" var="day" scope="session"/>
<c:remove var="day" />
<c:out value="${day}" /><br>
10.JSTL标签之catch标签
JSTL标签之catch标签
catch标签的用法
catch标签中可以包含哪些容易出错的JSTL标签(逻辑)
<!-- catch标签的用法 -->
<c:catch var="error">
<c:set target="aa" property="bb">asasa</c:set>
</c:catch>
<c:out value="${error}"></c:out>
11.JSTL标签之if标签
流程控制标签if,if标签的用法和我们程序中的if作用相同,用来实现分支条件的控制。
- test属性用于存放判断的条件,一般使用EL表达式来编写
- var属性指定名称用来存放判断的结果类型为true或者false
- scope属性用来存放var属性存放的范围
<c:if test="" var="" scope=""></c:if>
实例
<c:out value="${student.age}" />
<c:if test="${student.age>=2}" var="result" />
<c:out value="${result}" />
12.JSTL标签之choose-when-otherwise标签
接下来学习choose when以及otherwise这三个标签,之所以放在一起讲是因为这三个标签通常都会放在一起配合使用
-通常这三个标签被放在一起配合使用
-<c:choose>标签嵌套在<c:when>和<c:otherwise>标签外面作为他们的父标签来使用
-其中choose和when标签也可以一起组合使用
<!-- choose、when、otherwise标签的用法 -->
<c:choose>
<c:when test="${param.score<=100 && param.score>=60 }">
<c:out value="及格"></c:out>
</c:when>
<c:when test="${param.score<60 && param.score>=0 }">
<c:out value="不及格"></c:out>
</c:when>
<c:otherwise>
<c:out value="请检查你的输入!"></c:out>
</c:otherwise>
</c:choose>
Ps:用法类似于switch——case——default。
只是用choose和when
<c:choose>
<c:when test="${student.age>=18}" >
<c:out value="该学生已成年"></c:out>
</c:when>
13.JSTL标签之forEach标签
forEach标签的用法
-根据循环条件遍历集合(Collectoin)中的元素
.var设定变量名用于存储从集合中取出元素(必须无默认值)
.items指定要遍历的集合(必须无默认值)
.begin、end用于指定遍历的起始位置和终止位置(有默认)
.step指定循环的步长(有默认)
.varStatus通过index、count、first、last几个状态值,描述begin和end子集中的元素状态
<%
List<String> fruits=new ArrayList<String>();
fruits.add("apple");
fruits.add("pear");
fruits.add("orange");
fruits.add("banana");
request.setAttribute("fruits", fruits);
%>
<!-- forEach标签用法 -->
<!-- 用法一:全部遍历 -->
<c:forEach var="fruit" items="${fruits}">
<c:out value="${fruit}"></c:out><br>
</c:forEach>
<hr>
<!-- 用法二:部分遍历 -->
<c:forEach var="fruit" items="${fruits}" begin="1" end="2">
<c:out value="${fruit}"></c:out><br>
</c:forEach>
<!-- 用法三:部分遍历中指定步长 -->
<c:forEach var="fruit" items="${fruits}" begin="1" end="3" step="2">
<c:out value="${fruit}"></c:out><br>
</c:forEach>
Ps:step默认值:1。
<!-- 用法四:部分遍历并带状态 -->
<c:forEach var="fruit" items="${fruits}" begin="1" end="3" varStatus="fru">
<c:out value="${fruit}——四个属性:"></c:out><br>
<c:out value="index属性:${fru.index}"></c:out><br>
<c:out value="count属性:${fru.count}"></c:out><br>
<c:out value="first属性:${fru.first}"></c:out><br>
<c:out value="last属性:${fru.last}"></c:out><br>
<c:out value="----------"></c:out><br>
</c:forEach>
Ps:index从0开始;count从1开始;first是否第一个(boolean);last是否最后一个(boolean)。
14.JSTL标签之forTocken标签
forTokens标签的用法
-用于浏览字符串,并根据指定的字符将字符串截取
items指定被迭代的字符串
delims指定使用的分隔符
var指定用了存放遍历到的成员
<!--forTokens标签的用法 -->
<c:forTokens items="029-88886666-999" delims="-" var="num">
<c:out value="${num }"></c:out><br>
</c:forTokens>
15.JSTL标签之import标签
JSTL标签之import标签
import标签:可以把其他静态或动态文件包含到本JSP页面
与<jsp:include>
不同的是:include只能包含同一个web应用的文件,而import可以包含其他web应用中的文件,甚至是网络上的资源
PS:由于import标签导入网络上的资源可能会出现路径问题,所以import标签要包含在catch标签内使用
import标签用法
语法格式:
<c:import url="" context="" var="" scope="" charEncoding="" varReader="">
</c:import>
.url被导入资源的URL路径
.context相同服务器下其他的web工程,必须以"/"开头
.var以String类型存入被包含文件的内容
.Scope var变量的JSP范围
.charEncoding被导入文件的编码格式
.varReader以Reader类型存储被包含文件内容
<!-- 通过import标签导入网络上的相对路径 -->
<c:catch var="error20161">
<c:import url="招聘需要学的技术.txt" charEncoding="utf-8"></c:import>
</c:catch>
<c:out value="${ error20161}"></c:out><br>
<!-- 通过import标签导入网络上的绝对路径 -->
<c:catch var="error2016">
<c:import url="http://www.baidu.com"></c:import>
</c:catch>
<c:out value="${ error2016}"></c:out><br>
<!-- var及scope用法 -->
<c:catch var="error2">
<c:import url="Test.txt" var="test" scope="session" charEncoding="gbk"></c:import>
</c:catch>
<c:out value="import标签存储的test字符串变量值:${sessionScope.test}"></c:out>
context用来显示同一个服务器不同project的页面
context引入的内容是webapps下的其他Web project
-1.修改tomcat的发布路径(改eclipse中tomcat的部署路径,如果是灰掉的,停掉tomcat,然后clean,就可以改为第二项了。下面的path改为webapps)
-2.修改%TOMCAT_HOME%/conf/context.xml的Context标签中的属性
.crossContext=”ture”
<!-- context属性用法 -->
<c:catch var="error3">
<c:import url="/index1.jsp" context="/Test1"></c:import>
</c:catch>
<c:out value="${error3}"></c:out><br>
16.JSTL标签之redirect标签
redirect标签的用法
-该标签用来实现请求的重定向,同时可以在url中加入指定的参数
.url指定重定向页面的地址,可以是一个string类型的绝对地址或相对地址
.context用于导入其他web应用中的页面
<!-- redirect标签的用法,传递参数 -->
<c:redirect url="firstDemo.jsp">
<c:param name="username">zhangsan</c:param>
<c:param name="password">123</c:param>
</c:redirect>
目标页面输出
<c:out value="username是${param.username }"></c:out>
<c:out value="password是${param.password }"></c:out>
17.JSTL标签之url标签
url标签的用法
该标签用于动态生成一个String类型的URL,可以同<c:param>
标签共同使用,也可以使用html的<a>
标签实现超链接
value表示url路径值
例子:
<!-- url标签用法 -->
<c:if test="${1<2}">
<c:set var="partUrl">temp.jsp</c:set>
</c:if>
<c:url value="http://localhost:8080/Test/${partUrl}" var="newUrl" scope="session"></c:url>
<a href="${newUrl}">New URL</a>
18.JSTL函数之常用函数
使用JSTL函数需要导入:
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
函数用法:${fn:函数名}
使用JSTL标签需要导入:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!-- JSTL函数使用 -->
<c:out value="“Hello World”字符串中是否包含“Hello”?${fn:contains('Hello World','Hello')}"></c:out>
<hr>
<c:out value="“Hello World”字符串中是否包含“ABCD”?${fn:contains('Hello World','ABCD')}"></c:out>
<hr>
<c:out value="“Hello World”字符串中是否包含“hello”(忽略大小写)?${fn:containsIgnoreCase('Hello World','hello')}"></c:out>
<hr>
<c:out value="“Hello”是否在“Hello World”字符串开头?${fn:startsWith('Hello World','Hello')}"></c:out>
<hr>
<c:out value="“world”是否在“Hello World”字符串尾部?${fn:endsWith('Hello World','world')}"></c:out>
<!-- 不会输出<book>标签 -->
<book>书</book>
<hr>
<!-- 可输出标签但会出现转义问题 -->
<c:out value="${fn:escapeXml('<book>书</book>')}"></c:out>
<hr>
<!-- 可输出标签且不会出现转义问题 -->
<c:out value="<book>书</book>"></c:out>
<hr>
<!-- indexOf函数用法 -->
<c:out value="“Hello World”字符串“llo”出现的index值:${fn:indexOf('Hello World','llo')}"></c:out>
Ps:如果是xml标签(即使系统不认识),但是也不会输出。
escapeXml();对特殊字符进行转义;如果不想转义直接赋值给value即可;
indexOf(串1,串2,);串2在串1中出现的索引