- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我们有一个设置,我们将不同的可选 View 参数传递给 JSF 页面,并在设置参数后处理后续 View 操作。一个非常简单的例子如下所示:
page.xhtml:
<?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://xmlns.jcp.org/jsf/html"
xmlns:f="http://xmlns.jcp.org/jsf/core">
<f:view>
<f:metadata>
<f:viewParam name="a" value="#{page.a}"/>
<f:viewAction action="#{page.populateA()}" if="#{not empty page.a}"/>
<f:viewParam name="b" value="#{page.b}"/>
<f:viewAction action="#{page.populateB()}"/>
</f:metadata>
<h:outputLabel value="#{page.message}"/>
</f:view>
</html>
页面
import javax.faces.view.ViewScoped;
import javax.inject.Named;
@ViewScoped
@Named
public class Page {
private String a;
private String b;
private String message;
public String getA() {
return a;
}
public void setA(String a) {
this.a = a;
}
public String getB() {
return b;
}
public void setB(String b) {
this.b = b;
}
public String getMessage() {
return message;
}
public void populateA() {
this.message = "Param a given: " + this.a;
}
public void populateB() {
if (this.b != null) {
this.message = "Param b given: " + this.b;
}
}
}
现在,区别在于 a
的处理不起作用 (page.xhtml?a=123),而 b
的处理就像一个魅力( page.xhtml?b=123) - 尽管我认为我只是将空值检查从 Java 移到了 JSF。在可读性方面,我宁愿省略 Java 中的额外空值检查,并让 View 参数处理完全位于 JSF 中,但我如何调整代码才能使第一个场景起作用?
编辑 根据What is the purpose of rendered attribute on f:viewAction? 接受的答案, if
本身有效,所以我怀疑执行顺序错误(首先评估操作条件,然后将值应用于模型)。
最佳答案
<f:viewAction if>
属性基本上是重命名为<h:xxx rendered>
属性(我将留在中间是否更清楚,它至少有一个 bug in autogenerated documentation 作为结果;它列出了 rendered
而不是 if
)因此在 < em>Apply Request Values 阶段与所有其他 UI 组件一样。此阶段调用 UIComponent#decode()
View 中的所有 UI 组件。对于 UIViewAction
,<f:viewAction>
后面的UI组件类标记, decode()
说明如下:
Take no action if any of the following conditions are true:
The current request is a postback and the instance has been configured to not operate on postback. See
isOnPostback()
.The condition stated in the
if
property evaluates to false. SeeisRendered()
所以,是的,关于“错误的执行顺序”,您确实是正确的。在 Apply Request Values 阶段,它会检查 if
属性,如果它评估 false
,则不会进行解码,并且不会对操作事件进行排队。另请参阅 UIViewAction
的第 644 行source code它在哪里测试 isRendered()
内部decode()
如果 false
则不继续.在你的例子中,#{page.a}
,您正在检查 <f:viewAction if>
,仅在 更新模型值 阶段可用,该阶段在 应用请求值 阶段。
您想测试保证在应用请求值 阶段可用的其他东西。最好的候选者是实际的请求参数本身。所有“普通”请求参数都在 implicit EL object 可用的 EL 范围内#{param}
其中引用了 Map<String, String>
以参数名称作为键。
所以,总而言之,应该这样做:
<f:viewParam name="a" value="#{page.a}"/>
<f:viewAction action="#{page.populateA}" if="#{not empty param.a}"/>
更新以解决 <f:viewAction if>
的不直观行为, JSF 实用程序库 OmniFaces自 2.2 版起将提供 <o:viewAction>
谁的if
仅在 Invoke Application 阶段评估,就在广播操作事件之前。这个技巧是通过简单地扩展 UIViewAction
来完成的。组件并覆盖其 broadcast()
和 isRendered()
如下:
@Override
public void broadcast(FacesEvent event) throws AbortProcessingException {
if (super.isRendered()) {
super.broadcast(event);
}
}
@Override
public boolean isRendered() {
return !isImmediate() || super.isRendered();
}
这使您可以更直观地使用标签:
<f:viewParam name="a" value="#{page.a}"/>
<o:viewAction action="#{page.populateA}" if="#{not empty page.a}"/>
关于jsf - 调用 f :viewAction conditionally based on f:viewParam,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25241437/
现在我已经创建了一个额外的跨度来容纳一个条件。 568 || subKey == 0" ng-repeat="links in linksWrap.links">
一些 excel IF 语句可能会变得相当长,我正在寻找一种更简单的方法来编写它们。例如,如果我要写: If($B$4+13=7,$B$4+13,FALSE) 我认为它会更容易说: If($B$4+1
我有一个包含 FromDate 、 ToDate 、 VendorName 和 GoodsName 的表单,一旦一切为真,我需要显示结果 示例: FromDate="11/20/2019"、ToDat
我经常看到使用 !!condition 而不仅仅是常规条件的代码。即: if(!!value){ doSomething(); } 对比: if(value){ doSomething
这个问题有点模棱两可,这两个在汇编代码/性能方面是否等效: public void example{ do{ //some statements; if(condition)
在我看到的使用 Any 方法的 Linq 查询示例中,大约有一半是通过将其应用于 Where() 调用的结果来实现的,另一半则直接将其应用于集合。这两种样式是否总是等效的,或者在某些情况下它们可能会返
这个问题在这里已经有了答案: What does !!(x) mean in C (esp. the Linux kernel)? (3 个答案) 关闭 9 年前。 我见过人们使用带有两个 '!'
我对部署在生产环境中的应用程序进行了线程转储,该应用程序使用 logback。我不是分析线程转储的专家,但是,我必须这样做。正在学习,网上也看了一些文章。 下面是真正的线程转储: "logback-8
在 SQL 中(特别是 Postgres): 子句 where not foo='bar' in case foo is null 评估为某种 null,导致该行不是包含在结果中。 另一方面,子句 w
是不是类似于has and condition with join和where condition after join? 例如 对于以下两个查询,它会给我相同的结果吗 1) SELECT COUNT
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
如果您调用某个函数,并且该函数在发生错误时返回 NULL(例如,想想 malloc() 或 fopen()),两个更好: FILE *fp = fopen(argv[0], "r"); if (fp
我正在使用 Azure 数据工厂 V2,我需要在父检查验证中实现两级检查。例如:如果条件一为真,那么我需要检查条件 2。并且,如果条件 2 为真,则检查条件 3。 这是一种分层检查。当我在父 IF 条
使用 Linq to Entities 有以下区别吗? db.EntityName.Where(a => a.Id == id).FirstOrDefault(); db.EntityName.Fir
我有一种情况,我已经用两种不同的方式解决了,但想知道人们对这些选项的看法,以及他们是否有其他选择...... 系统正在处理数据的“间隔”。 所有数据都分配到一个“区间” 该间隔由事实表 中的“inte
我有包含字段 Amount, Condition1, Condition2 的表格。 例子: Amount Condition1 Condition2 ---------------------
我正在尝试在 Netbeans 中制作一个简单的 MySQL、Java JDBC Web 应用程序。我希望根据当前 session 中的状态变量显示不同的内容。我尝试了以下方法: 首先,我在 .jsp
我想为 postnuke cms 设计一个主题。 并希望在模板文件中使用 css 条件。 postnuke 使用类似 smarty 的标签 .... 所以当我使用 .... 它给出了一些关于标签的错误
我想问一下asyncio.Condition .我对这个概念并不熟悉,但我从学生时代就知道并了解锁、信号量和队列。 我找不到很好的解释或典型的用例,只是 this example .我看了看来源。核心
我想知道如何在不在语句中重做相同查询两次的情况下处理 SQL 比较。这是我要找的: SELECT columnName10, IF( SELECT columnName20 FROM Othe
我是一名优秀的程序员,十分优秀!