??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲精品成人一区,h片在线观看视频免费,成人香蕉视频http://www.aygfsteel.com/wenjianzhang/zh-cnThu, 19 Jun 2025 19:19:17 GMTThu, 19 Jun 2025 19:19:17 GMT60可恶 hibernate插g联接不上http://www.aygfsteel.com/wenjianzhang/archive/2006/02/24/32270.html不老的传说不老的传说Fri, 24 Feb 2006 03:18:00 GMThttp://www.aygfsteel.com/wenjianzhang/archive/2006/02/24/32270.htmlhttp://www.aygfsteel.com/wenjianzhang/comments/32270.htmlhttp://www.aygfsteel.com/wenjianzhang/archive/2006/02/24/32270.html#Feedback1http://www.aygfsteel.com/wenjianzhang/comments/commentRss/32270.htmlhttp://www.aygfsteel.com/wenjianzhang/services/trackbacks/32270.htmlhttp://www.binamics.com/hibernatesync 
q接不上

有没有新的地址 , 或是其他办法请高手指?!!

不老的传说 2006-02-24 11:18 发表评论
]]>
在Middlegen-Hibernate中设|oracle.xml实例http://www.aygfsteel.com/wenjianzhang/archive/2006/02/23/32085.html不老的传说不老的传说Thu, 23 Feb 2006 03:29:00 GMThttp://www.aygfsteel.com/wenjianzhang/archive/2006/02/23/32085.htmlhttp://www.aygfsteel.com/wenjianzhang/comments/32085.htmlhttp://www.aygfsteel.com/wenjianzhang/archive/2006/02/23/32085.html#Feedback0http://www.aygfsteel.com/wenjianzhang/comments/commentRss/32085.htmlhttp://www.aygfsteel.com/wenjianzhang/services/trackbacks/32085.html   <!-- =================================================================== -->
   <!-- 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>

