无意中看到JSF中的Managed Properties,不禁突发奇想: 用JSF能实现依赖注入吗?理论上是可以通的,于是开始了自己的尝试,只是写一个简单的Login页面.
首先,写一个IUserService的接口,接口中只有属性方法: getUsername, getPassword, setUsername, setPassword四个方法.代码如下:
package
net.moon.service;


public
interface
IUserService
...
{
String getUsername();
String getPassword();
void setUsername(String username);
void setPassword(String password);
}

用一个类实现该接口,代码如下:
package
net.moon.model;

import
net.moon.service.IUserService;


public
class
UserInfo
implements
IUserService
...
{
private String username;
private String password;

/** *//**
* @return the usernmae
*/

public String getUsername() ...{
return username;
}

/** *//**
* @param usernmae the usernmae to set
*/

public void setUsername(String usernmae) ...{
this.username = usernmae;
}

/** *//**
* @return the password
*/

public String getPassword() ...{
return password;
}

/** *//**
* @param password the password to set
*/

public void setPassword(String password) ...{
this.password = password;
}
}

写一个事务类,实现login功能,其中有一个类型为IUserService的域,代码如下:
package
net.moon.business;

import
net.moon.service.IUserService;


public
class
UserBO
...
{

IUserService user;

public String login()...{
String result = "FAILED";
//System.out.println(result);
if(user.getUsername().equalsIgnoreCase("admin")

&& user.getPassword().equals("password"))...{
result = "PASS";
}
return result;
}


/** *//**
* @return the user
*/

public IUserService getUser() ...{
return user;
}


/** *//**
* @param user the user to set
*/

public void setUser(IUserService user) ...{
this.user = user;
}
}
注意该类中的属性方法setUser, 其中的参数user作为IUserService的接口类型.然后就是用什么方法对user进行注入,这时候就要想到JSF中的Managed Properties.
首先在,faces-config中配置UserInfo类为MBean,代码如下:
<
managed-bean
>
<
managed-bean-name
>
userInfo
</
managed-bean-name
>
<
managed-bean-class
>
net.moon.model.UserInfo
</
managed-bean-class
>
<
managed-bean-scope
>
session
</
managed-bean-scope
>
</
managed-bean
>

然后将事务类UserBO也配置为MBean,代码如下:
<
managed-bean
>
<
managed-bean-name
>
userBO
</
managed-bean-name
>
<
managed-bean-class
>
net.moon.business.UserBO
</
managed-bean-class
>
<
managed-bean-scope
>
request
</
managed-bean-scope
>
<
managed-property
>
<
property-name
>
user
</
property-name
>
<
property-class
>
net.moon.service.IUserService
</
property-class
>
<
value
>
#{userInfo}
</
value
>
</
managed-property
>
</
managed-bean
>
注意蓝色显示部分,为userBO这个MBean配置了一个Managed Property,也就是要求JSF在实现userBO时, 用userInfo这个MBean为其user这个域赋值,从而实现注入.
接下来就是页面的实现了,首先是login页面, 代码如下:
<%
...
@ page contentType="text/html; charset=UTF-8"
%>

<%
...
@ taglib uri="http://java.sun.com/jsf/html" prefix="h"
%>

<%
...
@ taglib uri="http://java.sun.com/jsf/core" prefix="f"
%>

<
html
>
<
head
>
<
meta
http-equiv
="Content-Type"
content
="text/html; charset=UTF-8"
/>
<
title
></
title
>
</
head
>
<
body
>
<
f:view
>
<
h:form
>
<
h:panelGrid
border
="1"
columns
="2"
>
<
h:outputText
value
="User Name:"
></
h:outputText
>
<
h:inputText
value
="#{userInfo.username}"
></
h:inputText
>
<
h:outputText
value
="Password:"
></
h:outputText
>
<
h:inputText
value
="#{userInfo.password}"
></
h:inputText
>
</
h:panelGrid
>
<
h:commandButton
value
="Login"
action
="#{userBO.login}"
></
h:commandButton
>
</
h:form
>
</
f:view
>
</
body
>
</
html
>

表示登录成功的页面welcome.jsp,代码如下:
<%
...
@ page contentType="text/html; charset=UTF-8"
%>

<%
...
@ taglib uri="http://java.sun.com/jsf/html" prefix="h"
%>

<%
...
@ taglib uri="http://java.sun.com/jsf/core" prefix="f"
%>

<
html
>
<
head
>
<
meta
http-equiv
="Content-Type"
content
="text/html; charset=UTF-8"
/>
<
title
></
title
>
</
head
>
<
body
>
<
f:view
>
<
h:form
>
<
h:outputText
value
="Welcome , #{userInfo.username}"
></
h:outputText
>
</
h:form
>
</
f:view
>
</
body
>
</
html
>

配置导航如下:
<
navigation-rule
>
<
display-name
>
login
</
display-name
>
<
from-view-id
>
/login.jsp
</
from-view-id
>
<
navigation-case
>
<
from-action
>
#{userBO.login}
</
from-action
>
<
from-outcome
>
PASS
</
from-outcome
>
<
to-view-id
>
/welcome.jsp
</
to-view-id
>
</
navigation-case
>
<
navigation-case
>
<
from-action
>
#{userBO.login}
</
from-action
>
<
from-outcome
>
FAILED
</
from-outcome
>
<
to-view-id
>
/login.jsp
</
to-view-id
>
</
navigation-case
>
</
navigation-rule
>
以上代码在JDK 1.6, JSF 1.2, Tomcat 6.0下测试通过.