- 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/
我了解到不应使用 Eclipse-RCP 中的操作,而应使用命令。 问题是,如果我尝试使用 ExtensionPoint org.eclipse.ui.viewActions(在 View 顶部制作小
我正在使用带有 jsf 2.2 的 Glassfish 4,并且在我的一个 jsf 页面中有以下代码: ... 问题是 findBy
我刚刚在我现有的项目中加入了 JSF 2.2.2,我想使用 f:viewAction但我收到以下错误。 Tag Library supports namespace: http://java.sun
我有一个加载对象属性的 JSF 页面(其 id 在 URL 中传递)。加载可以持续更多秒,所以我想显示等待/忙碌指示器或“正在加载...”消息。 这是使用“viewAction”完成的
我想在使用 espresso 在 Android 中执行操作之前截取屏幕截图。 protected T performAction(ViewAction viewAction) { ViewA
与使用 viewAction 相比,什么时候应该使用 preRenderView 事件来初始化页面的数据?它们在使用上是否相同并且它们具有相同的效果? preRenderView 事件 或者
什么时候应该使用 f:viewAction 或 preRenderView 事件来初始化页面数据,而不是使用 @PostConstruct 注释?是否根据支持 bean 的范围类型使用其中一种或另一种
我对 JSF 2.2 功能有疑问 。我将此标记放置在我的 XHTML 页面中,它的名称为 viewActionStart.xhtml:
JSF 2.2 Primefaces 4.0 JBoss 野蝇 从带有客户列表的页面,并希望每个客户都有一个按钮,用户可以在其中添加项目。 当我单击“新项目”按钮时,我被重定向到新项目页面。 在 ur
我正在尝试使用 schema.org 创建带有 ViewAction 按钮的电子邮件,但它不起作用。我正在使用以下页面上的演练:https://developers.google.com/gmail/
我们有一个设置,我们将不同的可选 View 参数传递给 JSF 页面,并在设置参数后处理后续 View 操作。一个非常简单的例子如下所示: page.xhtml:
任何人都可以澄清我们如何在一般情况下或在现实世界中使用此代码片段吗? 最佳答案 处理 GET 参数 管理 GET 参数的设置、转换和验证。就像 ,然后是 GET 参数。 下
环境:JSF 2.2 与 Mojarra 2.2.12 和 CDI ViewScoped beans & javax.faces.STATE_SAVING_METHOD设置为client . 为了正确
我正在尝试测试一个应用程序,我需要隐藏键盘,因为我因此无法点击按钮。所以,我在 build.gradle 中添加了 Espresso: androidTestCompile 'com.android.
我是一名优秀的程序员,十分优秀!