jstl

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>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值