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
JSTL与JAVA数据交互 pagecontext相关推荐
- zk java数据交互 实例_zookeeper与java交互小结实现示例
对于学习java的小伙伴们来说,zookeeper一定是不陌生的,你们知道要如何在java中与zookeeper交互小结吗?这次小编就通过一个示例来带大家了解一下吧.import org.apache ...
- vue和java数据交互_Vue与SpringBoot之间的数据交互
相比与想jsp这样的模版引擎,数据都是依赖于后端的,前端的页面只能建立在各种HTML标签的拼接上.现如今web开发的趋势是在于前后端分离开发,今天介绍一种能够在前后端框架之间进行数据传输的工具axio ...
- JavaWeb项目使用BlazeDS整合Flex进行RemoteObject数据交互
目标: 1,Java Web Project整合Flex 2,Flex中AS代码调用RemoteObject与Java数据交互 环境: 1,JDK1.6 2,MyEclipse10 3,Adobe F ...
- java与c/c++之间的数据交互-----jni点滴
2019独角兽企业重金招聘Python工程师标准>>> 淡泊明志.宁静致远 A Diamond is just a piece of Coal that did well under ...
- 如何使用Java与Mysql进行数据交互
ArthurSlog SLog-5 Year·1 Guangzhou·China July 11th 2018 微信扫描二维码,关注我的公众号 做到每个敲下的按键.每次鼠标的点击.每次手机屏幕的触碰, ...
- java堆内与堆外数据交互_Java:汇总堆外数据
java堆内与堆外数据交互 探索如何以最小的垃圾回收影响和最大的内存利用率创建堆外聚合. 使用Java Map,List和Object创建大型聚合通常会产生大量堆内存开销. 这也意味着,一旦聚合超 ...
- JAVA与SAP数据交互的方式总结
JAVA与SAP数据交互的方式总结 RFC方式:Java程序直接通过RFC访问SAP的对象(或称函数,可能叫法不对) SAP提供了BAPI(Business Application Progr ...
- 实现服务器和客户端数据交互,Java Socket有妙招
摘要:在Java SDK中,对于Socket原生提供了支持,它分为ServerSocket和Socket. 本文分享自华为云社区<Java Socket 如何实现服务器和客户端数据交互>, ...
- java cookie能存到服务器_Cookie技术用于将会话过程中的数据保存到( )中,从而使浏览器和服务器可以更好地进行数据交互。(5.0分)_学小易找答案...
[单选题]下列选项中,用于对超链接和form表单中的action属性中设置的URL进行重写的方法是(5.0分) [判断题]安装好Tomcat后,就可以直接启动运行了,并不要先安装JDK.(5.0分) ...
最新文章
- 工业机器人抓取时怎么定位的?用什么传感器来检测?
- Github 的 Pull Request 教程
- Linux部署动态网页,Nginx发布支持动态配置的开源Web服务器
- bigint hive java类型_详解Apache Hudi如何配置各种类型分区
- c语言头文件和源文件_C语言头文件防卫式声明
- Input type (torch.cuda.DoubleTensor) and weight type (torch.cuda.FloatTensor) should be the same
- Joe一款个人博客typecho主题(扩展版)
- 超级猫超级签名分发源码
- 【报告分享】2021年中国新经济企业500强发展研究报告.pdf(附下载链接)
- Maven 设置本地仓库的地址
- 清华大学操作系统OS学习(八)——虚拟存储概念
- error MSB8008: 指定的平台工具集()未安装或无效。请确保选择受支持的 PlatformToolset 值
- gps串口通信程序c语言,stm32单片机串口接收GPS数据并解析NMEA之GPRMC
- android 以太网 热插拔,android_8.1 hdmi设备热插拔事件
- as3.0 当fla里面有TLF文本的时候,加载声音会出现错误
- python 网格策略_『量化经典策略』网格策略
- 真实故事:因为感动在一起,注定走不长久
- mysqli_connect(): (HY000/2002):
- 【工具分享篇二】PDF公式提取教程(一):Mathpix/Typora及Pandoc扩展安装教程
- python打开图片文件-Python怎么读取图片