??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲精品亚洲人成在线观看,亚洲无人区午夜福利码高清完整版,全亚洲最新黄色特级网站http://www.tkk7.com/jiabao/category/20482.html會只會i垂青有准備的hQ運氣不是每個h都有?zh-cnSat, 21 Apr 2007 12:03:42 GMTSat, 21 Apr 2007 12:03:42 GMT60phpQmysql扎实个h基本?/title><link>http://www.tkk7.com/jiabao/archive/2007/04/21/112478.html</link><dc:creator>金家?/dc:creator><author>金家?/author><pubDate>Sat, 21 Apr 2007 11:45:00 GMT</pubDate><guid>http://www.tkk7.com/jiabao/archive/2007/04/21/112478.html</guid><wfw:comment>http://www.tkk7.com/jiabao/comments/112478.html</wfw:comment><comments>http://www.tkk7.com/jiabao/archive/2007/04/21/112478.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/jiabao/comments/commentRss/112478.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/jiabao/services/trackbacks/112478.html</trackback:ping><description><![CDATA[ <p>一. 10句话<br />1.不要依赖register_global=ON的环境,从你刚懂得配|phpq行环境甚至不明白register_global的ON/OFF会对自己有什么媄响的那天P应该勇敢地把它设ؓOFF.<br />2.写程序前看看怎么用error_reporting.<br />3.不懂问本n没错Q但你需要在那之前查查手册?br />4.当然Q你需要懂得用手册。手册上找不到答案的时候,应该考虑下网l上的搜索引擎?br />5.刚学会php+mysql之后Q不要叫L要写论坛Q要写XXX。要明白Q刚学会写汉字ƈ不表CZ有能力写诗?br />6.在学web~程的时候,你应该先去认识htmlq个朋友?br />7.有点能力后,试着回答新手的问题,不要看到自己懂的而别Z懂就沾沾自喜Q扔下一名“简单,那是基本的东襎쀝就走更要不得?br />8.思考是一个好习惯Q不动手dq于空惻I什么也没有?br />9.写好一D늨序,如果觉得很满意,一周后再看一遍,也许你会认ؓ它应该有所改变<br />10.有空多看看别人的E序Q找Z人的不或优点,自己掂量?br /><br />? 各取所需<br /><br />1.善于使用“引用?它能直接影响到程序的效率?br /><br />2.善于用三元运子,可以让程式较_有效率?br />比如:<br /></p> <blockquote> <pre>PHP代码:<hr /><br />if ($data[$i]['nickname']) <br />{ <br />    $nickname =  $data[$i]['nickname']; <br />} <br />else <br />{ <br />    $nickname =  $data[$i]['ip']; <br />}<br /><hr /></pre> </blockquote> <p> <br />可以写成:<br /></p> <blockquote> <pre>PHP代码:<hr /><br />$nickname =  $data[$i]['nickname'] ? $data[$i]['nickname'] : $data[$i]['ip'];<br /><hr /></pre> </blockquote> <p> <br /> <br />3.善于l织if...else...回圈<br />比如:<br /></p> <blockquote> <pre>PHP代码:<hr /><br />$ext_name = strtolower(str_replace(".", "", strrchr($upfilename, "."))); <br />if (!empty($type)) <br />{ <br />    if (!strpos($type, $ext_name)) <br />    { <br />        echo "Please upload the file of $type form."; <br />        exit(); <br />    } <br />}<br /><hr /></pre> </blockquote> <p> <br />上面的代码你应该写成q样:<br /></p> <blockquote> <pre>PHP代码:<hr /><br />$ext_name = strtolower(str_replace(".", "", strrchr($upfilename, "."))); <br />if (!($type==='') && strpos($type, $ext_name)===false) <br />{ <br />    echo "Please upload the file of $type form."; <br />    exit(); <br />}<br /><hr /></pre> </blockquote> <p> <br /> <br />4.量让你的代码清淅些<br />如果写成q样Q是比较让h头痛?<br /></p> <blockquote> <pre>PHP代码:<hr /><br />$foo=$_post["foo"]; <br />   $username=$_post["user"]; <br />$group=$_POST["group"]; <br />if ($group=="wheel"){ <br />$username=$username."wheel"; <br />}<br /><hr /></pre> </blockquote> <p> <br />同样的代码,q样比较让人看得舒服了:<br /></p> <blockquote> <pre>PHP代码:<hr /><br />$foo      = $_post["foo"]; <br />$username = $_post["username"]; <br />$group    = $_POST["group"]; <br />if ($group=="wheel") <br />{ <br />    $username = $username."wheel"; <br />}<br /><hr /></pre> </blockquote> <p> <br />当然Q有一定基后,你应该要写成q样:<br /></p> <blockquote> <pre>PHP代码:<hr /><br />$foo      = &$_POST['foo']; <br />$username =  $_POST["group"]!='wheel' ? $_POST["username"] : $_POST["username"].'wheel';<br /><hr /></pre> </blockquote> <p> <br />5.~写规范的mysql 语句?br />字段和表名用"`"引v来,避免保留字的影响?br />如果看到下面q样的一个sql queryQ会让h比较头痛:<br /></p> <blockquote> <pre>PHP代码:<hr /><br />$query="select `flash_comment`.`content` , `flash_comment`.`nickname` , `flash_comment`.`date` , `flash_comment`.`ip` , `product`.`p_name` , `sgflash`.`fid` from `flash_comment` left join `product` on ( `flash_comment`.`p_no` = `product`.`p_no` ) left join `sgflash` on ( `product`.`p_name` = `sgflash`.`f_name` ) where `flash_comment`.`p_no` != '' order by `flash_comment`.`date`";<br /><hr /></pre> </blockquote> <p> <br />同样的一个query,写成q样׃o人看得明白得多了:<br /></p> <blockquote> <pre>PHP代码:<hr /><br />$query = "SELECT `flash_comment`.`content` , `flash_comment`.`nickname` , `flash_comment`.`date` , `flash_comment`.`ip` , `product`.`p_name` , `sgflash`.`fid` <br />          FROM `flash_comment` <br />          LEFT JOIN `product` ON ( `flash_comment`.`p_no` = `product`.`p_no` ) <br />          LEFT JOIN `sgflash` ON ( `product`.`p_name` = `sgflash`.`f_name` ) <br />          WHERE `flash_comment`.`p_no` != '' <br />          ORDER BY `flash_comment`.`date`";<br /></pre> </blockquote> <img src ="http://www.tkk7.com/jiabao/aggbug/112478.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/jiabao/" target="_blank">金家?/a> 2007-04-21 19:45 <a href="http://www.tkk7.com/jiabao/archive/2007/04/21/112478.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>深入剖析Java~程中的中文问题及徏议最优解x?/title><link>http://www.tkk7.com/jiabao/archive/2007/04/10/109661.html</link><dc:creator>金家?/dc:creator><author>金家?/author><pubDate>Tue, 10 Apr 2007 07:55:00 GMT</pubDate><guid>http://www.tkk7.com/jiabao/archive/2007/04/10/109661.html</guid><wfw:comment>http://www.tkk7.com/jiabao/comments/109661.html</wfw:comment><comments>http://www.tkk7.com/jiabao/archive/2007/04/10/109661.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/jiabao/comments/commentRss/109661.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/jiabao/services/trackbacks/109661.html</trackback:ping><description><![CDATA[ <p> <b>1、中文问题的来源 </b> <br />    计算机最初的操作pȝ支持的编码是单字节的字符~码Q于是,在计机中一切处理程序最初都是以单字节编码的英文为准q行处理。随着计算机的发展Qؓ了适应世界其它民族的语aQ当然包括我们的汉字Q,Z提出了UNICODE~码Q它采用双字节编码,兼容英文字符和其它民族的双字节字W编码,所以,目前Q大多数国际性的软g内部均采用UNICODE~码Q在软gq行Ӟ它获得本地支持系l(多数旉是操作系l)默认支持的编码格式,然后再将软g内部的UNICODE转化为本地系l默认支持的格式昄出来。Java的JDK和JVMx如此Q我q里说的JDK是指国际版的JDKQ我们大多数E序员用的是国际化的JDK版本Q以下所有的JDK均指国际化的JDK版本。我们的汉字是双字节~码语言Qؓ了能让计机处理中文Q我们自己制定的gb2312、GBK、GBK2K{标准以适应计算机处理的需求。所以,大部分的操作pȝZ适应我们处理中文的需求,均定制有中文操作pȝQ它们采用的是GBK,GB2312~码格式以正显C我们的汉字。如Q中文Win2K默认采用的是GBK~码昄Q在中文WIN2k中保存文件时默认采用的保存文件的~码格式也是GBK的,卻I所有在中文WIN2K中保存的文g它的内部~码默认均采用GBK~码Q注意:GBK是在GB2312基础上扩充来的?br />    ׃Java语言内部采用UNICODE~码Q所以在JAVAE序q行Ӟ存在着一个从UNICODE~码和对应的操作pȝ及浏览器支持的编码格式{换输入、输出的问题Q这个{换过E有着一pd的步骤,如果其中M一步出错,则显C出来的汉字׃出是qQ这是我们常见的JAVA中文问题?br />    同时QJava是一个跨q_的编E语aQ也x们编写的E序不仅能在中文windows上运行,也能在中文Linux{系l上q行Q同时也要求能在英文{系l上q行Q我们经常看到有人把在中文win2k上编写的JAVAE序Q移植到英文Linux上运行)。这U移植操作也会带来中文问题?br />    q有Q有Z用英文的操作pȝ和英文的IE{浏览器Q来q行带中文字W的E序和浏览中文网,它们本n׃支持中文Q也会带来中文问题?br />    有,几乎所有的览器默认在传递参数时都是以UTF-8~码格式来传递,而不是按中文~码传递,所以,传递中文参数时也会有问题,从而带来ؕ码现象?br />    MQ以上几个方面是JAVA中的中文问题的主要来源,我们把以上原因造成的程序不能正运行而生的问题UCQJAVA中文问题?br /><b>2、JAVA~码转换的详l过E?</b><br />    我们常见的JAVAE序包括以下cdQ?br />     *直接在console上运行的c?包括可视化界面的c?<br />     *JSP代码c(注:JSP是Servletscȝ变型Q?br />     *Serveletsc?br />     *EJBc?br />     *其它不可以直接运行的支持c?br />    q些cL件中Q都有可能含有中文字W串Qƈ且我们常用前三类JAVAE序和用L接交互,用于输出和输入字W,如:我们在JSP和Servlet中得到客L送来的字W,q些字符也包括中文字W。无些JAVAcȝ作用如何Q这些JAVAE序的生命周期都是这LQ?br />    *~程人员在一定的操作pȝ上选择一个合适的~辑软g来实现源E序代码q以.java扩展名保存在操作pȝ中,例如我们在中文win2k中用C本编辑一个java源程序;<br />     *~程人员用JDK中的javac.exe来编译这些源代码QŞ?classc?JSP文g是由容器调用JDK来编译的)Q?br />     *直接q行q些cL这些类布v到WEB容器中去q行Qƈ输出l果?br />    那么Q在q些q程中,JDK和JVM是如何将q些文g如何~码和解码ƈq行的呢Q?br />    q里Q我们以中文win2k操作pȝZ说明JAVAcL如何来编码和被解码的?br />    W一步,我们在中文win2k中用~辑软g如记事本~写一个Java源程序文?包括以上五类JAVAE序)Q程序文件在保存旉认采用了操作pȝ默认支持GBK~码格式(操作pȝ默认支持的格式ؓfile.encoding格式)形成了一?java文gQ也卻IjavaE序在被~译前,我们的JAVA源程序文件是采用操作pȝ默认支持的file.encoding~码格式保存的,java源程序中含有中文信息字符和英文程序代码;要查看系l的file.encoding参数Q可以用以下代码Q?br />public class ShowSystemDefaultEncoding {<br />public static void main(String[] args) {<br />String encoding = System.getProperty("file.encoding");<br />System.out.println(encoding);<br />}}<br />    W二步,我们用JDK的javac.exe文g~译我们的Java源程序,׃JDK是国际版的,在编译的时候,如果我们没有?encoding参数指定我们的JAVA源程序的~码格式Q则javac.exe首先获得我们操作pȝ默认采用的编码格式,也即在编译javaE序Ӟ若我们不指定源程序文件的~码格式QJDK首先获得操作pȝ的file.encoding参数(它保存的是操作pȝ默认的编码格式,如WIN2kQ它的gؓGBK)Q然后JDK把我们的java源程序从file.encoding~码格式转化为JAVA内部默认的UNICODE格式攑օ内存中。然后,javac把{换后的unicode格式的文件进行编译成.classcLӞ此时.class文g是UNICODE~码的,它暂攑֜内存中,紧接着QJDK此以UNICODE~码的编译后的class文g保存到我们的操作pȝ中Ş成我们见到的.class文g。对我们来说Q我们最l获得的.class文g是内容以UNICODE~码格式保存的类文gQ它内部包含我们源程序中的中文字W串Q只不过此时它己l由file.encoding格式转化为UNICODE格式了?br />    q一步中Q对于JSP源程序文件是不同的,对于JSPQ这个过E是q样的:即WEB容器调用JSP~译器,JSP~译器先查看JSP文g中是否设|有文g~码格式Q如果JSP文g中没有设|JSP文g的编码格式,则JSP~译器调用JDK先把JSP文g用JVM默认的字W编码格?也即WEB容器所在的操作pȝ的默认的file.encoding)转化Z时的Servletc,然后再把它编译成UNICODE格式的classc,q保存在临时文g夹中。如Q在中文win2k上,WEB容器把JSP文g从GBK~码格式转化为UNICODE格式Q然后编译成临时保存的Servletc,以响应用Lh?br />    W三步,q行W二步编译出来的c,分ؓ三种情况Q?br />    A?直接在console上运行的c?br />    B?EJBcd不可以直接运行的支持c?如JavaBeanc?<br />    C?JSP代码和Servletc?br />    D?JAVAE序和数据库之间<br />    下面我们分这四种情况来看?br />    A、直接在console上运行的c?br />    q种情况Q运行该c首先需要JVM支持Q即操作pȝ中必d装有JRE。运行过E是q样的:首先java启动JVMQ此时JVMd操作pȝ中保存的class文gq把内容d内存中,此时内存中ؓUNICODE格式的classc,然后JVMq行它,如果此时此类需要接收用戯入,则类会默认用file.encoding~码格式对用戯入的串进行编码ƈ转化为unicode保存入内存(用户可以讄输入的~码格式Q。程序运行后Q生的字符ԌUNICODE~码的)再回交给JVMQ最后JRE把此字符串再转化为file.encoding格式(用户可以讄输出的~码格式)传递给操作pȝ昄接口q输出到界面上?br />    对于q种直接在console上运行的c,它的转化q程可用?更加明确的表C出来:</p> <p> <img style="BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; BORDER-BOTTOM: black 1px solid" src="http://java.ccidnet.com/col/attachment/2006/6/713009.gif" /> </p> <p>?<br />    以上每一步的转化都需要正的~码格式转化Q才能最l不出现q现象?br />    B、EJBcd不可以直接运行的支持c?如JavaBeanc?<br />    ׃EJBcd不可以直接运行的支持c,它们一般不与用L接交互输入和输出Q它们常怸其它的类q行交互输入和输出,所以它们在W二步被~译后,Ş成了内容是UNICODE~码的类保存在操作系l中了,以后只要它与其它的类之间的交互在参数传递过E中没有丢失Q则它就会正的q行?br />q种EJBcd不可以直接运行的支持c? 它的转化q程可用?更加明确的表C出来:</p> <p> <img style="BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; BORDER-BOTTOM: black 1px solid" src="http://java.ccidnet.com/col/attachment/2006/6/713011.gif" /> </p> <p>?<br />    C、JSP代码和Servletc?br />    l过W二步后QJSP文g也被转化为ServletscLӞ只不q它不像标准的Servlets一校存在于classes目录中,它存在于WEB容器的时目录中Q故q一步中我们也把它做为Servlets来看?br />    对于ServletsQ客Lh它时QWEB容器调用它的JVM来运行ServletQ首先,JVM把Servlet的classcMpȝ中读出ƈ装入内存中,内存中是以UNICODE~码的Servletcȝ代码Q然后JVM在内存中q行该Servletc,如果Servlet在运行的q程中,需要接受从客户端传来的字符如:表单输入的值和URL中传入的|此时如果E序中没有设定接受参数时采用的编码格式,则WEB容器会默认采用ISO-8859-1~码格式来接受传入的值ƈ在JVM中{化ؓUNICODE格式的保存在WEB容器的内存中。Servletq行后生成输出,输出的字W串是UNICODE格式的,紧接着Q容器将Servletq行产生的UNICODE格式的串Q如html语法Q用戯出的串等Q直接发送到客户端浏览器上ƈ输出l用P如果此时指定了发送时输出的编码格式,则按指定的编码格式输出到览器上Q如果没有指定,则默认按ISO-8859-1~码发送到客户的浏览器上。这UJSP代码和Servletc,它的转化q程可用?更加明确地表C出来:</p> <p> <img style="BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; BORDER-BOTTOM: black 1px solid" src="http://java.ccidnet.com/col/attachment/2006/6/713013.gif" /> </p> <p>?<br />    D、JavaE序和数据库之间<br />    对于几乎所有数据库的JDBC驱动E序Q默认的在JAVAE序和数据库之间传递数据都是以ISO-8859-1为默认编码格式的Q所以,我们的程序在向数据库内存储包含中文的数据ӞJDBC首先是把E序内部的UNICODE~码格式的数据{化ؓISO-8859-1的格式,然后传递到数据库中Q在数据库保存数据时Q它默认即以ISO-8859-1保存Q所以,q是Z么我们常常在数据库中d的中文数据是q?br />    对于JAVAE序和数据库之间的数据传递,我们可以用图4清晰地表C出?/p> <p> <img style="BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; BORDER-BOTTOM: black 1px solid" src="http://java.ccidnet.com/col/attachment/2006/6/713015.gif" /> </p> <p>?<br />    <b>3、分析常见的JAVA中文问题几个必须清楚的原?/b><br />    首先Q经q上面的详细分析Q我们可以清晰地看到QQ何JAVAE序的生命期中,其编码{换的关键q程是在于:最初编译成class文g的{码和最l向用户输出的{码过E?br />    其次Q我们必M解JAVA在编译时支持的、常用的~码格式有以下几U:<br />    *ISO-8859-1Q?-bit, ?859_1,ISO-8859-1,ISO_8859_1{编?br />    *Cp1252Q美国英语编码,同ANSI标准~码<br />    *UTF-8Q同unicode~码<br />    *GB2312Q同gb2312-80,gb2312-1980{编?br />    *GBK , 同MS936Q它是gb2312的扩?br />    及其它的~码Q如韩文、日文、繁体中文等。同Ӟ我们要注意这些编码间的兼容关体系如下Q?br />    unicode和UTF-8~码是一一对应的关pRGB2312可以认ؓ是GBK的子集,即GBK~码是在gb2312上扩展来的。同ӞGBK~码包含?0902个汉字,~码范围为:0x8140-0xfefeQ所有的字符可以一一对应到UNICODE2.0中来?br />    再次Q对于放在操作系l中?java源程序文Ӟ在编译时Q我们可以指定它内容的编码格式,具体来说?encoding来指定。注意:如果源程序中含有中文字符Q而你?encoding指定为其它的~码字符Q显然是要出错的。用-encoding指定源文件的~码方式为GBK或gb2312Q无论我们在什么系l上~译含有中文字符的JAVA源程序都不会有问题,它都会正地中文{化ؓUNICODE存储在class文g中?br />    <br />然后Q我们必L楚,几乎所有的WEB容器在其内部默认的字W编码格式都是以ISO-8859-1为默认值的Q同Ӟ几乎所有的览器在传递参数时都是默认以UTF-8的方式来传递参数的。所以,虽然我们的Java源文件在出入口的地方指定了正的~码方式Q但其在容器内部q行时还是以ISO-8859-1来处理的?br /></p> <p> </p> <p align="center"> <br /> </p> <br /> <br /> <p>   <b>4、中文问题的分类及其最优解军_?/b><br />    了解以上JAVA处理文g的原理之后,我们可以提Z一套徏议最优的解决汉字问题的办法?br />    我们的目标是Q我们在中文pȝ中编辑的含有中文字符串或q行中文处理的JAVA源程序经~译后可以移值到M其它的操作系l中正确q行Q或拿到其它操作pȝ中编译后能正运行,能正地传递中文和英文参数Q能正确地和数据库交中英文字符丌Ӏ?br />    我们的具体思\是:在JAVAE序转码的入口和出口及JAVAE序同用h输入输出转换的地斚w制编码方法之正即可?br />    具体解决办法如下Q?br />    1?针对直接在console上运行的c?br />    对于q种情况Q我们徏议在E序~写Ӟ如果需要从用户端接收用L可能含有中文的输入或含有中文的输出,E序中应该采用字W流来处理输入和输出Q具体来_应用以下面向字符型节ҎcdQ?br />    ҎӞFileReaderQFileWrieter <br />        其字节型节点类型ؓQFileInputStreamQFileOutputStream<br />    对内存(数组Q:CharArrayReaderQCharArrayWriter<br />        其字节型节点类型ؓQByteArrayInputStreamQByteArrayOutputStream<br />    对内存(字符ԌQStringReaderQStringWriter<br />    对管道:PipedReaderQPipedWriter<br />        其字节型节点类型ؓQPipedInputStreamQPipedOutputStream<br />    同时Q应该用以下面向字符型处理流来处理输入和输出Q?br />    BufferedWriterQBufferedReader<br />        其字节型的处理流为:BufferedInputeStreamQBufferedOutputStream<br />    InputStreamReaderQOutputStreamWriter<br />    其字节型的处理流为:DataInputStreamQDataOutputStream<br />    其中InputStreamReader和InputStreamWriter用于字节流按照指定的字W编码集转换到字W流Q如Q?br />    InputStreamReader in = new InputStreamReader(System.inQ?GB2312")Q?br />    OutputStreamWriter out = new OutputStreamWriter (System.outQ?GB2312")Q?br />    例如Q采用如下的CZJAVA~码pC要求Q?br />//Read.java<br />import java.io.*;<br />public class Read {<br />public static void main(String[] args) throws IOException {<br />String str = "\n中文试Q这是内部硬~码的串"+"\ntest english character";<br />String strin= "";<br />BufferedReader stdin = new BufferedReader(new InputStreamReader(System.in,"gb2312")); //讄输入接口按中文编?br />BufferedWriter stdout = new BufferedWriter(new OutputStreamWriter(System.out,"gb2312")); //讄输出接口按中文编?br />stdout.write("误?");<br />stdout.flush();<br />strin = stdin.readLine();<br />stdout.write("q是从用戯入的Ԍ"+strin);<br />stdout.write(str);<br />stdout.flush();<br />}}<br />    同时Q在~译E序Ӟ我们用以下方式来q行Q?br />    javac -encoding gb2312 Read.java<br />    其运行结果如?所C:<br /><br />    ?<br />    2?针对EJBcd不可以直接运行的支持c?如JavaBeanc?<br />    ׃q种cd们本w被其它的类调用Q不直接与用户交互,故对q种cL_我们的徏议的处理方式是内部程序中应该采用字符来处理E序内部的中文字W串Q具体如上面一节中一PQ同Ӟ在编译类时用-encoding gb2312参数指示源文件是中文格式~码的即可?br />    3?针对Servletc?br />    针对ServletQ我们徏议用以下ҎQ?br />    在编译Servletcȝ源程序时Q用-encoding指定~码为GBK或GB2312Q且在向用户输出时的~码部分用response对象的setContentType("text/html;charset=GBK");或gb2312来设|输出编码格式,同样在接收用戯入时Q我们用request.setCharacterEncoding("GB2312")Q这h论我们的servletcȝ植到什么操作系l中Q只有客L的浏览器支持中文昄Q就可以正确昄。如下是一个正的CZQ?br /><font face="Times New Roman" size="3">//HelloWorld.java<br />package hello;<br />import java.io.*;<br />import javax.servlet.*;<br />import javax.servlet.http.*;<br />public class HelloWorld extends HttpServlet<br />{<br />public void init() throws ServletException { }<br />public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException<br />{<br />request.setCharacterEncoding("GB2312"); //讄输入~码格式<br />response.setContentType("text/html;charset=GB2312"); //讄输出~码格式<br />PrintWriter out = response.getWriter(); //使用PrintWriter输出<br />out.println("&lt hr &gt");<br />out.println("Hello World! This is created by Servlet!试中文!");<br />out.println("&lt hr &gt");<br />}<br />public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException<br />{<br />request.setCharacterEncoding("GB2312"); //讄输入~码格式<br />response.setContentType("text/html;charset=GB2312"); //讄输出~码格式<br />String name = request.getParameter("name");<br />String id = request.getParameter("id");<br />if(name==null) name="";<br />if(id==null) id="";<br />PrintWriter out = response.getWriter(); //使用PrintWriter输出<br />out.println("&lt hr &gt");<br />out.println("你传入的中文字串是:" + name);<br />out.println("&lt hr &gt你输入的id是:" + id);<br />out.println("&lt hr &gt");<br />}<br />public void destroy() { }<br />}<br />    Ljavac -encoding gb2312 HelloWorld.java来编译此E序?br />    试此Servlet的程序如下所C:<br />&lt %@page contentType="text/html; charset=gb2312"% &gt<br />&lt %request.setCharacterEncoding("GB2312");% &gt<br />&lt html &gt&lt head &gt&lt title &gt&lt /title &gt<br />&lt Script language="JavaScript" &gt<br />function Submit() {<br />//通过URL传递中文字W串值给Servlet<br />document.base.action = "./HelloWorld?name=中文";<br />document.base.method = "POST";<br />document.base.submit();<br />}<br />&lt /Script &gt<br />&lt /head &gt<br />&lt body bgcolor="#FFFFFF" text="#000000" topmargin="5" &gt<br />&lt form name="base" method = "POST" target="_self" &gt<br />&lt input name="id" type="text" value="" size="30" &gt<br />&lt a href = "JavaScript:Submit()" &gt传给Servlet&lt /a &gt<br />&lt /form &gt&lt /body &gt&lt /html &gt<br />    其运行结果如?所C:<br /><br />    ?<br />    4?JAVAE序和数据库之间<br />    为避免JAVAE序和数据库之间数据传递出Cؕ码现象,我们采用以下最优方法来处理Q?br />    1?对于JAVAE序的处理方法按我们指定的方法处理?br />    2?把数据库默认支持的编码格式改为GBK或GB2312的?br />    如:在mysql中,我们可以在配|文件my.ini中加入以下语句实玎ͼ<br />    在[mysqld]区增加:<br />    default-character-set=gbk<br />    q增加:<br />    [client]<br />    default-character-set=gbk<br />    在SQL Server2K中,我们可以数据库默认的语a讄为Simplified Chinese来达到目的?br />    5?针对JSP代码<br />    ׃JSP是在q行Ӟ由WEB容器q行动态编译的Q如果我们没有指定JSP源文件的~码格式Q则JSP~译器会获得服务器操作系l的file.encoding值来对JSP文g~译的,它在UL时最Ҏ出问题,如在中文win2k中可以很好运行的jsp文g拿到英文linux中就不行Q尽客L都是一LQ那是因为容器在~译JSP文g时获取的操作pȝ的编码不同造成的(在中文wink中的file.encoding和在英文Linux中file.encoding是不同的Q且英文Linux的file.encoding对中文不支持Q所以编译出来的JSPcd会有问题Q。网l上讨论的大多数是此c问题,多是因ؓJSP文gULq_时不能正显C的问题Q对于这c问题,我们了解了JAVA中程序编码{换的原理Q解册v来就Ҏ多了。我们徏议的解决办法如下Q?br />    1、我们要保证JSP向客L输出时是采用中文~码方式输出的,x论如何我们首先在我们的JSP源代~中加入以下一行:<br /></font></p> <p> <font face="Times New Roman" size="3">  &lt %@page contentType="text/html; charset=gb2312"% &gt<br />    2、ؓ了让JSP能正获得传入的参数Q我们在JSP源文件头加入下面一句:<br />    &lt %request.setCharacterEncoding("GB2312");% &gt<br />    3、ؓ了让JSP~译器能正确地解码我们的含有中文字符的JSP文gQ我们需要在JSP源文件中指定我们的JSP源文件的~码格式Q具体来_我们在JSP源文件头上加入下面的一句即可:<br />    &lt %@page pageEncoding="GB2312"% &gt?amp;lt %@page pageEncoding="GBK"% &gt<br />    q是JSP规范2.0新增加的指o?br />    我们使用此方法来解JSP文g中的中文问题Q下面的代码是一个正做法的JSP文g的测试程序:<br />//testchinese.jsp<br />&lt %@page pageEncoding="GB2312"% &gt<br />&lt %@page contentType="text/html; charset=gb2312"% &gt<br />&lt %request.setCharacterEncoding("GB2312");% &gt<br />&lt %<br />String action = request.getParameter("ACTION");<br />String name = "";<br />String str = "";<br />if(action!=null && action.equals("SENT"))<br />{<br />name = request.getParameter("name");<br />str = request.getParameter("str");<br />}<br />% &gt<br />&lt html &gt<br />&lt head &gt<br />&lt title &gt&lt /title &gt<br />&lt Script language="JavaScript" &gt<br />function Submit()<br />{<br />document.base.action = "?ACTION=SENT&str=传入的中?;<br />document.base.method = "POST";<br />document.base.submit();<br />}<br />&lt /Script &gt<br />&lt /head &gt<br />&lt body bgcolor="#FFFFFF" text="#000000" topmargin="5" &gt<br />&lt form name="base" method = "POST" target="_self" &gt<br />&lt input type="text" name="name" value="" size="30" &gt<br />&lt a href = "JavaScript:Submit()" &gt提交&lt /a &gt<br />&lt /form &gt<br />&lt %<br />if(action!=null && action.equals("SENT"))<br />{<br />out.println("&lt br &gt你输入的字符为:"+name);<br />out.println("&lt br &gt你通过URL传入的字WؓQ?+str);<br />}<br />% &gt<br />&lt /body &gt<br />&lt /html &gt<br />    如图7是此E序q行的结果示意图Q?br /><br />    ?<br />    <b>5、ȝ</b><br />    在上面的详细分析中,我们清晰地给ZJAVA在处理源E序q程中的详细转换q程Qؓ我们正确解决JAVA~程中的中文问题提供了基。同Ӟ我们l出了认为是最优的解决JAVA中文问题的办法?br />    <b>6、参考资?/b><br />    1、段明辉.Java ~程技术中汉字问题的分析及解决.<br />        http://www-900.ibm.com/developerWorks/cn/java/java_chinese/index.shtml<br />    2?周竞?关于Java中文问题的几条分析原?br />        http://www-900.ibm.com/developerWorks/cn/java/l-javachinese/index.shtml<br />    <b>7、作者介l?/b><br />        作者:abnerchaiQ高U程序员Q作者联pL法:<a href="mailto:josserchai@yahoo.com">josserchai@yahoo.com</a><br /></font> </p> <p> <font face="Times New Roman" size="3">   </font> <br /> </p> <img src ="http://www.tkk7.com/jiabao/aggbug/109661.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/jiabao/" target="_blank">金家?/a> 2007-04-10 15:55 <a href="http://www.tkk7.com/jiabao/archive/2007/04/10/109661.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>表现层、持久层、业务层http://www.tkk7.com/jiabao/archive/2007/04/08/109189.html金家?/dc:creator>金家?/author>Sat, 07 Apr 2007 19:17:00 GMThttp://www.tkk7.com/jiabao/archive/2007/04/08/109189.htmlhttp://www.tkk7.com/jiabao/comments/109189.htmlhttp://www.tkk7.com/jiabao/archive/2007/04/08/109189.html#Feedback0http://www.tkk7.com/jiabao/comments/commentRss/109189.htmlhttp://www.tkk7.com/jiabao/services/trackbacks/109189.html

