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>