不老的传说 2006-02-23 11:29 发表评论
]]>
使用MiddleGen 产生hibernate的数据库表映文?/title><link>http://www.aygfsteel.com/wenjianzhang/archive/2006/02/23/32075.html</link><dc:creator>不老的传说</dc:creator><author>不老的传说</author><pubDate>Thu, 23 Feb 2006 02:54:00 GMT</pubDate><guid>http://www.aygfsteel.com/wenjianzhang/archive/2006/02/23/32075.html</guid><wfw:comment>http://www.aygfsteel.com/wenjianzhang/comments/32075.html</wfw:comment><comments>http://www.aygfsteel.com/wenjianzhang/archive/2006/02/23/32075.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.aygfsteel.com/wenjianzhang/comments/commentRss/32075.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/wenjianzhang/services/trackbacks/32075.html</trackback:ping><description><![CDATA[<div class="wmqeeuq" id=title> <H1> <FONT face=Arial size=3>1Q下载Middlegen-Hibernate-r5<BR>地址QURL http://voxel.dl.sourceforge.net/sourceforge/hibernate/Middlegen-Hibernate-r5.zip<BR>2Q解压羃<BR>下载的解压~,?D:\Middlegen-Hibernate-r5<BR>3Q配|数据库文g<BR>q入D:\Middlegen-Hibernate-r5 目录下的\config\database 子目录,选择你要得数据库文gQ我使用的是mysql.<BR>原来的<BR><property name="database.driver.file"           value="${lib.dir}/mysql-connector-java-3.0.0-beta-bin.jar"/><BR>Ҏ<BR><property name="database.driver.file"           value="${lib.dir}/mysql-connector-java-3.0.15-ga-bin.jar"/>  <BR>同时指定数据库与用户名。我的配|如下(U色部分是要修改的部分)<BR>   <property name="database.script.file"           value="${src.dir}/sql/${name}-mysql.sql"/><BR>   <!--property name="database.driver.file"           value="${lib.dir}/mysql-connector-java-3.0.0-beta-bin.jar"/--><BR>   <property name="database.driver.file"           value="${lib.dir}/mysql-connector-java-3.0.15-ga-bin.jar"/>  <BR>   <property name="database.driver.classpath"      value="${database.driver.file}"/><BR>   <property name="database.driver"                value="org.gjt.mm.mysql.Driver"/><BR>   <property name="database.url"                   value="jdbc:mysql://localhost/hibernate"/><BR>   <property name="database.userid"                value="root"/><BR>   <property name="database.password"              value=""/><BR>   <property name="database.schema"                value=""/><BR>   <property name="database.catalog"               value=""/><BR>   <property name="jboss.datasource.mapping"       value="mySQL"/><BR><BR>mysql的驱动程序mysql-connector-java-3.0.15-ga-bin.jar copy 到D:\Middlegen-Hibernate-r5\lib?BR><BR>4Q修改Build.xml<BR>修改D:\Middlegen-Hibernate-r5目录下的build.xml 文gQ此文g是Middlegen-Hibernate 的Ant<BR>构徏配置。Middlegen-Hibernate根据build.xml 文g中的具体参数生成数据库表映射<BR>文g<BR><BR>1Q第24?修改数据库连?BR>hsqldb.xml Ҏmysql.xml<BR><!ENTITY database SYSTEM "file:./config/database/mysql.xml"><BR>2Q第52?修改输出目录<BR>?{build.dir}/gen-src Ҏ你要的目?BR>   <property name="build.gen-src.dir"              value="D:/Middlegen-Hibernate-r5/sample"/><BR>3Q第184?对应代码的Package name<BR>hibernate 节点package 属性的默认讄实际上是由前面的<BR>Application Name Q?{name}Q和?hibernate”组合而成Q根据我们的需要,<BR>其改ؓ<BR>         <hibernate<BR>            destination="${build.gen-src.dir}"<BR>            package="org.hibernate.sample"<BR>            genXDocletTags="true"<BR>            genIntergratedCompositeKeys="false"<BR>            javaTypeMapper="middlegen.plugins.hibernate.HibernateJavaTypeMapper"<BR>         /><BR>q里q有一个属性genXDocletTagsQ如果设|ؓtrueQ则生成的代码将包含<BR>xdoclet tag?BR>4Q第33?修改应用?BR>原来的<BR>   <property name="name" value="airline"/><BR>Ҏ<BR>   <property name="name" value="HibernateSample"/><BR><BR>5Q切换到D:\Middlegen-Hibernate-r5目录Q运行ant<BR><BR><BR></FONT></H1></DIV><img src ="http://www.aygfsteel.com/wenjianzhang/aggbug/32075.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/wenjianzhang/" target="_blank">不老的传说</a> 2006-02-23 10:54 <a href="http://www.aygfsteel.com/wenjianzhang/archive/2006/02/23/32075.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>eclipse 的JDK讄问题http://www.aygfsteel.com/wenjianzhang/archive/2006/02/23/32069.html不老的传说不老的传说Thu, 23 Feb 2006 02:14:00 GMThttp://www.aygfsteel.com/wenjianzhang/archive/2006/02/23/32069.htmlhttp://www.aygfsteel.com/wenjianzhang/comments/32069.htmlhttp://www.aygfsteel.com/wenjianzhang/archive/2006/02/23/32069.html#Feedback1http://www.aygfsteel.com/wenjianzhang/comments/commentRss/32069.htmlhttp://www.aygfsteel.com/wenjianzhang/services/trackbacks/32069.html我机器上装的是JDK1.5
后来发现是安装了Oracle9i自带的是jdk1.3.1Q安装Oracle时自q装上MQ把path中jdk1.3.1的bin路径l去掉,一下JAVA_HOME是不是指向机器上的jdk1.5.0Q然后启动eclipseQ就OK?img src ="http://www.aygfsteel.com/wenjianzhang/aggbug/32069.html" width = "1" height = "1" />

