【问题标题】:Using JSTL with JSF将 JSTL 与 JSF 一起使用
【发布时间】:2013-03-05 17:07:45
【问题描述】:

我知道这不是第一个与此相关的问题,但我未能找到可以解决我的问题的答案。

在我的项目中,我使用 PrimeFaces 3.5 并在 IBM WebSphere AS 7 上运行它。

我创建了一个非常简单的页面来演示这个问题,希望 SO 社区能帮助我解决这个问题:)

所以,这是页面:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:c="http://java.sun.com/jsp/jstl/core"
    xmlns:p="http://primefaces.org/ui">

    <h:head></h:head>
    <h:body>
        <p:panel>
            <c:if test="#{true}">
                <h:outputText value="WORKS!!!" />
            </c:if> 
        </p:panel>
    </h:body>
</html>

此页面生成以下 HTML:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <link type="text/css" rel="stylesheet" href="/APP/javax.faces.resource/theme.css.xhtml?ln=primefaces-bluesky" />
        <link type="text/css" rel="stylesheet" href="/APP/javax.faces.resource/primefaces.css.xhtml?ln=primefaces" />
        <script type="text/javascript" src="/APP/javax.faces.resource/jquery/jquery.js.xhtml?ln=primefaces"></script>
        <script type="text/javascript" src="/APP/javax.faces.resource/primefaces.js.xhtml?ln=primefaces"></script>
    </head>
    <body>
        <div id="j_idt6" class="ui-panel ui-widget ui-widget-content ui-corner-all">
            <div id="j_idt6_content" class="ui-panel-content ui-widget-content">
                WORKS!!!
            </div>
        </div>
        <script id="j_idt6_s" type="text/javascript">PrimeFaces.cw('Panel','widget_j_idt6',{id:'j_idt6'});</script>
    </body>
</html>

我有一个稍微修改的页面:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:c="http://java.sun.com/jsp/jstl/core"
    xmlns:p="http://primefaces.org/ui">

    <h:head></h:head>
    <h:body>
        <p:panel>
            <c:if test="#{bean != null}">
                <h:outputText value="WORKS!!!" />
            </c:if> 
        </p:panel>
    </h:body>
</html>

生成以下 HTML:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <link type="text/css" rel="stylesheet" href="/APP/javax.faces.resource/theme.css.xhtml?ln=primefaces-bluesky" />
    </head>
    <body>
        <div id="j_idt6" class="ui-panel ui-widget ui-widget-content ui-corner-all">
            <div id="j_idt6_content" class="ui-panel-content ui-widget-content">
                WORKS!!!
            </div>
        </div>
        <script id="j_idt6_s" type="text/javascript">PrimeFaces.cw('Panel','widget_j_idt6',{id:'j_idt6'});</script>   
    </body>
</html>

这两个页​​面应该完全相同呈现,但它们是不同的。 不同之处在于后面的页面缺少primefaces.cssjQuery 相关库,但它们是需要加载的。因此,更复杂的页面会失败。但这只发生在我第一次访问页面时。如果我点击浏览器刷新按钮,一切都会以正确的方式生成。

我真的不明白为什么会发生这种情况。据我了解JSTL 标签在JSF 之前处理。我们可以把它想象成一个普通的JSP 页面,但具有非HTML 布局,后来馈送到JSF 处理程序。所以这应该不会影响要加载哪些资源。

我知道我可以使用 &lt;h:outputStylesheet&gt;&lt;h:outputScript&gt; 强制输出链接,但我希望它可以开箱即用。

有什么想法吗?

【问题讨论】:

  • 问题到底是什么?一切都说“工作!!!”
  • 问题是第二个例子没有包含 PrimeFaces CSS 和 jQuery 库。但它应该包括它们。

标签: jsf primefaces jstl


【解决方案1】:

只需删除 JSTL。并尝试使用 JSF 来实现。对于这种类型的检查,您可以使用 preRenderView。

问题是 JSTL 组件和 JSF 组件的渲染行为是不同的。你可以阅读

BALUC 的博客。现在你可以使用

<f:event listener="#{user.isAdmin}" type="preRenderView" />

public void isAdmin(ComponentSystemEvent event){

    FacesContext fc = FacesContext.getCurrentInstance();

    if (!"admin".equals(fc.getExternalContext().getSessionMap().get("role"))){

        ConfigurableNavigationHandler nav 
           = (ConfigurableNavigationHandler) 
            fc.getApplication().getNavigationHandler();

        nav.performNavigation("access-denied");
    }       
  } 

有关更多信息,您可以查看以下链接。

http://www.mkyong.com/jsf2/jsf-2-prerenderviewevent-example/

【讨论】:

  • 这不是我想要的。问题似乎并不在于我使用 JSTL 的事实,否则两个示例的评估结果相同。或者更糟的是,JSTL 标记会出现在生成的 HTML 中。无论如何感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 2016-10-27
  • 1970-01-01
  • 1970-01-01
  • 2015-04-15
  • 2023-03-28
  • 2010-09-18
  • 2012-12-30
  • 2016-01-29
相关资源
最近更新 更多