原文地址: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

JSTL与JAVA数据交互 pagecontext相关推荐

  1. zk java数据交互 实例_zookeeper与java交互小结实现示例

    对于学习java的小伙伴们来说,zookeeper一定是不陌生的,你们知道要如何在java中与zookeeper交互小结吗?这次小编就通过一个示例来带大家了解一下吧.import org.apache ...

  2. vue和java数据交互_Vue与SpringBoot之间的数据交互

    相比与想jsp这样的模版引擎,数据都是依赖于后端的,前端的页面只能建立在各种HTML标签的拼接上.现如今web开发的趋势是在于前后端分离开发,今天介绍一种能够在前后端框架之间进行数据传输的工具axio ...

  3. JavaWeb项目使用BlazeDS整合Flex进行RemoteObject数据交互

    目标: 1,Java Web Project整合Flex 2,Flex中AS代码调用RemoteObject与Java数据交互 环境: 1,JDK1.6 2,MyEclipse10 3,Adobe F ...

  4. java与c/c++之间的数据交互-----jni点滴

    2019独角兽企业重金招聘Python工程师标准>>> 淡泊明志.宁静致远 A Diamond is just a piece of Coal that did well under ...

  5. 如何使用Java与Mysql进行数据交互

    ArthurSlog SLog-5 Year·1 Guangzhou·China July 11th 2018 微信扫描二维码,关注我的公众号 做到每个敲下的按键.每次鼠标的点击.每次手机屏幕的触碰, ...

  6. java堆内与堆外数据交互_Java:汇总堆外数据

    java堆内与堆外数据交互 探索如何以最小的垃圾回收影响和最大的内存利用率创建堆​​外聚合. 使用Java Map,List和Object创建大型聚合通常会产生大量堆内存开销. 这也意味着,一旦聚合超 ...

  7. JAVA与SAP数据交互的方式总结

    JAVA与SAP数据交互的方式总结 RFC方式:Java程序直接通过RFC访问SAP的对象(或称函数,可能叫法不对)     SAP提供了BAPI(Business Application Progr ...

  8. 实现服务器和客户端数据交互,Java Socket有妙招

    摘要:在Java SDK中,对于Socket原生提供了支持,它分为ServerSocket和Socket. 本文分享自华为云社区<Java Socket 如何实现服务器和客户端数据交互>, ...

  9. java cookie能存到服务器_Cookie技术用于将会话过程中的数据保存到( )中,从而使浏览器和服务器可以更好地进行数据交互。(5.0分)_学小易找答案...

    [单选题]下列选项中,用于对超链接和form表单中的action属性中设置的URL进行重写的方法是(5.0分) [判断题]安装好Tomcat后,就可以直接启动运行了,并不要先安装JDK.(5.0分) ...

最新文章

  1. 工业机器人抓取时怎么定位的?用什么传感器来检测?
  2. Github 的 Pull Request 教程
  3. Linux部署动态网页,Nginx发布支持动态配置的开源Web服务器
  4. bigint hive java类型_详解Apache Hudi如何配置各种类型分区
  5. c语言头文件和源文件_C语言头文件防卫式声明
  6. Input type (torch.cuda.DoubleTensor) and weight type (torch.cuda.FloatTensor) should be the same
  7. Joe一款个人博客typecho主题(扩展版)
  8. 超级猫超级签名分发源码
  9. 【报告分享】2021年中国新经济企业500强发展研究报告.pdf(附下载链接)
  10. Maven 设置本地仓库的地址
  11. 清华大学操作系统OS学习(八)——虚拟存储概念
  12. error MSB8008: 指定的平台工具集()未安装或无效。请确保选择受支持的 PlatformToolset 值
  13. gps串口通信程序c语言,stm32单片机串口接收GPS数据并解析NMEA之GPRMC
  14. android 以太网 热插拔,android_8.1 hdmi设备热插拔事件
  15. as3.0 当fla里面有TLF文本的时候,加载声音会出现错误
  16. python 网格策略_『量化经典策略』网格策略
  17. 真实故事:因为感动在一起,注定走不长久
  18. mysqli_connect(): (HY000/2002):
  19. 【工具分享篇二】PDF公式提取教程(一):Mathpix/Typora及Pandoc扩展安装教程
  20. python打开图片文件-Python怎么读取图片

热门文章

  1. 直播的一般流程是什么?
  2. 如果“王思聪”们创业就一定能成功
  3. Java相关资源下载路径
  4. Java-占位符的使用
  5. sql azure 语法_Azure SQL –使用Azure自动化的索引表
  6. 数据湖 数据仓库 数据集市_还原数据仓库/数据集市环境的两种方法
  7. 了解SQL Server中的倾斜数据
  8. [剑指offer] 66. 机器人的运动范围
  9. 2、Qt Project之鼠标事件监控
  10. WebService 的CXF框架 WS方式Spring开发