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就会显示在页面上。