JSTL JSP standard Tag Libary(JSP标准标签库)
JSTL允许开发人员可以像使用HTML标签 那样在JSP中开发Java功能。
JSTL库有core, i18n, fmt, sql 等等。
注意 uri=“http://java.sun.com/jsp/jstl/…” 省略号可被替代为jstl标签库
每调用一个库 都得写相应的uri 前半部分都是一致的 后缀跟其相应的库名
再接触JSTL之前复习一部分以及解释部分表达式
复习主要是JSP的指令标签 也就是——<%@ %>
JSP中有很多种指令 需要运用这个指令 就得使用这个指令标签
截至今日接触到的指令有page 这个指令是写JSP文件必带的类似于C语言的头文件 在这之后就是include 而这次是有关JSTL的taglib指令。 指令之后一般都会伴随着一些设置语句。
示例:
<%@ page language="java" contentType="text/html;charset=UTF-8" pageEncoding="UTF-8"
import="java.util.*" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
在进入主要内容需要解释一下${}
这个的作用 —— 类似于getParameter方法获取它的真值 可以是字符串或者数字,这个是EL表达式,表示你从另外一个页面传过来的参数的值
el表达式,它会从page,request,session,application中取值。比如:在request中setAttribute(“name”,“测试”),那么${name} 就会得到值为测试。
<%=request.getAttribute(“name”) %> 等价于$ {name}
<%=page%>等价于$ {page}
JSTL中对数据的set out remove三种操作:
在页面中使用JSTL需要在jsp中 通过指令进行设置
<%@ taglib uri=“http://java.sun.com/jsp/jstl/core” prefix=“c”%>
其中uri是我由导入的jar包来写的 是固有的。
prefix=“c” 表示后续的标签使用都会以<c: 开头,也是一种替代
<c:set var="name" value="${'gareen'}" scope="request" />
其中这个"${'gareen'}" 解释过来就是自己取自己的真值为字符串green 与name形成键值对 也是一种固有写法 注意打双引号
另一种理解 这个是value设置真值的写法
scope的意思是范围 换一种方式理解就是对那四个作用域进行选择
至于var value 是在设置真值时候的一种格式
这里选的是作用域request中设置name,相当于
<%request.setAttribute("name","gareen")%>
<c:out value="${name}" />//out这里用了out隐式对象
相当于 <%=request.getAttribute("name")%>//getAttribute和getparameter都是取值
<c:remove var="name" scope="request" />
这样的写法很好理解建立在之前的基础
在作用域request中删掉name,相当于
<%request.removeAttribute(“name”)%>
作用域可以是pageContext, request, session, application,这三个操作再JSTL中的写法和动作include有点相像 只不过一个是固有标签并且page=
另一个是自定义标签 value=
以下的JSTL中的if else将会对${}
理解更加深刻
示例:
<c:set var="hp" value="${10}" scope="request"/>
<c:if test="${hp<5}">
<p>dying!</p>
</c:if>
<c:if test="${!(hp<5)}">
<p> he need help! </p>
</c:if>
<%
pageContext.setAttribute("one", null);
pageContext.setAttribute("two","");
pageContext.setAttribute("three",new ArrayList() );
%>
<c:if test="${empty one}">
<p>noting! </p>
</c:if>
<c:if test="${empty two }">
<p>fucking say them</p>
</c:if>
<c:if test="${empty three }">
<p>NO Objects</p>
</c:if>
JSTL通过<c:if test="">
进行条件判断
但是JSTL没有<c:else,所以常用的办法是在<c:if的条件里取反,注意取反是将整个条件取反因此应打上括号
至于${}
在对属性进行设置真值时 都会使用${}
并打上双引号 在其中再放入判断语句 起作用是返回其判断结果真值给text属性
配合if使用的还有通过empty进行为空判断
empty可以判断对象是否为null,字符串长度是否为0,集合长度是否为0
else的另一种表示方法:
<c:choose>
<c:when test="${hp<5}">
</c:when>
<c:otherwise>
</c:otherwise>
</c:choose>
比起这种写法 取反要易懂一些,注意JSTL也是一种标签语言 也得加斜杠
</>
JSTL中的for循环遍历:
可以在JSP中使用for循环,但是其可读性很差。 借助JSTL的c:forEach标签,可以改善可读性
示例:分别使用for循环和<c:forEach标签来演示遍历一个List的区别
<%
List<String> hers=new ArrayList<>();
hers.add("dw");
hers.add("2ds");
hers.add("3");
hers.add("4");
hers.add("5");
request.setAttribute("trueStory", hers);
%>
<!-- 设置for循环遍历 -->
<table width="200px" align="center" border="1" cellspacing="0">
<tr>
<td>number:</td>
<td>object:</td>
</tr>
<%
int i=0;
for(String he:hers)
{
i++;
%>
<tr>
<td><%=i%></td>
<td><%=he%></td>
</tr>
<%}%>
</table>
<br>
<!-- 使用JSTL中的c:forEach 循环来遍历List -->
<table width="200px" align="center" border="1" cellspacing="0">
<tr>
<td>编号</td>
<td>英雄</td>
</tr>
<c:forEach items="${trueStory}" var="he" varStatus="st" >
<tr>
<td><c:out value="${st.count}" /></td>
<td><c:out value="${he}" /></td>
</tr>
</c:forEach>
</table>
注意在List<%%> 这段代码中的
request.setAttribute(“trueStory”, hers);
对于设置参数 <c:forEach 标签里的items="${}" 里放入的参数是request.setAttribute里的属性——trueStory而不是List——hers
这是JSTL循环标签<c:forEach与JSP里的for循环的不同之处
items="${trueStory}" 表示遍历的集合
var="he" 表示把每一个集合中的元素放在hero上
varStatus="st" 表示遍历的状态
value="${st.count}" 也就是集合里的元素脚标 遍历
JSTL中的<c:forTokens 标签 专门用于字符串拆分,并且可以指定多个分隔符
<c:set var="some" value="yyp:man-19;birthday:2002-..ok!33"/>
<c:forTokens items="${some}" delims=":-;!" var="hh">
<c:out value="${hh}"/><br/>
</c:forTokens>
var=“hh"是一个标记属性和JSTLset操作格式一致
<c:out value=”${hh}"/> 输出标记属性所代表的集合真值
包括在其他的操作里 比如以上的forEach
fmt:formatNumber 格式化数字 fmt标签库
之前谈及的JSTL标签库的其中一个
fmt 标签常用来进行格式化,其中fmt:formatNumber用于格式化数字
使用之前要加上
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix='fmt' %>
<fmt:formatNumber type="number" value="${money}" minFractionDigits="2"/>
<fmt:formatNumber 表示格式化数字
minFractionDigits 小数点至少要有的位数
maxFractionDigits 小数点最多能有的位数
主要记忆的就是prefix=‘fmt’ 和<fmt:formatNumber
该方法和Java里—— DecimalFormat df = new DecimalFormat("#.00");
和String.format()
一个作用
<c:set var="money" value="888.8" />
<c:set var="pi" value="3.1415926" />
最少两个小数点:
<fmt:formatNumber type="number" value="${money}" minFractionDigits="2"/>
<br>
最多两个小数点:
<fmt:formatNumber type="number" value="${pi}" maxFractionDigits="2" />
其中还有格式化日期:
和fmt:formatNumber 格式化数字一样,使用之前要加上
<%@ taglib uri=“http://java.sun.com/jsp/jstl/fmt” prefix=‘fmt’ %>
<fmt:formatDate value="now"pattern="Gyyyy年MM月dd日E"/><fmt:formatDatevalue="{now}" pattern="G yyyy年MM月dd日 E"/>
<fmt:formatDate value="now"pattern="Gyyyy年MM月dd日E"/><fmt:formatDatevalue="{now}" pattern=“a HH:mm:ss.S z”/>
<fmt:formatDate value="${now}" pattern=“yyyy-MM-dd HH:mm:ss”/>
<fmt:formatDate 表示格式化日期
yyyy 表示年份
MM 表示月份
dd 表示日期
E 表示星期几
a 表示是上午还是下午
HH 表示小时
mm 表示分钟
ss 表示秒
S 表示毫秒
z 表示时区
<%
Date now = new Date();
pageContext.setAttribute("now",now);
%>
完整日期: <fmt:formatDate value="${now}" pattern="G yyyy年MM月dd日 E"/><br>
完整时间: <fmt:formatDate value="${now}" pattern="a HH:mm:ss.S z"/><br>
常见格式: <fmt:formatDate value="${now}" pattern="yyyy-MM-dd HH:mm:ss"/>
除了fmt标签库 第二个也就是fn
fn标签提供各种实用功能,首先使用之前使用加入如下指令
<%@ taglib prefix=“fn” uri=“http://java.sun.com/jsp/jstl/functions” %>
用法举例:
${fn:substring(name, 0, 5)}
获取name的前5位
这里的调用fn函数 格式就直接是${}取值 放入fn函数
如fn:substring(name, 0, 5)
fn函数概览:
仔细看fn标签库里的函数
大部分和Java里的操纵字符串和比较字符串的方法作用是一致 只是表示格式不一样