??xml version="1.0" encoding="utf-8" standalone="yes"?>**网站欧美大片在线观看,成人av在线一区二区,精品成人自拍视频http://www.aygfsteel.com/hszdz/category/5297.htmlzh-cnWed, 28 Feb 2007 18:25:56 GMTWed, 28 Feb 2007 18:25:56 GMT60 实验: 使用 Apache 反向代理实现负蝲均衡及热?/title><link>http://www.aygfsteel.com/hszdz/articles/74376.html</link><dc:creator>爪哇之家</dc:creator><author>爪哇之家</author><pubDate>Tue, 10 Oct 2006 12:59:00 GMT</pubDate><guid>http://www.aygfsteel.com/hszdz/articles/74376.html</guid><description><![CDATA[ <h3>初步设想</h3> <ul> <li>早些时候在 JavaEye 上看到过一些?lighttpd 或?apache 作前? 通过负蝲均衡, 实现高性能?Web pȝ的讨? 于是留意了一下这斚w的技?</li> <li>考虑到对不同?App Server 而言, 实现 Session 复制的配|各不相?通常是需要配|集?, 因此从通用的角? 觉得使用 session sticky 方式实现的负载均衡比较方?</li> <li>׃没有看到有资料说 lighttpd 能够实现 session sticky, 所以决定先使用 Apache 试试.</li> </ul> 参考资? <ul><li>JavaEye 上的一短? <a >hapache跟tomcat做集session不同步问?/a></li><li>Apache 2.2 HTTP Server 文档中的 mod_proxy 部分: <a >英文</a>, <a >中文译</a></li></ul><h3>环境准备</h3><ul><li>下蝲安装 Apache, 试时用的?XAMPP ( <a style="border-bottom-width: 1px; border-bottom-style: dotted;" class="externallink" >http://www.apachefriends.org/en/xampp.html</a> ) ?Linux 版本 (xampp-linux-1.5.4.tar.gz), 按照安装说明, 解压?/opt/lampp 目录下就可以使用? <ul><li>启动 Apache: <code>sudo /opt/lampp/lampp startapache</code></li><li>重新加蝲 Apache: <code>sudo /opt/lampp/lampp reloadapache</code> (?httpd.conf 文g被修改后可以不重? 而是直接 reload 可以了)</li><li>停止服务: <code>sudo /opt/lampp/lampp stop</code></li></ul></li><li>准备两个q行同样E序?Web 服务? q里使用的是 Tomcat 5.5, q用一?jsp 文g作ؓ试文g(相关源代码参见文章最后的附g); <ul><li>q两?Tomcat 服务器需要将 HTTP 服务配置在不同的端口? 同时׃试时运行在同一台机器上, 其它端口也需要避免冲H?</li></ul></li><li>下蝲安装 JMeter ( jakarta-jmeter-2.2), 用于压力试, 验证负蝲均衡的效? </li></ul><h3>试 jsp 文g的说?/h3> 试用的 jsp 文g (test.jsp) h如下功能: <ul><li>昄当前q行的服务器?IP 地址及端口号, q样从返回的面p够知道是q行在哪一?Web 服务器上的了;</li><li>l计每个客户?不同?session)向同一台服务器发出h的次? 通过q个计数可以验证是否实现?session sticky;</li><li>通过 clear h参数(?.../test.jsp?clear=1)清除hơ数的计数结? 以便q行下一ơ测?</li><li>模拟 JSESSIONID +jvmRoute 的机? 自行实现了一?STICK_PORT_TOKEN ?Cookie, 直接使用不同服务器的 HTTP 端口号作?route; <ul><li><strong>说明1</strong>: 考虑到方案的通用? q里没有直接使用 JSESSIONID +jvmRoute 的机?</li><li><strong>说明2</strong>: 虽然作ؓ一个例? 相关代码是写d jsp 文g中的, 但是q个机制可以很方便的用一?Filter l一实现;</li></ul></li></ul><h3>Apache 的配|?/h3> ~辑 Apache ?httpd.conf 文g(如果使用 xampp-linux 的话, 应该?/opt/lampp/etc 目录?, 在文件的最后加上如下内?<br /><pre>###############################################################################<br /># Reverse Proxy and Load Balance ##############################################<br />###############################################################################<br /># 1)单的反向代理<br />ProxyRequests Off<br /><Proxy *><br /> Order deny,allow<br /> Allow from all<br /></Proxy><br />ProxyPass /1 http://localhost:8080/test<br />#ProxyPassReverse /1 http://localhost:8080/test<br />ProxyPass /2 http://localhost:18080/test<br />#ProxyPassReverse /2 http://localhost:18080/test<br /># 2)?stickysession ?balance<br />ProxyPass /3 balancer://non-sticky-cluster nofailover=On<br /><Proxy balancer://non-sticky-cluster><br /> BalancerMember http://localhost:8080/test<br /> BalancerMember http://localhost:18080/test smax=10<br /></Proxy><br /># 3)stickysession ?balance<br />ProxyPass /4 balancer://sticky-cluster stickysession=STICK_PORT_TOKEN nofailover=On<br /><Proxy balancer://sticky-cluster><br /> BalancerMember http://localhost:8080/test route=8080<br /> BalancerMember http://localhost:18080/test route=18080 loadfactor=2<br /></Proxy></pre> q个配置分ؓ3个部? 包括?1)单的反向代理, 2)?session sticky ?load balance, 以及 3)session sticky ?load balance 三种方式的配|?q里假设两个 Tomcat 服务器的 HTTP 服务被配|在 8080 ?18080 端口), 其中W?2) ?3) 的配|中 "nofailover=On" 适合于没?session 复制的情况下, q种情况? 如果其中一?HTTP 服务器出? 那么原来分配在这个出错机器上的浏览器客户端不会被自动转移到另外的服务器上, 必须重新启动览器才能将h分配到另外一台服务器上去.<br /><br /><h3>使用 JMeter 试l果</h3> 使用 JMeter ?"3)session sticky ?load balance" 的效果进行测? 通过压力试的方? 查两?Tomcat 服务器被分配到的h数量, 相关的测试脚本参见文章最后的附g.<br /><br /> 注意如果重复试, 在下一ơ测试开始之前请Ҏ?Tomcat 服务器执?.../test.jsp?clear=1 的请? 清除上一ơ的计数l果.<br /><br /> 从下囄试l果可见: 50个线E中?1个被分配?8080 端口的服务器? 29个则被分配到 18080 端口的服务器; 另外, 所有的 session hơ数都是 20 ? 说明 session sticky 辑ֈ了预期的效果.<img src ="http://www.aygfsteel.com/hszdz/aggbug/74376.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/hszdz/" target="_blank">爪哇之家</a> 2006-10-10 20:59 <a href="http://www.aygfsteel.com/hszdz/articles/74376.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何使用Log4jQ?/title><link>http://www.aygfsteel.com/hszdz/articles/64544.html</link><dc:creator>爪哇之家</dc:creator><author>爪哇之家</author><pubDate>Sat, 19 Aug 2006 12:23:00 GMT</pubDate><guid>http://www.aygfsteel.com/hszdz/articles/64544.html</guid><description><![CDATA[ <font size="2"> <strong>1?Log4j是什么?<br /></strong>  Log4j可以帮助调试Q有时候debug是发挥不了作 用的Q和分析Q要下蝲和了解更详细的内容,q是讉K其官方网站吧Q?/font> <a > <font size="2">http://jakarta.apache.org/log4j</font> </a> <font size="2">?br /><br /><strong>2、Log4j的概?/strong><br />  <!--StartFragment --> Log4j中有三个主要的组Ӟ它们分别?/font> <font size="2">Logger、Appender和LayoutQL<!--StartFragment -->og4j 允许开发h员定义多个LoggerQ每个Logger拥有自己的名字,Logger之间通过名字来表明隶属关pR有一个LoggerUCؓRootQ它永远 存在Q且不能通过名字索或引用Q可以通过Logger.getRootLogger()Ҏ获得Q其它Logger通过 Logger.getLogger(String name)Ҏ?br />   Appender则是用来指明所有的log信息存放C么地方,Log4j中支持多UappenderQ如<!--StartFragment --></font> <font size="3"> </font> <font size="2">console、files、GUI components、NT Event Loggers{,一个Logger可以拥有多个AppenderQ也是你既可以Log信息输出到屏q,同时存储C个文件中?br />   Layout的作用是控制Log信息的输出方式,也就是格式化输出的信息?br />   Log4j中将要输出的Log信息定义?U别,依次为DEBUG、INFO、WARN、ERROR和FATALQ当输出Ӟ只有U别高过配置中规定的 U别的信息才能真正的输出Q这样就很方便的来配|不同情况下要输出的内容Q而不需要更改代码,q点实在是方便啊?br /><br /><strong>3、Log4j的配|文?/strong><br />  虽然可以不用配置文gQ而在E序中实现配|,但这U方法在如今的系l开发中昄是不可取的,能采用配|文件的地方一定一定要用配|文件。Log4j支持? U格式的配置文gQXML格式和Java的property格式Q本人更喜欢后者,首先看一个简单的例子吧,如下Q?br /><br /></font> <font color="#614db3"> <font size="2">  log4j.rootLogger=debug, <strong>stdout, R</strong><br />  log4j.appender.<strong>stdout</strong>=org.apache.log4j.ConsoleAppender<br />  log4j.appender.stdout.layout=org.apache.log4j.PatternLayout<br /><br />  # Pattern to output the caller's file name and line number.<br />  log4j.appender.stdout.layout.ConversionPattern=%5p [%t] <strong>(%F:%L)</strong> - %m%n<br /><br />  log4j.appender.<strong>R</strong>=org.apache.log4j.RollingFileAppender<br />  log4j.appender.R.File=example.log<br />  log4j.appender.R.MaxFileSize=</font> <font size="2"> <strong>100KB<br /></strong> <br />  # Keep one backup file<br />  log4j.appender.R.MaxBackupIndex=1<br /><br />  log4j.appender.R.layout=org.apache.log4j.PatternLayout<br />  log4j.appender.R.layout.ConversionPattern=%p %t %c - %m%n         <br /><br /></font> <font color="#000000"> <font size="2">  首先Q是讄rootQ格式ؓ<!--StartFragment --> log4j.rootLogger=[level],appenderName, ...Q其中level是讄需要输Z息的U别Q后面是appender的输出的目的圎ͼ<!--StartFragment -->appenderName是指定日志信息输出到哪个地斏V您可以同时指定多个输出目的地?/font> <font size="2">配置日志信息输出目的地AppenderQ其语法?br /></font> <font size="2">  log4j.appender.appenderName = fully.qualified.name.of.appender.class<br />  log4j.appender.appenderName.option1 = value1<br />  ...<br />  log4j.appender.appenderName.option = valueN</font> <br /> <font size="2">Log4j提供的appender有以下几U:<br />  org.apache.log4j.ConsoleAppenderQ控制台Q?br />  org.apache.log4j.FileAppenderQ文Ӟ<br />  org.apache.log4j.DailyRollingFileAppenderQ每天生一个日志文Ӟ<br />  org.apache.log4j.RollingFileAppenderQ文件大到达指定尺寸的时候生新文gQ?br />  org.apache.log4j.WriterAppenderQ将日志信息以流格式发送到L指定的地方)<br /></font> </font> </font> <font color="#614db3"> <font color="#000000"> <font size="2">配置日志信息的格式(布局Q,其语法ؓQ?br /></font> <font size="2">  log4j.appender.appenderName.layout = fully.qualified.name.of.layout.class<br />  log4j.appender.appenderName.layout.option1 = value1<br />  ....<br />  log4j.appender.appenderName.layout.option = valueN</font> <br /> <font size="2">Log4j提供的layout有以下几U:<br />  org.apache.log4j.HTMLLayoutQ以HTML表格形式布局Q,<br />  org.apache.log4j.PatternLayoutQ可以灵zd指定布局模式Q,<br />  org.apache.log4j.SimpleLayoutQ包含日志信息的U别和信息字W串Q,<br />  org.apache.log4j.TTCCLayoutQ包含日志生的旉、线E、类别等{信息) <br /><br /></font> </font> </font> <font color="#000000"> <span style="font-size: 10.5pt;"> <font size="2"> <span lang="EN-US">Log4J采用cMC语言中的printf函数的打印格式格式化日志信息Q打印参数如下: %m 输出代码中指定的消息<o:p></o:p></span> </font> </span> </font> <p> <font color="#000000"> <span style="font-size: 10.5pt;"> <font size="2">  </font> <span lang="EN-US"> <font size="2">%p 输出优先U,即DEBUGQINFOQWARNQERRORQFATAL <br />  %r 输出自应用启动到输出该log信息耗费的毫U数 <br />  %c 输出所属的cȝQ通常是所在类的全?<br />  %t 输出产生该日志事件的U程?<br />  %n 输出一个回车换行符QWindowsq_为“\r\n”,Unixq_为“\n?<br />  %d 输出日志旉点的日期或时_默认格式为ISO8601Q也可以在其后指定格式,比如Q?d{yyy MMM dd HH:mm:ss,SSS}Q输出类|</font> </span> </span> <st1:chsdate isrocdate="False" islunardate="False" day="18" month="10" year="2002"> <span style="font-size: 10.5pt;" lang="EN-US"> <font size="2">2002q?0?8?/font> </span> </st1:chsdate> <span style="font-size: 10.5pt;" lang="EN-US"> <font size="2"> 22Q?0Q?8Q?21 <br />  %l 输出日志事g的发生位|,包括cȝ名、发生的U程Q以及在代码中的行数。D例:Testlog4.main(TestLog4.java:10)</font> </span> </font> </p> <br /> <font color="#614db3"> <font color="#000000"> <font size="2"> <br /> <strong>4、Log4j在程序中的?/strong> </font> </font> </font> <font color="#614db3"> <font color="#000000"> <br /> </font> <font color="#a0a0a0"> <font color="#090909" size="2">  要在自己的程序中使用Log4jQ首先需要将commons-logging.jar和logging-log4j-1.2.9.jar导入到构\? 中。然后再log4j.properties攑ֈsrc根目录下。这样就可以在程序中使用log4j了。在cM使用log4jQ?/font> </font> </font> <font color="#614db3"> <font color="#a0a0a0"> <font color="#090909" size="2">首先声明一个静态变?/font> </font> </font> <font color="#614db3"> <font color="#a0a0a0"> <font color="#090909" size="2">Logger logger=Logger.getLog("classname")Q现在就可以使用了,用法如下Qlogger.debug("debug message")或者logger.info("info message")Q看下面一个小例子Q?/font> </font> </font> <font color="#614db3"> <font color="#a0a0a0"> <br /> </font> <br /> <font size="2">  import com.foo.Bar;<br />  import org.apache.log4j.Logger;<br />  import org.apache.log4j.PropertyConfigurator;<br />  public class MyApp {<br />    static Logger logger = Logger.getLogger(MyApp.class.getName());<br />    public static void main(String[] args) {<br />      // BasicConfigurator replaced with PropertyConfigurator.<br />      PropertyConfigurator.configure(args[0]);<br />      logger.info("Entering application.");<br />      Bar bar = new Bar();<br />      bar.doIt();<br />      logger.info("Exiting application.");<br />    }<br />  }</font> </font> <img src ="http://www.aygfsteel.com/hszdz/aggbug/64544.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/hszdz/" target="_blank">爪哇之家</a> 2006-08-19 20:23 <a href="http://www.aygfsteel.com/hszdz/articles/64544.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>HTMLl构化:实践DIVQCSS|页布局入门指南(转蝲)http://www.aygfsteel.com/hszdz/articles/63433.html爪哇之家爪哇之家Mon, 14 Aug 2006 03:40:00 GMThttp://www.aygfsteel.com/hszdz/articles/63433.html