不老的传说 2006-02-23 10:14 发表评论
]]>
?利用JSF应对应用E序开发的未来http://www.aygfsteel.com/wenjianzhang/archive/2006/02/14/30589.html不老的传说不老的传说Tue, 14 Feb 2006 05:49:00 GMThttp://www.aygfsteel.com/wenjianzhang/archive/2006/02/14/30589.htmlhttp://www.aygfsteel.com/wenjianzhang/comments/30589.htmlhttp://www.aygfsteel.com/wenjianzhang/archive/2006/02/14/30589.html#Feedback0http://www.aygfsteel.com/wenjianzhang/comments/commentRss/30589.htmlhttp://www.aygfsteel.com/wenjianzhang/services/trackbacks/30589.htmlJavaServer Face为Java应用E序的开发提速?/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>

Figure 1

Figure 2

Figure 3

Figure 4

Figure 5

数据?/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>

  • GetProductSummariesQ该Ҏq回一个包含了产品表中所有品概要的列表。一个品概要通过ProductSummarycL表示?/SPAN>

  • GetProductDetailsQ该Ҏq回一个ProductBean对象Q该对象装h特定标识W的产品l节?/SPAN>

  • InsertOrderQ该Ҏ向Orders表和OrderDetails表插入客戯单?

应用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>

?. HTML定制标记?

使用验证?/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>

  1. ~写事g监听器?
  2. 在程序目录下的WEB-INF/classes or WEB-INF/lib目录中部|事件监听器?
  3. 在表C组Ӟ其事件被捕获Q的标记中,使用Core定制标记库中定义的action_listener或?valuechange_listener标记?

在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

下一?/SPAN>

下蝲
JavaServer Faces (JSF)

PizzaRia应用E序

阅读
关于JavaServer Faces的更多信?/SPAN>
java.sun.com/j2ee/javaserverfaces/download.html
java.sun.com/webservices/downloads/webservicespack.html

在PizzaRia应用E序中,开发h员需要一个名为AppAction Listener 的ActionListener。其processActionҎ从ActionEvent对象的getLocalValueҎ获取传递给该方法的本地倹{如果本地gؓ"BuyQ购乎ͼ"Q则processAction获取与用L关的ShoppingCartBean对象Qƈ且将shoppingItem加入到bean中去。如果本地gؓ"payQ付ƾ)",那么processAction׃sessionQ会话)对象获取OrderBean对象和ShoppingCartBean对象Qƈ调用DatabaseUtil对象的insertOrderҎ?A target=_blank>代码清单3描述了processActionҎ?/P>

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>



不老的传说 2006-02-14 13:49 发表评论
]]>
?JSF开发实??http://www.aygfsteel.com/wenjianzhang/archive/2006/02/14/30588.html不老的传说不老的传说Tue, 14 Feb 2006 05:47:00 GMThttp://www.aygfsteel.com/wenjianzhang/archive/2006/02/14/30588.htmlhttp://www.aygfsteel.com/wenjianzhang/comments/30588.htmlhttp://www.aygfsteel.com/wenjianzhang/archive/2006/02/14/30588.html#Feedback0http://www.aygfsteel.com/wenjianzhang/comments/commentRss/30588.htmlhttp://www.aygfsteel.com/wenjianzhang/services/trackbacks/30588.htmlJSF开发实??

bromon原创 请尊重版?BR>
    JSF开发实战的W一?jsf开发实战一)演示了如何徏立一个最单的JSF应用Q从那个例子中我们可以观察到JSF的页面组件是如何与后台的javabeanl定的,也看CJSF标签的最基本使用。在本文中我们会演示一个更加复杂的应用Q它包含了更丰富的JSF标签?BR>
    要开发的例子是一个用L理程序,理员输入帐号与密码登陆Q然后它可以看到所有用L列表Qƈ且可以修Ҏ者删除其中的一些数据。利用myeclipse所带的jsf-config.xml设计器,面程如下Q?BR>
 

    可以看出Q这个应用设计到的业务逻辑有:

用户登陆、修改用户信息、增加新用户、删除用?BR>
    我们在后台的数据库操作中使用hibernate框架来辅助开发,相关的技术细节请自行查阅文档?BR>
    首先建立pojo文gQUser.javaQ它包含几个基本属性:

private int id;
private String name;
private String password;
private int power;

