2009年1月21日星期三

JSF_021:JSF 问与答

问题1:哪里可以下载到JSF开发环境?
(1)下载地址:http://java.sun.com/javaee/javaserverfaces/download.html
(2)把JSF和commons jars放到WEB-INF/lib中。
(3)配置Faces controller servlet(javax.faces.webapp.FacesServlet)在web.xml中。
(4)配置faces-config.xml,其功能类似于struts-config.xml,包含两种组件的配置信息:Managed Beans 和 Navigation Rule。

问题2:哪些人员可以使用JSF?
无论是网页设计人员,应用程序开发人员,还是UI 组件开发人员都可以使用,而且互不干扰。
(1)网页设计人员
JSF 提供了一套像是新版本的HTML 标签,但它不是静态的,而是动态的,可以与后端的程序结合,但网页设计人员无需理会。
(2)应用程序开发人员JSF 提供了一个与传统应用程序开发相类似的模型(当然因某些本质上的差异,模型还是稍有不同),可以基于事件驱动来开发,不必关心HTTP 的处理细节。
(3)UI 组件开发人员
如同设计Swing 组件一样,UI 组件开发人员可以设计自定义的UI 组件,供网页设计人员和应用程序开发人员使用。

问题3:JSF基于JSP定制标签库有哪些?
JSF标签库core是有关于UI组件的,用于事件处理和数据转换:<%@taglib uri="http://java.sun.com/jsf/core" prefix="f" %>
JSF标签库html是有关于HTML的,用于展现用户界面:<%@taglib uri="http://java.sun.com/jsf/html" prefix="h" %>
更多有关JSF标签库的信息请访问:http://horstmann.com/corejsf/jsf-tags.html。
<f:view> 与<html> 有类似的作用,使用JSF组件时,这些组件一定要在<f: view> 与</f:view> 之间,就如同使用HTML时,所有的标签一定要在<html> 与</html> 之间。

问题4:UI组件的binding属性是干吗用的?
例如:<h:inputText value="Hello" binding="#{Backing.txtComponentInput}"></h:inputText>
binding属性就是把该组件的实例以属性的形式存储到bean中,便于其它方法(如Listener方法)中操作这个组件及其各个属性。
详细说明请参考:http://ztc.javaeye.com/blog/82305。

问题5:JSF 隐含对象由哪些,如何使用?
param 是JSF EL 预设的隐含对象变量,它代表request 所有参数的集合,实际是一个java.util.Map 型态对象,JSF 所提供的隐含对象。
JSF 隐含对象移除了pageScope 与pageContext,而增加了facesContext 与view,它们分别对应于 javax.faces.context.FacesContext 与javax.faces.component.UIViewRoot。

问题6:Command类型的组件的actionListener属性是干吗用的?例如:<h:commandButton value="送出"actionListener="#{user.verify}"action="#{user.outcome}"/>
在简单的导航中,我们根据Command类型的组件的action属性(设置成为Managed Beans的一个属性或一个方法)来决定要导向的页面。
这其实就是JSF 所提供的事件处理程序,JSF会为其自动产生一个预设的ActionListener来处理事件,并根据其返回值来决定导向的页面。
在运行时,JSF 会首先检查是否有指定的actionListener,然后再检查是否指定了action方法,并产生相应的或预设的ActionListener,并根据其返回值导航页面。
当你需要使用同一个方法来应付多种事件来源,并想要取得事件来源的相关讯息,您可以让处理事件的方法接收一个javax.faces.event.ActionEvent 事件参数,例如:
public void verify(ActionEvent e) {
if(!name.equals("justin") !password.equals("123456")) {
errMessage = "名称或密码错误" + e.getSource();
outcome = "failure";}
else {
outcome = "success";
}
}

可以使用<f:actionListener>为一个组件注册多个ActionListener,例如:
<h:commandButton value="送出" action="#{user.outcome}">
<f:actionListener type="onlyfun.caterpillar.LogHandler"/>
<f:actionListener type="onlyfun.caterpillar.VerifyHandler"/>
</h:commandButton>

<f:actionListener>会自动产生type 所指定的对象,并呼叫组件的addActionListener()方法注册Listener。

没有评论: