用JSF框架时,当一个JSP页面里,JSF TAG与JSTL TAG都存在的时候,它们之间有没有联系?

对此,做了以下测试(JSF 1.2  JSTL 1.2 Server:Tomcat):

JSP代码

<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %>
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<HTML>
<HEAD>
</HEAD>
<f:view beforePhase="#{testBean.doMethod}">
<p>By JSF TAG
<br>
Bean Created Time  :
<h:outputText value="#{testBean.beanCreateTime}" />
<br>
Bean Method Called Time  :
<h:outputText value="#{testBean.methodCalledTime}" />
<br>
<br>
By JSTL TAG
<br>
Bean Created Time  :
<c:out value="${testBean.beanCreateTime}"></c:out>
<br>
Bean Method Called  Time  :
<c:out value="${testBean.methodCalledTime}"></c:out>
<br>
<br>Test JSF TAG used in JSTL TAG
<br>
<c:if test="${not empty testBean.beanCreateTime}">Bean Created Time:<h:outputText value="#{testBean.beanCreateTime}" /><br>
</c:if>
<c:if test="${not empty testBean.methodCalledTime}">Bean Method Called  Time  : <h:outputText value="#{testBean.methodCalledTime}" /><br>
</c:if>
</p>
</f:view>
</HTML>
import javax.faces.event.PhaseEvent;public class TestBean {String beanCreateTime = null;String methodCalledTime = null;public TestBean() {long now = System.nanoTime();beanCreateTime = String.valueOf(now);System.out.println("beanCreateTime=" + beanCreateTime);}public void doMethod(PhaseEvent event) {long now = System.nanoTime();methodCalledTime = String.valueOf(now) + " PhaseID=" + event.getPhaseId();}public String getBeanCreateTime() {return beanCreateTime;}public void setBeanCreateTime(String time) {this.beanCreateTime = time;}public String getMethodCalledTime() {return methodCalledTime;}public void setMethodCalledTime(String initTime) {this.methodCalledTime = initTime;}
}

faces-config.xml

   <managed-bean><description>TestBean</description><managed-bean-name>testBean</managed-bean-name><managed-bean-class>com.test.TestBean</managed-bean-class><managed-bean-scope>request</managed-bean-scope></managed-bean>

执行JSP页面结果如下:

By JSF TAG
Bean Created Time : 89317663431525
Bean Method Called Time : 89317686242525 PhaseID=RENDER_RESPONSE 6

By JSTL TAG
Bean Created Time : 89317663431525
Bean Method Called Time :

Test JSF TAG used in JSTL TAG
Bean Created Time: 89317663431525

可以看出

1.由JSF创建出的bean可以被JSTL TAG直接使用

2.在bean的构造函数里赋值的属性可以被JSF TAG和JSTL TAG两方使用,不会有问题(如上面的beanCreateTime)。但是在JSF TAG调用的Method里赋值的属性只可以被JSF TAG使用(如methodCalledTime)

说明bean先被JSF创建,然后优先解析JSTL TAG,再解析JSF TAG

所以JSTL TAG里面如果包含JSF TAG的话,就会有冲突

另外如果JSP里加入了如下代码用来创建bean的话

<jsp:useBean id="testBean" class="com.test.TestBean" scope="request"></jsp:useBean>

JSF TAG与jsp:useBean之间的关联发现有如下几种情况

第一种情况: 如果这里的scope是和 faces-config里定义的managed-bean-scope是一致的话,那么效果与没有这段代码时是一样的

第二种情况:当这里的scope是request,而 faces-config里是session时,执行情况如下

第一次执行 : JSF和jsp:useBean各创建一个Bean实例,JSF TAG用的是JSF创建的, JSTL用的是jsp:useBean创建的

By JSF TAG
Bean Created Time : 92738654759473
Bean Method Called Time : 92738655964375 PhaseID=RENDER_RESPONSE 6

By JSTL TAG
Bean Created Time : 92738655272946
Bean Method Called Time :

Test JSF TAG used in JSTL TAG
Bean Created Time: 92738654759473

页面刷新一次后: JSF的scope是session,所以不会再次创建,jsp:useBean会在每次刷新时重新创建一次,且会覆盖JSF创建的

By JSF TAG
Bean Created Time : 92827106721384
Bean Method Called Time : 92827107836889 PhaseID=RENDER_RESPONSE 6

By JSTL TAG
Bean Created Time : 92827106721384
Bean Method Called Time :

Test JSF TAG used in JSTL TAG
Bean Created Time: 92827106721384

第三种情况:当这里的scope是session,而 faces-config里是request时,执行情况如下

第一次执行 :

By JSF TAG
Bean Created Time : 93666788381763
Bean Method Called Time : 93666790423084 PhaseID=RENDER_RESPONSE 6

By JSTL TAG
Bean Created Time : 93666788381763
Bean Method Called Time :

Test JSF TAG used in JSTL TAG
Bean Created Time: 93666788381763

页面刷新一次后:

By JSF TAG
Bean Created Time : 93666788381763
Bean Method Called Time : 93719730795394 PhaseID=RENDER_RESPONSE 6

By JSTL TAG
Bean Created Time : 93666788381763
Bean Method Called Time : 93666790423084 PhaseID=RENDER_RESPONSE 6

Test JSF TAG used in JSTL TAG
Bean Created Time: 93666788381763
Bean Method Called Time : 93719730795394 PhaseID=RENDER_RESPONSE 6

后台bean仅以session级方式实例化一次后,在同一个session里不会再次被创建

第四种情况: 当这里的scope是page,而 faces-config里是request时,执行情况如下

第一次执行 :

JSP:

By JSF TAG
Bean Created Time : 94597696039859
Bean Method Called Time : 94597697290856 PhaseID=RENDER_RESPONSE 6

