博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JavaServer Faces (JSF) with Spring
阅读量:7014 次
发布时间:2019-06-28

本文共 7376 字,大约阅读时间需要 24 分钟。

 

I just announced the new Spring 5 modules in REST With Spring:

1. Overview

In this article we will look at a recipe for accessing beans defined in Spring from within a JSF managed bean and a JSF page, for the purposes of delegating the execution of business logic to the Spring beans.

This article presumes the reader has a prior understanding of both JSF and Spring separately. The article is based on  of JSF.

2. In Spring

Let’s have the following bean defined in Spring. The UserManagementDAO bean adds a username to an in-memory store, and it’s defined by the following interface:

1
2
3
public
interface
UserManagementDAO {
    
boolean
createUser(String newUserData);
}

The implementation of the bean is configured using the following Java config:

1
2
3
4
5
6
public
class
SpringCoreConfig {
    
@Bean
    
public
UserManagementDAO userManagementDAO() {
        
return
new
UserManagementDAOImpl();
    
}
}

Or using the following XML configuration:

1
2
<
bean
class
=
"org.springframework.context.annotation.CommonAnnotationBeanPostProcessor"
/>
<
bean
class
=
"com.baeldung.dao.UserManagementDAOImpl"
id
=
"userManagementDAO"
/>

We define the bean in XML, and register CommonAnnotationBeanPostProcessor to ensure that the @PostConstruct annotation is picked up.

3. Configuration

The following sections explain the configuration items that enable the integration of the Spring and JSF contexts.

3.1. Java Configuration Without web.xml

By implementing the WebApplicationInitializer we are able to programatically configure the ServletContext. The following is the onStartup() implementation inside the MainWebAppInitializer class:

1
2
3
4
5
public
void
onStartup(ServletContext sc)
throws
ServletException {
    
AnnotationConfigWebApplicationContext root =
new
AnnotationConfigWebApplicationContext();
    
root.register(SpringCoreConfig.
class
);
    
sc.addListener(
new
ContextLoaderListener(root));
}

The AnnotationConfigWebApplicationContext bootstraps the Spring’g context and adds the beans by registering the SpringCoreConfig class.

Similarly, in the Mojarra implementation there is a FacesInitializer class that configures the FacesServlet. To use this configuration it is enough to extend the FacesInitializer. The complete implementation of the MainWebAppInitializer, is now as follows:

1
2
3
4
5
6
7
public
class
MainWebAppInitializer
extends
FacesInitializer
implements
WebApplicationInitializer {
    
public
void
onStartup(ServletContext sc)
throws
ServletException {
        
AnnotationConfigWebApplicationContext root =
new
AnnotationConfigWebApplicationContext();
        
root.register(SpringCoreConfig.
class
);
        
sc.addListener(
new
ContextLoaderListener(root));
    
}
}

3.2. With web.xml

We’ll start by configuring the ContextLoaderListener in web.xml file of the application:

1
2
3
4
5
<
listener
>
    
<
listener-class
>
        
org.springframework.web.context.ContextLoaderListener
    
</
listener-class
>
</
listener
>

This listener is responsible for starting up the Spring application context when the web application starts up. This listener will look for a spring configuration file named applicationContext.xml by default.

3.3. faces-config.xml

We now configure the SpringBeanFacesELResolver in the face-config.xml file:

1
<
el-resolver
>org.springframework.web.jsf.el.SpringBeanFacesELResolver</
el-resolver
>

An EL resolver is a pluggable component supported by the JSF framework, allowing us to customize the behavior of the JSF runtime when evaluating Expression Language (EL) expressions. This EL resolver will allow the JSF runtime access Spring components via EL expressions defined in JSF.

4. Accessing Spring Beans in JSF

At this point, our JSF web application is primed to access our Spring bean from either a JSF backing bean, or from a JSF page.

4.1. From a Backing Bean JSF 2.0

The Spring bean can now be accessed from a JSF backing bean. Depending on the version of JSF you’re running, there are two possible methods. With JSF 2.0, you use the @ManagedProperty annotation on the JSF managed bean.

1
2
3
4
5
6
7
@ManagedBean
(name =
"registration"
)
@RequestScoped
public
class
RegistrationBean
implements
Serializable {
    
@ManagedProperty
(value =
"#{userManagementDAO}"
)
    
transient
private
IUserManagementDAO theUserDao;
 
    
private
String userName;
1
2
    
// getters and setters
}

