Primefaces ManagedBean

The Most Complete User Interface Suite for JavaServer Faces

官网地址

ManagedBean 简介

JSF的 ManagedBean 就是一个普通的Java Bean,由JSF框架创建并管理。

定义ManagedBean

  1. JSF 1.2 中必须在 faces-config.xml 中配置。
  2. JSF 2.0 新增@ManagedBean 注解(测试无效,下一章会使用@Named注解代替该注解)

ManagedBean 生命周期

生命周期 说明
@RequestScoped(默认) bean只要HTTP请求响应就行。它根据HTTP请求创建,并在与HTTP请求相关联的HTTP响应完成时被销毁
@SessionScoped bean只要HTTP会话生存。 它在第一个HTTP请求时创建,并在HTTP会话无效时被销毁。注意ManagedBean必须被序列化(Serializable)
@ApplicationScoped bean只要Web应用程序生存。 它在第一个HTTP请求或Web应用程序启动时创建,并且在@ManagedBean中设置属性eager = true,并在Web应用程序关闭时被销毁
@NoneScoped bean与单个表达式语言(EL)求值时间一样长。 在EL求值评估时创建,并在EL求值评估后被销毁
@ViewScoped(JSF2.0新增) bean只要用户在浏览器窗口中与同一JSF视图进行交互即可。 它根据HTTP请求创建,并在用户导航到其他视图时被销毁。注意ManagedBean必须被序列化(Serializable)
@CustomScoped(JSF2.0新增) bean只要在为此范围创建的自定义Map中的bean的条目生效
@PostConstruct(常用) ManagedBean实例创建完毕之后,会调用@PostConstruct标注的方法,在该方法中可以处理Managed Bean的初始化工作
@PreDestroy ManagedBean实例销毁前,会调用@PreDestroy标注的方法,在该方法中可以清理相关资源

ManagedBean的依赖注入

@ManagedProperty
如果Managed Bean需要访问service,其它ManagedBean等,则建议使用@ManagedProperty进行注入,如:

1
2
@ManagedProperty(value="#{demoService}")
private Service demoService;

ManagedBean 存在问题

  1. 为了能够支持视图层的访问,JSF的ManagedBean必须实现Serializable接口,但是其所依赖的Spring Bean未必实现Serializable接口。
  2. JSF的ManagedBean和Spring的Bean,都可能依赖各自不同的其他Bean,但是注入依赖Bean的方式各不相同,不能混淆。
  3. JSF的ManagedBean的有效范围与Spring的Bean的有效范围不完全匹配。

ManagedBean 实战(XML)

Maven 依赖

通过maven下载Primefaces

1
2
3
4
5
<dependency>
<groupId>org.primefaces</groupId>
<artifactId>primefaces</artifactId>
<version>6.2</version>
</dependency>

通过maven下载JSF

1
2
3
4
5
6
7
8
9
10
11
<dependency>
<groupId>com.sun.faces</groupId>
<artifactId>jsf-api</artifactId>
<version>2.2.16</version>
</dependency>

<dependency>
<groupId>com.sun.faces</groupId>
<artifactId>jsf-impl</artifactId>
<version>2.2.16</version>
</dependency>

User 视图

UserView

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
package com.ray.primefaces01.view;

import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import java.io.Serializable;

/**
* @author Ray
* @date 2018/9/6 0006
* 视图
*/
public class UserView implements Serializable {

private String firstName;
private String lastName;

public String getFirstName() {
return firstName;
}

public void setFirstName(String firstName) {
this.firstName = firstName;
}

public String getLastName() {
return lastName;
}

public void setLastName(String lastName) {
this.lastName = lastName;
}

public void save(){
FacesContext.getCurrentInstance().addMessage(null,
new FacesMessage("Welcome " + firstName + " " + lastName));
}
}

JSF 页面

位置:src/main/webapp/event.xhtml
event.xhtml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:p="http://primefaces.org/ui">

<h:head>
<title>Ajax事件</title>
</h:head>

<h:body>
<h:form>
<h:panelGrid columns="3" cellpadding="5">
<h:outputText value="KeyUp[按钮松开时,触发keyup事件]:" />
<p:inputText id="firstName" value="#{userView.firstName}" >
<p:ajax event="keyup" update="out1" />
</p:inputText>
<h:outputText id="out1" value="#{userView.firstName}"/>

<h:outputText value="Blur[当元素失去焦点时触发blur事件]:" />
<p:inputText id="lastName" value="#{userView.lastName}" >
<p:ajax event="blur" update="out2" />
</p:inputText>
<h:outputText id="out2" value="#{userView.lastName}" />
</h:panelGrid>
</h:form>
</h:body>

</html>

JSF 配置文件

位置:src/main/webapp/WEB-INF/faces-config.xml
faces-config.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?xml version="1.0" encoding="UTF-8"?>
<faces-config xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee/web-facesconfig_2_2.xsd"
version="2.2">
<!--该元素用于管理JSF应用相关配置-->
<application>
<el-resolver>org.springframework.web.jsf.el.SpringBeanFacesELResolver</el-resolver>
</application>

<!--JSF应用中所有的托管Bean都放在该元素下-->
<managed-bean>
<managed-bean-name>userView</managed-bean-name>
<managed-bean-class>com.ray.primefaces01.view.UserView</managed-bean-class>
<managed-bean-scope>session</managed-bean-scope>
</managed-bean>

</faces-config>

运行效果

启动Tomcat运行项目,请注意查看启动信息,如果有异常应该先解决异常信息,运行成功后的结果如下所示:
访问地址:http://localhost:8080/event.jsf