📄 值变事件.htm
字号:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>新建网页 1</title>
</head>
<body>
<p>值变事件</p>
<div id="PageContent">
<table cellSpacing="0" cellPadding="0" width="100%" border="0" id="table3">
<tr>
<td class="pagebody" vAlign="top">
<table style="CLEAR: both" cellSpacing="0" cellPadding="0" width="100%" border="0" id="table4">
<tr>
<td class="pagecontent" vAlign="top" width="100%">
<div class="wiki-content">
如果使用者改变了JSF输入组件的值后送出窗体,就会发生值变事件(Value Change
Event),这会丢出一个javax.faces.event.ValueChangeEvent对象,如果您想要处理这个事件,有两种方式,一是直接设定JSF输入组件的valueChangeListener属性,例如:<div class="code" style="BORDER-TOP-STYLE: solid; BORDER-RIGHT-STYLE: solid; BORDER-LEFT-STYLE: solid; BORDER-BOTTOM-STYLE: solid">
<div class="codeContent">
<pre class="code-java"><h:selectOneMenu value=<span class="code-quote">"#{user.locale}"</span>
onchange=<span class="code-quote">"<span class="code-keyword">this</span>.form.submit();"</span>
valueChangeListener=<span class="code-quote">"#{user.changeLocale}"</span>>
<f:selectItem itemValue=<span class="code-quote">"zh_TW"</span> itemLabel=<span class="code-quote">"Chinese"</span>/>
<f:selectItem itemValue=<span class="code-quote">"en"</span> itemLabel=<span class="code-quote">"English"</span>/>
</h:selectOneMenu></pre>
</div>
</div>
<p>
为了仿真GUI中选择了选单项目之后就立即发生反应,我们在onchange属性中使用了JavaScript,其作用是在选项项目发生改变之后,立即送出窗体,而不用按下提交按钮;而valueChangeListener属性所绑定的user.changeLocale方法必须接受ValueChangeEvent对象,例如:</p>
<div class="code" style="BORDER-TOP-STYLE: solid; BORDER-RIGHT-STYLE: solid; BORDER-LEFT-STYLE: solid; BORDER-BOTTOM-STYLE: solid">
<div class="codeHeader" style="BORDER-BOTTOM-STYLE: solid">
<b>UserBean.java</b></div>
<div class="codeContent">
<pre class="code-java"><span class="code-keyword">package</span> onlyfun.caterpillar;
<span class="code-keyword">import</span> javax.faces.event.ValueChangeEvent;
<span class="code-keyword">public</span> class UserBean {
<span class="code-keyword">private</span> <span class="code-object">String</span> locale = <span class="code-quote">"en"</span>;
<span class="code-keyword">private</span> <span class="code-object">String</span> name;
<span class="code-keyword">private</span> <span class="code-object">String</span> password;
<span class="code-keyword">private</span> <span class="code-object">String</span> errMessage;
<span class="code-keyword">public</span> void changeLocale(ValueChangeEvent event) {
<span class="code-keyword">if</span>(locale.equals(<span class="code-quote">"en"</span>))
locale = <span class="code-quote">"zh_TW"</span>;
<span class="code-keyword">else</span>
locale = <span class="code-quote">"en"</span>;
}
<span class="code-keyword">public</span> void setLocale(<span class="code-object">String</span> locale) {
<span class="code-keyword">this</span>.locale = locale;
}
<span class="code-keyword">public</span> <span class="code-object">String</span> getLocale() {
<span class="code-keyword">if</span> (locale == <span class="code-keyword">null</span>) {
locale = <span class="code-quote">"en"</span>;
}
<span class="code-keyword">return</span> locale;
}
<span class="code-keyword">public</span> void setName(<span class="code-object">String</span> name) {
<span class="code-keyword">this</span>.name = name;
}
<span class="code-keyword">public</span> <span class="code-object">String</span> getName() {
<span class="code-keyword">return</span> name;
}
<span class="code-keyword">public</span> void setPassword(<span class="code-object">String</span> password) {
<span class="code-keyword">this</span>.password = password;
}
<span class="code-keyword">public</span> <span class="code-object">String</span> getPassword() {
<span class="code-keyword">return</span> password;
}
<span class="code-keyword">public</span> void setErrMessage(<span class="code-object">String</span> errMessage) {
<span class="code-keyword">this</span>.errMessage = errMessage;
}
<span class="code-keyword">public</span> <span class="code-object">String</span> getErrMessage() {
<span class="code-keyword">return</span> errMessage;
}
<span class="code-keyword">public</span> <span class="code-object">String</span> verify() {
<span class="code-keyword">if</span>(!name.equals(<span class="code-quote">"justin"</span>) ||
!password.equals(<span class="code-quote">"123456"</span>)) {
errMessage = <span class="code-quote">"名称或密码错误"</span>;
<span class="code-keyword">return</span> <span class="code-quote">"failure"</span>;
}
<span class="code-keyword">else</span> {
<span class="code-keyword">return</span> <span class="code-quote">"success"</span>;
}
}
}</pre>
</div>
</div>
<p>
另一个方法是实作javax.faces.event.ValueChangeListener接口,并定义其processValueChange()方法,例如:</p>
<div class="code" style="BORDER-TOP-STYLE: solid; BORDER-RIGHT-STYLE: solid; BORDER-LEFT-STYLE: solid; BORDER-BOTTOM-STYLE: solid">
<div class="codeHeader" style="BORDER-BOTTOM-STYLE: solid">
<b>SomeListener.java</b></div>
<div class="codeContent">
<pre class="code-java"><span class="code-keyword">package</span> onlyfun.caterpillar;
....
<span class="code-keyword">public</span> class SomeListener <span class="code-keyword">implements</span> ValueChangeListener {
<span class="code-keyword">public</span> void processValueChange(ValueChangeEvent event) {
....
}
....
}
然后在JSF页面上使用<f:valueChangeListener>卷标,并设定其type属性,例如:
{code:borderStyle=solid}
<h:selectOneMenu value=<span class="code-quote">"#{user.locale}"</span>
onchange=<span class="code-quote">"<span class="code-keyword">this</span>.form.submit();"</span>>
<f:valueChangeListener
type=<span class="code-quote">"onlyfun.caterpillar.SomeListener"</span>/>
<f:selectItem itemValue=<span class="code-quote">"zh_TW"</span> itemLabel=<span class="code-quote">"Chinese"</span>/>
<f:selectItem itemValue=<span class="code-quote">"en"</span> itemLabel=<span class="code-quote">"English"</span>/>
</h:selectOneMenu></pre>
</div>
</div>
<p> 下面这个页面是对 立即事件
中的范例程序作一个修改,将语言选项改以下拉式选单的选择方式呈现,这必须配合上面提供的UserBean类别来使用:</p>
<div class="code" style="BORDER-TOP-STYLE: solid; BORDER-RIGHT-STYLE: solid; BORDER-LEFT-STYLE: solid; BORDER-BOTTOM-STYLE: solid">
<div class="codeHeader" style="BORDER-BOTTOM-STYLE: solid">
<b>index.jsp</b></div>
<div class="codeContent">
<pre class="code-java"><%@ taglib uri=<span class="code-quote">"http:<span class="code-comment">//java.sun.com/jsf/core"</span> prefix="f" %>
</span> <%@ taglib uri=<span class="code-quote">"http:<span class="code-comment">//java.sun.com/jsf/html"</span> prefix="h" %>
</span> <%@page contentType=<span class="code-quote">"text/html;charset=UTF8"</span>%>
<f:view locale=<span class="code-quote">"#{user.locale}"</span>>
<f:loadBundle basename=<span class="code-quote">"messages"</span> <span class="code-keyword">var</span>=<span class="code-quote">"msgs"</span>/>
<html>
<head>
<title><h:outputText value=<span class="code-quote">"#{msgs.titleText}"</span>/></title>
</head>
<body>
<h:form>
<h:selectOneMenu value=<span class="code-quote">"#{user.locale}"</span>
immediate=<span class="code-quote">"<span class="code-keyword">true</span>"</span>
onchange=<span class="code-quote">"<span class="code-keyword">this</span>.form.submit();"</span>
valueChangeListener=<span class="code-quote">"#{user.changeLocale}"</span>>
<f:selectItem itemValue=<span class="code-quote">"zh_TW"</span>
itemLabel=<span class="code-quote">"Chinese"</span>/>
<f:selectItem itemValue=<span class="code-quote">"en"</span>
itemLabel=<span class="code-quote">"English"</span>/>
</h:selectOneMenu>
<h3><h:outputText value=<span class="code-quote">"#{msgs.hintText}"</span>/></h3>
<h:outputText value=<span class="code-quote">"#{msgs.nameText}"</span>/>:
<h:inputText value=<span class="code-quote">"#{user.name}"</span>/><p>
<h:outputText value=<span class="code-quote">"#{msgs.passText}"</span>/>:
<h:inputSecret value=<span class="code-quote">"#{user.password}"</span>/><p>
<h:commandButton value=<span class="code-quote">"#{msgs.commandText}"</span>
action=<span class="code-quote">"#{user.verify}"</span>/>
</h:form>
</body>
</html>
</f:view></pre>
</div>
</div>
</div>
</td>
</tr>
</table>
</td>
</tr>
</table>
</div>
<p> </p>
</body>
</html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -