JSF---->事件处理--值变事件

如果使用者改变了JSF输入组件的值后送出窗体,就会发生值变事件(Value Change Event),这会丢出一个javax.faces.event.ValueChangeEvent对象,如果您想要处理这个事件,有两种方式,一是直接设定JSF输入组件的valueChangeListener属性,例如:

<h:selectOneMenu value="#{user.locale}"
                  onchange="this.form.submit();"
                  valueChangeListener="#{user.changeLocale}">

     <f:selectItem itemValue="zh_CN" itemLabel="Chinese"/>
     <f:selectItem itemValue="en" itemLabel="English"/>
 </h:selectOneMenu>

为选择了选单项目之后就立即发生反应,我们在onchange属性中使用了JavaScript,其作用是在选项项目发生改变之后,立即送出窗体,而不用按下提交按钮;而valueChangeListener属性所绑定的user.changeLocale方法必须接受ValueChangeEvent对象,例如:UserBean.java

package wsz.ncepu;

import javax.faces.event.ValueChangeEvent;

public class UserBean {
	public String locale;
	private String name;
	private String password;
	private String errMessage;

	public void changeLocale(ValueChangeEvent event) {
		if ("en".equals(locale))
			locale = "zh_CN";
		else
			locale = "en";
	}

	public void setLocale(String locale) {
		this.locale = locale;
	}

	public String getLocale() {
		return this.locale;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getName() {
		return name;
	}

	public void setPassword(String password) {
		this.password = password;
	}

	public String getPassword() {
		return password;
	}

	public void setErrMessage(String errMessage) {
		this.errMessage = errMessage;
	}

	public String getErrMessage() {
		return errMessage;
	}

	public String verify() {
		if (!name.equals("justin") || !password.equals("123456")) {
			errMessage = "错误 ";
			return "failure";
		} else {
			return "success";
		}
	}
}

另一个方法是实作javax.faces.event.ValueChangeListener接口,并定义其processValueChange()方法,例如:

SomeListener.java

package wsz.ncepu;

import javax.faces.event.ValueChangeEvent;
import javax.faces.event.ValueChangeListener;

public class SomeListener implements ValueChangeListener {
	public void processValueChange(ValueChangeEvent event) {
		System.out.println("en".equals(wsz.ncepu.UserBean.locale));

		if ("en".equals(wsz.ncepu.UserBean.locale))

			wsz.ncepu.UserBean.locale = "zh_CN";
		else
			wsz.ncepu.UserBean.locale = "en";

	}

}

然后在JSF页面上使用<f:valueChangeListener>卷标,并设定其type属性,例如:

	<h:selectOneMenu value="#{user.locale}"
					onchange="this.form.submit();">
					<f:valueChangeListener type="wsz.ncepu.SomeListener" />
					<f:selectItem itemValue="zh_CN" itemLabel="Chinese" />
					<f:selectItem itemValue="en" itemLabel="English" />
				</h:selectOneMenu>

完整的index.jsp

<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f"%>
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h"%>
<%@page contentType="text/html;charset=UTF8"%>
<f:view locale="#{user.locale}">

	<html>
		<head>
			<title><h:outputText value="#{msgs.titleText}" />
			</title>
		</head>
		<body>
			<f:loadBundle basename="messages" var="msgs" />
			<h:form>

				<h:selectOneMenu value="#{user.locale}"
					onchange="this.form.submit();">
					<f:valueChangeListener type="wsz.ncepu.SomeListener" />
					<f:selectItem itemValue="zh_CN" itemLabel="Chinese" />
					<f:selectItem itemValue="en" itemLabel="English" />
				</h:selectOneMenu>


				<h3>
					<h:outputText value="#{msgs.hintText}" />
				</h3>
				<h:outputText value="#{msgs.nameText}" />: 
                <h:inputText value="#{user.name}" />
				<p>
					<h:outputText value="#{msgs.passText}" />
					:
					<h:inputSecret value="#{user.password}" />
				<p>
					<h:commandButton value="#{msgs.commandText}"
						action="#{user.verify}" />
			</h:form>
		</body>
	</html>




</f:view>


 

posted on 2012-05-17 23:09  小-强-斋-太  阅读(70)  评论(0编辑  收藏  举报

导航