国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JSP > 正文

jsp中如何通過API方式獲取jstl的變量

2024-09-05 00:19:19
字體:
來源:轉載
供稿:網(wǎng)友

一,問題概述

jstl的出現(xiàn),的確標準化了我們的jsp開發(fā),也使得頁面變得更加清晰,這也正是j2ee推出jstl的一個意圖。例如jsp中要求取出request中保存的一個屬性username,以前習慣的方式:
<%
      string username=(string)request.getattribute("username");
      out.println(username);
%>
或者
<%
      string username=(string)request.getattribute("username");
%>
<%=username%>
在使用jstl后,則可以直接書寫為:
<c:out value="${username}"/>
或者直接
${username}
可見去掉<%%>的使用后,jsp的確簡潔了許多。
不過在具體使用中,我們發(fā)現(xiàn)jstl提供的標簽庫只能在一定程度上滿足我們的應用邏輯要求,有些時候不得不在jsp中借助java代碼來實現(xiàn)。例如在jsp中要求取出request屬性信息中的用戶列表userlist,列出每個用戶時,如果該用戶為管理員用戶(假設該判斷由一個工具類的靜態(tài)方法來提供),則該用戶顯示為紅色,以前習慣的方式為:
<%
     list users=(list)request.getattribute("userlist");
     iterator us=users.iterator();
     while(us.hasnext()){
         user user=(user)us.next();
         booean hasadminrole=permissionutil.hasrole(user,role.admin);
         string color="black";
         if(hasadminrole){
             color="red";
         }
%>
<font color="<%=color%>"><%=user.getname%></font>
<%
     }
%>
那上面的邏輯是否可以使用jstl來實現(xiàn)呢,我們嘗試一下:
<c:set var="color" value="black"/>
<c:foreach items="${userlist}" var="user">
    <c:if test="如果是管理員">
       <c:set var="color" value="red"/>
   </c:if>
   <font color="<c:out value='${color}'/>"><c:out  value="${user.name}"/></font>
</c:foreach>
基本上可以,但是問題就在于如何判斷每次循環(huán)到的用戶是否為管理員呢?我們知道判斷方法是在一個工具類中實現(xiàn)的,而jstl標簽中還沒有可以直接調用類的方法的標簽,因此僅是標簽的jstl無法滿足這個要求。

二,解決方式

1,寫一個自定義標簽,來判斷當前循環(huán)到的用戶是否為管理員,如下:
<%@ taglib uri="/web-inf/myrolecheck.tld" prefix="role"%>
<c:set var="color" value="black"/>
<c:foreach items="${userlist}" var="user">
   <role:check user="${user.name}" role="admin">
       <c:set var="color" value="red"/>
   </role:check>
   <font color="<c:out value='${color}'/>"><c:out  value="${user.name}"/></font>
</c:foreach>
當然,上面的方式要求我們自定義的標簽能夠支持對el方式的解析,這實際上可以通過evalhelper類來實現(xiàn)。

2,聯(lián)合使用jstl與java api。使用這種方式,我們需要對jstl了解的更深一些,我們知道jstl和java api(或者說是<%%>方式)是很不相同的兩種書寫方式,他們之間的變量有些可以很好的傳遞,但有些卻讓人摸不著頭腦,例如:
1)<%%>變量在jstl中獲取的例子:
<%
      string username="zhangsan";
      pagecontext.setattribute("username",username);
%>
<c:out value="${username}"/>
即:jsp頁面中<%%>中的變量在定義后,需要放置到pagecontext屬性中,才能被獲取(當然也可以放置到request和session、applicatio中,這要根據(jù)實際應用來做決定,一般只是在頁面中使用的化,使用pagecontext就可以了)。
2)jstl變量在<%%>中獲取的例子:
<c:set var="username" value="zhangsan"/>
<%
      string username=(string)pagecontext.getattribute("username");
%>
上面為什么要在pagecontext中來獲取呢,因為c:set方式定義的變量默認是存放在pagecontext的屬性中的,當然了如果在定義是指定了作用范圍,則也需要通過相應作用范圍的頁面對象來獲取該屬性,例如:
<c:set var="username" value="zhangsan"  scope="session"/>
<%
      string username=(string)session.getattribute("username");
%>

另外,還要主要一點,jstl中的許多操作都用到了var屬性,例如c:foreach、c:import等等,這些var所代表的變量默認也是存放在pagecontext中的,當然有些標簽還提供了scope屬性,這也意味著其var所代表的變量會存放到scope指定的范圍之中。

在理解這些的基礎上,再來使用聯(lián)合方式解決最初的問題就相對好說多了,如下:
<c:foreach items="${userlist}" var="user">
   <%
         user user=(user)pagecontext.getattribute("user");
         booean hasadminrole=permissionutil.hasrole(user,role.admin);
         string color="black";
         if(hasadminrole){
             color="red";
         }

   %>
   <font color="<%=color%>"><c:out  value="${user.name}"/></font>
</c:foreach>

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 绥江县| 瑞安市| 竹北市| 广水市| 望谟县| 永兴县| 集安市| 砚山县| 射阳县| 银川市| 鱼台县| 阜平县| 余江县| 双柏县| 望都县| 保定市| 丹阳市| 桐城市| 平江县| 马关县| 云浮市| 和平县| 普安县| 石首市| 五大连池市| 郧西县| 瓦房店市| 铁力市| 抚远县| 柞水县| 邛崃市| 成都市| 西丰县| 临汾市| 亚东县| 太湖县| 利津县| 勐海县| 乃东县| 五寨县| 南靖县|