JSF In Action 學習一[原創]
首先介紹一下JSF(JavaServer Faces)JSF是JavaEE標準的一部分, 是基于組建的架構(component architecture), 而且是事件驅動的,其目的在于把WebApp的開發可以向DesktopApp一樣. 可以使各個常用的UI Widgets組件化, 提高重用性,簡化創建Web UI的工作量,并且它也提供了豐富的功能集包含事件處理機制(Event Handling Mechanism)、頁面導航(Page Navigation)、驗證客戶端數據(Input Validation)和數據轉換(Conversion)等等。JSF框架最主要的特色之一就是它并不僅針對于一種類型的客戶端,意味著除了用于桌面的Html瀏覽器客戶端外,它甚至還可能支持用于移動電話的Wml瀏覽器客戶端等。現在已經有很多的Vender在支持JSF:Apache Software Foundation, BEA Systems,Borland Software, IBM, Oracle, Macromedia,等等。
JSF她的實現常用的有(當然還有其他的):
1. Sun RI (Reference Implementation)
和一般的WebApp一樣放在WEB-INF/lib下
所需的lib: jsf-api.jar (在JSF specification定義的API)
jsf-impl.jar (Sun JSF的參考實現)
jstl.jar (JSTL API)
standard.jar (JSTL的實現Implementation)
2. Apache MyFaces
所需的lib: myfaces-api-1.2.2.jar
myfaces-impl-1.2.2.jar
jstl.jar (JSTL API)
standard.jar (JSTL的實現Implementation)
commons-beanutils-1.7.0.jar
commons-codec-1.3.jar
commons-collections-3.2.jar
commons-digester-1.8.jar
commons-el-1.0.jar
commons-discovery-0.4.jar
commons-logging-1.1.1.jar
配置環境:
1.配置web.xml
1 <web-app>
2
3 <servlet>
4 <servlet-name>Faces Servlet</servlet-name>
5 <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
6 </servlet>
7 <servlet-mapping>
8 <servlet-name>Faces Servlet</servlet-name>
9 <url-pattern>/faces/*</url-pattern>
10 </servlet-mapping>
11
12 </web-app>
和傳統的Struts類似,JSF也有配置文件faces-config.xml,并且她支持多個Config文件,可以在web.xml這樣設置: 2

3 <servlet>
4 <servlet-name>Faces Servlet</servlet-name>
5 <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
6 </servlet>
7 <servlet-mapping>
8 <servlet-name>Faces Servlet</servlet-name>
9 <url-pattern>/faces/*</url-pattern>
10 </servlet-mapping>
11

12 </web-app>
1 <web-app>
2
3 <context-param>
4 <param-name>javax.faces.STATE_SAVING_METHOD</param-name>
5 <param-value>server</param-value>
6 </context-param>
7 <context-param>
8 <param-name>javax.faces.CONFIG_FILES</param-name>
9 <param-value>/WEB-INF/config1.xml,/WEB-INF/config2.xml</
10 param-value>
11 </context-param>
12
13 <web-app>
2.配置faces-config.xml,在這里聲明managed beans, 并且它支持 EL expression,其實所有的JSF Component都支持EL expression2

3 <context-param>
4 <param-name>javax.faces.STATE_SAVING_METHOD</param-name>
5 <param-value>server</param-value>
6 </context-param>
7 <context-param>
8 <param-name>javax.faces.CONFIG_FILES</param-name>
9 <param-value>/WEB-INF/config1.xml,/WEB-INF/config2.xml</
10 param-value>
11 </context-param>
12

13 <web-app>
所有的元素都包含在<faces-config></faces-config>之間,以下是常用的managed-bean元素
1 <managed-bean>
2 <description>Used for testing.
3 </description>
4 <managed-bean-name>testBean</managed-bean-name>
5 <managed-bean-class>net.blogjava.gembin.TestBean
6 </managed-bean-class>
7 <managed-bean-scope>session</managed-bean-scope>
8 </managed-bean>
以上managed-bean的這3個元素是必須的,還有<description><display-name>, and <icon>.是可選的,主要用于可視化工具里顯示之用.2 <description>Used for testing.
3 </description>
4 <managed-bean-name>testBean</managed-bean-name>
5 <managed-bean-class>net.blogjava.gembin.TestBean
6 </managed-bean-class>
7 <managed-bean-scope>session</managed-bean-scope>
8 </managed-bean>
定義完managed beans 之后就可以在JSP頁面上引用它了。test.jsp
1 <%@ taglib uri="http://java.sun.com/jsf/html" prefix="h"%>
2 <%@ taglib uri="http://java.sun.com/jsf/core" prefix="f"%>
3 <html>
4 <head>
5 <title>Hello</title>
6 </head>
7 <body>
8 <f:view>
9 <h:outputText value="Hello #{testBean.sayHello}!"/>
10 </f:view>
11 </body>
12 </html>
TestBean.java2 <%@ taglib uri="http://java.sun.com/jsf/core" prefix="f"%>
3 <html>
4 <head>
5 <title>Hello</title>
6 </head>
7 <body>
8 <f:view>
9 <h:outputText value="Hello #{testBean.sayHello}!"/>
10 </f:view>
11 </body>
12 </html>
1 package net.blogjava.gembin;
2
3 public class TestBean{
4
5 public TestBean(){}
6
7 public String sayHello(){
8 return "jsf, Hello world!";
9 }
10 }
2
3 public class TestBean{
4
5 public TestBean(){}
6
7 public String sayHello(){
8 return "jsf, Hello world!";
9 }
10 }
這里注意test.jsp中只能有1個<f:view> 元素,并且它不代表任何UI,是JSF UI的Root
managed-bean-scope的值可以是:session,application,request,none。
每個托管的對象(managed-bean)不能引用生命周期比它還短的對象,所以
- 存放在request scope的Object可以引用none, application, session, request里的對象;
- 存放在session scope的Object可以引用none, application, session里的對象;
- 存放在application scope的Object可以引用none, application里的對象;
- 存放在none scope的Object可以引用none里的對象;
上面的例子運行之后將會在瀏覽器上顯示:
Hello jsf, Hello world!!
To be continued(待續...)