Note that the getter and setter are mandatory when using the @ManagedProperty. 

Now – to assert the accessibility of a Spring bean from a managed bean, we will add the createNewUser() method:

1
2
3
4
5
6
7
8
public
void
createNewUser() {
    
FacesContext context = FacesContext.getCurrentInstance();
    
boolean
operationStatus = userDao.createUser(userName);
    
context.isValidationFailed();
    
if
(operationStatus) {
        
operationMessage =
"User "
+ userName +
" created"
;
    
}
}

The gist of the method is using the userDao Spring bean, and accessing its functionality.

4.2. From a Backing Bean in JSF 2.2

Another approach, valid only in JSF2.2 and above, is to use CDI’s @Inject annotation. This is applicable to JSF managed beans (with the @ManagedBean annotation), and CDI-managed beans (with the @Named annotation).

Indeed, with a CDI annotation, this is the only valid method of injecting the bean:

1
2
3
4
5
6
@Named
(
"registration"
)
@RequestScoped
public
class
RegistrationBean
implements
Serializable {
    
@Inject
    
UserManagementDAO theUserDao;
}

With this approach, the getter and setter are not necessary. Also note that the EL expression is absent.

4.3. From a JSF View

The createNewUser() method will be triggered from the following JSF page:

1
2
3
4
5
6
7
8
9
10
11
<
h:form
>
    
<
h:panelGrid
id
=
"theGrid"
columns
=
"3"
>
        
<
h:outputText
value
=
"Username"
/>
        
<
h:inputText
id
=
"firstName"
binding
=
"#{userName}"
required
=
"true"
          
requiredMessage
=
"#{msg['message.valueRequired']}"
value
=
"#{registration.userName}"
/>
        
<
h:message
for
=
"firstName"
style
=
"color:red;"
/>
        
<
h:commandButton
value
=
"#{msg['label.saveButton']}"
action
=
"#{registration.createNewUser}"
          
process
=
"@this"
/>
        
<
h:outputText
value
=
"#{registration.operationMessage}"
style
=
"color:green;"
/>
    
</
h:panelGrid
>
</
h:form
>

To render the page, start the server and navigate to:

1
http:
//localhost
:8080
/jsf/index
.jsf

We can also use EL in the JSF view, to access the Spring bean. To test it it is enough to change the line number 7 from the previously introduced JSF page to:

1
2
<
h:commandButton
value
=
"Save"
  
action
=
"#{registration.userDao.createUser(userName.value)}"
/>

Here, we call the createUser method directly on the Spring DAO, passing the bind value of the userName to the method from within the JSF page, circumventing the managed bean all together.

5. Conclusion

We examined a basic integration between the Spring and JSF contexts, where we’re able to access a Spring bean in a JSF bean and page.

It’s worth noting that while the JSF runtime provides the pluggable architecture that enables the Spring framework to provide integration components, the annotations from the Spring framework cannot be used in a JSF context and vice versa.

What this means is that you’ll not be able to use annotations like @Autowired or @Component etc. in a JSF managed bean, or use the @ManagedBean annotation on a Spring managed bean. You can however, use the @Inject annotation in both a JSF 2.2+ managed bean, and a Spring bean (because Spring supports JSR-330).

The source code that accompanies this article is available at .

转载地址:http://zbqtl.baihongyu.com/

你可能感兴趣的文章
Spring源码(一)---BeanFactory
查看>>
java指定垃圾回收
查看>>
aop排除某些类型不拦截
查看>>
Firefox 61已经为Ubuntu 提供支持
查看>>
Google推出了以隐私和安全为中心的变更
查看>>
Scrapy Extensions(扩展)
查看>>
架在云上的商业智能
查看>>
在windows下使用OpenSSH(下)copy /b authorized_keys + ...
查看>>
Java订单系统原型设计
查看>>
JPA 实战 OneToOne
查看>>
MongoDb Architecture
查看>>
React Native
查看>>
节约内存:Instagram的Redis实践
查看>>
Cmd命令总结
查看>>
BAE试用
查看>>
Linphone学习之 Oss
查看>>
mysql 建立索引的时候 字段太长导致的异常
查看>>
解析nginx负载均衡
查看>>
Spring Boot 2.0配置druid
查看>>
【转】[VS2005]解决“由于应用程序的配置不正确,应用程序未能启动,重新安装应用程序可能会......
查看>>