误行完成set/getҎQƈ且编写对应的hbm.xml文g?BR>
我们的主要工作之一Q是要徏立好供jsf面lg使用的javabeanQ把它命名ؓUMDelegater.java。它会调用UserManager来完成业务逻辑Q这里是一个代理模式。UserManager的内容只是简单的???改的操作Q这里不再具体列出。UMDelegater的内ҎQ?BR>package org.bromon.jsf.control;

import java.util.List;

import javax.faces.model.DataModel;
import javax.faces.model.ListDataModel;

import org.bromon.jsf.model.UserManager;//自行建立的工LQ负责所有的hibernate操作
import org.bromon.jsf.model.pojo.User;//pojo对象

public class UMDeletager {
    private UserManager um=new UserManager();//所有具体的Ҏ都由它来实现
    private User user=new User();
        private DataModel allUsers=new ListDataModel();//JSF的内|对象,用来装html中table的数?BR>
        //----------set/getҎ---------------------
    public DataModel getAllUsers() {
        return allUsers;
    }

    public void setAllUsers(List list) {
        allUsers.setWrappedData(list);
    }
    public UserManager getUm() {
        return um;
    }
    public void setUm(UserManager um) {
        this.um = um;
    }
    public User getUser() {
        return user;
    }
    public void setUser(User user) {
        this.user = user;
    }
    
    //-----功能Ҏ---------
    public String login()
    {
        String s=um.login(this.getUser());
        if(s.equals("ok"))
        {
            this.setAllUsers(um.loadAll());//如果登陆成功Q就取出所有的用户信息
            return "login:ok";
        }else
        {
            swapper.setLoginFailInfo(s);
            return "login:fail";
        }
    }
    
    public String edit()
    {
        this.user=(User)allUsers.getRowData();//面中的table自动q回含有id的user对象
        this.user=um.loadById(user.getId());
        if(user!=null)
        {
            return "edit";
        }else
        {
            return "error";
        }
    }
    
    public String update()
    {
        um.update(this.getUser());
        this.setAllUsers(um.loadAll());//重新取一ơ数据,目的是更新缓?BR>        return "update:ok";
    }
    
    public String addNew()
    {
        this.setUser(new User());//生成一个新的user对象Q不含Q何数据,它会被自动映成一个没有数据的form
        return "add";
    }
    
    public String add()
    {
        um.add(this.getUser());
        this.setAllUsers(um.loadAll());//重新取一ơ数据,目的是更新缓?BR>        return "add:ok";
    }
}

    在jsf-config.xml中声明这个beanQ?BR>
Qmanaged-beanQ?BR>        Qmanaged-bean-nameQUMDelegaterQ?managed-bean-nameQ?BR>Qmanaged-bean-classQorg.bromon.jsf.control.UMDeletagerQ?managed-bean-classQ?BR>        Qmanaged-bean-scopeQsessionQ?managed-bean-scopeQ?BR>    Q?managed-beanQ?BR>
业务逻辑p计完成了Q下面可以开始编写jsf文gQ首先是index.jsp:

首先引入标签库,q且声明page属性:

<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %>
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %>
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

然后是构建页面:

QbodyQ?BR>    Qf:viewQ?BR>        Qh:formQ?BR>            Qh:panelGrid columns="3"Q?BR>                Qh:outputLabel for="name" value="帐号:"/Q?BR>                Qh:inputText id="name" value="#{UMDelegater.user.name}" required="true"/Q?BR>                Qh:message for="name"/Q?BR>                
                Qh:outputLabel for="password" value="密码:"/Q?BR>                Qh:inputSecret id="password" value="#{UMDelegater.user.password}" required="true" /Q?BR>                Qh:message for="password"/Q?BR>            Q?h:panelGridQ?BR>            Qh:panelGroupQ?BR>                Qh:commandButton value="登陆" action="#{UMDelegater.login}"/Q?BR>            Q?h:panelGroupQ?BR>        Q?h:formQ?BR>    Q?f:viewQ?BR>  Q?bodyQ?BR>
