加入收藏 | 设为首页 | 会员中心 | 我要投稿 聊城站长网 (https://www.0635zz.com/)- 智能语音交互、行业智能、AI应用、云计算、5G!
当前位置: 首页 > 教程 > 正文

jsp中怎样通过API方式获取jstl的变量

发布时间:2023-05-31 13:40:22 所属栏目:教程 来源:
导读:jsp中如何通过API方式获取jstl的变量

一,问题概述

jstl的出现,的确标准化了我们的jsp开发,也使得页面变得更加清晰,这也正是j2ee推出jstl的一个意图。例如jsp中要求取出request中保存的一个属性username,
jsp中如何通过API方式获取jstl的变量
 
一,问题概述
 
jstl的出现,的确标准化了我们的jsp开发,也使得页面变得更加清晰,这也正是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的确简洁了许多。
 
不过在具体使用中,我们发现jstl提供的标签库只能在一定程度上满足我们的应用逻辑要求,有些时候不得不在jsp中借助java代码来实现。例如在jsp中要求取出request属性信息中的用户列表userlist,列出每个用户时,如果该用户为管理员用户(假设该判断由一个工具类的静态方法来提供),则该用户显示为红色,以前习惯的方式为:
 
<%
 
     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来实现呢,我们尝试一下:
 
<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>
 
基本上可以,但是问题就在于如何判断每次循环到的用户是否为管理员呢?我们知道判断方法是在一个工具类中实现的,而jstl标签中还没有可以直接调用类的方法的标签,因此仅是标签的jstl无法满足这个要求。
 
二,解决方式
 
1,写一个自定义标签,来判断当前循环到的用户是否为管理员,如下:
 
<%@ 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类来实现。
 
2,联合使用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中,这要根据实际应用来做决定,一般只是在页面中使用的化,使用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指定的范围之中。
 
在理解这些的基础上,再来使用联合方式解决最初的问题就相对好说多了,如下:
 
<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>
 
 

(编辑:聊城站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!