98. 现在来看一下 el 表达式对运算符的支持:
1+1=${1+1}这样能计算出来,这里面支持通常的运算
10/5=${10/5}
10 div 5 = ${10 div 5} 效果是一样的。
10%3 = ${10%3} 取余是1
10 mod 3 = ${10 mod 3} 这个也是取余
还有
== eq
!= ne
< lt
> gt
<= le
>= ge
&& and
|| or
! not
/ div
% mod
现在来看一个为不为空的取法:
servlet里面的代码:
request.setAttribute("value2","");
request.setAttribute("value3",new ArrayList());给一个空的集合
request.setAttribute("value4","asdf");
request.setAttribute("value5",null);
在jsp页面代码:
value1:${empty value1} value1我没有设置啊,如果为空他就会返回true
value2:${empty value2} true
value3:${empty value3} true 集合为空他也能检测出来
value4:${empty value4} false 有值就是false
value5:${empty value5} true
value5:${!empty value5} 你取一下非,运行就是false了。
99. el得配合那套标签才能发挥他强大的作用啊。
使用el 你看咱们什么包都没有引入,但是他是有要求的,要求我们的,你看我们现在使用的tomcat,他要实现一定的规范才行。
你看我们在建立项目的时候,用的是j2ee1.4,你得用这个1.4 5.0的话会有一些问题。也就是说我们的web服务器要实现j2ee1.4规范。其实这个1.4规范他就实现了servlet1.4规范,其实就是jsp2.0的规范。
这是他说的,我用5.0也可以用啊。
你得注意了,你的工程的web.xml里面头部引入的schema一定要是servlet2.4的啊,不然的话,你在jsp页面上拿值是拿不到的。
100. 以后你在jsp里面别写什么尖括号,百分号之类的东西了。
jstl也是一个规范,sun对他做 了实现 ,就像jdbc一样,oracle对他做了一个实现,其他数据库厂商也对他做了一个实现。
在那个包中都有一些实例用法 ,你可以解开来看看
你要用这个jstl的话,你得拷两个 jar包,一个是standard.jar 一个是 jstl.jar
使用el不要导包,但是使用jstl就要导包了。
1. jstl中还是操作xml的,访问数据库的,函数标签库,也就是函数库。主要学习核心库。
核心库一般以c 开头,
2. 现在来看一下这个out标签:
<c:out value="abcd"></c:out>
现在输出就是abcd了,你输出一个原封字符串,你就可以这样输出了,其实你要输出字符串的话,在jsp里面你就直接写就可以了。
3. 我们为什么能用这个标签,就是因为有一个很重要的文件叫 .tld 的文件
采用taglib 引入标签,其实就是引入 .tld文件。
http://java.sun.com/jsp/jstl/core 1.1的引法
http://java.sun.com/jstl/core 1.0的引法
我们现在都用1.2了,就是第一种引法,这些东西王勇是在eclipse下面的standard.jar文件的META-INF下面看到,我是在jstl1.2.jar中的META-INF下看到的。
4. 关于这个前缀最好跟官方的<short-name>c<short-name>一样,你这样一写,大家一看就知道,你如果用什么abc 一写,人家一看就不是很明白了。
5. 现在来输出在servlet里面设置的值 :
<c:out value="${hello}"></c:out>输出hello world
这还不如直接使用
${hello}效果是一样的。用上面那个还麻烦一些还得引库,其实在有些情况下还是好一些,例如他就有一个缺省值的概念,也就是说当你什么都没有找到的时候,就给我输出一个值 :
<c:out value="${abc}" default="123"></c:out>输出123也就是说在这种情况下是有好处的。
6. 现在在servlet里面设置html字符串:
request.setAttribute("welcome","<font color='red'>北京欢迎你</font>");我们的意图就是一出来他是红的。先用el 来显示一下,看看区别:
welcome(el表达式:):${welcome}结果就是显示红色字体。现在用 <c:out>来一下:
welcome(default):<c:out value="${welcome}"/>显示结果是 <font color='red'>北京欢迎你</font>
所以c:out能显示,el则不能,el给解析了。
7. c:out为什么能把font给输出来呢?一个属性决定的:他有一个属性,这个属性默认值是true
<c:out value="${welcome}" escapeXml="false"></c:out>
8. 现在来看c:set 以前在一个页面中写:
<%
int i = 100;
%>你这么一写只能在这个页面中使用,使用c:set的话,还可以设置范围
<c:set value="123" var="temp" scope="page"></c:set> 这个是默认的范围。
可以直接取:${temp}
假设我这个变量我不想要了,可以考虑使用c:remove
如下:
<c:remove var="temp"/>
现在再来显示一下,看看显示什么,结果是什么都没有
${temp} 可以想到一个什么东西,以前什么电话字段中的内容为空的时候,我们 是怎么处理的啊,还用了一个三元运算符来搞,为null显示什么,活学活用啊。
9. <c:catch>标签,现在不介绍,就相当于try catch
10. <c:if>为true的话,他就会进入这个标签里面。这个标签比较好用。在servlet里面设几个值
request.setAttribute("v1",1);
request.setAttribute("v2",2);在jsp页面
<c:if test="${v1 lt v2}">
v1 小于 v2
</c:if>
11. <c:if>标签还有一个属性 var
<c:if test="${v1 lt v2}" var="v">
v1 小于 v2
</c:if>
我设置了这个变量,在这个页面中我都可以使用:
v:${v} 就显示为一个true 这个变量存放的是上面比较的结果。
12. 其实在很多情况下我们还要使用if else在这个jstl里面的if else是这么来使用的,使用
<c:choose> <c:when> <c:otherwise>这三个合起来用的,这个<c:choose>不能单独使用,至少得有一个<c:when> <c:otherwise>可以没有.如果没有的话,会报500错误的。
示例:
<c:choose>
<c:when test="${v1 lt v2}">
v1 小于 v2
</c:when>
<c:otherwise>
v1 大于v2
</c:otherwise> 注意这个不能放在c:when的前面。
</c:choose>
13. 还在servlet里面设置一个值
List userList = ewn ArrayList();
userList.add("user1");
userList.add("user2");
request.setAttribute("userlist",userList);如果他为空我们来做些什么
jsp页面:
<c:choose>
<c:when test="${empty userlist}">
用户列表为空:
</c:when>
<c:otherwise>
用户列表不为空
</c:otherwise>
</c:choose> otherwise在c:choose里面只能有一个
14. 现在来看一下结构:在servlet里面
Group group = new Group();
group.setName("动力节点");
List users = new ArrayList();
for(int i=0;i<10;i++){
User user = new User();
不写了,太简单了。
} 在Jsp页面 你用表格来显示的话,会好一些
<table border="1">
<tr>
<td>姓名</td>
<td>年龄</td>
<td>所属组</td>
</tr>
以前写法肯定是<% List users = request.getAttribute("users");
for(Iterator iter = users.iterator();iter.hasNext();){
User user = (User)iter.next();
}
%>
</table>
15. 现在他把那个for()注释了,那么 你在页面中肯定是空了,你不用标签的话,就这么 写
<% List users = request.getAttribute("users");
if(users == null || users.size() == 0){
%>
<tr>
<td colspan="3">没有符合条件的数据</td>
</tr>
<%>
}else{
for(Iterator iter = users.iterator();iter.hasNext();){
User user = (User)iter.next();
}
}
%> 这多麻烦 啊,下面用标签来写
16.
<table border="1">
<tr>
<td>姓名</td>
<td>年龄</td>
<td>所属组</td>
</tr>
<c:choose>
<c:when test="${empty users}">
<tr>
<td colspan="3">没有符合条件的数据</td>
</tr>
<c:otherwise>
<c:forEach items="${users}" var="user">
<tr>
<td>${user.username}</td>
<td>${user.age}</td>
<td>${user.group.name}</td>
</tr>
</c:forEach>
</c:otherwise>
</c:when>
</c:choose>
</table>
17. 现在有这样一种需求,如果这个值 能被2整除就给变红色显示:怎么做呢?c:forEach有一个属性
varStatus
<c:forEach items="${users}" var="user" varStatus="vs">
<c:choose>
<c:when test="${vs.count % 2 == 0}">
<tr bgcolor="red">
</c:when>
<c:otherwise>
<tr> 不能被2整除不需要变,就是一个tr
</c:otherwise>
</c:choose>
<td>${user.username}</td>
<td>${user.age}</td>
<td>${user.group.name}</td>
</tr> 这么 一写他会报一个错,你看前面有一个tr,没有结束,我又写了一个tr,他就不认了,这个没有关系,一运行就没事了。
</c:forEach>
18. c:forEach还有这些 begin end step属性
step这个是步长。如果你设置步长是2的话,那么就是52 54 56了,或者51 53 55.
19. 现在用c:forEach 来 循环输出 map
<c:forEach items="${map}" var="v">
${v.key} = ${v.value}
</c:forEach>
20. 这个jstl没有那么强大,就负责一些输出输出逻辑的,如果像以前那样嵌套java的代码,那功能就大了,这也就是满足jsp页面就是一些标签的原则。
21. 还有一个c:forTokens输出采用某种符号间隔的字符串。这个使用频率并不高。
servlet里面设置
request.setAttribute("strTokens","a#b#c#d");
jsp页面
<c:forTokens items="${strTokens}" delims="#" var="v">
${v}<br>
</c:forTokens>
22. 现在来看c:catch 因为不能使用java代码,
先看看java代码的形式吧
<%
try{
Integer.parseInt("abc");
}catch(NumberFormatException e){
out.println(e.getMessage());
}
%>
<c:catch>
<%
Integer.parseInt("abc");
%>
</c:catch>
23. 现在来看c:import 把一个页面引进来
<c:import url="http://localhost:8080/drp/index.html"/>
24. 还有一个c:url这个标签可以生成一个url,一般结合 c:param来使用
<c:url value="http://localhost:8080/drp/sysmgr/user_add.jsp">
<c:param name="username" value="Tom"/>
<c:param name="age" value="20"/>
</c:url>这样形成的url后面就会跟上参数
http://localhost:8080/drp/sysmgr/user_add.jsp?username=Tom&age=20
25. 还有一个c:redirect重定向
<c:redirect context="/drp" url="index.html">
context指定在到哪去,url:指定到哪个页面。
</c:redirect>
他没有调成功,用这个出错了,没事,一般不用,这个的话,在sevlet里面一定要会用。
26. 现在来看一下,这个fmt这个标签库,这个标签库叫格式化相关的,也叫国际化相关的。其实主要还是国际化相关,以fmt 开头 的。我们只了解两个常用 的,一个格式化时间,一个格式化数值。
27. <fmt:formatDate pattern="设置一种模式,最主要就掌握这种吧"
在servlet里面
request.setAttribute("today",new Date());
在jsp页面你还得引一下
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %> 前缀可以随便命名,最好跟他的发布名称是一样的。
today(default): <fmt:formatDate value="${today}" /> 显示效果:2009-11-16默认只有年月日,没有时分秒
<fmt:formatDate value="${today}" type="date"/>显示 为:2009-11-16默认为date
<fmt:formatDate value="${today}" type="time"/>
显示效果只有 时分秒
<fmt:formatDate value="${today}" type="date"/>
<fmt:formatDate value="${today}" type="both"/>
现在效果为:年月日加时分秒的格式显示。
<fmt:formatDate value="${today}" dateStyle="short"/> 09-11-16 前面 20没有了,
<fmt:formatDate value="${today}" dateStyle="medium"/> 2009-11-16这个是默认的
<fmt:formatDate value="${today}" dateStyle="long"/> 2009年11月16日
<fmt:formatDate value="${today}" dateStyle="full"/> 2009年11月16日 星期一 这个显示的结果来源于操作系统里面的区域时间。
<fmt:formatDate value="${today}" pattern="yyyy/mm/dd HH:mm:ss"/>
<fmt:formatDate value="${today}" pattern="yyyy/mm/dd HH:mm:ss" var="d" />把结果放到一个变量里面
both:二者都,二者
medium:中间
28. 现在来看格式化数字 c:formatNumber,这个也比较常见
servlet里面
request.setAttribute("n",1234567.123);
jsp页面
n(default)<fmt:formatNumber value="${n}"/>
效果为:1,234,567.123 自动加上了 ,
<fmt:formatNumber value="${n}" pattern="###,###.####"/>
效果为:1,234,567.123就三位 不补0
<fmt:formatNumber value="${n}" pattern="###,###.0000"/>
效果为:1,234,567.1230 补0
<fmt:formatNumber value="${n}" groupingUsed="false"/> 这样千分位就没有了
效果:1234567.123
29. 现在来看jstl中的函数库,
在servlet中
request.setAttribute("hello","hello world");
jsp页面
hello.length(jsp脚本):<%=((String)request.getAttribute("hello")).length()%>
页面头部还得引入
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
hello.length(jstl函数,jstl函数必须使用在el表达式中,语法:前缀 + 冒号 + 函数名):
${fn:length (hello) }
最好用 gt 你用 > < 就可能会和一些标签冲突
<c:choose>
<c:when test="${fn:length(userList) gt 0}">//判断这个集合是不是大于0
存在用户数据
</c:when>
<c:otherwise>
没有符合条件的数据
</c:otherwise>
</c:choose>
30. 假设我现在就想在jsp里面直接调用类的一个方法:演示:
写一个类 MyFunctions
//方法必须为static public 的,这是要求
public static String sayHello(String name){
return "Hello " + name;
}
你一写完,你还得描述一下,得用一个.tld的文件来描述一下,这个文件就叫myFunctions.tld
<?xml version="1.0" encoding="UTF-8" ?>
<taglib xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
version="2.0">
<description>my functions library</description>
<display-name>my functions</display-name>
<tlib-version>1.0</tlib-version>
<short-name>my</short-name> //跟写官方似的指定最好以什么开头
//描述你的uri
<uri>http://www.bjpowernode/functions</uri>
<function>
<name>say</name> 在页面中调用 的时候用say
<function-class>com.bjpowernode.jstl.MyFunctions</function-class>
<function-signature>java.lang.String sayHello(java.lang.String)</function-signature>
</function>
</taglib>