面中声明了两个文本框,分别映射UMDelegater对象中user对象的name属性,和UMDelegater对象中user对象的password属性。一旦这个表单被提交Q这两个文本框的值就会被自动赋给user对象Q我们只需要从user中取数据p了,不用再去执行ȝ的request.getParameter(“?Q更改编码,转换数据cd{操作?BR>
我们同时q声明了一个buttonQ它与UMDelegater对象的loginҎl定Q点击该按钮Q系l会执行UMDelegater.loginҎQ该Ҏ从user对象中取出name和passwordQ和数据库中的记录进行比较。如果合法,那么取出所有的数据Q放C个DataModel对象中,具体代码是:

List userList=UserManager.getAllUser();//取得所有用h据,攑ֈ一个List?BR>DataModel allUser=new ListDataModel ();//DataModel是一个接口,ListDataModel是它的一个实?BR>
allUsers.setWrappedData(userList);//数据填充进d?BR>
使用DataModel意义何在呢?JSF中,我们可以把一个html面上的table和一个DataModell定hQ这些数据会自动填充到table中,我们不必再自己去写@环,生成若干?lt;tr>?lt;td>来生成一个table。在list.jsp中我们会看到如何使用DataModel?BR>
攑֥数据之后Q登陆成功的操作完成了Q返回一个login:okQ就可以重定向到list.jsp。如果用L陆失败,那么会返回login:failQ重定向到error.jspQ它的内容就不叙说了。下面我们看看list.jsp里面有什么,下面是它?lt;body>代码Q?BR>
QbodyQ?BR>    Qf:viewQ?BR>        Qh:formQ?BR>            Qh:dataTable id="users" value="#{UMDelegater.allUsers}" var="u" border="1" width="80%" Q?BR>                Qh:columnQ?BR>                    Qf:facet name="header"Q?BR>                        Qh:outputText value="id"/Q?BR>                    Q?f:facetQ?BR>                    Qh:outputText value="#{u.id}"/Q?BR>                Q?h:columnQ?BR>                
                Qh:columnQ?BR>                    Qf:facet name="header"Q?BR>                        Qh:outputText value="帐号"/Q?BR>                    Q?f:facetQ?BR>                    Qh:commandLink action="#{UMDelegater.edit}"Q?BR>                        Qh:outputText value="#{u.name}"/Q?BR>                    Q?h:commandLinkQ?BR>                Q?h:columnQ?BR>                
                Qh:columnQ?BR>                    Qf:facet name="header"Q?BR>                        Qh:outputText value="密码"/Q?BR>                    Q?f:facetQ?BR>                    Qh:outputText value="#{u.password}"/Q?BR>                Q?h:columnQ?BR>                
                Qh:columnQ?BR>                    Qf:facet name="header"Q?BR>                        Qh:outputText value="权限代码"/Q?BR>                    Q?f:facetQ?BR>                    Qh:outputText value="#{u.power}"/Q?BR>                Q?h:columnQ?BR>            Q?h:dataTableQ?BR>            QpQ?BR>                Qh:commandLink action="#{UMDelegater.addNew}" value="增加用户" /Q?BR>            Q?pQ?BR>        Q?h:formQ?BR>    Q?f:viewQ?BR>  Q?bodyQ?BR>
我们使用了一个h:dataTable标签Q它是JSF独有的东西,它会被翻译ؓ一个html的tableQ通过指定h:dataTable的value="#{UMDelegater.allUsers}"属性,它就与我们刚才生成的DataModel对象兌hQ数据会被自动填充。我们只需要声明dataTable中的每一列的表头Q数据来自哪个字D就可以了,如下Q?BR>Qh:columnQ?BR>    Qf:facet name="header"Q?BR>        Qh:outputText value="id"/Q?BR>    Q?f:facetQ?BR>    Qh:outputText value="#{u.id}"/Q?BR>Q?h:columnQ?BR>
表格最后还有一个“增加用户”的按钮Q它与UMDelegater.addNewl定Q它会把我们重定向到add.jsp?BR>需要注意的是,每个用户名都是个链接,点击之后可以重定向到edit.jspQ这个页面可以修改用戯料。这是通过如下代码实现的:

Qh:commandLink action="#{UMDelegater.edit}"Q?BR>    Qh:outputText value="#{u.name}"/Q?BR>Q?h:commandLinkQ?BR>
可以看出Q实际上pȝ调用了UMDelegater.editҎQ该Ҏ的功能是Ҏ面传过来的用户id查询数据库,扑ֈ相关记录后返回一个User对象Q然后重定向到edit.jspQ由于我们后面编写edit.jsp的时候会把form元素与User对象l定Q所以该User对象所含有的数据会自动昄到各个form元素上?BR>
list.jsp的显C效果如下:



看到q里你也怼问,那么我如何来化q个表格Q实际上q正式JSFq类框架面的最大问题,它大量的使用了标{ֺQ目前流行的|页制作工具(如deamweaver)又没有提供够的支持Q所以只能依靠挖掘dataTable标签的各个属性,q且大量依赖css才能实现面的美化。如果java世界能有一个强大的JSF IDEQ能够提供vs.net一L能力Q那么JSF也许会更Ҏ行?BR>
下面我们来看看edit.jsp的内容,如下Q?BR>
QbodyQ?BR>    Qf:viewQ?BR>        Qh:formQ?BR>            Qh:inputHidden id="id" value="#{UMDelegater.user.id}"/Q?BR>            Qh:panelGrid columns="3"Q?BR>                Qh:outputLabel for="name" value="帐号"/Q?BR>                Qh:inputText id="name" value="#{UMDelegater.user.name}" required="true"/Q?BR>                Qh:message for="name"/Q?BR>                
                Qh:outputLabel for="power" value="权限"/Q?BR>                Qh:inputText id="power" value="#{UMDelegater.user.power}" required="true"/Q?BR>                Qh:message for="power"/Q?BR>            Q?h:panelGridQ?BR>            Qh:panelGroupQ?BR>                Qh:commandButton value="保存" action="#{UMDelegater.update}"/Q?BR>            Q?h:panelGroupQ?BR>        Q?h:formQ?BR>    Q?f:viewQ?BR>  Q?bodyQ?BR>
可以看出Qedit.jspq没有什么特别需要留意的Q只是一个最单的form与bean的绑定,“保存”按钮与UMDelegater.updateҎl定Q它的功能是把修改后的form数据写入数据库,然后重新取一ơ数据,以免~存做怪,看不C改的效果?BR>
Add.jsp也和edit.jsp很类|它的内容如下Q?BR>
QbodyQ?BR>    Qf:viewQ?BR>          Qh:formQ?BR>              Qh:panelGrid columns="3"Q?BR>                  Qh:outputLabel for="name" value="帐号:" /Q?BR>                  Qh:inputText id="name" value="#{UMDelegater.user.name}" required="true"/Q?BR>                  Qh:message for="name"/Q?BR>                  
                  Qh:outputLabel for="password" value="密码:"/Q?BR>                  Qh:inputText id="password" value="#{UMDelegater.user.password}" required="true"/Q?BR>                  Qh:message for="password"/Q?BR>                  
                  Qh:outputLabel for="power" value="权限"/Q?BR>                  Qh:inputText id="power" value="#{UMDelegater.user.power}" required="true"/Q?BR>                  Qh:message for="power"/Q?BR>              Q?h:panelGridQ?BR>              Qh:panelGroupQ?BR>                  Qh:commandButton value="保存" action="#{UMDelegater.add}"/Q?BR>              Q?h:panelGroupQ?BR>          Q?h:formQ?BR>      Q?f:viewQ?BR>  Q?bodyQ?BR> 

不老的传说 2006-02-14 13:47 发表评论
]]>
?JSF开发实?一)http://www.aygfsteel.com/wenjianzhang/archive/2006/02/14/30587.html不老的传说不老的传说Tue, 14 Feb 2006 05:46:00 GMThttp://www.aygfsteel.com/wenjianzhang/archive/2006/02/14/30587.htmlhttp://www.aygfsteel.com/wenjianzhang/comments/30587.htmlhttp://www.aygfsteel.com/wenjianzhang/archive/2006/02/14/30587.html#Feedback0http://www.aygfsteel.com/wenjianzhang/comments/commentRss/30587.htmlhttp://www.aygfsteel.com/wenjianzhang/services/trackbacks/30587.htmlJSF开发实?一)

