??xml version="1.0" encoding="utf-8" standalone="yes"?>
q接不上
有没有新的地址 , 或是其他办法请高手指?!!
]]>
<!-- ant properties/targets for oracle 8/9 -->
<!-- note: this is not a proper xml file (there is no root element) -->
<!-- it is intended to be imported from a *real* xml file -->
<!-- =================================================================== -->
<!-- please set your Oracle-SID according to your needs -->
<property environment="env"/>
<property name="database.script.file" value="${src.dir}/sql/${name}-oracle.sql"/>
<!--property name="database.driver.file" value="${env.ORACLE_HOME}/jdbc/lib/classes12.jar"/-->
<property name="database.driver.file" value="${lib.dir}/classes12.jar"/>
<property name="database.driver.classpath" value="${database.driver.file}"/>
<property name="database.driver" value="oracle.jdbc.driver.OracleDriver"/>
<property name="database.url" value="jdbc:oracle:thin:@localhost:1521:oracle"/>
<property name="database.userid" value="scott"/>
<property name="database.password" value="tiger"/>
<property name="database.schema" value="scott"/>
<property name="database.catalog" value=""/>
<!--property name="jboss.datasource.mapping" value="Oracle7"/-->
<!--property name="jboss.datasource.mapping" value="Oracle8"/-->
<property name="jboss.datasource.mapping" value="Oracle9i"/>
1. 注意一定要讄SCHEMA
2. 用了默认的driver.file讄,在执行ant时出?我就把oracle_home/jdbc/lib下的jar文g拯?lib 目录下了,再修改driver.file属性即?/P>
JavaServer Faces(JSF)是一用Java技术来快速构建Web应用E序的新技术。JSF通过提供以下Ҏ来加速开发进E:标准和可扩展的用L面组Ӟ极易配置的页面导航;用于输入验证的组Ӟ自动化的Bean理Q事件处理;L的错误处理,以及内置的对国际化的支持?BR>
本文介绍如何使用JSF来构建在U比萨(pizzaQ订购系l?/SPAN>
目描述
该应用程序被UC为PizzaRiaQ是一个在U商店,允许用户选择比萨饼ƈ递交选定的比萨饼。PizzaRia与其他在U商店类|用户可以览菜单Q向购物车中d所选品ƈq行l̎?/P>
该应用程序的用户界面?个JSP文gl成Q它们是index.jsp, details.jsp, shoppingCart.jsp, checkOut.jsp以及order.jsp 。每个用L面的面包括3个其它页面:header.jsp, menu.jsp?footer.jsp ?/P>
![]() |
![]() |
![]() |
![]() |
![]() |
数据?/SPAN>
该程序的数据存储?张表中:productsQ品)、ordersQ定单)和OrderDetailsQ订单详l项目)。Products表存储品信息,h4列:ProductIdQ品标识), NameQ名Uͼ, DescriptionQ说明)?PriceQh|?/SPAN>
Orders表中的每一行存储一个单独的订单Q其中的信息包括联系人姓名、送货地址以及信用卡细目。Orders表有6列:OrderIdQ定单标识), ContactNameQ联pMh姓名Q? DeliveryAddressQ送货地址Q? CCNameQ信用卡所属h姓名Q? CCNumberQ信用卡LQ和 CCExpiryDateQ信用卡有效期限Q?BR>
每个订单的详l项目被存储在OrderDetails表中。OrderDetails表有4列:OrderIdQ定单标识), ProductIdQ品标识), QuantityQ数量)?PriceQh|。Orders与OrderDetails表通过OrderID列有一对多的对应关pR请注意QOrderDetails表在用户下订单的时候就保存相关的hg息。该h可能与当前品hg同,后者存储在Products表的Price列中?/P>
用于在一个Oracle数据库中创徏所需的表的脚本文件pizzaria-oracle.sql存放?A >pizzaria.zip文g中?/SPAN>
业务对象
以下是在该应用程序中使用的业务对象:
ProductBean用于装一个品信息。它h如下属性:idQ标识)、nameQ名Uͼ、descriptionQ说明)和priceQh|。每ơdetails.asp被讉K的时候,JSF实现QimplementationQ就会自动创Z个ProductBean实例。该JSF实现调用ProductBean的无参数构造器Q从数据库中获取相关的数据,q且其填入相应的字列中?/SPAN>
ProductSummary?/SPAN>ProductSummaryQ品概要)用于表示产品的概要。该cd?个属性:idQ标识)和nameQ名Uͼ?/SPAN>
ShoppingItemBean?/SPAN>ShoppingItemBean用于表示购物目。该cd?个属性:productIdQ品标识), productNameQ品名Uͼ, priceQh|以及 quantityQ数量)?/SPAN>
ShoppingCartBean?/SPAN>ShoppingCartBean用于表示一个存储在对话QsessionQ对象中的购物R。该cd许用h加购物项目(使用addShoppingҎQ,获取包含所有购物项目的列表Q用getShoppingItemsҎQ,获得所购货物的Mh|使用getTotalҎQ?/SPAN>
OrderBean?/SPAN>OrderBean表示一个订单。该cd有如?个属性:contactName, deliveryAddress, creditCardName, creditCardNumber以及 creditCardExpiryDate?
MenuBean?/SPAN>MenuBean使用getMenuҎ昄可供产品的目录。该Ҏq回一个包含到产品l节的链接的HTML表?BR>
DatabaseUtil?/SPAN>DatabaseUtil提供了以?U方法以便访问和操作数据Q?/SPAN>
应用E序上下文监听器
应用E序上下文监听器QAppContextListenerc)从web.xml文gd用于讉K数据库的初始参数Q然后将其写入ServletContext对象。用到的初始参数如下QjdbcDriver, dbUrl, dbUserName?dbPassword。在你的web.xml文g中编辑这些|以便反应你数据库的真实倹{?/P>
JSF应用E序配置
JSF允许~程人员仅仅通过应用E序配置文g可以轻N|应用程序。该文g如果存在的话Q则它应该被命名为faces-config.xmlQƈ且应该位于你应用E序下的WEB-INF 目录?/P>
可以在faces-config.xmlz文g中对该应用程序的多个斚wq行配置Q包括bean理、页面导航、定制UIQ用L面)lg、定刉证程序和消息资源。在 PizzaRia 应用E序中,我将该faces-config.xml用于bean理和页面导航的配置?BR>
JavaBean理?/SPAN>对于JavaBean理Q可以用应用程序配|文件faces-config.xml中的managed-bean元g。每个managed-bean元g都会注册一个JavaBean--JSF会将该JavaBean在特定的作用域内实例化和q行储存。managed-bean元g定义如下Q?/SPAN>
<!ELEMENT managed-bean (description*, display-name*, icon*, managed-bean name, managed-bean-class, managed-bean-scope, (managed-property* | map-entries | list-entries))>
每个managed-bean元g都必d含一个managed-bean-name元gQ一个managed-bean-class元gQ以及一个managed-bean-scope元gQƈ且可选择性地包含一些描q、显C名、图标和managed-property/map-entries/list-entries元g?/SPAN>
managed-bean-name指定了被用来在整个应用程序中引用该JavaBean的名U。managed-bean-class元g包含该JavaBean的完全限度的cd。managed-bean-scope元g定义该JavaBean的作用域。该元g可能的值是Qapplication、session、request或者none。如果managed-bean-scope元g是none以外的其他|那么Q所创徏的该JavaBean元g会被存储在相应的对象中。比如说Q如果值是"session"Q那么,该JavaBean׃被存储在一个给定用Lsession对象中?/SPAN>
在PizzaRia应用E序中,我注册了?A target=_blank>代码清单1所C的4个JavaBeans?/SPAN>
面DQ?/SPAN>面D军_了Web应用E序的控制流。本节演C如何在JSF中创立一个页面导航?/SPAN>
JSF使用navigation-rule元g来ؓ面D定义规则。其定义如下Q?/SPAN>
<!ELEMENT navigation-rule (description*, display-name*, icon*, from-view-id?, navigation-case*)>
from-view-id元g是首(起始)的标识符。ؓ了说明被UC为index.jsp的JSP面的导航规则,下面l出子元件from-view-id的|
<from-view-id>/index.jsp</from-view-id>
navigation-case元g表示一个可能的目标面。navigation-rule一个元件可以有零个或者数个navigation-case子元件?/SPAN>
每个navigation-case元g都指定from-view-id的特定处理结果的目标面。结果可以来自from-view-id元g?UICommandlg的行动(actionQ属性?/P>
navigation-case元g由如下所C的代码描述Q?/SPAN>
<!ELEMENT navigation-case (description*, display-name*, icon*, from-action?, from-outcome?, to-view-id, redirect?)>
to-view-id元g指定目标面。from-outcome值是处理from-view-id的结果。该值来自于在from-view-id中触发了ActionEvent?UICommandlg的行动属性?/SPAN>
from-action元g也表C处理from-view-id的结果。但其值来自于引发了ActionEvent的UICommandlg的行动属性的q算倹{?BR>
代码清单2展示了在PizzaRia应用E序中用的navigation-rule元g?/SPAN>
在JSP面中用UIlg
JSF提供两个定制标记库来帮助用户快速编写Web应用E序QHTML和Core。HTML定制标记库定义了用来表示UIlg的标记。Core定制标记库用具有组件的验证器(validatorsQ定义了注册事g处理器的核心行动Q以及其他一些行动。你可以在自qJSF应用E序的JSP面中用这两个库的标记?/P>
Z在JSP面中用HTML和Core定制标记库,必须在页面中包含如下所C的taglib指oQ?/SPAN>
<%@ taglib uri="http://java.sun.com /jsf/html/" prefix="h" %> <%@ taglib uri="http://java.sun.com/ jsf/core/" prefix="f" %>
Prefix的属性值可以是L倹{但是,Ҏ惯例Q最好是使用"h"?f"?/SPAN>
在JSF应用E序中编写JSP面是每一个页面制作者的责Q。除了布|组件之外,他们的责任还包括把组件绑定到模型对象数据q且把Core标记Q诸如事件监听器和验证器Q添加到lg标记中?/P>
在HTML定制标记库中?5个标记。每个组仉呈现Z个HTML元gQ而多个标记被呈现为同一个HTML元g?A >?列出了HTML定制标记库中的标记?/P>
标记 | 说明 |
Column | 在UIDatalg内表CZ个数据列?/TD> |
command_button | 表示一个向服务器提交表单的按钮?/TD> |
command_link | 表示一个指向另一面或者本面内其他位|的链接?/TD> |
data_table | 表示一个支持将数据l定C个数据对象的集合上的表?/TD> |
Form | 表示一个表单?/TD> |
graphic_image | 昄一张图片?/TD> |
input_hidden | 表示一个隐藏的元g?/TD> |
input_secret | 表示一个密码输入框?/TD> |
input_text | 表示一个可接受单个字符串的文本输入框?/TD> |
input_textarea | 表示一个可接受多个字符串的文本输入区?/TD> |
Message | 昄l定lg的信息?/TD> |
Messages | 表示一个从FacesContext中获取消息ƈ且将其显C给用户的组件?/TD> |
output_label | 昄文本?/TD> |
output_link | 昄一个超链接?/TD> |
output_message | 昄l定lg的信息?/TD> |
output_text | 昄一行文本?/TD> |
panel_grid | 昄一张表?/TD> |
panel_group | 一个组仉合分l?/TD> |
selectboolean_checkbox | 表示一个单选文本框?/TD> |
selectmany_checkboxlist | 昄一套复选框Q用户从中可以选择多个倹{?/TD> |
selectmany_listbox | 表示一个多选下拉选择框,用户从中可以选择多个目?/TD> |
selectmany_menu | 表示一个多选项目列表,用户从中可以选择多个目?/TD> |
selectone_listbox | 表示一个单选下拉选择框,用户从中只能选择一个项目?/TD> |
selectone_menu | 表示单选项目列表,用户从中只能选择一个项目?/TD> |
selectone_radio | 表示一套单选按钮?/TD> |
使用验证?/SPAN>
验证器得输入确认简单化q且可以节省开发h员的大量~程旉。JSF提供一套验证器cȝ于确认输入到输入lg中的倹{另外一U方法就是,如果现有的标准验证器不符合需要,那么开发h员还可以~写自己的验证器?/SPAN>
验证器是一个实现类Qimplementation classQ,它可以验证输入|如果是非法输入,׃发出一个错误信息。可以通过一个验证器嵌入一个其输入需要验证的输入lg中来使用它。如果该验证器判断出用户的输入是非法的,那么JSF servlet׃重新昄刚才提交了表单的那个JSP面Q而不会将本地值复制给l定到该输入lg上的JavaBean实例?BR>
JSF实现为通用的验证Q务提供了3个标准验证器Q包括检查必填的域内已填入内宏V输入的内容W合长度和范围要求?A >?列D了标准的验证器?/SPAN>
验证器类 | 标记 | 说明 |
LengthValidator | validate_length | 保lg的本地值的长度在规定的范围之内。该值必L字符串型?/TD> |
LongRangeValidator | validate_longrange | 保lg的本地值在规定的范围之内。该值必能够被转换成长型?/TD> |
DoubleRangeValidator | validate_doublerange | 保lg的本地值在规定的范围内。该值必能够被转换成Q点型?/TD> |
另外QHTML定制标记库中的input_text和input_textarea标记有必填的属性。如果将该属性标赋gؓ真,那么用户在l进行操作之前,必d文本输入框元件或者文本输入区域进行填写?BR>
在PizzaRia应用E序中,checkOut.jsp面使用该必填的属性以便保证没有一个域是空的?/SPAN>
事g处理
JSP应用E序是事仉动型的程序。在JSF中处理事件o人惊奇的单。以下是处理步骤Q?/P>
在JSF中的事g对象?/SPAN>JSF中的所有事件对象必L供javax.faces .event.FacesEventc,以便q些事g被请求处理生命周期支持。FacesEventcLjava.util.EventObject的子c,q添加了getComponentҎQ该Ҏq回引发该事件的UIComponentlg?/SPAN>
FacesEventcL两个子类QActionEvent?ValueChangeEvent。ActionEventcLz诸如UICommandlg之类的UIlg?BR>
ValueChangeEventcM发出一个通知Q告知本地UIInputlg的D修改了。然而,如果新值没有被成功地验证ؓ合法的,则不会发出ValueChangeEvent通知。被加入到该cM的两个重要方法是getOldValue ?getNewValue。getOldValueҎq回引发该事件的lg的旧倹{getNewValueҎq回相应的新倹{这两种Ҏ的返回值类型都是java .lang.Object?BR>W三QJSF中的事g监听器?/P>
为捕获一个JSF事gQ?/SPAN>需要用一个事件监听器。JSFE序中的所有监听器都必d现javax.faces.event.FacesListener接口。该接口提供java.util.EventListener接口Q后者是必须由所有Java事g监听器实现的接口?/SPAN>
Faces Listener接口有两个子接口QActionListener ?ValueChangeListener。ActionListener接口是ؓ了捕获ActionEvent而必被实现的接口。该接口d了一个新的方?-processAction--该方法请求处理生命周期来调用。当Z注册了ActionListener 的ActionEvent发生事gӞ׃调用processAction。processActionҎ的代码如下:
public void processAction(ActionEvent event) throws AbortProcessingException
ValueChangeListener接口是ؓ了捕获ValueChangeEvent而实现的接口。该接口d了一个方法:processValueChange。当ValueChangeEvent动作被其监听者监听到Ӟ׃调用processValueChangeҎ。processValueChangeҎ的代码如下:
public void processValueChange(ValueChangeEvent event) throws AbortProcessingException
阅读 |
AppActionListenercM用两个非常有用的ҎQgetValueBinding 和getDatabaseUtil。getValueBinding接受指定对象名的字符Ԍq返回一个可以向下{换类型ؓ对象cd的ValueBinding对象。比如说Qؓ获得用户的在应用E序配置文g中被注册成shoppingCartBean 的ShoppingCartBean实例Q开发h员需要通过传?shoppingCartBean"来调用getValueBinding?
ShoppingCartBean cart = (ShoppingCartBean) getValueBinding("#{shoppingCartBean}").getValue(facesContext);
getValueBindingҎ如下Q?
private ValueBinding getValueBinding(String valueRef) { ApplicationFactory factory = (ApplicationFactory)FactoryFinder .getFactory(FactoryFinder .APPLICATION_FACTORY); Application application = factory.getApplication(); return application.createValueBinding (valueRef); }
getDatabaseUtilҎq回一个对ServletContext中的DatabaseUtil实例的引用:
private DatabaseUtil getDatabaseUtil() { FacesContext facesContext = FacesContext.getCurrentInstance(); ServletContext servletContext = (ServletContext) facesContext.getExternalContext() .getContext(); return (DatabaseUtil) servletContext .getAttribute("DATABASE_UTIL"); }
q行该应用程?/SPAN>
该PizzaRia JSF应用E序用JSF参考实玎ͼJavaServer Faces [JSF] Beta 1.0Q已做过试。请参看该应用程序的zip文g(pizzaria.zip)中的readme.txt文gQ以便获得有关部|PizzaRia应用E序的更详细信息?/SPAN>