关于JSF与EJB的整合资料比较少,没找到。
所以以普及度很高的spring为例。
步骤是非常简单的,主要有两条思路一是让所有的beanJSF的@ManagedBean和spring的@Component各自分管,经过实验他们之间的注入依赖在同一个bean里不能混用。比如如果class是@ManagedBean如果field上@Resource就会出错。只能用@ManagedProperty(value="#{xxxServiceImpl}")这样注入。而且当在class上同时@ManagedBean@Component是@ManagedBean更加优先。
第一步:
web.xml开发环境下的配置
<!-- spring启动监视器 -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:beans.xml</param-value>
</context-param>
<!-- jsf额外需要的spring监视器 -->
<listener>
<listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
</listener>
<!-- JSF2.0的配置-->
<servlet>
<servlet-name>Faces Servlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>*.jsf</url-pattern>
</servlet-mapping>
<!-- JSF2.0的模式配置,开发模式下会在调试时报更加详细的错误-->
<context-param>
<param-name>javax.faces.PROJECT_STAGE</param-name>
<param-value>Development</param-value>
</context-param>
第二步:
faces-config.xml中加上
<application>
<variable-resolver>
org.springframework.web.jsf.DelegatingVariableResolver
</variable-resolver>
</application>
第三步:
在BackBean中以注解的形式添加依赖,这一步是关键步骤。
经过我的实验我得到了我认为的最佳配置BackBean的方式。
service和entity照旧由spring管理,只不过如果你不想额外增加数据传输层(DTO)的话,那么需要把实体也暴露为jsf的受管bean。
如:
实体的配置
@ManagedBean
@NoneScoped
@Entity
public class User {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private long id;
......................略
backbean的配置
@ManagedBean
public class Hello {
@ManagedProperty(value="#{user}")
private User user;
@ManagedProperty("#{userServiceImpl}") //可见spring的bean已经暴露给了jsf了,可以由el表达式访问到的受管bean了。这是的在页面上通过el表达式直接访问sevice业务层执行一些业务操作成为了可能,虽然我不赞成这么做。
private UserService userServiceImpl;
public String run(){
System.out.println(user.getName());
userServiceImpl.save(user);
return "succ";
}
.....................略
第四步:
像原来一样配置好spring的一切就行了。