JSTL与EL之间的千丝万缕

一、关于JSTL和EL:

什么是JSTL?

  JSTL( JSP Standard Tag Library)JSP标准 标签库,由apache实现。

什么是EL?

  EL(Expression Language)表达式语言。

两者关系?

  JSTL在赋值时会大量用到EL表达式。可以简单理解成,EL只是JSTL中的一部分。

作用:

  简化jsp页的书写;削弱jsp中调用servlet的Java代码,便于分层控制。只要是jsp能够完成的功能使用JSTL和EL表达式都可以完成。包括从和Servlet的数据交互、操作XML、格式化数据显示以及样式显示(控制表格的偶数行使用不同的颜色显示等)、Request中读取数据、控制循环(数组、Map等)、支持函数处理(trim、substring、join等)、还可以自定义函数等、操作数据库(违背分层原则,一般不这么使用)。


二、EL表达式:

  如果只是使用EL表达式,不需要引入任何jar包,只要jsp/servlet容器实现了J2EE1.4/servlet2.4、JSP2.0规范就可以。但是它的功能有限,如:针对于空,给出默认的输出,迭代循环数组元素等是无法实现的。对于JSTL,这些都是没有问题的,但需要进行引入和说明。

  语法:${scope} scope(applicatioin/session/servlet等)

  内置对象:pageScope、reqeustScope、sessionScope、applicationScope

  默认搜索范围:pageScope——applicationScope

  指定搜索方式:${requestScope.hello}

  在jsp中,很少直接传字串,一般传的是对象,且对象中还包含有其他对象,无需引入包,要求对象都需要有get方法,在jsp中获取数据的时候,直接点出get后面的那一部分,不区分大小写。


  EL隐含对象:

param:针对request.getParameter("itemNoOrName")使用这个内置对象取得数值,itemNoOrName=${param.itemNoOrName}

如果request.setAttribute("pageModel", pageModel);则直接使用EL表达式取数据。


  需要注意点是:EL表达式不能取出使用常量定义的变量。


三、JSTL:

  关于JSTL,不做过多的说明,jsp界面中的java代码,使用JSTL都可以替代,而且更加简洁,负责前台的人甚至可以不需要熟悉java代码。

  这里附上一个帮助文档:有详细的api说明。


四、使用:

  演示通过使用jstl和el和核心库的使用:获取并显示用户信息。

  1、引入jar包:

如果要使用JSTL,而不仅仅是EL,需要引入jstl.jar和standard.jar两个包。这里也提供下载连接。

  2、定义java实体类:

        这里使用一个User类和一个Group类,一个用户属于某个Group,就是两个普通的实体类,二者之间有一个关联,代码比较简单,就不贴了。

  3、编写Servlet类:       

