开发 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:
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/applicationContext.xml</param-value>
</context-param>
添加 Spring listener:
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
4.编辑 applicationContext.xml,内容如下:
清单 4. applicationContext.xml
<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>
新建名称为 org.zhouxing.simple.ProductBean 的一个类作为 JSF 的 managed Bean 。 JSF 使用 JavaBean 来达到程序逻辑与视图分离的目的,在 JSF 中的 Bean 其角色是属于 Backing Bean,又称之为 Glue Bean,其作用是在真正的业务逻辑 Bean 及 UI 组件之间搭起桥梁,在 Backing Bean 中会呼叫业务逻辑 Bean 处理使用者的请求,或者是将业务处理结果放置其中,等待 UI 组件取出当中的值并显示结果给使用者。
主要有两个方法实现业务功能,代码如下:
清单 5. 业务功能代码
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 变量解析器
<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-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-case>
<to-view-id>/index.jsp</to-view-id>
</navigation-case>
</navigation-rule>
6.创建 index.jsp,页面显示表单和查询结果。代码片段如下:
清单 9. 创建 index.jsp
<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 组件必须在