By JSTL TAG
Bean Created Time : 94597696039859
Bean Method Called Time :

Test JSF TAG used in JSTL TAG
Bean Created Time: 94597696039859

后台log:

beanCreateTime=94597695412126
beanCreateTime=94597696039859

页面刷新一次后:

By JSF TAG
Bean Created Time : 94736992042843
Bean Method Called Time : 94736992690970 PhaseID=RENDER_RESPONSE 6

By JSTL TAG
Bean Created Time : 94736992042843
Bean Method Called Time :

Test JSF TAG used in JSTL TAG
Bean Created Time: 94736992042843

beanCreateTime=94597695412126
beanCreateTime=94597696039859
beanCreateTime=94736991359795
beanCreateTime=94736992042843

从上面现象看,每次JSF与jsp:useBean各创建一个beang实例,jsp:useBean创建的覆盖JSF创建的

第五种情况: 当这里的scope是page,而 faces-config里是session时,执行情况如下

JSF创建一次后不会再次创建,jsp:useBean每次创建一个bean实例,在TAG使用上互相不干扰:

第一次执行:

By JSF TAG
Bean Created Time : 108104069197900
Bean Method Called Time : 108104070863475 PhaseID=RENDER_RESPONSE 6

By JSTL TAG
Bean Created Time : 108104069197900
Bean Method Called Time :

Test JSF TAG used in JSTL TAG
Bean Created Time: 108104069197900

beanCreateTime=108104068334383
beanCreateTime=108104069197900

页面刷新一次后:

By JSF TAG
Bean Created Time : 108104069197900
Bean Method Called Time : 108170882535908 PhaseID=RENDER_RESPONSE 6

By JSTL TAG
Bean Created Time : 108170881005267
Bean Method Called Time :

Test JSF TAG used in JSTL TAG
Bean Created Time: 108104069197900

beanCreateTime=108104068334383
beanCreateTime=108104069197900
beanCreateTime=108170881005267

JSF与JSTL TAG的互用问题相关推荐

  1. jsf标签,jsp标签与jstl标签

    JSF通过定制标签与JSP集成.之前展示过的所有 JSF标签,<h:inputText>.<h:outputText>.<h:form> 和<f:view&g ...

  2. JSF 标签大全(非常详细 有例子)

    1. JSF入门 藉由以下的几个主题,可以大致了解JSF的轮廓与特性,我们来看看网页设计人员与应用程序设计人员各负责什么. 1.1简介JSF Web应用程序的开发与传统的单机程序开发在本质上存在着太多 ...

  3. 在 JSF中JSP扮演的角色

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! JSF ...

  4. Java Server Faces(JSF)历险(一)

    从今天开始研究JSF(Java Server Faces),JSF作为最新的MVC框架,得到了sun等业界技术领袖的支持,我相信JSF必然会超越Struts,Tapestry成为主流开发技术.以后的系 ...

  5. 关于web项目的 ajax 处理方式

    2019独角兽企业重金招聘Python工程师标准>>> 传统处理方式: 这是我们最常用的 web 项目请求 - 处理流程. 主要由服务端响应用户请求,处理业务数据,生成 html 页 ...

  6. 如何避免JSP文件中的Java代码?

    本文翻译自:How to avoid Java code in JSP files? I'm new to Java EE and I know that something like the fol ...

  7. [读书笔记]《Head First Servlets JSP》2nd

    书名:Head First Servlets and JSP: Passing the Sun Certified Web Component Developer Exam 出版商:O'Reilly ...

  8. Token注解防止表单的重复提交

    注解的一些基础: 参见http://blog.csdn.net/duo2005duo/article/details/50505884和 http://blog.csdn.net/duo2005duo ...

  9. java cookie id,我如何在Java中获取会话ID

    I want to build an api in java to solve the security image problem occurred while moving one page to ...

最新文章

  1. Android Fragments 详细使用详细介绍
  2. 父类中“this” 指向问题
  3. linux基础,文件目录管理,cd、rm、mkdir
  4. GIS实用小技巧(一)-如何将RTK测量数据导入CAD中?
  5. 如何设置Active Directory域控制器
  6. PyOpenGL之3D界面详解(二)
  7. 红外遥控c语言,NEC协议红外遥控器
  8. SSL 1105——【USACO 2.1】顺序的分数(递归+二分)
  9. JS定义数组,初始化
  10. SQLite数据库的CRUD操作
  11. caffe编译-CUDNN_STATUS错误解决方案
  12. 海信电视全记录:法国再度闯入世界杯决赛,剑指蝉联冠军
  13. wow(3) : 宏命令
  14. 工业人工智能及应用研究现状及展望
  15. SpringBoot 雪花算法生成商品订单号【SpringBoot系列13】
  16. 微信开发-错误码大全
  17. 固网服务器win7系统驱动,固网HU-4608驱动
  18. 笔记本电脑wifi连接网络不能上网有感叹号
  19. 上传大文件超时upstream timed out ,nginx配置修改
  20. FireFox插件 - Greasemonkey

热门文章

  1. JAVA数据加密压缩传输给服务端(Gzip加AES)
  2. Web前端开发必备网站
  3. backtracking及其应用
  4. Kafka常用命令之kafka-topics.sh
  5. 【无标题】USB2514i USB HUB使用经验总结
  6. cadence 16.60破解方式及文件下载地址
  7. 英雄联盟英雄数据son_如何为您的网站找到完美的英雄形象
  8. [4G5G专题-90]:流程 - 4G LTE 终端在RRC IDLE状态下的行为
  9. C++字符串赋值、拼接、查找、替换、存取、插入删除和子串
  10. 计算机cpu的字母,电脑处理器后面的字母你认识几个?不认识跟我来学学(intel篇)...