EventとListener
Value change events
方法1
<h:selectOneMenu
value="#{myBean.value}"
onchange="submit();"
valueChangeListener="#{myBean.onChangeSomeValue}">
<f:selectItems value="#{myBean.someList}"/>
</h:selectOneMenu>
<h:inputText valueChangeListener="#{myBean.onChangeSomeValue}"/>
<h:panelGrid binding="#{myBean.panel}" rendered="false" />
public class MyBean {
public void onChangeSomeValue(ValueChangeEvent event) {
UIInput selected = (UIInput) event.getComponent();
String selectedValue = (String) selected.getValue();
...
}
public void onChangeSomeValue(ValueChangeEvent event) {
HtmlInputText sender = (HtmlInputText) event.getComponent();
sender.setReadonly(true);
panel.setRendered(true);
}
}
方法2
<h:inputText value="#{myBean.value}" onchange="submit();">
<f:valueChangeListener type="xxx.listeners.MyValueChangeListener"></f:valueChangeListener>
</h:inputText>
import javax.faces.event.ValueChangeEvent;
import javax.faces.event.ValueChangeListener;
public class MyValueChangeListener implements ValueChangeListener {
public void processValueChange(ValueChangeEvent event) {
...
}
}
Action events
<from-outcome>方式
<h:commandButton type="submit" value="Login" action="success" immediate="true"/>
メソッド方式
<h:commandButton type="submit" value="Login" action="#{myBean.login}"/>
<h:commandButton value = "Login" actionListener = "#{myBean.doSomeAction}" />
public void doSomeAction(ActionEvent event){
UIComponent component = event.getComponent();
String id = component.getId();
...
}
初期処理時
UIComponent component = new UIComponent();
component.addActionListener(new CustomActionListener());
public class CustomPhaseListener implements ActionListener {
...
}
Data model events
FacesContext ctx = FacesContext.getCurrentInstance();
HtmlDataTable dataTable =
(HtmlDataTable) ctx.getApplication().createComponent(HtmlDataTable.COMPONENT_TYPE);
DataModel dataModel = new ResultSetDataModel(resultSet);
dataModel.addDataModelListener(new DataModelListener() {
public void rowSelected(DataModelEvent e) {
FacesContext.getCurrentInstance()
.getExternalContext().log("Row selected:" + e.getRowIndex());
}
});
dataTable.setValue(dataModel);
Phase events
import javax.faces.context.FacesContext;
import javax.faces.event.PhaseEvent;
import javax.faces.event.PhaseId;
import javax.faces.event.PhaseListener;
public class CustomPhaseListener implements PhaseListener {
public CustomPhaseListener() { }
public void beforePhase(PhaseEvent event) {
System.out.println("[BEFORE]" + event.getPhaseId());
FacesContext ctx = event.getFacesContext();
UIViewRoot root = ctx.getViewRoot();
String viewId = root.getViewId();
...
}
public void afterPhase(PhaseEvent event) {
System.out.println("[AFTER]" + event.getPhaseId());
PhaseId phaseId = event.getPhaseId();
if (phaseId == PhaseId.RESTORE_VIEW) {
...
}
}
public PhaseId getPhaseId() {
//return PhaseId.ANY_PHASE;
return PhaseId.RESTORE_VIEW; //どのフェーズで呼び出す
}
}
<lifecycle>
<phase-listener>xxx.CustomPhaseListener</phase-listener>
<phase-listener>...</phase-listener>
</lifecycle>