将JSTL与JSF结合使用
我知道这不是关于这个问题的第一个问题,但我没有找到解决我问题的答案 在我的项目中,我使用PrimeFaces3.5,并在IBMWebSphereAS7上运行它 我创建了一个非常简单的页面来演示这个问题,希望SO社区能帮助我解决:) 因此,这是页面:将JSTL与JSF结合使用,jsf,primefaces,jstl,Jsf,Primefaces,Jstl,我知道这不是关于这个问题的第一个问题,但我没有找到解决我问题的答案 在我的项目中,我使用PrimeFaces3.5,并在IBMWebSphereAS7上运行它 我创建了一个非常简单的页面来演示这个问题,希望SO社区能帮助我解决:) 因此,这是页面: <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3
<?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">
<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>
作品
cw('Panel','widget_j_idt6',{id:'j_idt6'});
我有一个稍微修改过的页面:
<?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" />
<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">
<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>
作品
cw('Panel','widget_j_idt6',{id:'j_idt6'});
这两个页面应该以相同的方式呈现,但它们是不同的。
不同之处在于后一个页面缺少primefaces.css
和jQuery
相关库,但需要加载它们。更复杂的页面会因此而失败。但这只有在我第一次访问页面时才会发生。如果单击浏览器刷新按钮,则所有内容都以正确的方式生成
我真的不明白为什么会这样。据我了解,JSTL
标记是在JSF
之前处理的。我们可以把它想象成一个普通的JSP
页面,但它有一个非HTML
布局,后来被送入JSF
处理程序。因此,这不应影响要加载的资源
我知道我可以使用
和
强制输出链接,但我希望它可以开箱即用
有什么想法吗?只需删除JSTL即可。并尝试使用JSF来实现。对于这种类型的检查,可以使用preRenderView 问题在于JSTL组件和JSF组件的呈现行为不同。你可以阅读 巴鲁克的博客。现在你可以使用
<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");
}
}
public void isAdmin(组件系统事件){
FacesContext fc=FacesContext.getCurrentInstance();
if(!“admin”.equals(fc.getExternalContext().getSessionMap().get(“角色”)){
配置导航处理器导航
=(配置AvigationHandler)
fc.getApplication().getNavigationHandler();
导航执行(“访问被拒绝”);
}
}
有关更多信息,请查看以下链接
问题到底是什么?一切都说“行!!!”问题是第二个示例没有包括PrimeFacesCSS和
jQuery
库。但应该包括他们,这不是我想要的。问题似乎并不在于我使用了JSTL,否则两个例子的计算结果会相同。更糟糕的是,JSTL标记会出现在生成的HTML中。无论如何,谢谢你的帮助。