你正在学习CSS布局吗?是不是还不能完全掌握UCSS布局Q通常有两U情况阻你的学习:

W一U可能是你还没有理解CSS处理面的原理。在你考虑你的面整体表现效果前,你应当先考虑内容的语义和l构Q然后再针对语义、结构添加CSS。这文章将告诉你应该怎样把HTMLl构化?

另一U原因是你对那些非常熟悉的表现层属?例如Qcellpadding,、hspace、align="left"{等)束手无策Q不知道该{换成?应的什么CSS语句?当你解决了第一U问题,知道了如何结构化你的HTMLQ我再给Z个列表,详细列出原来的表现属性用什么CSS来代ѝ?

l构化HTML

我们在刚学习|页制作ӞL先考虑怎么设计Q考虑那些囄、字体、颜艌Ӏ以及布局Ҏ。然后我们用Photoshop或者Fireworksd来、切割成图。最后再通过~辑HTML所有设计还原表现在面上?

如果你希望你的HTML面用CSS布局(是CSS-friendly?Q你需要回头重来,先不考虑“外观”,要先思考你的页面内容的语义和结构?

外观q不是最重要的。一个结构良好的HTML面可以以Q何外观表现出来,CSS Zen Garden是一个典型的例子。CSS Zen Garden帮助我们最l认识到CSS的强大力量?

HTML不仅仅只在电脑屏q上阅读。你用photoshop_ֿ设计的画面可能不能显C在PDA、移动电话和屏幕阅读Z。但是一个结构良好的HTML面可以通过CSS的不同定义,昄在Q何地方,M|络讑֤上?

开始思?/strong>

首先要学习什么是"l构"Q一些作家也UC?语义"。这个术语的意思是你需要分析你的内容块Q以及每块内Ҏ务的目的Q然后再Ҏq些内容目的建立L应的HTMLl构?

如果你坐下来仔细分析和规划你的页面结构,你可能得到类DL几块Q?

标志和站点名U?

主页面内?

站点D(主菜?

子菜?

搜烦?

功能?例如购物车、收银台)

脚(版权和有x律声?

我们通常采用DIV元素来将q些l构定义出来Q类DP

Qdiv id="header"Q</divQ?

Qdiv id="content"Q</divQ?

Qdiv id="globalnav"Q</divQ?

Qdiv id="subnav"Q</divQ?

Qdiv id="search"Q</divQ?

Qdiv id="shop"Q</divQ?

Qdiv id="footer"Q</divQ?

q不是布局Q是l构。这是一个对内容块的语义说明。当你理解了你的l构Q就可以加对应的ID在DIV上。DIV容器中可以包含Q何内容块Q也可以嵌套另一个DIV。内容块可以包含L的HTML元素---标题、段落、图片、表根{列表等{?

Ҏ上面讲述的,你已l知道如何结构化HTMLQ现在你可以q行布局和样式定义了。每一个内容块都可以放在页面上M地方Q再指定q个块的颜色、字体、边框、背景以及对齐属性等{?

使用选择器是件美妙的?/strong>

id的名U是控制某一内容块的手段,通过l这个内容块套上DIVq加上唯一的id,你就可以用CSS选择器来_定义每一个页面元素的外观表现,包括?题、列表、图片、链接或者段落等{。例如你?header写一个CSS规则Q就可以完全不同?content里的囄规则?

另外一个例子是Q你可以通过不同规则来定义不同内容块里的链接样式。类DP#globalnav a:link或?#subnav a:link或?content a:link。你也可以定义不同内容块中相同元素的样式不一栗例如,通过#content p?footer p分别定义#content?footer中p的样式。从l构上讲Q你的页面是由图片、链接、列表、段落等l成的,q些元素本nq不会对昄在什么网l?讑֤?PDAq是手机或者网l电?有媄响,它们可以被定义ؓM的表现外观?

一个仔l结构化的HTML面非常单,每一个元素都被用于结构目的。当你想~进一个段落,不需要用blockquote标签Q只要用p标签Qƈ对p 加一个CSS的margin规则可以实现羃q目的。p是结构化标签Qmargin是表现属性,前者属于HTMLQ后者属于CSS?q就是结构于表现?相分?)

良好l构的HTML面内几乎没有表现属性的标签。代码非常干净z。例如,原先的代码<table width="80%" cellpadding="3" border="2" align="left"Q,现在可以只在HTML中写QtableQ,所有控制表现的东西都写到CSS中去Q在l构化的HTML中, table是表格Q而不是其他什?比如被用来布局和定??

亲自实践一下结构化

上面说的只是最基本的结构,实际应用中,你可以根据需要来调整内容块。常怼出现DIV嵌套的情况,你会看到"container"层中又有其它层,l构cMq样Q?

Qdiv id="navcontainer"Q?

Qdiv id="globalnav"Q?

QulQa listQ?ulQ?

Q?divQ?

Qdiv id="subnav"Q?

QulQanother listQ?ulQ?

Q?divQ?

Q?divQ?

嵌套的div元素允许你定义更多的CSS规则来控制表玎ͼ例如Q你可以l?navcontainer一个规则让列表居右Q再l?globalnav一个规则让列表居左Q而给#subnav的list另一个完全不同的表现?

用CSS替换传统Ҏ

下面的列表将帮助你用CSS替换传统ҎQ?

HTML属性以及相对应的CSSҎ

HTML属?

CSSҎ说明

align="left"

align="right" float: left;

float: right; 使用CSS可以动 M元素:囄、段落、div、标题、表根{列表等{?

当你使用float属性,必须l这个Q动元素定义一个宽度?

marginwidth="0" leftmargin="0" marginheight="0" topmargin="0" margin: 0; 使用CSS, margin可以讄在Q何元素上, 不仅仅是body元素.更重要的Q你可以分别指定元素的top, right, bottom和left的margin倹{?

vlink="#333399" alink="#000000" link="#3333FF" a:link #3ff;

a:visited: #339;

a:hover: #999;

a:active: #00f;

在HTML中,链接的颜色作为body的一个属性值定义。整个页面的链接风格都一栗用CSS的选择器,面不同部分的链接样式可以不一栗?

bgcolor="#FFFFFF" background-color: #fff; 在CSS中,M元素都可以定义背景颜Ԍ不仅仅局限于body和table元素?

bordercolor="#FFFFFF" border-color: #fff; M元素都可以设|边?boeder)Q你可以分别定义top, right, bottom和left

border="3"cellspacing="3" border-width: 3px; 用CSSQ你可以定义table的边框ؓl一样式Q也可以分别定义top, right, bottom and leftҎ的颜艌Ӏ尺寸和样式?

你可以?table, td or th q些选择?

如果你需要设|无Ҏ效果Q可以用CSS定义Q?border-collapse: collapse;

Qbr clear="left"Q?

Qbr clear="right"Q?

Qbr clear="all"Q?

clear: left;

clear: right;

clear: both;

许多2列或?列布局都?float属性来定位。如果你在Q动层中定义了背景颜色或者背景图片,你可以用clear属?

cellpadding="3"

vspace="3"

hspace="3" padding: 3px; 用CSSQQ何元素都可以讑֮padding属性,同样Qpadding可以分别讄top, right, bottom and left。padding是透明的?

align="center" text-align: center;

margin-right: auto; margin-left: auto;

Text-align 只适用于文?

象divQpq样的块U可以通过margin-right: auto; 和margin-left: auto;来水q_?

一些o人遗憄技巧和工作环境

׃览器对CSS支持的不完善Q我们有时候不得不采取一些技?hacks)或徏立一U环?Workarounds)来让CSS实现传统Ҏ同样的效 果。例如块U元素有时侯需要用水q_中的技巧,盒模型bug的技巧等{。所有这些技巧都在Molly Holzschlag的文章《Integrated Web Design: Strategies for Long-Term CSS Hack Management》中有详l说?/p>

爪哇之家 2006-08-14 11:40 发表评论
]]>
JSP 70?/title><link>http://www.aygfsteel.com/hszdz/articles/63426.html</link><dc:creator>爪哇之家</dc:creator><author>爪哇之家</author><pubDate>Mon, 14 Aug 2006 03:22:00 GMT</pubDate><guid>http://www.aygfsteel.com/hszdz/articles/63426.html</guid><description><![CDATA[ <div id="wmqeeuq" class="postbody">1. 问:在JAVA与JSP中要调用一个LINUX上的脚本E序,或WINDOWS上的脚本E序,该怎么写?<br />{:System.getRuntime().exec("bash < aaa.sh");<br /><br />2. 问:java中用什么表C双引号<br />{:"""<br /><br />3. 问:如何在JSPE序里另起一个线E?<br />{:<br />JSP本n是独立U程q行而不象CGI都是独立q程.<br />一?<br />Thread t = new Thread("你的对象");<br />t.start();可以了.<br />要求你这个对象要实现runnable接口或承thread.<br /><br />4. 问:jsp如何获得客户端的IP地址Q?br />{:<br />request.getRemoteAddr()<br />看看各个webserver的API文档说明Q一般都有自带的Qresin和tomcat都有<br /><br />5. 问:E序l止与输出终?br />{:<br />E序中止:return;<br />输出中止out.close();q一句相当于ASP的response.end<br /><br />6. 问:jsp中如何得C늚URLQ?br />{:request.getHeader("referer");<br /><br />7. 问:提交|页的网过期功能是怎么做的Q?br />{:response.setHader("Expires","0");<br /><br />8. 问:在JSP|页中如何知道自已打开的页面的名称<br />{:<br />request.getRequestURI() ;//文g?br />request.getRequestURL() ;//全部QRQ?br /><br />9. 问:提交表单后验证没有通过Q返回提交页面,如何使原提交面中的数据保留Q?br />{:javascript的go(-1)可以把上늚表单内容重新昄出来,但password域没?br /><br />10. 问:如何取得http的头信息Q?br />{:request.getHader(headerName);<br /><br />11. 问:&&?amp;的区别?<br />{:<br />&&是短路的与操作,也就是当C个条件是false的时候,W二个条件不用执?br />&相反Q两个条件L执行?br /><br />12. 问:?以正弦曲U的一个周期显C出?br />{:<br />public void paint(Graphics g)<br />{<br />for(int i=0;i<200;i++)<br />g.drawString("*",i,(int)(Math.sin(i)*20)+50);<br />}<br />}<br /><br />13. 问:点数相乘后l果不精如100.0 * 0.6 l果{于 60.0004<br />{:<br />q不叫错?float和double是这样实现的.如果要精计,java提供了一个strictfp,它的计算遵@IEEE 754标准.而普通的float和double?br /><br />由地q_点格式或硬件提供的额外_ֺ或表C围?br /><br />14. 问:如何获得当前用的cursors的位|?<br />{:<br />int row = rs.getRow()是当前指针行数,q有isFrist();isBeforeFist();isLast();isAfterLast();可以试是不是在Ҏ名所说的位置<br /><br />15. 问:表单成功提交了,点后退昄|页q期<br />{:<br />?lt;head></head>里面加以下代?br /><META HTTP-EQUIV="Pragma" CONTENT="no-cache"> <br /><META HTTP-EQUIV="Cache-Control" CONTENT="no-cache"> <br /><META HTTP-EQUIV="Expires" CONTENT="0"> <br />或者在表单中加上<br /><% <br />response.setHeader("Pragma","no-cache"); <br />response.setHeader("Cache-Control","no-cache"); <br />response.setDateHeader("Expires",0); <br />%><br /><br />16. 问:接口的简单理?br />{:接口Z规范,比如我在接口中定义了一个方?<br />getData()<br />q是用来从不同的数据库中取数据的,是JDBC的实现对于用?我不要知道每U数据库是如何做?但我知道如何它们要实现这个接口就一定有<br /><br />q个Ҏ可以供我调用.q样SUN把q个接口l各个数据库开发商,让他们自己实? 但ؓ什么不用承而用接口?因ؓl承只能从一个你c?br /><br />l承,而接口可以实现多?是说我实现的子cL多个规定好的接口中的功能. q只是简单的理解,{你深入理解抽象的时候就知道抽象到抽?br /><br />cLZ么还要再抽象到接?<br /><br />17. 问:怎样~写一个取消按钮(怎样q回上一个页面,象工h的后退按钮Q?<br />{:<br />javascript把每ơ浏览过的location都压C一个栈?q个栈就是history,然后你如果要回到W几个页面它做几次POP操作,把最后POP出来<br /><br />的那个LOCATIONl你. q就是JAVASCRIPT在实现history.go(-x)的原?<br /><br />18. 问:什么是回调Q?br />{:<br />单说,回调用不是让你去监听谁做完了什么事,而是谁做完了什么事报告给? q就是回调用的思想.例子太多?AWT的事?SWING事g模型<br /><br />都是q样? q有多线E中,如果要控制线E数,不能L查询每个U程是否l束,要在每个U程l束时让U程自己告诉ȝE我l束?你可?br /><br />开新的U程?<br /><br />19. 问:要介l一下compareToҎ<br />{:<br />compareToҎ是Comparable 接口必需实现的方?只要实现Comparable <br /><br />可以用Arrays.srot()排序p实现Runnable接口的runpThread()一?<br /><br />20. 问:如何可以从别的Web服务器检索页, 然后把检索到的网늚HTML代码储存在一个变量中q回q来<br />{:q是一个简单的WEB ROBOT实现,用URLcdC|页中抓内容,然后自己写一个分析程序从中找出新的URL,不断递归下去p?<br /><br />21. 问:applet中如何获得键盘的输入<br />{:application的System.in是当前系l的标准输入,applet因ؓ安全的原因不可能d当前pȝ(客户?的标准输?只能从它的ROOTlg?br /><br />事g?比如键盘事g中取得键?<br /><br />22. 问:怎样计算代码执行所p的时_<br />{:<br />代码开始取旉Q结束后取时_相减<br />long t1 = System.currentTimeMillis();<br />///////////////// your code<br />long t2 = System.currentTimeMillis() ;<br />long time = t2-t1;<br /><br />23. 问:如何获在E序中获得一个文件的ContentTypeQ?br />{:<br />URL u = new URL("file:///aaa.txt");<br />URLConnection uc = u.openConnection();<br />String s = uc.getContentType();<br /><br />24. 问:q接池的使用是徏立很多连接池Q还是一个连接池里用多个q接Q?br />{:<br />只有在对象源不同的情况下才会发生多个池化,如果你只q一l一个数据源,永远不要用多个连l池. 所以连l池的初始化一定要做成静态的,?br /><br />且应该在构造对象之?也就是只有在cLOAD的时?别的时候不应该有Q何生成新的连l池的时候?br /><br />25. 问:JavaMail要怎么安装Q?br />{:下蝲两个包,一个是javamail包,另一个是jaf包。下载完直接把这两个包不解压加到CLASSPATH?br /><br />26. 问:怎样把地址栏里的地址锁定Q?br />{:把你的服务器的可讉K目录索引选项关闭p?M服务器都有一个conf文g,里面都有q个选项?br /><br />27. 问:在JAVA中怎么取得环境变量啊。比如: TEMP = CQTEMP Q?br />{:String sss = System.getProperty(key)<br /><br />28. 问:怎样实现四舍五入Q保留小数点后两位小敎ͼ<br />{:<br />import java.text.*;<br />...<br />NumberFormat nf=NumberFormat.getNumberInstance();<br />nf.setMaximumFractionDigits(2);<br />nf.setMinimumFractionDigits(2);<br />nf.format(numb);<br /><br />29. 问:Applet和form如何通信Q?br />{:<br />取得的参C到param里面<br /><% <br />String xxx = request.getParameter("xxx"); <br />%> <br /><applet> <br /><param value="<%=xxx%>"> <br /></applet><br /><br /><br />30. 问:java-plug-in是什么?<br />{:Java Runtime Environment的插件。用来运行javaE序。不需要什么特别的讄。等于你的机器里面有了jvm?br /><br />31. 问:WEB上面怎么栯接上一个EXCEL表格Q?br />{:<br />定义面得contentType="application/vnd.ms-excel"Q让面以excel得Ş式打开。同样也可以以word得Ş式打开Qapplication/msword?br /><br />32. 问:怎样才能避免textarea字数限制Q?br />{:是用了FORM的默认方法的~故,如果什么也不写默认是GET改用Post卛_Q在Form中定义mothod="post"?br /><br />33. 问:Z么加?lt;%@page contentType="text/html;charset=gb2312" %>插入数据库的中文Q依然是qQ?br />{:<br />q要从环境看,能显C明你的JSP引擎没有问题,但写入数据库时你的JDBC能不能处理中?同一公司不同版本的JDBC都有支持中文和不支持?br /><br />文的情况,RESIN自带的MYSQL JDBC׃支持,MM的就支持,q有你的数据库类型是否支持中?CHAR的一般支?但是否用binary存储双字节码<br /><br />34. 问:对于JFrameQhide()Qshow()与setVisibel()有什么区别吗Q?br />{:<br />setVisible()从Componentl承q来Q而hide(),show()从Window里面l承q来?br />Makes the Window visible. If the Window and/or its owner are not yet displa yable, both are made displayable. The Window will <br /><br />be validated prior to being made visible. If t he Window is already visible, this will bring the Window to the front. 区别?br /><br />q?br />36. 问:sendRedirectZ么不可以转到mms协议的地址的?response.sendRedirect("mms://missiah.adsldns.org:9394");<br />{:javaq_目前实现的protocol中ƈ没有mms,你可以取pȝ属性java.protocol.handler.pkgs看看它的g有没有mms,所以如果要想重定向<br /><br />到mms://hostq样和URL,只有生成客户端的JAVASCRIPT让它来重定向<br /><br />37. 问:JTable中怎样定义各个Columns和Width和怎样讄表格的内定w做靠x居中Q?br />{:<br />TableColumn tc = table.getColumn("Name");//取得列名?Name"的列Handle<br />int currentWidth = tc.getPreferredWidth(); //取得该列当前的宽?br />tc.setPreferredWidth(200); //讄当前列宽<br />tc.setMaxWidth(200); //讄该列最大宽?br />tc.setMinWidth(50); //讄该列最宽?br /><br />38. 问:Ҏ作是否可用于select语句Q?br />{:Ҏ作其实是指成批理更新的操?l对不可能用于select操作?br /><br />39. 问:Z么jsp路径太深文g名太长就无法d文gQ?br />{:path不能过255长度,不然找不到?q是作业pȝ的事?br /><br />40. 问:如何让页面不保留~存Q?br />{:<br /><% <br />response.setHeader("Pragma","No-cache"); <br />response.setHeader("Cache-Control","no-cache"); <br />response.setDateHeader("Expires", 0); <br />%><br /><br />41. 问:我的applet code 中用到jbutton 时就出错是否׃ie不支持swing package 请问应怎么办?<br />{:JBUTTON是SWING基本包啊,只要把jdk/jre/lib/rt.jar攑֜classpathp?不要加蝲M别的库?br /><br />42. 问:不知道java是否支持midi格式Q如果支持,应该怎么把wave格式转换成midi格式Q?br />{:目前q不?可以看一下JMF三个版中对MIDI的格式支持是read only,而WAVE是read/write,MIDI只能播放,不能生成?br /><br />43. 问:在jsp里面防止用户直接输入urlq去面Q应该怎么做呢Q?br />{:<br />一是从web服务器控?Ҏ一目录的所有访问要通过验证.<br />二是在要讉K的页面中加入控制.q个一般用session,也可以用h状态码实现<br /><br />44. 问:<br />例如后台有一计算应用E序Q此E序q算h很慢Q可持箋几分钟到几小Ӟq不,主要是能ȀzdQ,客户d提交后,服务器对?br /><br />务进行检无误后向服务器后台程序发送信息,q将其激zR要求如下:<br />1Q首先将后台E序Ȁz,让它执行此Q务(比如Q前台将计算的C代码提交上后Q后台程序程序能马上调用Qƈ其q行Q?br />2Q要在前台JSP面中显C行过E信息(׃q行旉长,希望让客L到运行过E中产生的信息)如何完成Q?br /><br />{:<br />zL可以?q行一个shell让它去运行后台就?但不可能取出q行信息,因ؓHTTP的超旉制不可能永远{你后台q行?而且信息如果要动?br /><br />实时推出来就得用SERVER PUSH技术?br /><br />45. 问:数据库是datetime ?Q插入当前时间到数据库?<br />{:<br />java.sql.Date sqlDate = new java.sql.Date();<br />PreparedStatement pstmt = conn.prepareStatement("insert into foo(time) values(?)");<br />pstmt.setDate(1,sqlDate);<br />pstmt.executeUpdate();<br /><br />46. 问:怎样L字符串前后的I格?br />{:String.trim()<br /><br />47. 问:session怎样存取intcd的变量?<br />{:<br />session.setAttribute("int", i+"");<br />int i = Integer.parseInt(session.getAttribute("int"));<br /><br />48. 问:在javascript中如何输出的floatcd的数据保留两位小数?br />{:Math.round(aaaaa*100)/100?br /><br />49. 问:在beanU如何调用session<br />{:<br />你可把session对象作ؓ一个参Clbean<br />在BEAN中定义HttpServletRequest request;HttpSession session;<br />然后<br />session = request.getSession(false);<br />false为如果session为空,不徏立新的session<br />session作ؓ参数传入.其实只要request传入可?br /><br />50. 问:如何把txt或word文g按原格式昄在jsp面或servlet上?<br />{:<br />其实一个非常简单的解决Ҏ是在服务器的MIME中指点定TEXT和WORD的解释方?然后用JSP或SERVLET生成它就行了,客户端就会自动调用相<br /><br />应程序打开你的文档?br />如果是希望按原格式的昄在页面上Q而不是调用其他程序打开那么你可以试试用WEBDEV协议,可以说这是MS的一个亮?它是在WEB方式下打开<br /><br />文档,和共享一?完全W合的要求?br /><br />51. 问:object的cloneҎZ么不能直接调用?<br />{:<br />q个Ҏ在object中是protected<br />Z么要把这个方法定义ؓprotected,q是一个折?它的目的是想知道你这个方法在Object里只是一个标?而不是一个实?比如<br /><br />public class Object<br />{<br />.............<br />protected Object clone()<br />{}<br />}<br /><br />所以直接承的clone()Ҏq不能做M?你要使用q个Ҏp重蝲q个Ҏq放宽访问权限ؓpublic,或实现cloneable接口. 但它没法<br /><br />q样告诉你它没有真的实现,只好用protected Ҏ加以警示<br /><br />52. 问:一个页面中如何h另外一个页面?<br />{:<br />要求是这些面必L兌,一是它们都有一个共同的层?也就是说是一个内的分面,当然可以是Q意,帧内再分帧也可以,另一个可<br /><br />能是当前H口弹出的窗?如果没有联系,那就不可能用一个页面刷新另一个页? 帧内只要一U一U引用就行了. <br /><br />比如在左帧中一个页面中写top.right.location.reload();那么名ؓright的右帧中的页面就会刷? 弹出的一?用open时的名称h子窗?<br /><br />子窗口用openerhȝ?br /><br />53. 问:如何在jsp中怎么样向客户端写cookiesQ?br />{:<br />Cookie coo = new Cookie(name, value);<br />HttpServletResponse.addCookie(name);<br /><br />54. 问:Z么jTextField1.setText("aaabbb");jTextField2.setText("AAABBB"); 得到的字体宽度不一P<br />{:是说如果不是指定ؓ{宽字体,每个字体的宽度都是不一L.因此JAVA中用FontMetrics cL取字W宽度?br /><br />55. 问:String kk=application/octet-stream; name="G:/SMBCrack.exe";如何得到SMBCrack.exeQ?br />{:<br />q应该是解析上传时候的二进制流得到的这一行里面格式是固定的,取到name="后面的字W串Q然后把";L。然后取最后一?后面的所有字<br /><br />W组成一个新字符串就行了?br /><br />56. 问:如何传值ƈ不刷新页面?<br />{:<br />弹出一个页面进行值的选择或者输入,ok后用将gl原H口Q用javascript关闭打开的窗口即可:<br />window.close();opener.focus();<br /><br />57. 问:有一个字W串Q?EF0C114EA4"Q如何变为a[0] = 0xEF a[1] = 0x0C a[2] = 0x11 a[3] = 0x4E a[4] = 0xA4Q?br />{:<br />String str="EF0C114EA4F";<br />out.print(str+"<br>");<br />int l=str.length()/2+str.length()%2,j=0,k=0;<br />String[] a=new String[l];<br />for(int i=0;i<l;i++){<br />if(str.length()-j==1)<br />k=str.length();<br />else<br />k=j+2;<br />a="0x"+str.substring(j,k);<br />out.print("a["+Integer.toString(i)+"]="+a+"<br>");<br />j+=2;<br />}<br /><br />58. 问:怎样一个int转换成一个四字节的byte数组Q?br />{:<br />int x = 1234567;<br />byte[] b = new byte[4];<br />for(int i=0;i<b.length;i++)<br />{<br />b = (x >>( i*8)) & 0xFF;<br />}<br /><br />59. 问:indexOf()的用需要注意什么?<br />{:参数是指从第几位Q?Q?Q?Q?..Q开始搜索,而返回值是指搜索到的位|(0Q?Q?Q?.......Q注意是从零v的?br /><br />60. 问:在Java应用E序中如何动态的d一个按钮?<br />{:<br />q里涉及一个组仉l的问题,lg要先于panel被显CZ处存?如果一panel已经昄?那么加在上面你能看到?但如果在同一个panel? <br /><br />先有button A,假如按下它加了butt on B,q时你如果整个panel重给,那么A本n要重l?它的事g监听没有了,当然也就加不成B?所以如<br /><br />果要先有另一个panel,当按A时把B加在q个panel上ƈ重绘q个paenl,其实更好的方法是先把B加在panel?同一个也?把它setVisiable(flas<br /><br />e),按A时设?true?br /><br />61. 问:book mybook=new book(bookid);book是servlet,出错?br />{:<br />book是servlet,能book mybook=new book(bookid);<br />说明自己实现了servlet容器?不然,servlet能让你自己去调用? servlet如果调用其实和EJBq?%的区别都没有,它们都是自己l承或实C些接<br /><br />?在这些父cL接口中实C如果和容?打交?的方?然后容器调用q些Ҏ来管理它,让它生成实例,池化,钝化,销?再生{?所以这?br /><br />写是错误的?br /><br />62. 问:l定一个字W串5*(5+9)/7怎样计算出结果?<br />{:<br />可有两种Ҏ<br />1。用堆栈完成<br />2。最单的ҎQ不用编E,如果有Q何一个数据库的化Q用select (5*(5+9)/7) from oneTable<br /><br />63. 问:如何实现递交表单内容的加密解密?<br />{:<br />如果你用IE目前只能用SSL协议,q一层不要你考虑,否则只你用你自己的工具加密传?接收后再解密?至于如何加解,如果要和公认的系l结<br /><br />?q通用的MD5,RAS{公开法,如果你只是自׃自己?你随便按你的x把数据加上一些东?取回来按规则减掉q些东西,我敢保证?br /><br />你自己没有Q何h能知道解密方?<br /><br />64. 问:Z么Integer.parseInt("+1");会抛出NumberFormatException的异常?<br />{:因ؓ"+"q行在JAVA中被重蝲.pȝ无法定你用的是术加还是字W??br />q一点可以在JAVASCRIPT中更好地理解:<br /><form name="t"><input name=s value=1234></form><br />var a = document.t.s.value+1;<br />q时a = 12345,因ؓdocument.t.s.value作ؓ字符?但var a = document.t.s.value-1;<br />a 是1233,因ؓpȝ知道-q算肯定是算术运?所以把document.t.s.value转换成数?<br /><br /><br />65. 问:hashCode() 有什么用Z么有时候需要覆盖Object里的hashcode()ҎQ?br />{:q就是这个对象的w䆾证啊,要不如何区分哪个对象?br /><br />66. 问:怎样在tomcat中实C个定时执行的东东Q?br />{:<br />在应用程序启动时自动q行。servlet2.3中定义了ServletListener,监听Servlet Con text的启动或则关闭(可在配置文g中配|)Q启动时<br /><br />触发一个守护程序的q行(可以实现java.util.Timer或则 javax.swing.Timer).<br /><br />67. 问:E序可以输出自己吗?<br />{:孔d悖论q个非常有名的法?是说Q何程序都不可能输?<br /><br />68. 问:能够把字W{化成ASCII码?比如?A 转化?65Q?br />{:<br />int a='A';<br />out.println(a);<br /><br />69. 问:如何区分输入的文字中的全角与半角Q?br />{:׃不能分L出全角和半角字符的值有什么规?只好把全角符L丑և来了.<br /><br />70. 问:用户注册后的自动发信E序该怎么做?<br />{:<br />q种发信E序不考虑性能,因ؓ不可?U就有一个h注册,我们说的考虑性能的发信程序是指上百万信在队列里要不停发送的那种,象你q个<br /><br />随便怎么写一个程序都?没有必要用JAVAMAIL.只要指定一个发信的服务器然后用cocketq它?5口就行了.自己用SOCKETqSMTP?5口发一?br /><br />信就好象两个d之间送一样东?直接递过d?用JAVAMAIL,消息机制是你把q个东西从邮局寄给你的d? </div> <img src ="http://www.aygfsteel.com/hszdz/aggbug/63426.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/hszdz/" target="_blank">爪哇之家</a> 2006-08-14 11:22 <a href="http://www.aygfsteel.com/hszdz/articles/63426.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>利用JSF、SpringFramework和Hibernate构徏Web应用的实例讲q?/title><link>http://www.aygfsteel.com/hszdz/articles/21507.html</link><dc:creator>爪哇之家</dc:creator><author>爪哇之家</author><pubDate>Sat, 26 Nov 2005 07:09:00 GMT</pubDate><guid>http://www.aygfsteel.com/hszdz/articles/21507.html</guid><wfw:comment>http://www.aygfsteel.com/hszdz/comments/21507.html</wfw:comment><comments>http://www.aygfsteel.com/hszdz/articles/21507.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/hszdz/comments/commentRss/21507.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/hszdz/services/trackbacks/21507.html</trackback:ping><description><![CDATA[<font face="verdana, arial, helvetica" size="2">[原作者]</font><font face="verdana, arial, helvetica" size="2"><strong> Derek Yang Shen<br></strong>[原文链接] <a >http://www.javaworld.com/javaworld/jw-07-2004/jw-0719-jsf.html</a><br>[源码链接] <a >http://www.javaworld.com/javaworld/jw-07-2004/jsf/jw-0719-jsf.zip</a><br>[译] 本h<br>[点评] 该文是我看的W一讲qJSF与Spring整合的文章,是一个很好的范例Q比较适合于对Spring有了一定了解h学习。其中大量篇q讲q的JSFQ对JSF感兴的也可以来看看?br>[声明] 该文是本人第一ơ翻译大块头的文章,׃本h才疏学浅、英语较烂,但考虑到和我一样不喜欢看洋文的大有人在Q遂用近4时的时间翻译该文,对一些技术名词和不会译的地方用原文代替Q其中难免有很多错误Q欢q批评指正?br><br>[译文]<br><br>JSF 是一U新的用于构架j2ee应用用户界面的技术,它尤光合于基于MVC架构的应用中。虽已有很多文章介绍q了JSFQ然而它们大多从理论高度来介l? JSF而不是面向于实际应用。目前对于实际应用,JSF仍有很多问题没有解决Q例如:如何使JSF适应于MVC整体构架中?如何JSF与其他Java 框架整合hQ是否应该将业务逻辑攄在JSF的backing beans中?如何处理JSF中的安全机制Q更为重要的是如何利用JSF构架现实世界的Web应用Q?br><br>本文涉及到上面的这些问题,它将演示如何JSF、Spring和Hibernate整合在一P构架Z个名为JCatalog?/font><font face="verdana, arial, helvetica" size="2">在线产品Lpȝ</font><font face="verdana, arial, helvetica" size="2">。利用该DemoQ本文涵盖了Web应用开发的每一个阶D,包括需求收集、分析,技术选择Q系l架构和实现。本文讨Z在JCatalog中涉及到的各U技术的优点和缺点ƈ展示了一些关键部分的设计Ҏ?br><br>本文的对象是从事ZJ2ee的Web应用架构人员和开发h员,它ƈ不是对JSF、SpringFramework和Hibernate的简单介l,如果对这些领域不甚了解,请参看相兌源?br><br><font size="5"><b>该范例的功能需?/b></font><br>JCatalog是一个现实世界的Web应用Q我首先描述JCatalog的需求,在通篇的技术决{和架构设计旉涉及到本部分?br><br>? 设计Web应用的第一阶段是收集系l的功能需求,范例应用是一个典型的电子商务应用pȝQ用户可以浏览品的catalogq查看品的详细情况Q而管? 员可以管理品的catalog。通过增加一些其他功能,如inventory理和订单处理等Q该应用可成Z个成熟的电子商务pȝ?br><br><b><font size="3">Use cases</font></b><br>Use-case分析被用来展C例应用的功能需求,?是该应用的use-case图?br>     <p align="center"><a ><img style="width: 324px; height: 196px;" alt="" src="http://www.huihoo.com/java/jsf/jw-0719-jsf1.gif" align="bottom" border="0" height="127" hspace="0" width="228"></a></p><br>use -case囄于表C系l中的actors以及可能q行的operationsQ在该应用中有七个use-caseQ用戯够浏览? catalog和查看品的详细情况Q一旦用L录到pȝ中,她将成ؓ理员,从而可以创建新的品,~辑已存在的产品或者删除老的产品{?br><br><b><font size="3">Business rules</font></b><br>JCatalog必须W合以下business rules:</font> <ul> <li><font face="verdana, arial, helvetica" size="2">每个产品必须h唯一的ID</font> </li><li><font size="2">每个产品必须属于臛_一个category</font><font face="verdana, arial, helvetica" size="2"> <br></font> </li><li><font face="verdana, arial, helvetica" size="2">产品ID一旦创立不得修?/font></li> </ul> <font face="verdana, arial, helvetica" size="2"><b><font size="3">Assumptions</font></b><br>我们在系l的设计和实C做以下假定:<br></font> <ul> <li><font face="verdana, arial, helvetica" size="2">p讲是~省语言Q且不需事先国际?/font> </li><li><font face="verdana, arial, helvetica" size="2">在Catalog不讲不会过500个?/font> </li><li><font face="verdana, arial, helvetica" size="2">catalog不会被频繁的修?/font></li> </ul> <font face="verdana, arial, helvetica" size="2"><b><font size="3">Page flow</font></b><br>?昄了所有的JCatalog的pages以及它们之间的transitions关系Q?br>     <p align="center"><a ><img style="width: 250px; height: 159px;" alt="" src="http://www.huihoo.com/java/jsf/jw-0719-jsf2.gif" align="bottom" border="0" height="102" hspace="0" width="176"></a></p><br>? 应用中存在两lpagesQ公开的internet和用于管理的intranetQ其中intranet只能被那些成功登录到pȝ的用戯问? ProductSummary不作Z个单独的page展示l用P它显C在Catalog page中的frame中。ProductList只对理员可视,它包含用于创建、编辑和删除产品的链接?br><br>?是一个Catalog面的示意图Q理想状况下Q在需求文档中应该包含每一늚详细C意图?br>         <p align="center"><a ><img style="width: 222px; height: 160px;" alt="" src="http://www.huihoo.com/java/jsf/jw-0719-jsf3.gif" align="bottom" border="0" height="114" hspace="0" width="222"></a></p><br><font size="5"><b>构架设计</b></font><br>Web应用开发的下一个阶D|构架设计Q它包括应用划分ؓ多个功能lgq将q些lg分割l合成层Q高层的构架设计应该中立于所选用的特定技术?br><br><b><font size="3">多层架构</font></b><br>? 层架构是整个系l清晰的分ؓ多个功能单元Qclient、presentation、business-logic、integration? EISQ这确保职责得到清晰的划分Q得系l更易于l护和扩展。具有三层或{多层的pȝ被证明比C/S模型h更好的׾~性和灉|性?br><br>client层是使用和表C数据模型的地方Q对于一个Web应用Qclient层通常是浏览器Q基于浏览器的瘦客户端不包含M表示逻辑Q它依赖?/font><font face="verdana, arial, helvetica" size="2">presentation</font><font face="verdana, arial, helvetica" size="2">层?br><br>presentation层将business-logic层的服务展示l用P它应知道如何处理用户的请求,如何同business-logic层交互,q且知道如何选择下一个视图显C给用户?br><br>business-logic层包含应用的business objects和business services。它接受来在于presentation层的h、基于请求处理业务逻辑。业务逻辑层组件将受益于系l的服务,如安全管理、事务管理和资源理{?br><br>integration层是介于</font><font face="verdana, arial, helvetica" size="2">business-logic</font><font face="verdana, arial, helvetica" size="2">层和EIS层之间的桥梁Q它装了与EIS层交互的逻辑。有Ӟintegration层和business-logic层合UCؓ中间层?br><br>应用的数据被保存在EIS层中Q它包括关系数据库、面向对象数据库和以及遗留系l等?br><br><b><font size="3">JCatalog的构架设?/font></b><br>?昄了JCatalog的构架设计以及如何应用于多层构架pȝ中?br>  </font> <p align="center"><font face="verdana, arial, helvetica" size="2"><a ><img style="width: 326px; height: 218px;" alt="" src="http://www.huihoo.com/java/jsf/jw-0719-jsf4.gif" align="bottom" border="0" height="120" hspace="0" width="196"></a></font></p> <font face="verdana, arial, helvetica" size="2"><br>? 应用采用了多层非分布式的构架Q图4展示了系l的分层以及每一层中选择的技术,它同时又是该范例的部|图Q它的presentation? business-logic和integration层将存在于同一个web容器中。定义良好的接口孤立每一层的职责Q这一架构使得应用更ؓ单和? 好的伸羃性?br><br>对于presentation层,l验表明Q最好的Ҏ是选择已存在的q已得到证明了的Web应用框架Q而不是自己去设计和开发新的框架。我们拥有多个可选择的框Ӟ如StrutsQWebWork和JSF{,在JCatalog中,我们选择采用JSF?br><br>EJB 和POJO都可以用来创Z务逻辑层,如果应用是分布式的,采用hremote接口的EJB是一个好的选择Q由于JCatalog是一个典型的不需要远 E访问的Web应用Q因此选用POJOQƈ充分利用Spring Framework的帮助,是实现业务逻辑层的更好选择?br><br>integration层利用关pd数据库事先数据的持箋化,存在多种Ҏ可用来实玎ͼ<br></font> <ul> <li><font face="verdana, arial, helvetica" size="2">JDBCQ这是最为灵zȝҎQ然而,低的JDBC难以使用Q而且质量差的JDBC代码很难q{良好</font> </li><li><font face="verdana, arial, helvetica" size="2">Entity beansQCMP的Entity bean是一U分L据访问代码和处理ORM的昂늚ҎQ它是以应用服务器ؓ中心的方法,即entity bean不是应用与某种数据库类型而是EJB容器U束在一赗?/font> </li><li><font face="verdana, arial, helvetica" size="2">O/R mapping frameworkQ一个ORM框架采用以对象ؓ中心的方法实现数据持l化Q一个以对象Z心的应用易于开发ƈh高度的可UL性。在该领域中存在几个? 架可用—JDO、Hibernate、TopLink以及CocoBase{。在我们的范例中选用Hibernate?/font></li> </ul> <font face="verdana, arial, helvetica" size="2">现在Q我们将讨论每一层中的设计问题,׃JSF是一个相对较新的技术,因此着重于它的使用Q?br><br></font><font size="3"><b><font face="verdana, arial, helvetica">presentation</font></b></font><font face="verdana, arial, helvetica" size="2"><font size="3"><b>层和JSF</b></font><br>表示层的功能是收集用L输入、展C数据、控刉面导航ƈ用L输入传递给业务逻辑层,表示层同旉要验证用L输入以及l护应用的session状态。在下面几部分中Q我讨C层设计时的考虑和模式,q说明选择JSF作ؓJCatalog表示层的原因?br><br><b>MVC</b><br>MVC是Java-Blueprints推荐的架构设计模式,MVC几个方面分d来,从而减代码的重复Q它以控制ؓ中心q得应用更h展性。MVC同时可帮助具有不同技能的用户更关注于自己的技能,通过定义良好的接口进行相互合作。MVC是表C层的架构设计模式?br><br><b>JSF</b><br>JSF 是Web应用的服务器端用L件框Ӟ它包含以下APIQ表CUIlg、管理它们的状态、处理事件、服务器端验证、数据{换、定义页面导航、支持国际化Q? qؓq些Ҏ提供扩展能力。它同时包括两个JSP的tag库以在JSP面中表CUIlgQ以及将lgwire为服务器端对象?br><br><b>JSF和MVC</b><br>JSF非常适合于基于MVC的表C层架构Q它在行为和表示之间提供了清晰的分离Q它使得你可以采用熟悉的UIlg和web层概念而无需受限于某U特D的脚本技术或标记语言?br><br>JSF backing beans是JSF的Model层,此外Q它同样包含actionsQaction是controller层的扩展Q用于将用户的请求委z业务逻辑层? q里h意,从整体的应用构架看,业务逻辑层也被称为model层。包含JSF标签的JSP面是表C层QFaces Servlet提供了controller的功能?br><br><b>Z么选用JSFQ?/b></font><font face="verdana, arial, helvetica" size="2"><br>JSF不仅仅是另外一个Web框架Q下面这些特性是JSF区别于其他Web框架之所在:</font> <ul> <li><font face="verdana, arial, helvetica" size="2">cSwing的面向对象的Web应用开发:服务器端有状态的UIlg模型Q配合event listeners和handlersQ促q了面向对象的Web应用开发?/font> </li><li><font face="verdana, arial, helvetica" size="2">backing -bean理Q?backing bean是与面中用的UIlg相关联的javabeanlgQbacking-bean理UIlg对象的定义同执行应用相关处理和拥有数据的对象 分离开来。JSF在合适的范围内保存和理q些backing-bean实例?/font> </li><li><font face="verdana, arial, helvetica" size="2">可扩展的UI模型QJSF的UI模型是可配置的、可重用的,用以构徏JSF应用的用L面。你可以通过扩展标准的UIlg来开发出更ؓ复杂的组Ӟ例如菜单条、树lg{?/font> </li><li><font face="verdana, arial, helvetica" size="2">灉|的rendering模型Qrenderer分离了UIlg的功能和昄Q多个renderers可创建和用来为同一客户端或不同的客L定义不同的显C?/font> </li><li><font face="verdana, arial, helvetica" size="2">可扩展的转换和验证模型:Z标准的converter和validatorQ你可以开发出自己的可提供更好的模型保护的converter和validator?/font></li> </ul> <font face="verdana, arial, helvetica" size="2">? 如此,JSF目前未成熟Q随同JSF发布? components、converters和validators都是最基础的,而且per-component验证模型不能处理components 和validators间的many-to-many验证。此外,JSF标签不能与JSTL间无~的整合在一赗?br><br>在下面的章节中,我将讨论几个在JCatalog实现中的关键部分和设计决{。我首先解释managed bean的定义和使用以及JSF中的backing beanQ然后,我将说明如何处理安全、分ccaching、file upload、验证以及错误信息定制?br><br><b>Managed bean,backing bean,view object 和domain object model</b><br>JSF 中引入了两个新的名词Qmanaged bean和backing bean。JSF提供了一个强大的managed-bean工具Q由JSF来管理的JavaBean对象UCؓmanaged-beanQ一? managed bean表述了一个bean如何被创建和理Q它不包含该bean的Q何功能性描q?br><br>backing bean定义了与面中用的UIlg相关联的属性和处理逻辑。每一个backing-bean属性邦定于一个组件实例或某实例的value。一? backing-bean同时定义了一l执行组件功能的ҎQ例如验证组件的数据、处理组件触发的事g、实施与lg相关的导航等?br><br>一个典 型的JSF应用其中的每个面和一个backing-beanl合hQ然而在现实应用中,强制的执行这Uone-on-one的关pM是一U理想的? x案,它可能会D代码重复{问题。在现实的应用中Q多个页面可以共享一个backing-beanQ例如在JCatalog中, CreateProduct和EditProduct共享同一个ProductBean定义?br><br>model对象特定于表C层中的一? view对象Q它包含必须昄在view层的数据以及验证用户输入、处理事件和与业务逻辑层交互的处理逻辑{。在Z JSF的应用中backing bean是view对象Q在本文中backing bean和view对象是可互换的名词?br><br>Ҏ于struts中的 ActionForm和ActionQ利用JSF中的backing-beanq行开发将能更好的遵@面向对象ҎQ一? backing-bean不仅包含view数据Q而且q包含与q些数据相关的行为,而在struts中,Action和ActionForm分别包含数据 和逻辑?br><br>我们都应该听说过domain object modelQ那么,domain object model和view对象之间有什么区别呢Q在一个简单的Web应用中,一个domain object model能够横穿所有层中,而在复杂的应用中Q需要用C个单独的view对象模型。domain object model应该属于业务逻辑层,它包含业务数据和与特定业务对象相关的业务逻辑Q一个view对象包含presentation-specific的数? 和逻辑。将view对象从domain object model中分d来的~点是在q两个对象模型之间必出现数据映。在JCatalog中,ProductBeanBuilder? UserBeanBuilder利用reflection-based Commons BeanUtils来实现数据映?br><br><b>安全</b><br>目前QJSF没有内徏的安全特性,而对于范例应用来说安全需求是非常基础的:用户d到administration intranet中仅需用户名和密码认证Q而无需考虑授权?br>针对于JSF的认证,已有几种Ҏ提出Q?br></font> <ul> <li><font face="verdana, arial, helvetica" size="2">利用一个backing beanQ这一个方法非常简单,然而它却将backing bean与特D的l承关系l合h?/font> </li><li><font face="verdana, arial, helvetica" size="2">利用JSF的ViewHandler decoratorQ这一Ҏ中,安全逻辑紧密C一特定Web层技术联pd了一?/font> </li><li><font face="verdana, arial, helvetica" size="2">利用servlet filterQ一个JSF应用与其他的Web应用没有什么两Pfilter仍是处理认证查的最好地方,q种Ҏ中,认证逻辑与Web应用分离开?/font></li> </ul> <font face="verdana, arial, helvetica" size="2">在我们的范例E序中,SecurityFilterc被用来处理用户的认证,目前Q受保护的资源只包含三个面Q出于简单的考虑Q将它们的位|被编码到FiltercM?br><br><b>分页</b><br>? 应用中的Catalog面需要分,表示层可用来处理分页Q即它取出所有的数据q保存在q一层;分页同样可在business-logic层? integration层、甚至EIS层中实现。由于在JCatalog中假设不过500个品,因此所有的产品信息能存攑֜一个user session中,我们分逻辑攑֜了ProductListBean中,与分늛关的参数通过JSF managed-bean工具配置?br><br><b>Caching</b><br>Caching 是提高Web应用性能的最重要技术之一Q在应用构徏中的很多层中都可以实现caching。JSF managed-bean工具可以使在表示层实现caching非常Ҏ。通过改变一个managed bean的范_q个managed bean中包含的数据可以在不同的范围内缓存?br><br>范例应用中采用了两cachingQ第一Ucaching存在于业务逻辑层, CachedCatalogServiceImplcȝ护了一个所有品和目录的读写cacheQSpring该cMZ个singleton service bean来管理,所以,一Ucache是一个应用范围的dcache?br><br>Z化分逻辑q进而提高应用的速度Q品同 样在session范围内缓存到表示层,每一个用L护着他自qProductListBeanQ这一Ҏ的缺Ҏ内存的消耗和数据的失效问题,在一? 用户session中,如果理员更改了catalogQ用户可到的是失效的数据,然而,׃我们假设应用的数据不会经常的改变Q所以这些缺点将能够? 受?br><br><b>File upload</b><br>目前的JSF Sun参考实C不支持file upload。Struts虽已h非常不错的file upload能力Q然而要想用这一Ҏ需要Struts-Faces整合库。在JCatalog中,一个图像与一个品相兌Q在一个用户创Z新的? 品后Q她必须相应的囄上传Q图片将保存在应用服务器的文件系l里Q品的ID是囑փ名称?br><br>范例应用中采?input type="file">、Servlet和Jakarta Common的file-upload API来实现简单的文g上传功能Q该Ҏ包含两个参数Q图像\径和囑փ上传l果面。它们将通过ApplicationBean来配|,详细内容请参?FileUploadServletcR?br><br><b>Validation</b><br>JSF中发布的标准validator是非常基的,无法满现实的需要,但很Ҏ开发出自己的JSF validatorQ在范例中,我开发了SelectedItemsRange validatorQ它用来验证UISelectManylg中选择的数量:<br><br>  <h:selectmanylistbox id="selectedCategoryIds" value="#{productBean.selectedCategoryIds}"><br>     <catalog:validateselecteditemsrange minnum="1"></catalog:validateselecteditemsrange><br>     <f:selectitems id="categories" value="#{applicationBean.categorySelectItems}"></f:selectitems><br>  </h:selectmanylistbox><br><br>详细情况请参看范例?br><br><b>定制错误信息</b><br>在JSF中,你可以ؓconverters和validators创徏resource bundle和定刉误信息,一个resource bundle可在faces-config.xml中创建:<br><br>  <message-bundle>catalog.view.bundle.Messages</message-bundle><br><br>q将错误信息的key-value对加到Message.properties文g中:<br><br>  javax.faces.component.UIInput.CONVERSION=Input data is not in the correct type.<br>  javax.faces.component.UIInput.REQUIRED=Required value is missing.<br><br><b><font size="3">业务逻辑层和Spring Framework</font></b><br>业务对象和业务服务存在于业务逻辑层中Q一个业务对象不仅包含数据,而且包含相应的逻辑Q在范例应用中包含三个业务对象:Product、Category和User?br><br>? 务服务与业务对象交互q提供更高的业务逻辑Q需要首先定义一个正式的业务接口Q它是直接与l端用户交互的服务接口。在JCatalog中,通过? Spring Framework帮助下的POJO实现业务逻辑层,其中共有两个业务服务QCatalogService包含Catalog理相关的业务逻辑Q? UserService中包含User理逻辑?br><br>Spring是基于IoC概念的框Ӟ在范例应用中用到的SpringҎ包括:<br></font> <ul> <li><font face="verdana, arial, helvetica" size="2">Bean management with application contextsQSpring可以有效地组l我们的中间层对象,它能够消除singleton的proliferationQƈ易于实现良好的面向对象编E方法,即“编E到接口”?/font> </li><li><font face="verdana, arial, helvetica" size="2">Declarative Transaction management: Spring利用AOP实现事务理Q而无需借助于EJB容器Q利用这U方法,事务理可以用于MPOJO中。Spring的事务管理不局限于JTAQ? 而是可以采用不同的事务策略,在范例应用中Q我们将使用declarative transaction management with Hibernate transaction?/font> </li><li><font face="verdana, arial, helvetica" size="2">Data-access exception hierarchyQSpring提供了非常好的异常来代替SQLExceptionQؓ利用Spring的异常,必须在Spring的配|文件中定义以下异常转换Q?/font></li> </ul> <font face="verdana, arial, helvetica" size="2">        <bean class="" id="jdbcExceptionTranslator"><br>          <property name="dataSource"><br>              <ref bean="dataSource"><br>          </ref><br>        </property><br><br>        在范例应用中Q如果一个具有重复ID的新产品被插入,会抛出DataIntegrityViolationExceptionQ这一异常被 <br>        catchqrethrown一个DuplicateProductIdException。这P该异常就可以与其它的异常区别处理?br></bean></font> <ul> <li><font face="verdana, arial, helvetica" size="2">Hibernate integrationQSpring与Hibernateq样的ORM框架整合的非常好QSpring提供了对Hibernate session的高效和安全的处理,它可通过application context配置Hibernate的SessionFactories和JDBC数据源,q得应用易于测试?/font></li> </ul> <font face="verdana, arial, helvetica" size="2"><br><b><font size="3">Integration层和Hibernate</font></b><br>Hibernate是一个开源的ORM框架Q它可以支持所有主SQL数据库系l,Hibernate的查询语a为对象和关系架v了非常好的桥梁。Hibernate提供了强大的功能以实玎ͼ数据d和更新、事务管理、数据连接池、查询和实体关系理{?br><br><b><font size="3">Data Access Ojbect(DAO)</font></b><br>JCatalog 中采用了Dao模式Q该模式抽象和封装了所有对数据源的讉KQ该应用中包括两个DAO接口QCatalogDao和UserDaoQ它们相应的实现 HibernateCatalogDaoImpl和HibernateUserDAoImpl包含了Hibernate特定的逻辑来实现数据的理和持? 化?br><br><b><font size="5">实现</font></b><br>现在我们来看看如何将上面讨论的这些东西包装在一起以实现JCatalogQ你可以从这个地址下蝲源码Q?a >source code</a><br><br><b><font size="3">数据库设?/font></b><br>我们范例应用创徏了包?个表的数据库Q如?所C:<br> <p align="center"><a ><img style="width: 290px; height: 211px;" alt="" src="http://www.huihoo.com/java/jsf/jw-0719-jsf5.gif" align="bottom" border="0" height="150" hspace="0" width="248"></a></p><br><b><font size="3">c设?/font></b><br>?昄了JCatalog的类?br> <p align="center"><a ><img style="width: 414px; height: 255px;" alt="" src="http://www.huihoo.com/java/jsf/jw-0719-jsf6.gif" align="bottom" border="0" height="232" hspace="0" width="120"></a></p><br>“编 E到接口”的思想贯穿了整个设计实CQ在表示层,q到四个backing beanQProductBean、ProductListBean、UserBean和MessageBean;业务逻辑层包含两个业务服? (CatalogService和UserService)和三个业务对?Product、Category和User);Integration层有 两个Dao接口和它们相应的Hibernate实现QSpring的application context用来理l大多数的业务逻辑层和integration层的对象QServiceLocatorJSF和业务逻辑层整合在了一赗?br><br><b><font size="3">Wire everything up</font></b><br>׃幅所限,我们仅D例说明,范例中use case CreateProduct展示了如何装配和构徏应用Q在详细讲述l节前,我们利用sequence??)来说明所有层的end-tp-end整合?br> <p align="center"><a ><img style="width: 470px; height: 128px;" alt="" src="http://www.huihoo.com/java/jsf/jw-0719-jsf7.gif" align="bottom" border="0" height="128" hspace="0" width="120"></a></p><br><br><b>表示?/b>Q?br>表示层实现包括创建JSP面、定义页D、创建和配置backing bean以及JSF与业务逻辑层整合?br></font> <ul> <li><font face="verdana, arial, helvetica" size="2">JSP pageQcreateProduct.jsp是用来创建新产品的页面,它包含UIlgq将lg打包成ProductBeanQValidateItemsRange标签用来验证用户选择的种cL量,Ҏ一个品至要有一个种c被选中?/font></li> </ul> <ul> <li><font face="verdana, arial, helvetica" size="2">面DQ应用中的导航被定义在应用的配置文gfaces-navigation.xml中,CreateProduct的导航准则如下:</font></li> </ul> <blockquote><font face="verdana, arial, helvetica" size="2"><navigation-rule></navigation-rule></font><br><font face="verdana, arial, helvetica" size="2">   <from-view-id>*</from-view-id></font><br><font face="verdana, arial, helvetica" size="2">   <navigation-case></navigation-case></font><br><font face="verdana, arial, helvetica" size="2">      <from-outcome>createProduct</from-outcome></font><br><font face="verdana, arial, helvetica" size="2">      <to-view-id>/createProduct.jsp</to-view-id></font><br><font face="verdana, arial, helvetica" size="2">   </font><br><br></blockquote> <blockquote><font face="verdana, arial, helvetica" size="2"><navigation-rule></navigation-rule></font><br><font face="verdana, arial, helvetica" size="2">   <from-view-id>/createProduct.jsp</from-view-id></font><br><font face="verdana, arial, helvetica" size="2">   <navigation-case></navigation-case></font><br><font face="verdana, arial, helvetica" size="2">      <from-outcome>success</from-outcome></font><br><font face="verdana, arial, helvetica" size="2">      <to-view-id>/uploadImage.jsp</to-view-id></font><br><font face="verdana, arial, helvetica" size="2">   </font><br><font face="verdana, arial, helvetica" size="2">   <navigation-case></navigation-case></font><br><font face="verdana, arial, helvetica" size="2">      <from-outcome>retry</from-outcome></font><br><font face="verdana, arial, helvetica" size="2">      <to-view-id>/createProduct.jsp</to-view-id></font><br><font face="verdana, arial, helvetica" size="2">   </font><br><font face="verdana, arial, helvetica" size="2">   <navigation-case></navigation-case></font><br><font face="verdana, arial, helvetica" size="2">      <from-outcome>cancel</from-outcome></font><br><font face="verdana, arial, helvetica" size="2">      <to-view-id>/productList.jsp</to-view-id></font><br><font face="verdana, arial, helvetica" size="2">   </font><br><br></blockquote> <ul> <li><font face="verdana, arial, helvetica" size="2">Backing beanQProductBean不仅包含有将数据映射到页面上的UIlg的属性,q包括三个actionQcreateAction、editAction和deleteActionQ下面是createActionҎ的代码:</font></li> </ul> <blockquote><font face="verdana, arial, helvetica" size="2">public String createAction() {</font><br><font face="verdana, arial, helvetica" size="2">   try {</font><br><font face="verdana, arial, helvetica" size="2">      Product product = ProductBeanBuilder.createProduct(this);</font><br><br><font face="verdana, arial, helvetica" size="2">      //Save the product.</font><br><font face="verdana, arial, helvetica" size="2">      this.serviceLocator.getCatalogService().saveProduct(product);</font><br><br><font face="verdana, arial, helvetica" size="2">      //Store the current product id inside the session bean.</font><br><font face="verdana, arial, helvetica" size="2">      //For the use of image uploader.</font><br><font face="verdana, arial, helvetica" size="2">      FacesUtils.getSessionBean().setCurrentProductId(this.id);</font><br><br><font face="verdana, arial, helvetica" size="2">      //Remove the productList inside the cache.</font><br><font face="verdana, arial, helvetica" size="2">      this.logger.debug("remove ProductListBean from cache");</font><br><font face="verdana, arial, helvetica" size="2">      FacesUtils.resetManagedBean(BeanNames.PRODUCT_LIST_BEAN);</font><br><font face="verdana, arial, helvetica" size="2">   } catch (DuplicateProductIdException de) {</font><br><font face="verdana, arial, helvetica" size="2">      String msg = "Product id already exists";</font><br><font face="verdana, arial, helvetica" size="2">      this.logger.info(msg);</font><br><font face="verdana, arial, helvetica" size="2">      FacesUtils.addErrorMessage(msg);</font><br><br><font face="verdana, arial, helvetica" size="2">      return NavigationResults.RETRY;</font><br><font face="verdana, arial, helvetica" size="2">   } catch (Exception e) {</font><br><font face="verdana, arial, helvetica" size="2">      String msg = "Could not save product";</font><br><font face="verdana, arial, helvetica" size="2">      this.logger.error(msg, e);</font><br><font face="verdana, arial, helvetica" size="2">      FacesUtils.addErrorMessage(msg + ": Internal Error");</font><br><br><font face="verdana, arial, helvetica" size="2">      return NavigationResults.FAILURE;</font><br><font face="verdana, arial, helvetica" size="2">   }</font><br><font face="verdana, arial, helvetica" size="2">   String msg = "Product with id of " + this.id + " was created successfully.";</font><br><font face="verdana, arial, helvetica" size="2">   this.logger.debug(msg);</font><br><font face="verdana, arial, helvetica" size="2">   FacesUtils.addInfoMessage(msg);</font><br><br><font face="verdana, arial, helvetica" size="2">   return NavigationResults.SUCCESS;</font><br><font face="verdana, arial, helvetica" size="2">}</font><br></blockquote> <ul> <li><font face="verdana, arial, helvetica" size="2">Managed-bean声明QProductBean必须在JSF配置文gfaces-managed-bean.xml中配|:</font></li> </ul> <blockquote><font face="verdana, arial, helvetica" size="2"><managed-bean></managed-bean></font><br><font face="verdana, arial, helvetica" size="2">   <description></description></font><br><font face="verdana, arial, helvetica" size="2">      Backing bean that contains product information.</font><br><font face="verdana, arial, helvetica" size="2">   </font><br><font face="verdana, arial, helvetica" size="2">   <managed-bean-name>productBean</managed-bean-name></font><br><font face="verdana, arial, helvetica" size="2">   <managed-bean-class>catalog.view.bean.ProductBean</managed-bean-class></font><br><font face="verdana, arial, helvetica" size="2">   <managed-bean-scope>request</managed-bean-scope>    </font><br><font face="verdana, arial, helvetica" size="2">   <managed-property></managed-property></font><br><font face="verdana, arial, helvetica" size="2">      <property-name>id</property-name></font><br><font face="verdana, arial, helvetica" size="2">      <value>#{param.productId}</value></font><br><font face="verdana, arial, helvetica" size="2">   </font><br><font face="verdana, arial, helvetica" size="2">   <managed-property></managed-property></font><br><font face="verdana, arial, helvetica" size="2">      <property-name>serviceLocator</property-name></font><br><font face="verdana, arial, helvetica" size="2">      <value>#{serviceLocatorBean}</value></font><br><font face="verdana, arial, helvetica" size="2">   </font><br><br></blockquote> <ul> <li><font face="verdana, arial, helvetica" size="2">  表示层和业务逻辑层之间的整合Q? ServiceLocator抽象了查找服务的逻辑Q在范例应用中,ServiceLocator被定义ؓ一个接口,该接口实Cؓ一个JSF? managed beanQ即ServiceLocatorBeanQ它在Spring的application context中寻找服务:</font></li> </ul> <blockquote><font face="verdana, arial, helvetica" size="2">ServletContext context = FacesUtils.getServletContext();</font><br><font face="verdana, arial, helvetica" size="2">this.appContext = WebApplicationContextUtils.getRequiredWebApplicationContext(context);</font><br><font face="verdana, arial, helvetica" size="2">this.catalogService = (CatalogService)this.lookupService(CATALOG_SERVICE_BEAN_NAME);</font><br><font face="verdana, arial, helvetica" size="2">this.userService = (UserService)this.lookupService(USER_SERVICE_BEAN_NAME);</font><br></blockquote> <font face="verdana, arial, helvetica" size="2"><b>业务逻辑?/b><br></font> <ul> <li><font face="verdana, arial, helvetica" size="2">业务对象Q由于采用Hibernate提供持久化,因此Product和Category两个业务对象需要ؓ它们的所有field提供getter和setter?/font></li> </ul> <ul> <li><font face="verdana, arial, helvetica" size="2">业务服务QCatalogService接口中定义了所有的与Catalog management相关的服务:</font></li> </ul> <blockquote><font face="verdana, arial, helvetica" size="2">public interface CatalogService {</font><br><font face="verdana, arial, helvetica" size="2">   public Product saveProduct(Product product) throws CatalogException;</font><br><font face="verdana, arial, helvetica" size="2">   public void updateProduct(Product product) throws CatalogException;</font><br><font face="verdana, arial, helvetica" size="2">   public void deleteProduct(Product product) throws CatalogException;</font><br><font face="verdana, arial, helvetica" size="2">   public Product getProduct(String productId) throws CatalogException;</font><br><font face="verdana, arial, helvetica" size="2">   public Category getCategory(String categoryId) throws CatalogException;</font><br><font face="verdana, arial, helvetica" size="2">   public List getAllProducts() throws CatalogException;</font><br><font face="verdana, arial, helvetica" size="2">   public List getAllCategories() throws CatalogException;</font><br><font face="verdana, arial, helvetica" size="2">}</font><br></blockquote> <ul> <li><font face="verdana, arial, helvetica" size="2">Spring ConfigurationQ这里是CatalogService的Spring配置Q?/font></li> </ul> <blockquote><font face="verdana, arial, helvetica" size="2"><!-- Hibernate Transaction Manager Definition --></font><br><font face="verdana, arial, helvetica" size="2"><bean class="org" id="transactionManager"></bean></font><br><font face="verdana, arial, helvetica" size="2">   <property name="sessionFactory"><ref local="sessionFactory"></ref></property></font><br><br><br><font face="verdana, arial, helvetica" size="2"><!-- Cached Catalog Service Definition --></font><br><font face="verdana, arial, helvetica" size="2"><bean class="catalog" id="catalogServiceTarget" init-method="init"></bean></font><br><font face="verdana, arial, helvetica" size="2">   <property name="catalogDao"><ref local="catalogDao"></ref></property></font><br><br><br><font face="verdana, arial, helvetica" size="2"><!-- Transactional proxy for the Catalog Service --></font><br><font face="verdana, arial, helvetica" size="2"><bean class="org" id="catalogService"></bean></font><br><font face="verdana, arial, helvetica" size="2">   <property name="transactionManager"><ref local="transactionManager"></ref></property></font><br><font face="verdana, arial, helvetica" size="2">   <property name="target"><ref local="catalogServiceTarget"></ref></property></font><br><font face="verdana, arial, helvetica" size="2">   <property name="transactionAttributes"></property></font><br><font face="verdana, arial, helvetica" size="2">      <props></props></font><br><font face="verdana, arial, helvetica" size="2">         <prop key="get*">PROPAGATION_REQUIRED,readOnly</prop></font><br><font face="verdana, arial, helvetica" size="2">       <prop key="save*">PROPAGATION_REQUIRED</prop></font><br><font face="verdana, arial, helvetica" size="2">       <prop key="update*">PROPAGATION_REQUIRED</prop></font><br><font face="verdana, arial, helvetica" size="2">       <prop key="delete*">PROPAGATION_REQUIRED</prop></font><br><font face="verdana, arial, helvetica" size="2">      </font><br><font face="verdana, arial, helvetica" size="2">   </font><br><br></blockquote> <ul> <li><font face="verdana, arial, helvetica" size="2">Spring和Hibernate的整合:下面是HibernateSessionFactory的配|:</font></li> </ul> <blockquote><font face="verdana, arial, helvetica" size="2"><!-- Hibernate SessionFactory Definition --></font><br> <code></code><p> <!-- Hibernate SessionFactory Definition --><br> <bean id="sessionFactory" class="org.springframework.orm.hibernate.LocalSessionFactoryBean"><br>    <property name="mappingResources"><br>       <list><br>          <value>catalog/model/businessobject/Product.hbm.xml</value><br>          <value>catalog/model/businessobject/Category.hbm.xml</value><br>          <value>catalog/model/businessobject/User.hbm.xml</value><br>       </list><br>    </property><br>    <property name="hibernateProperties"><br>       <props><br>         <prop key="hibernate.dialect">net.sf.hibernate.dialect.MySQLDialect</prop><br>        <prop key="hibernate.show_sql">true</prop><br>        <prop key="hibernate.cglib.use_reflection_optimizer">true</prop><br>        <prop key="hibernate.cache.provider_class">net.sf.hibernate.cache.HashtableCacheProvider</prop><br>       </props><br>    </property> <br>    <property name="dataSource"><br>       <ref bean="dataSource"/><br>    </property><br> </bean><br> </p><p> <code>CatalogDao</code> uses <code>HibernateTemplate</code> to integrate between Hibernate and Spring. Here's the configuration for <code>HibernateTemplate</code>: </p><p> <code></code></p><p> <!-- Hibernate Template Defintion --><br> <bean id="hibernateTemplate" class="org.springframework.orm.hibernate.HibernateTemplate"> <br>    <property name="sessionFactory"><ref bean="sessionFactory"/></property> <br>    <property name="jdbcExceptionTranslator"><ref bean="jdbcExceptionTranslator"/></property> <br> </bean> <br> </p><p> <br><br></p></blockquote> <font face="verdana, arial, helvetica" size="2"><b>Integration?/b><br>Hibernate通过xml配置文g来映业务对象和关系数据库,在JCatalog中,Product.hbm.xml表示了Product对象的映,Category.hbm.xml则用来表CCategory的映,Product.hbm.xml如下Q?br></font> <blockquote><font face="verdana, arial, helvetica" size="2"> <code></code></font><p> <font face="verdana, arial, helvetica" size="2"><?xml version="1.0"?><br> <!DOCTYPE hibernate-mapping PUBLIC <br>       "-//Hibernate/Hibernate Mapping DTD 2.0//EN"<br>       "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd"><br> <hibernate-mapping package="catalog.model.businessobject"><br>    <class name="Product" table="product"><br>       <id name="id" column="ID" unsaved-value="null"><br>          <generator class="assigned"/><br>       </id><br>       <property name="name" column="NAME" unique="true" not-null="true"/><br>       <property name="price" column="PRICE"/>     <br>       <property name="width" column="WIDTH"/>      <br>       <property name="height" column="height"/>      <br>       <property name="description" column="description"/>   <br>       <set name="categoryIds" table="product_category" cascade="all"><br>          <key column="PRODUCT_ID"/><br>          <element column="CATEGORY_ID" type="string"/><br>       </set><br>    </class><br> </hibernate-mapping><br> </font></p><p> <code><font face="verdana, arial, helvetica" size="2">CatalogDao</font></code><font face="verdana, arial, helvetica" size="2"> is wired with <code>HibernateTemplate</code> by Spring: </font></p><p> <code></code></p><p> <font face="verdana, arial, helvetica" size="2"><!-- Catalog DAO Definition: Hibernate implementation --><br> <bean id="catalogDao" class="catalog.model.dao.hibernate.CatalogDaoHibernateImpl"><br>    <property name="hibernateTemplate"><ref bean="hibernateTemplate"/></property> <br> </bean> <br> </font></p><p> </p></blockquote> <font face="verdana, arial, helvetica" size="2"><font face="verdana, arial, helvetica" size="2"><b><font size="5">l论</font></b><br>? 文主要讲qC如何JSF与Spring、Hibernate整合在一h构徏实际的Web应用Q这三种技术的l合提供了一个强大的Web应用开发框架? 在Web应用的高层设计中应该采用多层构架体系QJSF非常适合MVC设计模式以实现表C层QSpring可用在业务逻辑层中理业务对象Qƈ提供事物? 理和资源理{,Spring与Hibernatel合的非常出ԌHibernate是强大的O/R映射框架Q它可以在integration层中提供 最好的服务?br><br>通过整个Web应用分割成多层,q借助于“编E到接口”,应用E序的每一层所采用的技术都是可替换的,例如Struts? 以用来替换JSFQJDO可替换Hibernate。各层之间的整合不是不值得研究Q采用IoC和ServiceLocator设计模式可得整合非常容 易。JSF提供了其它Web框架Ơ缺的功能,然而,qƈ不意味着你马上抛弃Struts而开始用JSFQ是否采用JSF取决于项目目前的状况和功能需 求,以及开发团队的意见{?br><br></font></font><img src ="http://www.aygfsteel.com/hszdz/aggbug/21507.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/hszdz/" target="_blank">爪哇之家</a> 2005-11-26 15:09 <a href="http://www.aygfsteel.com/hszdz/articles/21507.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <a href="http://www.aygfsteel.com/" title="狠狠久久亚洲欧美专区_中文字幕亚洲综合久久202_国产精品亚洲第五区在线_日本免费网站视频">狠狠久久亚洲欧美专区_中文字幕亚洲综合久久202_国产精品亚洲第五区在线_日本免费网站视频</a> </div> </footer> վ֩ģ壺 <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ľ</a>| <a href="http://" target="_blank">Dz</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ƫ</a>| <a href="http://" target="_blank">ƽ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">г</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ʼ</a>| <a href="http://" target="_blank">ǿ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ٺ</a>| <a href="http://" target="_blank">²</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ɽʡ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ɽ</a>| <a href="http://" target="_blank">ӽ</a>| <a href="http://" target="_blank">Ǧɽ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">Ʊ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">Т</a>| <a href="http://" target="_blank">鱦</a>| <a href="http://" target="_blank">ͼ</a>| <a href="http://" target="_blank"></a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>