1.JSP页面自动刷新
- 利用response对象的setIntHeader()方法
public void setIntHeader(String header, int headerValue)
这里header就写Refresh,其他怎么写我也不太清楚,待学习
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>HelloWorld</title>
</head>
<body>
<%!int i = 0; %>
<%
response.setIntHeader("Refresh", 5);
%>
<%=i++ %>
</body>
</html>
- 由上面示例探讨一下JSP声明的作用范围
- 作用域是当前JSP页面,毋庸置疑
- 只要服务器没初期,任何人访问当前页面或者访问后又刷新都会经过过滤器Filter,变量i都会自增1,直到服务器关闭才重新回到初始的0
2.EL表达式
- EL内置对象
pageScope 获取page域属性组成的Map
requestScope 获取reqeust域属性组成的Map
sessionScope 获取session域属性组成的Map
applicationScope 获取application域属性组成的Map
pageContext 获取jsp的9大隐式对象, 如 ${pageContext.request}
initParam 获取在web.xml配置的WEB应用参数
param 请求参数Map<String,String>, 如:${param.userName}
paramValues 请求参数Map<String,String[]>, 如: ${paramValues.userName[1]}
header 请求头Map<String,String[]>, 如: ${header[“Accept-Language”] }
headerValues 请求头Map<String,String[]>
cookie 获取cookie对象, 如 ${cookie.JSESSIONID.name} ${cookie.JSESSIONID.value} - EL语法
- 常量(直接输出到HTML)
${“字符串”},${123},${true} - 变量(在四大域搜寻)
${userName} 在依次四大域搜寻变量名的值,不存在则返回 “” (相当于 <%= pageContext.findAttribute(“userName”) %>)
①${pageScope.userName}
②${requestScope.userName}
③${sessionScope.userName}
④${applicationScope.userName} - 搜寻数组/集合对象
${myList[0]} - 搜寻map对象
${myMap.key} 如存在键值对bread和价格,${price.bread}就得到价格
${myMap[“key-first.last”]} key名是数字或特殊符(.-),必须用[] - 搜寻javaBean对象
${user.getName()} 相当于 <%=user.getName()%>
${user.name}
${user[“name”]
不能这样写:${user[name]} - 简单运算
- 算术运算(+、-、*、/、%)
①除法不是整除
②“+”不能拼接,只能做加法
③如果字符串可以转化成数字则可以做运算
④两端空格不影响,但是在数字字符串之间有空格则报错 - 关系运算(>、<、>=、<=、==、!=)
- 逻辑运算(&&、||、!)
- 三元表达式
${3==3 ? “Y” : “N”}
El表达式不能嵌套,当比较的部分是从之前传过来值时,要想别的办法 - 域中指定的属性是否空(empt、not empty)
${empty person.name},${not empty person.name}
empty运算在以下四种情况下,返回true
- 根据绑定名未找到绑定值
- 绑定值是 “”
- 绑定值是null
- 集合的长度为0
- 算术运算(+、-、*、/、%)
- 常量(直接输出到HTML)
表达式 | 值 |
---|---|
${1 + 1} | 2 |
${5 * 5} | 25 |
${40 / 8} | 5.0 |
${5 / 3} | 1.6666666666666667 |
${6 - 9} | -3 |
${10 % 3} | 1 |
${1 + “2”} | 3 |
${“1” + “2”} | 3 |
${1 + “2s”} | 报错:500 |
${3==3 ? “Y” : “N”} | Y |
${not empty person.name} | true |
3.JSTL标签
- 下载JSTL标签库
一般使用JSTL1.1以上版本,现在最新版是JSTL1.2.5
在Apache Tomcat官网下载JSTL标签库(Taglibs)
下载地址: http://tomcat.apache.org/download-taglibs.cgi
下载页面有4个jar包:
Impl: taglibs-standard-impl-1.2.5.jar JSTL实现类库
Spec: taglibs-standard-spec-1.2.5.jar JSTL标准接口
EL: taglibs-standard-jstlel-1.2.5.jar JSTL1.0标签-EL相关
Compat: taglibs-standard-compat-1.2.5.jar 兼容版本
从README得知:
如果不使用JSTL1.0标签,可以忽略taglibs-standard-jstlel 包,
README没有介绍taglibs-standard-compat包,估计应该是兼容以前版本标签库,
所以一般只需要 taglibs-standard-impl 和 taglibs-standard-spec 两个jar包
Maven依赖配置如下:
<dependency>
<groupId>org.apache.taglibs</groupId>
<artifactId>taglibs-standard-spec</artifactId>
<version>1.2.5</version>
</dependency>
<dependency>
<groupId>org.apache.taglibs</groupId>
<artifactId>taglibs-standard-impl</artifactId>
<version>1.2.5</version>
</dependency>
把上述两个jar包加到项目,或者复制到Tomcat/lib(所有项目都可以共用,一劳永逸)
- 核心标签库
- core 核心标签库
- fmt 国际化标签
- sql 数据库标签(废弃)
- xml XML标签(废弃)
- 在jsp中引入 core fmt 标签库:
<%@ taglib uri = “http://java.sun.com/jsp/jstl/core” prefix= “c”%>
<%@ taglib uri = “http://java.sun.com/jsp/jstl/fmt” prefix = “f”%>
- 常用标签
- <c:if>
<!--name取自转发前的request-->
<c:if test="${name == 'jack'}" var="name1" scope="page">
name is jack!
</c:if>
<br/>
<!--name1存储上面test的结果,是true或者false,可以用EL表达式继续取值-->
<!--若是var是name,那么实际上是重新赋值,name不是jack而是true-->
<c:if test="${name1 != 'jack'}" var="name" scope="page">
name1 is not jack!
</c:if>
<!--此处没有else标签-->
属性 | 描述 |
---|---|
test | 条件(必填属性) |
var | 用于存储条件结果的变量 |
scope | var属性的作用域(默认page) |
- <c:choose>、<c:when>、<c:otherwise>
用这个可能比<c:if>要好一些
<c:set var="salary" scope="session" value="${2000*2}"/>
<c:choose>
<c:when test="${salary == 4000}">
true,your salary is ${salary}
</c:when>
<c:otherwise>
false,your salary is ${salary}
</c:otherwise>
</c:choose>
- <c:foreach>
属性 | 描述 | 是否必要 | 默认值 |
---|---|---|---|
items | 要被循环的信息 | 否 | 无 |
begin | 开始的元素(0=第一个元素,1=第二个元素) | 否 | 0 |
end | 最后一个元素(0=第一个元素,1=第二个元素) | 否 | Last element |
step | 每一次迭代的步长 | 否 | 1 |
var | 代表当前条目的变量名称 | 否 | 无 |
varStatus | 代表循环状态的变量名称 | 否 | 无 |
varStatus的属性
current:当前这次迭代的(集合中的)项
index:当前这次迭代从 0 开始的迭代计数(第几个)
count:当前这次迭代从 1 开始的迭代计数(第几个)
first:用来表明当前这轮迭代是否为第一次迭代的标志,返回true/false
last:用来表明当前这轮迭代是否为最后一次迭代的标志,返回true/false
<!--循环列表-->
<c:forEach items="${list}" var="it" varStatus="st">
${it}----迭代变量,表示list中每一项,等价于${st.current}
${st.index}----当前索引
</c:forEach>
<!--循环Map-->
<c:forEach items="${map}" var="it" varStatus="st">
${it.key}:${it.value}
${st.current}--格式为:key=value
</c:forEach>
<!--循环计数,类似for循环-->
<c:forEach var="i" begin="1" end="10" step="2" varStatus="st">
${i}
</c:forEach>
- <c:forTokens>
标签与标签有相似的属性,不过还有另一个属性:
属性 | 描述 | 是否必要 | 默认值 |
---|---|---|---|
delims | 分隔符 | 是 | 无 |
<!--把字符串按分隔符分开成数组,result代表数组的每一项-->
<c:forTokens items="sdfa,fsad,fds" delims="," var="result">
${result}<br>
</c:forTokens>
- fmt标签库
<!--格式化日期-->
<!--var属性是必须的-->
<f:formatDate value="<%=new Date()%>" pattern="yyyy年MM月dd日 HH:mm:ss" var="date" scope="request" />
<!--上面是转换日期到字符串,并存储在date变量中,要用还得EL取-->
${requestScope.date}
<!--格式化数字-->
<!--这里var不是必须的,没有则直接显示值,有则不显示,把值存在var变量中-->
<f:formatNumber type="percent" minFractionDigits="10" value="${balance}"/>