[java]  view plain  copy
  1. package com.bjpowernode.jstl;  
  2.   
  3. import java.io.IOException;  
  4.   
  5.   
  6. import java.util.ArrayList;  
  7. import java.util.HashMap;  
  8. import java.util.List;  
  9. import java.util.Map;  
  10.   
  11. import javax.servlet.ServletException;  
  12. import javax.servlet.http.HttpServlet;  
  13. import javax.servlet.http.HttpServletRequest;  
  14. import javax.servlet.http.HttpServletResponse;  
  15.   
  16. /** 
  17.  * 核心库,测试一些字串、数组、map、list、空、循环等基础的应用 
  18.  * @author LiMin 
  19.  * 
  20.  */  
  21. public class jstlCoreServlet extends HttpServlet {  
  22.       
  23.     @Override  
  24.     protected void doGet(HttpServletRequest request, HttpServletResponse response)  
  25.             throws ServletException, IOException {  
  26.           
  27.         //普通字串  
  28.         request.setAttribute("hello""Hello World");  
  29.           
  30.         //带有html样式的文本  
  31.         request.setAttribute("welcome","<font color='red'>欢迎来到这个世界!</font>");  
  32.           
  33.         //set  
  34.         User u = new User();  
  35.         request.setAttribute("u", u);  
  36.           
  37.           
  38.           
  39.         //条件控制标签  
  40.         request.setAttribute("v1"10);  
  41.         request.setAttribute("v2"20);  
  42.           
  43.         //空   
  44.         request.setAttribute("userList"new ArrayList());  
  45.           
  46.         //结构  
  47.         Group group = new Group();  
  48.         group.setName("信息技术提高班第八期");  
  49.           
  50.         List users = new ArrayList();  
  51.         for (int i=0; i<10; i++) {  
  52.             User user = new User();  
  53.             user.setUsername("张三_" + i);  
  54.             user.setAge(23 + i);  
  55.             user.setGroup(group);  
  56.             users.add(user);  
  57.         }  
  58.           
  59.         request.setAttribute("users", users);     
  60.                   
  61.           
  62.           
  63.         Map map = new HashMap();  
  64.         map.put("k1""v1");  
  65.         map.put("k2""v2");  
  66.         map.put("k3""v3");  
  67.         map.put("k4""v4");  
  68.           
  69.           
  70.         request.setAttribute("map", map);  
  71.           
  72.         //forTokens  
  73.         request.setAttribute("strTokens","1#2#3#4#5");  
  74.           
  75.           
  76.         request.getRequestDispatcher("/jsp_core.jsp").forward(request, response);  
  77.                   
  78.           
  79.           
  80.     }  
  81.   
  82.       
  83. }  

  这里的Servlet跟不适用jstl没有任何差别。这里制造了一些实体结构、空、数组、map数据,为下一步的jstl的访问,做演示基础。

  4、使用jstl的核心库访问、控制数据显示:

    jsp_core.jsp文件:

