JSF頁面代碼將在backing bean中跟隨,輸入中的內容將相應地檢查並啓用正確的面板。在輸入框中輸入1將激活面板1,爲面板2輸入2併爲兩個面板留空。
JSF是一個優秀的企業應用程序開發規範,它提供了更大的靈活性和關注點分離。您需要將用戶界面元素遠離業務邏輯組件。我的解決方案是通過不引用輔助bean中的UI元素ID來遵守該主體。
<?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">
<h:head>
<title>Facelet Title</title>
</h:head>
<h:body>
Hello from Facelets
<h:form id="frm" >
<h:commandButton value="click me" action="#{test2.aa()}">
<f:ajax execute="@form" render=":mainpanel" ></f:ajax>
</h:commandButton>
<h:inputText id="intest" value="#{test2.selection}"></h:inputText>
</h:form>
<h:panelGroup id="mainpanel">
<h:panelGroup id="panel1" rendered="#{test2.prop1=='v'}">panel1
<h:outputLabel id="lbl1" value="#{test2.prop1}" ></h:outputLabel>
</h:panelGroup>
<h:panelGroup id="panel2" rendered="#{test2.prop2=='v'}">panel2
<h:outputLabel id="lbl2" value="#{test2.prop2}"></h:outputLabel>
</h:panelGroup>
</h:panelGroup>
</h:body>
</html>
支持bean代碼儘可能簡單我已經在請求範圍內使用了會話範圍。
package test;
import javax.inject.Named;
import javax.enterprise.context.SessionScoped;
import java.io.Serializable;
@Named(value = "test2")
@SessionScoped
public class test2 implements Serializable {
String prop1;
String prop2;
String selection;
public String getProp1() {
return prop1;
}
public void setProp1(String prop1) {
this.prop1 = prop1;
}
public String getProp2() {
return prop2;
}
public void setProp2(String prop2) {
this.prop2 = prop2;
}
public test2() {
prop1 = "v";
prop2 = "v";
selection = "";
}
public String getSelection() {
return selection;
}
public void setSelection(String selection) {
this.selection = selection;
}
public String aa() {
if ("".equals(selection)) {
prop1 = "v";
prop2 = "v";
return "";
} else if ("1".equals(selection)) {
prop1 = "v";
prop2 = "h";
return "";
} else if ("2".equals(selection)) {
prop1 = "h";
prop2 = "v";
return "";
}
return "";
}
}