JSTL学习:
作用:提升jsp中的逻辑代码编写效率,使用标签来学习。
使用:
JSTL的核心标签库
JSTL的格式化标签库
JSTL的SQL标签库
JSTL的函数标签库
JSTL的xml标签库
JSTL的核心标签库使用:
1.导入jar包:需要先到官网http://archive.apache.org/dist/jakarta/taglibs/standard/binaries/下载jstl的包,解压后,将里面的jstl.jar和standard.jar两个包复制到项目----->Webcontent------>lib的目录下。
2.声明jstl标签库的引入(核心标签库)
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
这个也就是上一章说的jsp的taglib指令的使用方式。
3.内容:
基本标签学习:
<c:out value="数据" default="默认值"></c:out>
数据可以为常量,也可以是EL表达式。
作用:将数据输出给客户端, 其实直接使用el表达式它就会自己输出了,但是好处是,使用标签会使整个页面变得和谐一点,而且它在输出变量的情况下,还可以设置默认值,就是万一找不到这个变量,就会输出默认值,默认值可以不设置。
<c:set var="键名" value="数据" scope="指定作用域"></c:set>
<c:set>标签,就是往作用域里面存进去值的,作用域有四个,分别是page,request,session,applicatiopn.
作用:存储数据到作用域中
var:表示存储的键名
value:表示存储的数据的值
scope:表示要存储的对象pageContext,request,session,applicatiopn.
<c:remove var="hello" scope="page"></c:remove>
<c:remove>标签,表示删除作用域中指定的数据
var:表示要删除的键的名字
scpoe:表示要删除的作用域(可选)
注意:
如果不在指定的作用域的情况下使用该标签删除数据,则它会将四个作用域对象中符合删除条件(键名与var后面的数据一致)的数据全部删除。
<!-- 基本标签学习 -->
<c:out value="数据" default="默认值"></c:out>
<c:set var="变量名" value="变量值" scope="指定作用域"></c:set>
<c:set var="hello" value="hello pageContext" scope="page"></c:set>
<c:set var="hello" value="hello request" scope="request"></c:set>
<c:set var="hello" value="hello session" scope="session"></c:set>
<c:set var="hello" value="hello application" scope="application"></c:set>
<c:remove var="hello" scope="page"></c:remove>
<c:out value="${hello}"></c:out>
<c:out value="${requestScope.hello}"></c:out>
<c:out value="${sessionScope.hello}"></c:out>
<c:out value="${applicationScope.hello}"></c:out>
上面设置了多个hello变量,但是他们的值和作用域是不一样的,如果把那一句<c:renove>标签注释掉,将会输出如下图:
1.因为四个set,分别把四个对应的数据存进去对应的作用域了,那么,输出的时候,想第一句,没指定作用域,为什么输出“hello pageContext”呢?因为,一旦你要输出,tomcat服务器就会从这四个区域里面查找,按从小到大查找,一旦找到了,也就不再往下寻找了,如果后面三个out不指定输出作用域,那么四句话都将会输出“hello pageContext”。但是后面三个out标签指定了对应的作用域,那么tomcat服务器将会去里面寻找对应的值。
2.如果remove那一句去掉,那么输出结果就是
为什么?因为remove指定的作用域为page,把page这个作用域里面的名为hello的数值删了,tomcat服务器在page作用域没找到hello,他就会去request作用域里面找,找到了,就不再往下了,后面那三个是因为他们都指定作用域了。
<c:remove var="hello" ></c:remove>
如果把remove这一句写成这样,那么四个都不会有输出,因为全被删了(符合删除条件)。
对于out标签,也可以在value标签里面直接填充一个字符串,那么它就会照着字符串输出。
逻辑标签学习:
<c:if>标签
传统方式在jsp里面做判断并输出一句话,与jstl在jsp里面输出一句话
<!-- 传统方式 -->
<%
int num=4;
if(num>3)
{
%>
<p>今天天气真好!!!!</p>
<%
}
%>
<!-- jstl方式 -->
<c:set var="n" value="4"></c:set>
<c:if test="${n>3}">
<b>今天天气真好!</b>
</c:if>
<!-- 相当于java里面的单分支判断 -->
<c:if test="${表达式}">
前端代码
</c:if>
作用:进行逻辑判断,相当于java的单分支判断。
注意:逻辑判断标签的表达式需要依赖于EL表达式的逻辑运算,也就是涉及到表达式中的数据必须从作用域中获取(EL表达式只能获取作用域的数值),所以,使用这个if标签,通常要和set标签联合起来使用。
<c:choose test="${表达式}">
<c:when test=""></c:when>
<c:when test=""></c:when>
<c:when test=""></c:when>
…
<c:choose>
<c:choose>标签,相当于java里面的多分支判断。
<!-- java里面的多分支判断,test后面的值依赖于el表达式,只能做作用域中取 -->
<c:set var="score" value="85"></c:set>
<c:choose>
<c:when test="${score>80}"><b>优秀!</b></c:when>
<c:when test="${score>70 && score<=80}"><b>良好!</b></c:when>
<c:when test="${score>60}"><b>及格!</b></c:when>
<c:otherwise><b>不及格!</b></c:otherwise>
</c:choose>
与if标签类似,类似于java里面的多标签判断。只会执行一个when标签(java里面也是只会执行一个if条件),test后面的值依赖于el表达式的逻辑判断,他的值也只能从作用域中取,otherwise就相当于else标签,上面的条件都不符合,它就会执行最后的otherwise标签。
循环标签学习:
静态循环
<c:forEach begin=“1” end=“4” step=“2”>
循环体
<c:forEach>
作用:循环内容进行处理
使用:
begin:声明循环开始位置
end:声明循环结束位置
step:声明步长,举个栗子,如果step=“2”,相当于for循环里面i=i+2;
varStaus:声明变量记录每次循环的数据(下标,次数,是否是第一次循环,是否是最后一次循环)
var:声明变量,记录每次循环的结果
注意:数据存储在作用域中,需要使用EL表达式获取
例如:
<c:forEach begin="2" end="4" step="1" varStatus="vs">
1111--->${vs.index}---->${vs.count}--->${vs.first}--->${vs.last}<br>
</c:forEach>
这个就是获得上面说的数据的应用。
动态循环
<c:forEach items="${list}" var="str">
bbb ${str}<br/>
</c:forEach>
items会把一个对象的长度从1开始循环一次,var设置的不是一个变量的名字,是存储每次循环变量所用的数据。
<!-- jstl的循环标签 -->
<!-- 传统表格方式 -->
<table border="1">
<tr>
<td>课程名称</td>
<td>教师</td>
<td>价格</td>
<td>重要性</td>
</tr>
<%
for(int i=0;i<3;++i)
{
%>
<tr>
<td>java</td>
<td>张老师</td>
<td>免费</td>
<td>很重要</td>
</tr>
<%} %>
</table>
<!-- 使用jstl标签完成循环 -->
<!-- begin是起始数数值,end是结束数值,step是步长 varStatus里面设置的是一个变量名
相当于上面循环的i,因为我们只有起始值和结束值,但是万一要用到这个值进行逻辑判断,这个就是
变量名,index打印的当前循环所在的下标,count打印的是次数 ,也就是说count的值永远从1开始
而index的值从begin开始,first和last是判断你是否在第一次循环和最后一次循环-->
<!-- 常量循环 -->
<c:forEach begin="2" end="4" step="1" varStatus="vs">
1111--->${vs.index}---->${vs.count}--->${vs.first}--->${vs.last}<br>
</c:forEach>
<!-- 动态循环 -->
<%
ArrayList<String> list=new ArrayList<String>();//记得导入java.util.ArrayList;
list.add("a");
list.add("b");
list.add("c");
list.add("d");
request.setAttribute("list", list);//把list放到作用域里面
%>
<!-- str类似于一个变量,它每次的值是对应的下标的数据-->
<c:forEach items="${list}" var="str">
bbb ${str}<br/>
</c:forEach>
<table border="1">
<tr>
<td>java</td>
<td>张老师</td>
<td>免费</td>
<td>很重要</td>
</tr>
//着重注意var的使用
<c:forEach items="${list}" var="s">
<tr>
<td>${s}</td>
<td>${s}</td>
<td>${s}</td>
<td>${s}</td>
</tr>
</c:forEach>
</table>
<!-- 遍历map -->
<%
HashMap<String,String>map=new HashMap<String,String>();
map.put("a1","哈哈哈");
map.put("a2", "嘻嘻嘻");
request.setAttribute("map",map);//把map放到作用域里面,前面的键名,后面是对象名
%>
<c:forEach items="${map}" var="m" >
${m}<br>//把m整个打印出来,键名=数据
${m.key}<br><!-- 拿到当前的m对象的键名 -->//只打印键名
${m.value}<br><!-- 拿到当前的m对象的值 -->//只打印数据
</c:forEach>