[java]  view plain  copy
  1. <%@ page language="java" contentType="text/html; charset=GBK"  
  2.     pageEncoding="GBK"%>  
  3. <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>  
  4. <%@ page import="java.util.*"%>  
  5. <%@ page import="com.bjpowernode.jstl.*"%>  
  6. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">  
  7. <html>  
  8. <head>  
  9. <meta http-equiv="Content-Type" content="text/html; charset=GB18030">  
  10.   
  11. <title>测试jstl核心库,引入tld文件</title>  
  12.   
  13.   
  14. </head>  
  15.   
  16. <body>  
  17.     <h1>测试jstl核心库</h1>  
  18.     <br>  
  19.     <li>采用C:out标签</li>  
  20.     <br> hello(使用标签):  
  21.     <c:out value="123"></c:out>  
  22.     <br> hello(使用标签):  
  23.     <c:out value="hello"></c:out>  
  24.     <br> hello(使用EL表达式):${hello }  
  25.     <br> hello(default):${hello123 }  
  26.     <br> hello(使用缺省值):  
  27.     <c:out value="${hello123}" default="没有值"></c:out>  
  28.     <br> hello(使用缺省值):  
  29.     <c:out value="${hello123 }">没有值</c:out>  
  30.     <br> welcome(使用EL表达式):${welcome }  
  31.     <br> welcome(使用jst标签,escapeXml="true"):  
  32.     <c:out value="${welcome }" escapeXml="true"></c:out>  
  33.     <br> welcome(使用jst标签,escapeXml="false"):  
  34.     <c:out value="${welcome }" escapeXml="false"></c:out>  
  35.     <br>  
  36.   
  37.   
  38.     <p>  
  39.         <c:set value="root" var="userid" />  
  40.         ${userid }<br>  
  41.     <li>测试c:set,c:remove</li>  
  42.     <br>  
  43.     <c:set value="root" var="userid" />  
  44.     userid:${userid }  
  45.     <br>  
  46.   
  47.     <c:remove var="userid" />  
  48.     userid1:${userid }  
  49.     <br>  
  50.   
  51.   
  52.    <li>测试c:set、c:remove</li><br>  
  53.     测试set: <c:set value="root" var="userId"> </c:set><br>  
  54.     userId2:${userId }  
  55.       
  56.     测试set(body scope): <c:set  var="userId" scope="page"> root </c:set><br>  
  57.         userId3:${userId }  
  58.      
  59.   
  60.     测试remove  
  61.     <br> userId:${userId }  
  62.     <br>  
  63.     <c:remove var="userId" />  
  64.     移除后:userId:${userId }  
  65.     <br>  
  66.   
  67.   
  68.     <p>  
  69.     <li>条件控制标签:c:if</li>  
  70.     <br> 测试if控制:  
  71.     <c:if test="${v1 lt v2 }">v1小于v2</c:if>  
  72.     <br>  
  73.   
  74.     <li>条件控制标签:c:when c:chose c:otherwise</li>  
  75.     <br>  
  76.     <c:choose>  
  77.         <c:when test="${v1 gt v2 }">  
  78.             v1大于v2<br>  
  79.         </c:when>  
  80.         <c:otherwise>  
  81.                 v1不大于v2<br>  
  82.         </c:otherwise>  
  83.     </c:choose>  
  84.   
  85.   
  86.     <c:choose>  
  87.         <c:when test="${empty userList }">  
  88.         
  89.             userList为空<br>  
  90.         </c:when>  
  91.         <c:otherwise>  
  92.             存在用户数据!<br>  
  93.         </c:otherwise>  
  94.   
  95.     </c:choose>  
  96.   
  97.     <p>  
  98.     <li>jsp语法,显示表格</li>  
  99.     <span style="color:#ff0000;"><table>  
  100.         <tr>  
  101.             <td>姓名</td>  
  102.             <td>年龄</td>  
  103.             <td>组别</td>  
  104.   
  105.         </tr>  
  106.         <%  
  107.         //取出数据  
  108.         List userList =(List)request.getAttribute("users");  
  109.         if(userList==null||userList.size()==0){               
  110.     %>  
  111.         <tr>  
  112.             <td colspan="3">没有数据</td>  
  113.         </tr>  
  114.         <%    
  115.         }else{                    
  116.               
  117.      %>  
  118.   
  119.         <%             
  120.             for(int i =0;i<userList.size();i++){  
  121.             User user = (User)userList.get(i);   
  122. /*              for(Iterator iter= userList.iterator();iter.hasNext();){ 
  123.                 User user = (User)iter.next();   */           
  124.         %>  
  125.         <tr>  
  126.             <td><%=user.getUsername() %></td>  
  127.             <td><%=user.getAge() %></td>  
  128.             <td><%=user.getGroup().getName() %></td>  
  129.         </tr>  
  130.         <%  
  131.         }  
  132.         }  
  133.      %>  
  134.   
  135.     </table>  
  136.   
  137.   
  138.   
  139.   
  140.     <li>循环控制标签c:forEach</li>  
  141.     <br> 测试c:forEach:  
  142.     <table border="1">  
  143.         <tr>  
  144.             <td>用户名</td>  
  145.             <td>年龄</td>  
  146.             <td>所属组</td>  
  147.         </tr>  
  148.         <c:choose>  
  149.             <c:when test="${empty users}">  
  150.                 <tr>  
  151.                     <td colspan="3">没有符合条件的数据</td>  
  152.                 </tr>  
  153.             </c:when>  
  154.             <c:otherwise>  
  155.                 <c:forEach items="${users}" var="user">  
  156.                     <tr>  
  157.                         <td>${user.username }</td>  
  158.                         <td>${user.age }</td>  
  159.                         <td>${user.group.name }</td>  
  160.                     </tr>  
  161.                 </c:forEach>  
  162.             </c:otherwise>  
  163.         </c:choose>  
  164.   
  165.   
  166.     </table>  
  167.   
  168.   
  169.     <li>循环控制标签c:forEach varSatues</li>  
  170.     <br>  
  171.     <table>  
  172.         <tr>  
  173.             <td>用户名</td>  
  174.             <td>年龄</td>  
  175.             <td>所属组</td>  
  176.         </tr>  
  177.   
  178.         <c:choose>  
  179.             <c:when test="${empty users }">  
  180.                 <tr>  
  181.                     <td colspan="3">没后符合条件的语句</td>  
  182.                 </tr>  
  183.             </c:when>  
  184.             <c:otherwise>  
  185.                 <c:forEach items="${users}" var="user" varStatus="vs">  
  186.                     <c:choose>  
  187.                         <c:when test="${vs.count mod 2 ==0 }">  
  188.                             <tr bgcolor="yellow">  
  189.                         </c:when>  
  190.                         <c:otherwise>  
  191.                             <tr>  
  192.                         </c:otherwise>  
  193.                     </c:choose>  
  194.                     <td>${user.username }</td>  
  195.                     <td>${user.age }</td>  
  196.                     <td>${user.group.name }</td>  
  197.                     </tr>  
  198.   
  199.                 </c:forEach>  
  200.             </c:otherwise>  
  201.         </c:choose>  
  202.   
  203.     </table>  
  204. </span>  
  205.       
  206.     <p>  
  207.        
  208.    <li>循环控制标签c:forEach begin end  step</li><br>  
  209.   
  210.    <table border="1">  
  211.     <tr>  
  212.         <td>用户名</td>  
  213.         <td>年龄</td>  
  214.         <td>所属组</td>  
  215.     </tr>  
  216.       
  217.     <c:choose>  
  218.         <c:when test="${empty users }"  >  
  219.             <tr>  
  220.                 <td colspan="3">没后符合条件的语句</td>  
  221.             </tr>  
  222.         </c:when>  
  223.         <c:otherwise>  
  224.             <c:forEach  items="${users }" var ="user"  begin ="2"  end ="8" step="2">  
  225.             <tr>  
  226.                 <td> ${user.username }</td>  
  227.                 <td>${user.age }</td>  
  228.                 <td>${user.group.name }</td>              
  229.             </tr>  
  230.         </c:forEach>  
  231.       
  232.         </c:otherwise>  
  233.     </c:choose>         
  234.   
  235.    </table>   
  236.       
  237.          
  238.    <p>  
  239.    <li>演示forEach输出 Map 值</li><br>  
  240.    <c:forEach  items="${map}" var ="entry">  
  241.         ${ entry.key},${entry.value }<br>       
  242.    </c:forEach>     
  243.        
  244.    
  245.    <p>  
  246.    <li>演示使用forTokes循环</li>  
  247.    <c:forTokens items="${strTokens }" delims="#" var="v" >  
  248.         ${v }<br>  
  249.    </c:forTokens>  
  250.     
  251.     <p>      
  252.     <li> catch标签 </li>  
  253.     <%  
  254.         try{  
  255.             Integer.parseInt("abcv");  
  256.         }catch(NumberFormatException e){              
  257.               
  258.             out.print(e.getMessage());  
  259.         }  
  260.      %>  
  261.      <c:catch>  
  262.         ${msg }  
  263.      </c:catch>  
  264.     <p>  
  265.         
  266.     
  267.     <li>c: url c:param</li>  
  268.     <c:url value="http://localhost:8080/drp4.7/sysmgr/validate.jsp" var ="u">  
  269.         <c:param name="userId" value="zhangsanfeng"></c:param>  
  270.         <c:param name="age" value="180"></c:param>  
  271.     </c:url>  
  272.     ${u }<br>  
  273.    
  274.     
  275.    <li>c:redirect</li>  
  276.     <c:redirect url="/login.jsp" context="/drp4.7"></c:redirect>   
  277.   
  278. </body>  
  279. </html>  

   注意需要添加对jstl的引用:

[java]  view plain  copy
  1. <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>  
   不同版本的jstl,uri的路径是有所区别的,初学者,可以从jstl Library—>jstl-impl.jar—>META-INF目录下的具体的tld文件中复制。

   通过上面的代码就可以看出使用jstl要比嵌入java代码简洁的多,尤其是在循环方面更是如此。具体语法,比较简单,而且文章中也已经附上了帮助文档,这里不做赘述,关键还是要多实践。   

    

五、疑问:

  jstl方便在jsp中构造页面的显示,对于树形结构,如果是在servlet中结合数据库递归+html代码实现,一些优秀的框架,如ext等已经做的很好了,但是对于使用jstl有什么好的方法吗?

转载自:http://blog.csdn.net/lmdcszh/article/details/9240719

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值