技术开发 频道

使用 Spring,JSF,EJB3 设计企业应用程序

  开发 WEB Project

  WEB Project 是本文的重点,在这小节中我们将用 JSF 通过 Spring 来调用 EJB,体验 Spring 的便利。

  1.新建名称为 simpleWEB 的 Dynamic WEB Project,Dynamic WEB Project version 为 2.5,Configuration 为 JavaServer Faces v1.1 Project,选中 Add project to anEAR,如下图:

  图 9. 新建 Web 项目  

  点击 Next,默认下一步,JSF Libraries 选择 Server Supplied JSF Implementation,修改 URL Mapping Patterns 为 *.jsf,如下图:

  图 10. 配置项目对 JSF 的支持  

  所有以 *.jsf 结尾的请求都有 JSF 处理。

  2.配置 WEB Project 。

  拷贝 SPRING_HOME/dist/spring.jar 到 WebContent/WEB-INF/lib 目录。在 WebContent/WEB-INF 下新建 spring 配置文件 applicationContext.xml 。

  一个 Spring 为框架的 Web 项目,通常以 web.xml 为入口,在 Web 应用启动时,读入 context-param 中批量的配置文件,初始化配置文件里所定义的 Bean,通过ContextLoaderListener在 web 应用程序的 servlet context 建立后立即执行建立 Spring 的ApplicationContext。

  3.编辑 web.xml

  添加 ContextParam:

<context-param>
    
<param-name>contextConfigLocation</param-name>
    
<param-value>/WEB-INF/applicationContext.xml</param-value>
</context-param>

  添加 Spring listener:

<listener>
    
<listener-class>
    org.springframework.web.context.ContextLoaderListener
    
</listener-class>
</listener>

  4.编辑 applicationContext.xml,内容如下:

  清单 4. applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi
="http://www.w3.org/2001/XMLSchema-instance"
xmlns:jee
="http://www.springframework.org/schema/jee"      
xsi:schemaLocation
="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http:
//www.springframework.org/schema/jee
http:
//www.springframework.org/schema/jee/spring-jee-2.5.xsd">

<jee:jndi-lookup id="productDAO" jndi-name="simple/ProductDAOBean/remote"  
proxy
-interface="org.zhouxing.simple.ProductDAORemote" />
</beans>

  Spring 通过 jndi-lookup 来访问 EJB,以后就可以在本地 EJB 组件,远程 EJB 或者 POJO 这些变体之间透明地切换实现方式,而不需要改变客户端的代码。

  新建名称为 org.zhouxing.simple.ProductBean 的一个类作为 JSF 的 managed Bean 。 JSF 使用 JavaBean 来达到程序逻辑与视图分离的目的,在 JSF 中的 Bean 其角色是属于 Backing Bean,又称之为 Glue Bean,其作用是在真正的业务逻辑 Bean 及 UI 组件之间搭起桥梁,在 Backing Bean 中会呼叫业务逻辑 Bean 处理使用者的请求,或者是将业务处理结果放置其中,等待 UI 组件取出当中的值并显示结果给使用者。

  主要有两个方法实现业务功能,代码如下:

  清单 5. 业务功能代码

package org.zhouxing.simple;

import java.util.List;

/**
JSF Managed Bean 实现 Product 的查询,添加
@author 周行
*
*/
public class ProductBean {
    
private ProductDAORemote productDAO;
    
private Product product;

    
public ProductBean() {
        product
= new Product();
    }

    
public void setProductDAO(ProductDAORemote productDAO) {
        this.productDAO
= productDAO;
    }

    
public String add() {
        productDAO.add(product);
        return
"";
    }

    
public List<Product> getProducts() {
        return productDAO.findAll();
    }

    
public Product getProduct() {
        return product;
    }
}

  属性 productDAO 通过 JSF 配置文件用 Spring 注入,属性 product 为简单起见作为表单 Form 。

  5.在 JSF 中使用 Spring 的注入功能需要在 JSF 配置文件中使用 Spring 的变量解析器 DelegatingVariableResolver 类。 DelegatingVariableResolver 类首先会查询请求委派到 JSF 实现的默认的解析器中,然后才是 Spring 的“ business context ”。代码片段如下:

  清单 6. 在 faces-config.xml 文件中指定使用 Spring 变量解析器

<application>
    
<variable-resolver>
         org.springframework.web.jsf.DelegatingVariableResolver
    
</variable-resolver>
    
<locale-config>
        
<default-locale>en</default-locale>
    
</locale-config>
</application>

  在 JSF 配置文件中配置 Managed Bean,代码片段如下:

  清单 7. 配置 Managed Bean

<managed-bean>
    
<managed-bean-name>productBean</managed-bean-name>
    
<managed-bean-class>org.zhouxing.simple.ProductBean</managed-bean-class>
    
<managed-bean-scope>session</managed-bean-scope>
    
<managed-property>
        
<property-name>productDAO</property-name>
        
<value>#{productDAO}</value>
    
</managed-property>
</managed-bean>

  #{productDAO} 表达式将通过 Spring 注入。

  在 JSF 配置文件中配置 navigation Rule,请求转向 index.jsp 。代码片段如下:

  清单 8. 配置 navigation Rule

<navigation-rule>
    
<navigation-case>
        
<to-view-id>/index.jsp</to-view-id>
    
</navigation-case>
</navigation-rule>

  6.创建 index.jsp,页面显示表单和查询结果。代码片段如下:

  清单 9. 创建 index.jsp

<f:view>
    
<h:form>
        名称
<h:inputText value="#{productBean.product.name}"/><p>
        存货
<h:inputText value="#{productBean.product.inventory}"/><p>
        单价
<h:inputText value="#{productBean.product.price}"/><p>
        描述
<h:inputTextarea value="#{productBean.product.description}"/>
        
<h:commandButton value=" 添加 " action="#{productBean.add}" />
    
</h:form>

    
<h:dataTable var="entry" value="#{productBean.products}"
        rendered
="true">
        
<h:column>
            
<h:outputLabel value="#{entry.name}"/>
        
</h:column>
        
<h:column>
            
<h:outputLabel value="#{entry.inventory}"/>
        
</h:column>
        
<h:column>
            
<h:outputLabel value="#{entry.price}"/>
        
</h:column>
        
<h:column>
            
<h:outputLabel value="#{entry.description}"/>
        
</h:column>
    
</h:dataTable>
</f:view>

  JSF 组件必须在 之间, 会产生一个表单, 来显示 product 对象的各个属性, 会产生一个提交按钮,调用 productBean 的 add 方法处理。 调用 productBean 的 getProducts 方法迭代所有 product 的信息。

0
相关文章