Z实现web层(strutsQ和持久层(HibernateQ之间的松散耦合Q我们采用业务代表(Business DelegateQ和DAOQData Access ObjectQ两U模式。DAO模式Z减少业务逻辑和数据访问逻辑之间的耦合Q当一个持久曾框架被应用时Q该模式会减少业务对象和该框架之间的耦合Q这h们可以不修改业务对象而选择不同的持久层框架的实现。实际上在DAO模式中包含两U结构模式:桥(BridgeQ模式和适配器(AdaptorQ模式。?/font>

对表现层Q我们?/font> Struts Q业务层使用 Spring Q对于持久层我们使用的是 Hibernate 。你可以取代这里的某个框架而用你喜欢的框架已辑ֈ同样的效果。下图显CZ框架被整合v来时Q从最高层ơ看到的视图?br />
clip_image001_0007.gif

应用?/strong>

    许多设计良好的web应用Q可以被按职责分为四层。这些层ơ是表现层、持久层、业务层、和领域模型层。每一个层ơ都有其独特的职责,不能把各自的功能与其它层ơ相混合。每一个应用层都应该和其它层隔d来,但允怋用接口在层间q行通信。我们开始来看看每个层,q讨Z下它们各自都应该提供什么和不应该提供什么?/font>

表现?/strong>

    一个典型的web 应用的末端是表现层。许多Java 开发者都知道Struts提供了什么东ѝ然而,太多时候,耦合代码比如业务逻辑被放qorg.apache.struts.Action中。所以,我们先ȝ一下Struts之类的框架应该提供什么。下面就是Struts 的职责所在:

  1. 理用户的请求和响应
  2. 提供一个控制v来将调用委托C务逻辑和其他上游处?
  3. 来自于抛出例外的其他层的例外处理到Struts Action ?
  4. l装可以在视图中表现的模型对?
  5. 执行UI 校验

下面是一些经常可以用Strutsq行~码但是不应该和表现层关联的事情Q?/font>

  1. 直接和数据库交互Q比如JDBC 调用
  2. 与应用相关的业务逻辑和校?
  3. 事务理

在表现层中引入这些类型的代码导致类型耦合和维护负担?/font>

持久?/strong>

    一个典型Web应用的另一端是持久层。这也是应用中最Ҏ很快失控的地斏V开发者通常低估了自己构q持久层框架的挑战。一个定制的Q内部开发的持久层不仅需要大量的开发时_q且通常~Z功能和难以管理。目前有许多解决q些问题的开源对象关pL?(ORM) 框架。特别地QHibernate 框架允许Java中的对象-关系的持久性和查询服务。Hibernate 对已l熟悉了SQL 和JDBC API的Java开发者来或具有中度的学习曲线。Hibernate 的持久对象基于POJO和Java集QcollectionsQ。此外,使用Hibernate 不和你的IDE接口。下面列Z你需要在持久性框架中~写的代码类型:

  1. 查询关系信息到对象中。Hibernate是通过UCؓHQL的OO查询语言Q或者用更有表现能力的规则APIQ来完成q个工作的。除了用对象而不是表Q用字D而不是列的方式,HQL非常cM?SQL。也有一些新的特定的HQL 语言特征需要学习;但是Q它们是很容易理解和良好~写的。HQL是一U用于查询对象的自然语言Q而对象,只需要很的学习曲线吧?
  2. 存储、更新和删除存储在数据库中的信息
  3. 高的对象关pL框架比如Hibernate支持大部分主SQL数据库,它们支持?子关p,事务Q承和多态?/font>

下面是应该在持久层避免的一些事情:

  1. 业务逻辑应该|于应用的更高层中。这里只允许数据讉KҎ?
  2. 不应该持久逻辑和表现逻辑耦合。避免表现组件如JSP或者基于servlet的类中的逻辑直接和数据访问进行通信。通过持久性逻辑隔离在其自己的层中,应用具有更加灵zȝ修改性而不影响到其他层的代码。例如, Hibernate可以使用其他持久框架和API代替Q而不需要修改其它层中的代码?/font>

业务层应该负责下面的问题Q?/font>

  1. 处理应用的业务逻辑和业务校?
  2. 理事务
  3. 允许与其他层q行交互的接?
  4. 理业务U对象之间的依赖?
  5. 加入了表现和持久层之间的灉|性,以便它们不需要彼此进行直接通信
  6. 从表现层暴露上下文给业务层以获得业务服务
  7. 理从业务层到表现层的实?/font>


]]>
关于POJO及DAO- -http://www.tkk7.com/jiabao/archive/2007/04/06/109033.html金家?/dc:creator>金家?/author>Fri, 06 Apr 2007 14:11:00 GMThttp://www.tkk7.com/jiabao/archive/2007/04/06/109033.htmlhttp://www.tkk7.com/jiabao/comments/109033.htmlhttp://www.tkk7.com/jiabao/archive/2007/04/06/109033.html#Feedback0http://www.tkk7.com/jiabao/comments/commentRss/109033.htmlhttp://www.tkk7.com/jiabao/services/trackbacks/109033.htmlPOJO = pure old Java object POJO有一些private的参C为对象的属性。然后针Ҏ个参数定义了get和setҎ作ؓ讉K的接口。例如: public class User {

private long id;

private String name;

public void setId(long id) {

this.id = id;

}

public void setName(String name) {

this.name=name;

}

public long getId() {

return id;

}

public String getName() {

return name;

}

}

POJO对象有时也被UCؓData对象Q大量应用于表现现实中的对象?

取自"

 

                                      

POJO = pure old java object or plain ordinary java object or what ever.

PO = persisent object 持久对象

是说在一些Object/Relation Mapping工具中,能够做到l护数据库表记录的persisent object完全是一个符合Java Bean规范的纯Java对象Q没有增加别的属性和Ҏ。全都是q样子的Q?/p>

public class User { 
  private long id; 
  private String name;
  public void setId(long id) {
 this.id = id;
}  
public void setName(String name) {
this.name=name;
} 
 public long getId() {
 return id;
}  
public String getName() { 
return name;
}
}  

首先要区别持久对象和POJO?/p>

持久对象实际上必d应数据库中的entityQ所以和POJO有所区别。比如说POJO是由new创徏Q由GC回收。但是持久对象是insert数据库创建,由数据库delete删除的。基本上持久对象生命周期和数据库密切相关。另外持久对象往往只能存在一个数据库Connection之中QConnnection关闭以后Q持久对象就不存在了Q而POJO只要不被GC回收QL存在的?/p>

׃存在诸多差别Q因此持久对象PO(Persistent Object)在代码上肯定和POJO不同Qv码PO相对于POJO会增加一些用来管理数据库entity状态的属性和Ҏ。而ORMq求的目标就是要PO在用上量和POJO一_对于E序员来_他们可以把PO当做POJO来用Q而感觉不到PO的存在?/p>

JDO的实现方法是q样的:

1、编写POJO

2、编译POJO

3、用JDO的一个专门工P叫做EnhancerQ一般是一个命令行E序Q手工运行,或者在ant脚本里面q行Q对POJO的class文g处理一下,把POJO替换成同名的PO?/p>

4、在q行期运行的实际上是POQ而不是POJO?/p>

该方法有点类gJSPQJSP也是在编译期被{换成Servlet来运行的Q在q行期实际上q行的是ServletQ而不是JSP?/p>

Hibernate的实现方法比较先q:

1、编写POJO

2、编译POJO

3、直接运行,在运行期Q由Hibernate的CGLIB动态把POJO转换为PO?/p>

由此可以看出Hibernate是在q行期把POJO的字节码转换为PO的,而JDO是在~译期{换的。一般认为JDO的方式效率会E高Q毕竟是~译期{换嘛。但是Hibernate的作者Gavin King说CGLIB的效率非怹高,q行期的PO的字节码生成速度非常之快Q效率损失几乎可以忽略不计?/p>

实际上运行期生成PO的好处非常大Q这样对于程序员来说Q是无法接触到PO的,PO对他们来说完全透明。可以更加自q以POJO的概忉|UPO。另外由于是q行期生成POQ所以可以支持增量编译,增量调试。而JDO则无法做到这一炏V实际上已经有很多h在抱怨JDO的编译期Enhancer问题了,而据说JBossDO采用运行期生成PO字节码,而不采用~译期生成PO字节码?/p>

另外一个相关的问题是,不同的JDO产品的Enhancer生成的PO字节码可能会有所不同Q可能会影响在JDO产品之间的可UL性,q一Ҏ点类似EJB的可UL性难题?/p>


p个问题另外引Z个JDO的缺陗?/p>

׃JDO的PO状态管理方式,所以当你在E序里面get/set的时候,实际上不是从PO的实例中取valuesQ而是从JDO State Manager?中取出来Q所以一旦PM关闭QPO׃能进行存取了?/p>

在JDO中,也可以通过一些办法得PO可以在PM外面使用Q比如说定义PO是transient的,但是该PO在PM关闭后就没有PO identity了。无法进行跨PM的状态管理?/p>

而Hibernate是从PO实例中取values的,所以即使Session关闭Q也一样可以get/setQ可以进行跨Session的状态管理?/p>

在分多层的应用中Q由于持久层和业务层和web层都是分开的,此时Hibernate的PO完全可以当做一个POJO来用Q也是当做一个VOQ在各层间自׃递,而不用去Session是开q是兟뀂如果你把这个POJO序列化的话,甚至可以用在分布式环境中。(不适合lazy loading的情况)

但是JDO的PO在PM关闭后就不能再用了,所以必dPM关闭前把PO拯一份VOQ把VO传递给业务层和web层用。在非分布式环境中,也可以用ThreadLocal模式保PM始终是打开状态,来避免每ơ必进行PO到VO的拷贝操作。但是不怎么_qL权宜之计Q不如Hibernate的功能强?/p>

辨别一些名词:
1。VOQ实际上很模p,通常指ValueObject和ViewObject
2. ViewObjectQ界面展现需要的对象Q如Struts的FormBean
3。Value ObjectQ早期被作ؓValueObject和Transfer Object的ȝ。实际上Value Object的真正意义在于它的内容,而不是n?
4。Transfer ObjectQ数据传输对象,在应用程序不同层ơ之间传书对象,在一个分布式应用E序中,通常可以提高整体的性能
5。POQ也许就是Persistent ObjectQ基本上是Entity?
在不同的体系l构和实现方式里面,q些对象有可能重复,也有可能不重叠。如果你要做一个对所有的体系都能够方便移植的框架Q那么每一U对象都需要严格区分。例如JDO的PO不能作ؓTOQ应为它不能qPMQ譬如你可以选择用ViewObjectQ如Struts的FOrmBean)直接作ؓTOQ但在tapestry和Webwork里面׃合适了。但在很多时候,能够方便实用是最重要的,不要q度设计是了?

POJO是这样一个对象,它是一个普通的Java对象Q它不同于EJBq样的带有繁重的容器控制功能的对象,它也不是那种被Enhancedq的对象Q例如JDO的静态EnhanceQ也不是cMHibernate那样被动态的byte code generationq?

也就是说POJO的概忉|相对于其他那U被人动q手脚的class而言的,它是没有被动q手脚的?

其实Qؓ什么要做DAO?无非是:
1Q?理connection/transaction (hibernate的话是session/transaction)
2, 便于q行l计/log操作Q?
3Q?便于q行权限控制Q?

DAO模式中,有两cd象,一U是DAOQ一U是valueObject?在我们讨论的q个情况中,value object是hibernate对应的POJO.

那么Q按照我的理解,DAO是一个Transaction包装器,光辑l构是商业的具体事务。此处,数据库的transaction和商业的事务是统一的?/p>

]]>搭徏TOMCAT+JPETSTORE出现的错?/title><link>http://www.tkk7.com/jiabao/archive/2007/04/01/107751.html</link><dc:creator>金家?/dc:creator><author>金家?/author><pubDate>Sun, 01 Apr 2007 06:15:00 GMT</pubDate><guid>http://www.tkk7.com/jiabao/archive/2007/04/01/107751.html</guid><wfw:comment>http://www.tkk7.com/jiabao/comments/107751.html</wfw:comment><comments>http://www.tkk7.com/jiabao/archive/2007/04/01/107751.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.tkk7.com/jiabao/comments/commentRss/107751.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/jiabao/services/trackbacks/107751.html</trackback:ping><description><![CDATA[ool.java:684)<br />        at java.lang.Thread.run(Thread.java:595)<br />2007-04-01 13:52:17,234 [http-8080-Processor20] DEBUG org.apache.struts.action.R<br />equestProcessor - processForwardConfig(ForwardConfig[name=null,path=/common/Erro<br />r.jsp,redirect=false,contextRelative=false,module=null])<br />2007-04-01 13:52:17,968 [http-8080-Processor20] DEBUG org.apache.struts.util.Mod<br />uleUtils - Get module name for path /shop/viewCategory.shtml<br />2007-04-01 13:52:17,968 [http-8080-Processor20] DEBUG org.apache.struts.util.Mod<br />uleUtils - Module name found: default<br />2007-04-01 13:52:17,968 [http-8080-Processor20] DEBUG org.apache.struts.action.R<br />equestProcessor - Processing a 'GET' for path '/shop/viewCategory'<br />2007-04-01 13:52:17,968 [http-8080-Processor20] DEBUG org.apache.struts.util.Req<br />uestUtils -  Looking for ActionForm bean instance in scope 'request' under attri<br />bute key 'productListForm'<br />2007-04-01 13:52:17,968 [http-8080-Processor20] DEBUG org.apache.struts.util.Req<br />uestUtils -  Creating new ActionForm instance of type 'com.jdon.strutsutil.Model<br />ListForm'<br />2007-04-01 13:52:17,968 [http-8080-Processor20] DEBUG org.apache.struts.util.Req<br />uestUtils -  --> <a href="mailto:com.jdon.strutsutil.ModelListForm@1ff2e1b">com.jdon.strutsutil.ModelListForm@1ff2e1b</a><br />2007-04-01 13:52:17,968 [http-8080-Processor20] DEBUG org.apache.struts.action.R<br />equestProcessor -  Storing ActionForm bean instance in scope 'request' under att<br />ribute key 'productListForm'<br />2007-04-01 13:52:17,968 [http-8080-Processor20] DEBUG org.apache.struts.action.R<br />equestProcessor -  Populating bean properties from this request<br />2007-04-01 13:52:17,968 [http-8080-Processor20] DEBUG org.apache.struts.action.R<br />equestProcessor -  Looking for Action instance for class com.jdon.framework.samp<br />les.jpetstore.presentation.action.ProductListAction<br />2007-04-01 13:52:17,968 [http-8080-Processor20] DEBUG org.apache.struts.action.R<br />equestProcessor -   Returning existing Action instance<br />2007-04-01 13:52:17,984 [http-8080-Processor20] DEBUG com.jdon.bussinessproxy.co<br />nfig.TargetMetaDefXmlLoader - [JdonFramework]metaDefs size:12<br />2007-04-01 13:52:17,984 [http-8080-Processor20] DEBUG com.jdon.controller.servic<br />e.WebServiceFactory - [JdonFramework] getService was found in:productManager<br />2007-04-01 13:52:17,984 [http-8080-Processor20] DEBUG com.jdon.security.web.Http<br />RequestUserSetup - [JdonFramework] setArrtibute:REMOTE_ADDRESS=127.0.0.1<br />2007-04-01 13:52:17,984 [http-8080-Processor20] DEBUG com.jdon.container.access.<br />ServiceAccessorImp - [JdonFramework] enter getService: proxyInstanceFactoryVisit<br />able in action<br />2007-04-01 13:52:17,984 [http-8080-Processor20] DEBUG com.jdon.container.visitor<br />.HttpSessionProxyVisitor - [JdonFramework] get the optimized instance for the ke<br />y com.jdon.framework.samples.jpetstore.service.bo.ProductManagerImpproxyInstance<br />FactoryVisitable<br />2007-04-01 13:52:17,984 [http-8080-Processor20] DEBUG com.jdon.bussinessproxy.dy<br />ncproxy.DynamicProxyWeaving - [JdonFramework]call method:com.jdon.framework.samp<br />les.jpetstore.service.ProductManager.getProductIDsListByCategory<br />2007-04-01 13:52:17,984 [http-8080-Processor20] DEBUG com.jdon.aop.AopClient - [<br />JdonFramework] enter AOP invoker2 for:com.jdon.framework.samples.jpetstore.servi<br />ce.bo.ProductManagerImp method:getProductIDsListByCategory<br />2007-04-01 13:52:17,984 [http-8080-Processor20] DEBUG com.jdon.aop.joinpoint.Adv<br />isorChainFactory - [JdonFramework] enter  create PointcutAdvisor<br />2007-04-01 13:52:17,984 [http-8080-Processor20] DEBUG com.jdon.aop.joinpoint.Adv<br />isorChainFactory - [JdonFramework] find all service's interceptos size=1<br />2007-04-01 13:52:17,984 [http-8080-Processor20] DEBUG com.jdon.aop.joinpoint.Adv<br />isorChainFactory - [JdonFramework] find pojoService's interceptos size=4<br />2007-04-01 13:52:17,984 [http-8080-Processor20] DEBUG com.jdon.aop.reflection.Pr<br />oxyMethodInvocation - [JdonFramework] method.getName() :getProductIDsListByCateg<br />ory<br />2007-04-01 13:52:17,984 [http-8080-Processor20] DEBUG com.jdon.aop.AopClient - [<br />JdonFramework] MethodInvocation will proceed ...<br />2007-04-01 13:52:17,984 [http-8080-Processor20] DEBUG com.jdon.aop.interceptor.C<br />acheInterceptor - [JdonFramework]methodMatchsModelGET: returnClassName = com.jdo<br />n.controller.model.PageIterator<br />2007-04-01 13:52:17,984 [http-8080-Processor20] DEBUG com.jdon.aop.interceptor.P<br />oolInterceptor - [JdonFramework] enter PoolInterceptor<br />2007-04-01 13:52:17,984 [http-8080-Processor20] DEBUG com.jdon.aop.interceptor.P<br />oolInterceptor - [JdonFramework] borrow a object:com.jdon.framework.samples.jpet<br />store.service.bo.ProductManagerImp id:17427094 from pool<br />2007-04-01 13:52:17,984 [http-8080-Processor20] DEBUG com.jdon.aop.interceptor.P<br />oolInterceptor - [JdonFramework]pool state: active=1 free=0<br />2007-04-01 13:52:17,984 [http-8080-Processor20] DEBUG com.jdon.aop.reflection.Pr<br />oxyMethodInvocation - [JdonFramework] finish call all inteceptors<br />2007-04-01 13:52:17,984 [http-8080-Processor20] DEBUG com.jdon.aop.reflection.Pr<br />oxyMethodInvocation - [JdonFramework]enter method reflection<br />2007-04-01 13:52:17,984 [http-8080-Processor20] DEBUG com.jdon.aop.reflection.Pr<br />oxyMethodInvocation - [JdonFramework] target:com.jdon.framework.samples.jpetstor<br />e.service.bo.ProductManagerImp service's method:getProductIDsListByCategory runn<br />ing..<br />2007-04-01 13:52:17,984 [http-8080-Processor20] DEBUG com.jdon.aop.reflection.Pr<br />oxyMethodInvocation - [JdonFramework] it is pojo target service<br />2007-04-01 13:52:17,984 [http-8080-Processor20] DEBUG com.jdon.aop.reflection.Me<br />thodInvokerUtil - [JdonFramework] method invoke: com.jdon.framework.samples.jpet<br />store.service.bo.ProductManagerImp method=getProductIDsListByCategory<br />2007-04-01 13:52:17,984 [http-8080-Processor20] DEBUG com.jdon.framework.samples<br />.jpetstore.service.bo.ProductManagerImp -  getProductIDsListByCategory<br />2007-04-01 13:52:17,984 [http-8080-Processor20] ERROR com.jdon.framework.samples<br />.jpetstore.service.bo.ProductManagerImp -  Dao error : com.ibatis.dao.client.Dao<br />Exception: Error starting SQL Map transaction.  Cause: java.sql.SQLException: In<br />valid authorization specification,  message from server: "Access denied for user<br /> <a href="mailto:'banq'@'localhost'">'banq'@'localhost'</a> (using password: YES)"<br />Caused by: java.sql.SQLException: Invalid authorization specification,  message<br />from server: "Access denied for user <a href="mailto:'banq'@'localhost'">'banq'@'localhost'</a> (using password: YES)"<br />2007-04-01 13:52:17,984 [http-8080-Processor20] DEBUG com.jdon.aop.reflection.Me<br />thodInvokerUtil - [JdonFramework] method invoke successfully<br />2007-04-01 13:52:17,984 [http-8080-Processor20] DEBUG com.jdon.aop.interceptor.P<br />oolInterceptor - [JdonFramework] realease a object:com.jdon.framework.samples.jp<br />etstore.service.bo.ProductManagerImp to pool<br />2007-04-01 13:52:17,984 [http-8080-Processor20] DEBUG com.jdon.bussinessproxy.dy<br />ncproxy.DynamicProxyWeaving - [JdonFramework]call method:getProductIDsListByCate<br />gory finish!<br />2007-04-01 13:52:17,984 [http-8080-Processor20] DEBUG org.apache.struts.action.E<br />xceptionHandler - ExceptionHandler caught this exception:<br />java.lang.Exception: getPageIterator's result is null, check your ModelListActio<br />n subclass<br />        at com.jdon.strutsutil.ModelListAction.execute(ModelListAction.java:67)<br />        at org.apache.struts.action.RequestProcessor.processActionPerform(Reques<br />tProcessor.java:421)<br />        at org.apache.struts.action.RequestProcessor.process(RequestProcessor.ja<br />va:226)<br />        at org.apache.struts.action.ActionServlet.process(ActionServlet.java:116<br />4)<br />        at org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:397)<br />        at javax.servlet.http.HttpServlet.service(HttpServlet.java:689)<br />        at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)<br />        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(Appl<br />icationFilterChain.java:252)<br />        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationF<br />ilterChain.java:173)<br />        at com.jdon.util.SetCharacterEncodingFilter.doFilter(SetCharacterEncodin<br />gFilter.java:92)<br />        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(Appl<br />icationFilterChain.java:202)<br />        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationF<br />ilterChain.java:173)<br />        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperV<br />alve.java:214)<br />        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextV<br />alve.java:178)<br />        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.j<br />ava:126)<br />        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.j<br />ava:105)<br />        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineVal<br />ve.java:107)<br />        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.jav<br />a:148)<br />        at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java<br />:825)<br />        at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.proce<br />ssConnection(Http11Protocol.java:738)<br />        at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpo<br />int.java:526)<br />        at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFol<br />lowerWorkerThread.java:80)<br />        at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadP<br />ool.java:684)<br />        at java.lang.Thread.run(Thread.java:595)<br />2007-04-01 13:52:17,984 [http-8080-Processor20] DEBUG org.apache.struts.action.R<br />equestProcessor - processForwardConfig(ForwardConfig[name=null,path=/common/Erro<br />r.jsp,redirect=false,contextRelative=false,module=null])<br />2007-04-01 13:52:18,531 [http-8080-Processor20] DEBUG org.apache.struts.util.Mod<br />uleUtils - Get module name for path /shop/viewCategory.shtml<br />2007-04-01 13:52:18,531 [http-8080-Processor20] DEBUG org.apache.struts.util.Mod<br />uleUtils - Module name found: default<br />2007-04-01 13:52:18,531 [http-8080-Processor20] DEBUG org.apache.struts.action.R<br />equestProcessor - Processing a 'GET' for path '/shop/viewCategory'<br />2007-04-01 13:52:18,531 [http-8080-Processor20] DEBUG org.apache.struts.util.Req<br />uestUtils -  Looking for ActionForm bean instance in scope 'request' under attri<br />bute key 'productListForm'<br />2007-04-01 13:52:18,531 [http-8080-Processor20] DEBUG org.apache.struts.util.Req<br />uestUtils -  Creating new ActionForm instance of type 'com.jdon.strutsutil.Model<br />ListForm'<br />2007-04-01 13:52:18,531 [http-8080-Processor20] DEBUG org.apache.struts.util.Req<br />uestUtils -  --> <a href="mailto:com.jdon.strutsutil.ModelListForm@2bfdff">com.jdon.strutsutil.ModelListForm@2bfdff</a><br />2007-04-01 13:52:18,531 [http-8080-Processor20] DEBUG org.apache.struts.action.R<br />equestProcessor -  Storing ActionForm bean instance in scope 'request' under att<br />ribute key 'productListForm'<br />2007-04-01 13:52:18,531 [http-8080-Processor20] DEBUG org.apache.struts.action.R<br />equestProcessor -  Populating bean properties from this request<br />2007-04-01 13:52:18,531 [http-8080-Processor20] DEBUG org.apache.struts.action.R<br />equestProcessor -  Looking for Action instance for class com.jdon.framework.samp<br />les.jpetstore.presentation.action.ProductListAction<br />2007-04-01 13:52:18,531 [http-8080-Processor20] DEBUG org.apache.struts.action.R<br />equestProcessor -   Returning existing Action instance<br />2007-04-01 13:52:18,531 [http-8080-Processor20] DEBUG com.jdon.bussinessproxy.co<br />nfig.TargetMetaDefXmlLoader - [JdonFramework]metaDefs size:12<br />2007-04-01 13:52:18,531 [http-8080-Processor20] DEBUG com.jdon.controller.servic<br />e.WebServiceFactory - [JdonFramework] getService was found in:productManager<br />2007-04-01 13:52:18,531 [http-8080-Processor20] DEBUG com.jdon.security.web.Http<br />RequestUserSetup - [JdonFramework] setArrtibute:REMOTE_ADDRESS=127.0.0.1<br />2007-04-01 13:52:18,531 [http-8080-Processor20] DEBUG com.jdon.container.access.<br />ServiceAccessorImp - [JdonFramework] enter getService: proxyInstanceFactoryVisit<br />able in action<br />2007-04-01 13:52:18,531 [http-8080-Processor20] DEBUG com.jdon.container.visitor<br />.HttpSessionProxyVisitor - [JdonFramework] get the optimized instance for the ke<br />y com.jdon.framework.samples.jpetstore.service.bo.ProductManagerImpproxyInstance<br />FactoryVisitable<br />2007-04-01 13:52:18,531 [http-8080-Processor20] DEBUG com.jdon.bussinessproxy.dy<br />ncproxy.DynamicProxyWeaving - [JdonFramework]call method:com.jdon.framework.samp<br />les.jpetstore.service.ProductManager.getProductIDsListByCategory<br />2007-04-01 13:52:18,531 [http-8080-Processor20] DEBUG com.jdon.aop.AopClient - [<br />JdonFramework] enter AOP invoker2 for:com.jdon.framework.samples.jpetstore.servi<br />ce.bo.ProductManagerImp method:getProductIDsListByCategory<br />2007-04-01 13:52:18,531 [http-8080-Processor20] DEBUG com.jdon.aop.joinpoint.Adv<br />isorChainFactory - [JdonFramework] enter  create PointcutAdvisor<br />2007-04-01 13:52:18,531 [http-8080-Processor20] DEBUG com.jdon.aop.joinpoint.Adv<br />isorChainFactory - [JdonFramework] find all service's interceptos size=1<br />2007-04-01 13:52:18,531 [http-8080-Processor20] DEBUG com.jdon.aop.joinpoint.Adv<br />isorChainFactory - [JdonFramework] find pojoService's interceptos size=4<br />2007-04-01 13:52:18,531 [http-8080-Processor20] DEBUG com.jdon.aop.reflection.Pr<br />oxyMethodInvocation - [JdonFramework] method.getName() :getProductIDsListByCateg<br />ory<br />2007-04-01 13:52:18,531 [http-8080-Processor20] DEBUG com.jdon.aop.AopClient - [<br />JdonFramework] MethodInvocation will proceed ...<br />2007-04-01 13:52:18,531 [http-8080-Processor20] DEBUG com.jdon.aop.interceptor.C<br />acheInterceptor - [JdonFramework]methodMatchsModelGET: returnClassName = com.jdo<br />n.controller.model.PageIterator<br />2007-04-01 13:52:18,531 [http-8080-Processor20] DEBUG com.jdon.aop.interceptor.P<br />oolInterceptor - [JdonFramework] enter PoolInterceptor<br />2007-04-01 13:52:18,531 [http-8080-Processor20] DEBUG com.jdon.aop.interceptor.P<br />oolInterceptor - [JdonFramework] borrow a object:com.jdon.framework.samples.jpet<br />store.service.bo.ProductManagerImp id:17427094 from pool<br />2007-04-01 13:52:18,531 [http-8080-Processor20] DEBUG com.jdon.aop.interceptor.P<br />oolInterceptor - [JdonFramework]pool state: active=1 free=0<br />2007-04-01 13:52:18,531 [http-8080-Processor20] DEBUG com.jdon.aop.reflection.Pr<br />oxyMethodInvocation - [JdonFramework] finish call all inteceptors<br />2007-04-01 13:52:18,531 [http-8080-Processor20] DEBUG com.jdon.aop.reflection.Pr<br />oxyMethodInvocation - [JdonFramework]enter method reflection<br />2007-04-01 13:52:18,531 [http-8080-Processor20] DEBUG com.jdon.aop.reflection.Pr<br />oxyMethodInvocation - [JdonFramework] target:com.jdon.framework.samples.jpetstor<br />e.service.bo.ProductManagerImp service's method:getProductIDsListByCategory runn<br />ing..<br />2007-04-01 13:52:18,531 [http-8080-Processor20] DEBUG com.jdon.aop.reflection.Pr<br />oxyMethodInvocation - [JdonFramework] it is pojo target service<br />2007-04-01 13:52:18,531 [http-8080-Processor20] DEBUG com.jdon.aop.reflection.Me<br />thodInvokerUtil - [JdonFramework] method invoke: com.jdon.framework.samples.jpet<br />store.service.bo.ProductManagerImp method=getProductIDsListByCategory<br />2007-04-01 13:52:18,531 [http-8080-Processor20] DEBUG com.jdon.framework.samples<br />.jpetstore.service.bo.ProductManagerImp -  getProductIDsListByCategory<br />2007-04-01 13:52:18,546 [http-8080-Processor20] ERROR com.jdon.framework.samples<br />.jpetstore.service.bo.ProductManagerImp -  Dao error : com.ibatis.dao.client.Dao<br />Exception: Error starting SQL Map transaction.  Cause: java.sql.SQLException: In<br />valid authorization specification,  message from server: "Access denied for user<br /> <a href="mailto:'banq'@'localhost'">'banq'@'localhost'</a> (using password: YES)"<br />Caused by: java.sql.SQLException: Invalid authorization specification,  message<br />from server: "Access denied for user <a href="mailto:'banq'@'localhost'">'banq'@'localhost'</a> (using password: YES)"<br />2007-04-01 13:52:18,546 [http-8080-Processor20] DEBUG com.jdon.aop.reflection.Me<br />thodInvokerUtil - [JdonFramework] method invoke successfully<br />2007-04-01 13:52:18,546 [http-8080-Processor20] DEBUG com.jdon.aop.interceptor.P<br />oolInterceptor - [JdonFramework] realease a object:com.jdon.framework.samples.jp<br />etstore.service.bo.ProductManagerImp to pool<br />2007-04-01 13:52:18,546 [http-8080-Processor20] DEBUG com.jdon.bussinessproxy.dy<br />ncproxy.DynamicProxyWeaving - [JdonFramework]call method:getProductIDsListByCate<br />gory finish!<br />2007-04-01 13:52:18,546 [http-8080-Processor20] DEBUG org.apache.struts.action.E<br />xceptionHandler - ExceptionHandler caught this exception:<br />java.lang.Exception: getPageIterator's result is null, check your ModelListActio<br />n subclass<br />        at com.jdon.strutsutil.ModelListAction.execute(ModelListAction.java:67)<br />        at org.apache.struts.action.RequestProcessor.processActionPerform(Reques<br />tProcessor.java:421)<br />        at org.apache.struts.action.RequestProcessor.process(RequestProcessor.ja<br />va:226)<br />        at org.apache.struts.action.ActionServlet.process(ActionServlet.java:116<br />4)<br />        at org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:397)<br />        at javax.servlet.http.HttpServlet.service(HttpServlet.java:689)<br />        at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)<br />        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(Appl<br />icationFilterChain.java:252)<br />        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationF<br />ilterChain.java:173)<br />        at com.jdon.util.SetCharacterEncodingFilter.doFilter(SetCharacterEncodin<br />gFilter.java:92)<br />        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(Appl<br />icationFilterChain.java:202)<br />        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationF<br />ilterChain.java:173)<br />        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperV<br />alve.java:214)<br />        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextV<br />alve.java:178)<br />        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.j<br />ava:126)<br />        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.j<br />ava:105)<br />        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineVal<br />ve.java:107)<br />        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.jav<br />a:148)<br />        at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java<br />:825)<br />        at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.proce<br />ssConnection(Http11Protocol.java:738)<br />        at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpo<br />int.java:526)<br />        at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFol<br />lowerWorkerThread.java:80)<br />        at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadP<br />ool.java:684)<br />        at java.lang.Thread.run(Thread.java:595)<br />2007-04-01 13:52:18,546 [http-8080-Processor20] DEBUG org.apache.struts.action.R<br />equestProcessor - processForwardConfig(ForwardConfig[name=null,path=/common/Erro<br />r.jsp,redirect=false,contextRelative=false,module=null])<br />2007-04-01 14:02:02,593 [ContainerBackgroundProcessor[StandardEngine[Catalina]]]<br /> DEBUG com.jdon.container.visitor.HttpSessionProxyVisitor - [JdonFramework] unva<br />lueBound active, sessionId :3523A004637D3D889596DC8076494139<br />2007-04-01 14:02:02,593 [ContainerBackgroundProcessor[StandardEngine[Catalina]]]<br /> DEBUG com.jdon.container.visitor.HttpSessionProxyVisitor - [JdonFramework] unva<br />lueUnbound active, componentsboxs size2<br /><img src ="http://www.tkk7.com/jiabao/aggbug/107751.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/jiabao/" target="_blank">金家?/a> 2007-04-01 14:15 <a href="http://www.tkk7.com/jiabao/archive/2007/04/01/107751.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何从开发h员走向架构师http://www.tkk7.com/jiabao/archive/2007/03/16/104379.html金家?/dc:creator>金家?/author>Fri, 16 Mar 2007 15:23:00 GMThttp://www.tkk7.com/jiabao/archive/2007/03/16/104379.htmlhttp://www.tkk7.com/jiabao/comments/104379.htmlhttp://www.tkk7.com/jiabao/archive/2007/03/16/104379.html#Feedback0http://www.tkk7.com/jiabao/comments/commentRss/104379.htmlhttp://www.tkk7.com/jiabao/services/trackbacks/104379.html

  在寻找优U的指挥的时候,您首先要扄是一名优U的音乐演奏家。但q每个音乐演奏安能成ZU的指挥。架构师的专业发展方面也与此cM。越来越多的 IT l织开始认识到良好软g体系l构的重要性,架构师职业正q速发展ؓ IT 内一个独立的门类。由于要从相当小的候选范围内招募架构师,因此q就l管理带来了一些新挑战。即使h力资源部门找C候选者,针对l验q行的筛选也比其他门cLZ根{跨这些障的最快方式是要认识到Q大部分好的架构师同时也是好的开发h员,因此L架构师h才时可能首先应该从普通开发h员中找v。招聘h员在对候选?内部或外?q行详细审查Ӟ应该考虑q个观点。不q,Ҏ资源q行挑选可能比较麻烦,因ؓ只有极少的优U开发h员具有成为架构师的特征或愿望?/p>

  本文列出了开发h员成为架构师要进行的工作。我从可能考虑q行此{型的开发h员和评估q行此{型的开发h员的l理q两个方面来探讨q一问题。我q将提供一pd在做些决{时要考虑的因素?/p>

  个h特征

  软g开发团队和理层之间的联系始终?IT 中的一个关键所在。二者都們֐于以完全不同的方式考虑l定的问题。大部分相关技?/b>都是讨论目l理应如何跟t和解释开发h员的q度和问题。但沟通不的情况仍然非常普遍Q而且q是目p|的首要原因。好的架构师是解册个问题的最有效办法。架构师的主要责L提供开发h员和目l理之间的共用沟通媒体。他们负责让业务规则及需求与工程实践及限制相适应Q以保成功。以下是成功架构师的一些主要特征?/p>

  愿意q有能力q行沟通:在开发h员中发现架构师的最有h值标准是有效的沟通。您需要技术娴熟、经验丰富的开发h员,q样的h员需要有项目中的业务相关问题进行沟通的l历。架构师l常必须对理解方面的差距q行预计Q然后才能有所贡献。他们必L意克服困难来保技术和业务观点的融合。他们ƈ不必Ҏ见交换工作进行计划和协调;q仍然主要是目l理的工作。他们的d是确定表q系l?b onmouseover="isShowAds = true;isShowAds2 = true;ads.Move(this,"http://rad.17luntan.com/UploadImage/17/633058554832006250.gif","%u201C%u593A%u5B9D%u5947%u5175%uFF0C%u9510%u4E0D%u53EF%u5F53%21%20%u8D2DLG%u9510%u6BD4%u6DB2%u6676%uFF0C%u60CA%u559C%u597D%u793C%u7B49%u4F60%u62FF%21%u201D%20%20%20%20","19228","设计","%u8BBE%u8BA1","http%3A//210.192.100.35/11725683872830http%3A//www.lgemonitor.com.cn/mnt/sale0703/index.html%3F11725683872830")" style="FONT-WEIGHT: normal; CURSOR: hand; COLOR: #0000ff; TEXT-DECORATION: underline" onmouseout="javascript:isShowAds = false;isShowAds2 = false;">设计时的最佛_具和构gQ以促进有效的意见交换。他们必能够判断当前方法显得不需要采用新Ҏ的情c写作技能也非常重要Q还需要具有制作草囄技能或使用制图软g的能力?

  h处理谈判l节斚w的经验:架构师经帔R要负责讨论系l开发的技术折h案。优先的冲H可能会带来实践限制、风险规避或可能D在各个不同业务组之间需求不同。优U的架构师能够有效地评估技术可能性,q能在不损失目的主要h值的前提下制订开发计划来处理各种利害关系和限制。这与前面讨论的沟通技能紧密相养I但同时也要体现架构师的技术能力。好的架构师候选者应该是l常帮助Ҏ争议的讨行引导的人,能够使讨论得出新的想法,而不会其在一个位|停滞不前?

  自觉d;U极解决设计问题Q?/strong>架构师的日常工作目标l常q不明确。很多开发h员直接参考功能规范来列出d清单。架构师通常则是向这些开发h员提供所需l构的h员,以便可能提高工作效率。好的候选者不仅进行沟通方面的工作Q而且也会预计各种设计问题q加以解决——通常在没有Q何具体指C的情况下自觉进行。无论所分配的职责如何,U极参与目的开发h员都有机会从一起工作的人员中脱颖而出?

  抽象思维和分析:架构师必能够理解表q模p的概念q将其变成相兛_方能够理解的目构g。他们必能够理解抽象概念,q以具体的语a对其q行沟通。开发h员中好的候选者经常要求或自己d解释开发生命周期中Ҏh的问题。他们能q速评估各U想法ƈ其U_后箋工作的操作徏议中?/p>

  开发h员经常具有很强的数学能力Q而好的架构师则們֐于表现出更强的口头表达能力。管理h员经常说开发h员具有“工E意识”,而这是一个用于评估架构师的非常有意义的方面。架构师应该h很强的解x术问题的能力Q但q必能够准获知更为全面的人员如何与技术交互的信息。这要求h某种形式的抽象思维(而不再是代码的细?Q这U思维能力可能较难形成?/p>

  有些为,某种U别的正式教育是成ؓ优秀开发h员的必备条g之一Q我q不同意q种_英论。我遇到了很多高中就辍学的优U开发h员。不q,对于体系l构设计工作Q我的个人经验以及我Ҏ需能力的认识都让我怿Q好的架构师通常臛_获得了一个有挑战性的学士学位?/p>

  跟踪生命周期

  好的架构师通常有在具备定义良好的Y件开发生命周?Software Development Life CycleQSDLC)的组l工作的l验。架构师必须理解在其所属专业内最重要的操作过E。这q不意味着需要有其他前提Q例如,q不需要高能力成熟度模?Capability Maturity ModelQCMM)U别的工作经验。好的架构师可能来自使用 SDLC 的多个小型P代的极限~程(Extreme ProgrammingQXP)Ҏ的组l。务必注意各U传lY件开发操作,?Michael A. Jackson 的方法:Jackson l构~程(Jackson Structured ProgrammingQJSP)?Jackson pȝ开?Jackson System DevelopmentQJSD)。Jackson 的研I对架构师职业发展的意义像 Donald Knuth 的研I对E序员一样重要。架构师可以偏爱Ml典的、经q时间考验的Y件系l开发方法?/p>

  SDLC 也可以成估架构师合适h选的有用机制。每?SDLC 阶段都具有能提供相关U烦的特征。SDLC 包含很多的变体Q但在此部分Q我用几乎所有方法的公共基础部分。下面的列表详细说明?SDLC 的各个阶D,q列Z好的架构师候选者在每个阶段表现出来的特征?/p>

  •   分析Q?/strong>在分析期_好的架构师会考虑非技术媄响,以便了解需求和在其中q行开发的环境。架构师可ؓ风险评估d带来q泛的Y件经验供参考。寻扑օ有丰富经验的开发h员,以帮助业务部门理解技术h员正解释需求所需的信息。寻扑֜开发的早期阶段能够预计可能遇到的问题的开发h员?
  •   设计Q?/strong>在高U设计期_好的架构师会攉问题I间的各个抽象元素,q就其进行沟通,以便开发团队草拟将要开发的pȝ的相兛_表。架构师负责需求}慎地映射到所得到的系l体pȝ构的功能。在详细设计期间Q他们所扮演的角色ƈ不是核心角色Q但ZҎ整个pȝ的规则对特定模块的元素进行审查,仍然需要他们。寻扑֖于让团队能够预计设计决策Ҏl系l的影响的开发h员。寻扑֖于确定一些最x件来促进与技术和非技术受众沟通设计问题的开发h员?
  •   实现Q?/strong>在实现期_架构师对目q行引导Q以保其符合系l体pȝ构。他们在一U评估技术更改请求,q确定如何对设计q行调整Q以最好地处理此类h。架构师q要密切了解开发h员的q度Q特别要跟踪pȝ中模块间的集成点的状态。寻扄常对讨论q行引导来连接多个子pȝ的开发h员。寻N目经理可以依赖其快速地q行与更改和出现的问题相关的风险评估的开发h员?
  •   试Q?/strong>架构师对pȝ集成和用h受度试q行指导Qƈ负责评估q度的正沟通的持箋试l果。寻扄解错误模式且善于测试复查结果{换ؓ行动计划的开发h员?
  •   l护Q?/strong>在维护期_架构师将发v关于pȝ集成的讨论。无论处?IT 基础设施问题Q还是确保部门之间的技术合作,架构师都必须完全理解应用E序Q必d速学习姊妹应用程序的体系l构Q而且必须集成点和风险进行有效沟通。寻扑օ有系l集成经验且表现出快速掌握全貌的能力的开发h员。系l集成是一独特的d?

  架构师培d?/strong>

  有些l织能比其他l织更有效地q行架构师培充R如果充分考虑到招聘此cL专业人才的困难,努力促成能鼓励开发h员发展ؓ架构师的环境是非常明智的{略。但务必避免对不愿意或不适合走这条\的开发h员进行处|。组l应该ؓ开发h员制订多条发展\U,包括那些愿意l箋担Q开发h员的人。对架构师而言Q资深开发h员不可或~。他们可以实现系l中最关键的模块。通过对其他开发h员进行代码检查和试支持Q他们可帮助保M软g质量Q而如果质量不能保证,即最好的体系l构也毫无用处?/p>

  l织应制订个估程序,以鼓励开发h员考虑其职业目标,其中要包含体pȝ构设计的选项。应该鼓q理在其下属中L体系l构设计人才。应该实现指D划,让架构师与希望成为架构师的开发h员协作工作。应该鼓励开发h员通过参加各种协会、撰写文章和参加会议Q从而参与到专业领域中来。通过q样参与q来Q可帮助开发h员从新的角度理解pȝQƈ帮助他们更好地就其认识进行沟通。这栯能培d提高效率的重要创新想法?/p>

  l束?/strong>

  开发h员一旦迈Z通向体系l构设计专业方向的第一步,可以利用很多资源来获得帮助Q其中包括很多来?IBM 的资源。有时候,此过E的最困难的部分就是第一步,而本文提供了一些线索和提示Q经理和开发h员可以利用其来评估应该鼓励哪些h努力成ؓ架构师?/p>

声明Q文章摘自CSDN



]]>
վ֩ģ壺 Ļպ| ޾Ʒ| һaëƬƵ| Ů˱˾޴| ŮҰbbwbbw| | һɫݳѾƷվ| 123Һ| ŮƷþþ2020| һѿ| ޾Ʒ| ޾Ʒa| www.999ƷƵۿ| պëƬƵѿ| aһƵ| 69˾ƷƵ | 97ۺɫ| һ߹ۿ| ձɫͼ߹ۿ| ɫƷһ| ޾Ʒ˳߹ۿ| ޾Ʒa߹ۿ| 98Ƶ| avվ| 97޾ƷȫƵ| þŷƷ| ޾Һһ| ޼Ƶ| ޱ龫Ʒһ| ƷƵȫѹۿ| av벻þ| Ů˾޸| ߲˳Ƶ߹ۿ| AëƬƵ߲| avƬ쿴| ƷһëƬƵۿ| ĻƷ| վ߹ۿ| ˵һavվ| þAV뾫Ʒɫҹ | һӰԺ|