Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 853|回复: 0

jsp中如何通过API方式获取jstl的变量

[复制链接]

该用户从未签到

发表于 2011-9-25 10:33:28 | 显示全部楼层 |阅读模式
一,问题概述

jstl的出现,的确标准化了我们的jsp开发,也使得页面变得更加清晰,这也正是J2EE推出jstl的一个意图。例如jsp中要求取出request中保存的一个属性username,以前习惯的方式:
<%
      String username=(String)request.getAttribute("username");
      out.println(username);
%>
或者
<%
      String username=(String)request.getAttribute("username");
%>
<%=username%>
在使用jstl后,则可以直接书写为:
<cut 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>
回复

使用道具 举报

该用户从未签到

发表于 2011-10-29 13:03:38 | 显示全部楼层
谢谢分享啊 。。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

GMT+8, 2024-4-28 12:49 , Processed in 0.430819 second(s), 47 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表