1.JSF
JavaBean介紹
JSF使用 JavaBean 來達到程式邏輯與視圖分離的目的,在JSF中的Bean其角色是屬于Backing
Bean,又稱之為Glue Bean。
作用是在真正的業務邏輯Bean及UI元件之間搭起橋梁,相當于STRUTS中的FormBean,對頁面的值進行存儲。
JSF將Bean的管理集中在faces-config.xml中,上面介紹的JSF的例子如下:
<!-- bean定義 -->
<managed-bean>
<managed-bean-name>user</managed-bean-name>
<managed-bean-class>test.UserBean</managed-bean-class>
<managed-bean-scope>session</managed-bean-scope>
</managed-bean>
<managed-bean-class>設定所要使用的Bean類別,<managed-bean-name>設定之名稱,
<managed-bean-scope>設定Bean的存活范圍,您可以設定為request、session
與application,設定為request時,Bean的存活時間為請求階段。
您還可以將存活范圍設定為none,當設定為none時會在需要的時候生成一個新的Bean,例如您在一個method中想要生成一個臨時的Bean,就可以將之設定為none。
如果有必要在啟始Bean時,自動設置屬性的初始值,則可以如下設定:
....
<managed-bean>
<managed-bean-name>user</managed-bean-name>
<managed-bean-class>
test.UserBean
</managed-bean-class>
<managed-bean-scope>session</managed-bean-scope>
<managed-property>
<property-name>name</property-name>
<value>caterpillar</value>
</managed-property>
<managed-property>
<property-name>password</property-name>
<value>123456</value>
</managed-property>
</managed-bean>
....
您的屬性不一定是字串值,也許會是int、float、boolean等等型態,您可以設定<value>
值時指定這些值的字串名稱,JSF會嘗試進行轉換。
您也可以將其它產生的Bean設定給另一個Bean的屬性,例如:
<managed-bean>
<managed-bean-name>user</managed-bean-name>
<managed-bean-class>test.UserBean</managed-bean-class>
<managed-bean-scope>session</managed-bean-scope>
</managed-bean>
<managed-bean>
<managed-bean-name>userinfo</managed-bean-name>
<managed-bean-class>test.UserBeanInfo</managed-bean-class>
<managed-bean-scope>session</managed-bean-scope>
<managed-property>
<property-name>userBean</property-name>
<property-class>test.UserBeanService</property-class>
<value>#{user}</value>
</managed-property>
</managed-bean>
在UserBeanInfo里面定義了變量userBean,變量userBean的類型是類UserBean,這里就把變量userBean直接賦值為#{user}。
2.JSF JavaBean示例(反向注入)
其實通常我們所說的反向注入(Ioc)就是這個,這也是JSF和STRUTS一個非常大的區別,JSF支持反向注入,它可以更好的管理業務Bean的對象。
下面舉個例子:
在配置文件中:
<managed-bean>
<managed-bean-name>userinfo</managed-bean-name>
<managed-bean-class>test.UserBeanInfo</managed-bean-class>
<managed-bean-scope>session</managed-bean-scope>
<managed-property>
<property-name>userBean</property-name>
<property-class>test.UserBeanService</property-class>
<value>#{user}</value>
</managed-property>
</managed-bean>
這樣,當UserBeanInfo的實例建立的時候,就會自動將UserBeanService的對象賦值給UserBeanInfo實例的變量userBean。
JsfBeanExample.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=utf-8"%>
<html>
<head>
<title>JSF JavaBean示例(反向注入)</title>
</head>
<body>
<f:view>
<h:form>
<h3>請輸入您的名稱</h3>
<h:outputText value="#{user.errMessage}"
style="color:red"/><p>
<!-- 姓名 -->
名稱: :<h:inputText value="#{user.name}"
/>
<p>密碼:<h:inputSecret value="#{user.password}"/>
<p><h:commandButton value="送出"
action="#{userinfo.verify1}"
/>
</h:form>
</f:view>
</body>
</html>
UserBeanInfo.java:
package test;
public class UserBeanInfo
{
UserBeanService userBean;
public String verify1() {
if (!userBean.getName().equals("sunlin")
||
!userBean.getPassword().equals("123456")) {
userBean.setErrMessage("名稱或者密碼錯誤1(依賴注入實現)");
return "failure";
} else {
return "success";
}
}
/**
* userBean をセットする
* @param userBean the
userBean to set
*/
public void setUserBean(UserBeanService userBean) {
this.userBean = userBean;
}
}
UserBeanInfo的類里面并沒有綁定頁面輸入的信息,頁面輸入的信息是綁定在Userbean中的。但是我們在faces-config.xml配置文件中設置了反向注入,
將UserBeanService直接設置到UserBeanInfo的變量userBean里,所以在類UserBeanInfo中可以直接取得Userbean中的信息進行Check。
▲注意:UserBeanInfo中必須要定義setUserBean()方法。
http://localhost:8080/jsfTest/pages/jsfBeanExample.faces 當你用戶名或者密碼出錯的時候,Message就會顯示在頁面上。