JSF2.0与Spring3的整合

    技术2025-10-12  7

    关于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的一切就行了。

     

    最新回复(0)