У нас есть параметр, в котором у нас есть разные необязательные параметры представления, переданные на страницы JSF, и последующие действия вида, которые должны быть обработаны после того, как параметры были установлены. Очень простой пример показан ниже:Invoke f: viewAction условно на основе f: viewParam
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>
Page
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
не работает (стр .xhtml? a = 123), в то время как обработка b
работает как шарм (page.xhtml? b = 123) - хотя я думал, что просто перевел нулевую проверку с Java на JSF. Что касается удобочитаемости, я бы предпочел исключить дополнительные проверки нулей в Java и полностью обработать обработку параметров представления в JSF, но как я могу настроить код, чтобы первый сценарий работал?
EDIT Согласно принятому ответу What is the purpose of rendered attribute on f:viewAction?, if
работает сама по себе, так что я подозреваю, что неправильный порядок выполнения (первая оценка состояния действия, а затем применить значения в модели).