JSTL与JAVA数据交互 pagecontext

原文地址:http://www.oschina.net/question/12_693

一,问题概述

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>

转载于:https://www.cnblogs.com/sitengfei/archive/2012/06/06/2537713.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值