< /h:inputText>
< /span>
< /div>
< div>
< h:outputText id="celsiusLabel" value="摄氏温度:"/>
< span>
< h:outputText id="celsiusValue" value="#{tc.celsiusTemp}">
< f:convertNumber maxFractionDigits="3" type="number"/>
< /h:outputText>
< /span>
< /div>
< div>
< h:commandButton value="转换" action="#{tc.convert}">
< /h:commandButton>
< /div>
< /h:form>
< /f:view>
< /body>
< /html>
在程序的前两行是导入JSF核心库和HTML库,这个在前面已经讨论过,在这里不再详述。
下面让我们来看看JSF标签是如何同后端进行交互的。由于我们是在JSP中使用JSF,因此,这个和正常的JSP没有什么区别;JSP实际上就是Servlet,在JSP第一次运行时由JSP编译器将.JSP文件编译成Servlet后再由Servlet调用,然后由Servlet来接收客户端传过来的数据流。但和一般的JSP程序不同的是,JSF标签是由JSF API负责调用的(这样可以做到逻辑层和表现层分离),除此之外,它们和一般的JSP标签没有任何区别。
当UIComponent标签收到doStartTag方法时,JSF将使用这些属性来设置标签的值。如本例中的inputText标签将按它的属性值来设置。下面是JSF的代码片段。
< h:inputText id="temperature" value="#{tc.fahrenheitTemp}"> < f:validateDoublerange minimum="-100.0" maximum="100.0"/> < f:valuechangeListener type="tempconv.page.TCChangedListener"/> < /h:inputText> |
接下来让我们来看看上面程序的最重要的部分,也就是UIInput组件的事件处理。
< f:valuechangeListener type="tempconv.page.TCChangedListener"/>
在JSF中事件处理是由valuechangeListener标签完成的。这个标签所表示的事件在文本框的值发生变化时引发事件。但有意思的是这个事件并不马上提交,而是要等到用户点击"提交"按钮后这个事件连同相应的数据才提交给后端。因此,这个事件请求也叫做预提交。最后,让我们看看UICommand的代码实现。
< div> < h:commandButton value="转换" action="#{tc.convert}"> < /h:commandButton> < /div> |
最后,让我们来看看J