Consoder以下代码:
<h:commandButton value="do" action="#{testBacking.do}">
<f:ajax execute="@all" render="@all" listener="#{testBacking.listener}"/>
</h:commandButton>
Run Code Online (Sandbox Code Playgroud)
我希望在Ajax响应XML中有一个自定义标记(具有基于服务器逻辑的值),如下所示:
<isValidationFailed> true </isValidationFailed>
Run Code Online (Sandbox Code Playgroud)
如果验证失败,我可以使用此数据重新启用按钮(在Ajax启动时禁用该按钮,以避免双击).
我怎样才能实现这一点(最好不使用任何JSF第三方库)?
编辑:
更准确地说,示例代码应该是这样的:
<h:commandButton id="myButton" value="do" action="#{testBacking.do}">
<f:ajax execute="id1" render="id2 myButton" listener="#{testBacking.listener}"/>
</h:commandButton>
Run Code Online (Sandbox Code Playgroud)
这只能通过使用a PartialViewContext加载到JSF应用程序中的自定义来实现PartialViewContextFactory.自定义PartialViewContext应该反过来返回自定义PartialResponseWriter上PartialViewContext#getResponseWriter().在此自定义中PartialResponseWriter,您应该能够通过调用startExtension()和endExtension()in 添加XML响应的扩展endDocument().就像是:
@Override
public void endDocument() throws IOException {
Map<String, String> attributes = new HashMap<String, String>();
attributes.put("name1", "value1");
attributes.put("name2", "value2");
startExtension(attributes);
write("lorem ipsum");
endExtension();
super.endDocument();
}
Run Code Online (Sandbox Code Playgroud)
然后,这将以XML响应结束
<extension name1="value1" name2="value2">lorem ipsum</extension>
Run Code Online (Sandbox Code Playgroud)
这是可用的和穿越data.responseXML的jsf.ajax.addOnEvent()功能.
这是一个完整的启动示例,您可以在特定情况下使用它:
MyPartialViewContextFactory 它提供自定义部分视图上下文:
public class MyPartialViewContextFactory extends PartialViewContextFactory {
private PartialViewContextFactory wrapped;
public MyPartialViewContextFactory(PartialViewContextFactory wrapped) {
this.wrapped = wrapped;
}
@Override
public PartialViewContext getPartialViewContext(FacesContext context) {
return new MyPartialViewContext(wrapped.getPartialViewContext(context));
}
}
Run Code Online (Sandbox Code Playgroud)
MyPartialViewContext 它提供了自定义部分响应编写器:
public class MyPartialViewContext extends PartialViewContextWrapper {
private PartialViewContext wrapped;
private PartialResponseWriter writer;
public MyPartialViewContext(PartialViewContext wrapped) {
this.wrapped = wrapped;
this.writer = new MyPartialResponseWriter(wrapped.getPartialResponseWriter());
}
@Override
public PartialResponseWriter getPartialResponseWriter() {
return writer;
}
@Override
public void setPartialRequest(boolean isPartialRequest) {
wrapped.setPartialRequest(isPartialRequest);
}
@Override
public PartialViewContext getWrapped() {
return wrapped;
}
}
Run Code Online (Sandbox Code Playgroud)
MyPartialResponseWriter<extension id="myextension">与身体一起写为JSON):
public class MyPartialResponseWriter extends PartialResponseWriter {
public MyPartialResponseWriter(ResponseWriter wrapped) {
super(wrapped);
}
@Override
public void endDocument() throws IOException {
startExtension(Collections.singletonMap("id", "myextension"));
write("{\"validationFailed\": " + FacesContext.getCurrentInstance().isValidationFailed() + "}"); // Consider a JSON serializer, like Google Gson.
endExtension();
super.endDocument();
}
}
Run Code Online (Sandbox Code Playgroud)
要使其运行,请按以下方式注册工厂faces-config.xml:
<factory>
<partial-view-context-factory>com.example.MyPartialViewContextFactory</partial-view-context-factory>
</factory>
Run Code Online (Sandbox Code Playgroud)
以下是您可以访问,解析和使用以下内容<extension id="myextension">的方法jsf.ajax.addOnEvent():
jsf.ajax.addOnEvent(function(data) {
if (data.status == "success") {
var args = JSON.parse(data.responseXML.getElementById("myextension").firstChild.nodeValue);
if (args.validationFailed) {
// ...
}
else {
// ...
}
}
});
Run Code Online (Sandbox Code Playgroud)
但是,您的特定功能要求可以以不同的,可能更简单的方式实现.只需让ajax请求更新按钮本身,并在有成功回发的方法时disabled评估按钮的属性true.
<h:commandButton id="myButton" value="do" action="#{testBacking.do}"
disabled="#{facesContext.postback and not facesContext.validationFailed}">
<f:ajax execute="id1" render="@this id2" listener="#{testBacking.listener}"/>
</h:commandButton>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2303 次 |
| 最近记录: |