bromon原创 请尊重版?BR>
    JSF是J2EE5.0中所包含的web开发框Ӟq应该是W一个成为jcp标准Qƈ且随j2eesdk一起发布的web框架Q可以看出sun对它的期望很高。JSF最大的竞争Ҏ是tapestryQ是apache的品,但是apache又弄Z个myfacesQ是对jsf标准的一个实现。也怽也和我一P在jsf和tapestry之间犹U很久Q将来从apache的态度上应该可以看Z者的走向。在tss上有一比较jsf 1.0与tapestry 3.0的文章,内容很扎实到位:http://www.theserverside.com/articles/article.tss?l=JSFTapestry
JSF的竞争对手不是struts/webwork之流Q它们基本上已经是不同阶D上的东西了Q放在一h较意义不大?BR>
    JSF的开发流E和asp.net中所倡导的code behind方式很相|核心是事仉动,lg和标{装E度非常高,很多典型应用已经不需要开发者去处理http。页面操作会被自动映到对应的java bean中,后台逻辑只需要同java bean发生交互。整个过E是通过“依赖注?DI)”来实现的,看来q是目前解偶合的最佳途径啊,spring的媄响真是深q。不q正式因为jsf采用了这L方式Q导致开发工作和以前的jsp/struts{都有非常大的不同,需要一定的旉d习。学习之前徏议先对依赖注入有比较清楚的认识,可以参考我的learn Spring in springpd的第一?BR>
    本系列将以两个例子来讲解jsf的基本开发,W一个例子当然是hello world。目前可用的jsf ide不多Qibm要到06q才能放出支持jsf的wtp版本。所以我们的例子基本以手写ؓ主,q样也能让我们有更清楚的认识Q同时推荐目前最好的jsf开发工Pmyeclipse 4.0 GA。后面的例子会有jsf和hibernate的内容,它都能给予很好的支持。由于myeclipseq不免费Q所以我们除了讲解在ide中如何操作外Q还会叙q手动操作的具体内容Q以免过于依赖开发工兗用什么服务器都可以,q里采用了jboss 4.0.2。如果你的服务器是高版本的tomcat(5.5+)Q那么必要删除它自带的一些包才能很好的支持jsfQ具体细节请查看它的文档?BR>
    误行下载jsf ri和JSTL 1.1?BR>
废话说Q开始了?BR>
    在myeclipse 4.0GA中新Z个web目Q命名ؓhelloQؓ目增加对JSTL的支持:


 
在JSTL的版本中选择1.1?BR>该操作实际上是把jstl.jar和standard.jar加到工程中?BR>
采用cM的操作ؓ目d对jsf的支持:myeclipse?add jsf capabilities
如图Q?BR> 


其中的jsf implementation是选择使用哪中JSF实现Q我们采用的是sun的jsf ri
JSF config path是配|文件的位置Q保持不?BR>URL pattern是jsf servlet的映方式,有两U选择Q具体细节后面说明?BR>以上操作上是为项目加入了jsf需要的jar和tld文gQƈ且创Z一个faces-config.xml的配|文件。涉及到的jar有:commons-beanutils.jar    commons-collections.jar        commons-digester.jar    commons-logging.jar    jsf-api.jar        jsf-impl.jar
涉及Cjsf中所有的tld文g?BR>
当前的faces-config.xml文g的内ҎQ?BR><?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE faces-config PUBLIC "-//Sun Microsystems, Inc.//DTD JavaServer Faces Config 1.1//EN" "http://java.sun.com/dtd/web-facesconfig_1_1.dtd">

<faces-config>

</faces-config>

环境已经建立好了Q现在我们要建立一个程序,它的功能是让用户在表单中输入名字Q提交后pȝ会返回一个问候。用jsf的以后好处是Q开发h员会很自然的把mvc各层分开Q不会像使用strtus那样别扭Q这一点在后面的开发中感觉得到?BR>
首先开发model层,它是个很单的beanQ?BR>package org.bromon.jsf.model.hello;

public class SayHello {
    public String say(String name)
    {
        return "你好,"+name;
    }
}

在model层中你可以随意的实现业务的数据逻辑Q不需要与web层有M的关pR?BR>
下面开发控制层Q它负责存取web层的数据Qƈ且调用model层的逻辑Q?BR>/**
 * jsf的控制层Ҏ
 * @author bromon
 */
package org.bromon.jsf.control.hello;

import org.bromon.jsf.model.hello.*;

public class HelloDelegater {
    
    //------属?--------
    private String name;//表单中的文本框数据会传到q里
    private String result;//web会从这里取得运行结?BR>    private SayHello sayHello;//model层的对象,q不事例?ql注?BR>    
    //-----set/get--------
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public SayHello getSayHello() {
        return sayHello;
    }
    public void setSayHello(SayHello sayHello) {
        this.sayHello = sayHello;
    }
    public String getResult() {
        return result;
    }
    public void setResult(String result) {
        this.result = result;
    }
    
    //-----逻辑Ҏ---------
    public String say()
    {
        this.setResult(sayHello.say(this.getName()));
        return "ok";
    }
}

需要注意的是,属性的名字、set/getҎ的名字必M格按照java bean规范~写Q因为它们要被注入依赖时使用。sayHello对象q没有被实例化,它会在运行时ql注入?BR>
q两个bean当然要在pȝ中申明,否则无法实现DI。在faces-config.xml文g中添加内容:
<managed-bean>
        <managed-bean-name>SayHello</managed-bean-name>
        <managed-bean-class>
            org.bromon.jsf.model.hello.SayHello
        </managed-bean-class>
        <managed-bean-scope>request</managed-bean-scope>
    </managed-bean>
    <managed-bean>
        <managed-bean-name>HelloDelegater</managed-bean-name>
        <managed-bean-class>
            org.bromon.jsf.control.hello.HelloDelegater
        </managed-bean-class>
        <managed-bean-scope>request</managed-bean-scope>
        <managed-property>
            <property-name>sayHello</property-name>
            <value>#{SayHello}</value>
        </managed-property>
    </managed-bean>

    在后一个bean中,它的sayHello属性被指定要在q行时注入一个org.bromon.jsf.model.hello.SayHello的实例?BR>
下面要编写表C层的页面,只有一个index.jspQ?BR>需要引入两个标{ֺQ?BR>
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %>
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %>
下面是构造jsf标签Q?BR>
<body>
    <f:view>
        <h:form>
            <h:panelGrid columns="3">
                <h:outputLabel for="name" value="姓名:"/>
                <h:inputText id="name" value="#{HelloDelegater.name}" required="true"/>
                <h:message for="name"/>
                
                <h:outputLabel value="#{HelloDelegater.result}"/>
            </h:panelGrid>
            <h:panelGroup>
                <h:commandButton action="#{HelloDelegater.say}" value="提交"/>
            </h:panelGroup>
        </h:form>
    </f:view>
  </body>

面中包含了一个文本框和一个labelQ他们分别被l定CHelloDelegatercȝ两个属性上Q具体的l定工作有系l通过{控制的方式调用对应的set/get方式实现。提交按钮被l定CHelloDelegater.sayҎQ该Ҏ会把计算l果赋给result属性,它会在页面中昄出来?BR>
因ؓ我们在url pattern中选择?.faces,所以我们应该访问如下地址来查看程?
http://localhost:8080/hello/index.faces
相应?如果你选择?faces/*,那么应该是:
http://localhost:8080/hello/faces/index.jsp

E序执行l果如下Q?BR>

 

    下一文章中Q将介绍一个更加复杂的用户理E序Q可以更清楚的看到jsf的特征,q会涉及到jsf的model对象一些组件的使用?


不老的传说 2006-02-14 13:46 发表评论
]]>
վ֩ģ壺 Դ| | | | | ޳| üɽ| ɽ| Ʊ| | | ̫| п| Ͼ| | | | | | | | | | | Ͳ| | | | | | | ˳| | | | | ʡ| ϲ| | Ӣ| |