??xml version="1.0" encoding="utf-8" standalone="yes"?>国产日韩欧美制服另类,日韩精品一区二区三区第95 ,国产一区 二区http://www.aygfsteel.com/FaithChen/上善若水,厚d载物;无欲则刚,止于臛_zh-cnTue, 24 Jun 2025 14:52:55 GMTTue, 24 Jun 2025 14:52:55 GMT60详细讲解Java中log4j的用方?/title><link>http://www.aygfsteel.com/FaithChen/archive/2010/06/29/324743.html</link><dc:creator>FaithChen</dc:creator><author>FaithChen</author><pubDate>Tue, 29 Jun 2010 02:27:00 GMT</pubDate><guid>http://www.aygfsteel.com/FaithChen/archive/2010/06/29/324743.html</guid><wfw:comment>http://www.aygfsteel.com/FaithChen/comments/324743.html</wfw:comment><comments>http://www.aygfsteel.com/FaithChen/archive/2010/06/29/324743.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/FaithChen/comments/commentRss/324743.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/FaithChen/services/trackbacks/324743.html</trackback:ping><description><![CDATA[1、Log4j是什么?<br />   Log4j可以帮助调试Q有时候debug是发挥不了作 用的Q和分析Q要下蝲和了解更详细的内容,q是讉K其官方网站吧Q?http://jakarta.apache.org/log4j .<br /> <br />   2、Log4j的概?br />   Log4j中有三个主要的组Ӟ它们分别?Logger、Appender和LayoutQLog4j 允许开发h员定义多个LoggerQ每个Logger拥有自己的名字,Logger之间通过名字来表明隶属关pR有一个LoggerUCؓ(f)RootQ它永远存在Q且不能通过名字索或引用Q可以通过Logger.getRootLoggerQ)Ҏ(gu)获得Q其它Logger通过 Logger.getLoggerQString nameQ方法?br />   Appender则是用来指明所有的log信息存放C么地方,Log4j中支持多UappenderQ如 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 />   3、Log4j的配|文?br />   虽然可以不用配置文gQ而在E序中实现配|,但这U方法在如今的系l开发中昄是不可取的,能采用配|文件的地方一定一定要用配|文件。Log4j支持?U格式的配置文gQXML格式和Java的property格式Q本人更喜欢后者,首先看一个简单的例子吧,如下Q?br />    log4j.rootLogger=debug, stdout, R<br />    log4j.appender.stdout=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] (%F:%L) - %m%n<br /> <br />    log4j.appender.R=org.apache.log4j.RollingFileAppender<br />    log4j.appender.R.File=example.log<br />    log4j.appender.R.MaxFileSize= 100KB<br /> <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 />   首先Q是讄rootQ格式ؓ(f) log4j.rootLogger=[level]QappenderNameQ?……Q其中level是讄需要输Z息的U别Q后面是appender的输出的目的圎ͼappenderName是指定日志信息输出到哪个地斏V?zhn)可以同时指定多个输出目的地?配置日志信息输出目的地AppenderQ其语法?br /> log4j.appender.appenderName = fully.qualified.name.of.appender.class<br />    log4j.appender.appenderName.option1 = value1<br />    ...<br />    log4j.appender.appenderName.option = valueN<br /> <br /> <br />   Log4j提供的appender有以下几U:(x)<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 /> <br />   配置日志信息的格式(布局Q,其语法ؓ(f)Q?br /> 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<br /> <br />   Log4j提供的layout有以下几U:(x)<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 />      www.jhaccp.com.cn<br />   Log4J采用cMC语言中的printf函数的打印格式格式化日志信息Q打印参数如下:(x) %m 输出代码中指定的消息<br />   %p 输出优先U,即DEBUGQINFOQW(xu)ARNQERRORQFATAL<br />   %r 输出自应用启动到输出该log信息耗费的毫U数<br />   %c 输出所属的cȝQ通常是所在类的全?br />   %t 输出产生该日志事件的U程?br />   %n 输出一个回车换行符QW(xu)indowsq_?#8220;rn”QUnixq_?#8220;n”<br />   %d 输出日志旉点的日期或时_(d)默认格式为ISO8601Q也可以在其后指定格式,比如Q?d{yyy MMM dd HHQmmQssQSSS}Q输出类|(x) 2002q?0?8?22Q?0Q?8Q?21<br />   %l 输出日志事g的发生位|,包括cȝ名、发生的U程Q以?qing)在代码中的行数。D例:(x)Testlog4.mainQTestLog4.javaQ?0Q?br /> <br />   4、Log4j在程序中的?br />   要在自己的程序中使用Log4jQ首先需要将commons- logging.jar和logging-log4j-1.2.9.jar导入到构\径中。然后再log4j.properties攑ֈsrc根目录下。这样就可以在程序中使用log4j了。在cM使用log4jQ首先声明一个静态变?Logger logger=Logger.getLogQ?classname"Q;现在可以用了Q用法如下:(x)logger.debugQ?debug message"Q或者logger.infoQ?info message"Q,看下面一个小例子Q?br /> <br /> 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 />    }<br /> <img src ="http://www.aygfsteel.com/FaithChen/aggbug/324743.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/FaithChen/" target="_blank">FaithChen</a> 2010-06-29 10:27 <a href="http://www.aygfsteel.com/FaithChen/archive/2010/06/29/324743.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java1.5Ҏ(gu)参数不确?/title><link>http://www.aygfsteel.com/FaithChen/archive/2010/06/28/324684.html</link><dc:creator>FaithChen</dc:creator><author>FaithChen</author><pubDate>Mon, 28 Jun 2010 08:55:00 GMT</pubDate><guid>http://www.aygfsteel.com/FaithChen/archive/2010/06/28/324684.html</guid><wfw:comment>http://www.aygfsteel.com/FaithChen/comments/324684.html</wfw:comment><comments>http://www.aygfsteel.com/FaithChen/archive/2010/06/28/324684.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/FaithChen/comments/commentRss/324684.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/FaithChen/services/trackbacks/324684.html</trackback:ping><description><![CDATA[<table style="width: 100%; table-layout: fixed"> <tbody> <tr> <td> <div class="wmqeeuq" id="blog_text" class="cnt"> <p style="margin: 20px auto 10px" class="g_p_center g_t_wrap g_t_left g_t_20 g_c_pdin c07"><span><span>java1.5Ҏ(gu)参数不确?/span></span></p> <div id="wmqeeuq" class="g_blog_list"> <div id="wmqeeuq" class="g_t_center g_c_pdin g_p_center c07 content"> <div id="wmqeeuq" class="ns_content"> <p style="text-indent: 2em">Java?Test(Object...args){}"Ҏ(gu)声明的理解——J2SE5?#8220;Varargs”机制<cite>收藏</cite></p> <p style="text-indent: 2em">转自Q?/p> <p style="text-indent: 2em">孙v?(sun.haitao@126.com) http://blog.csdn.net/avius</p> <p style="text-indent: 2em">2004q??日最初发表,2004q??9日最后修?/p> <p style="text-indent: 2em">J2SE 1.5提供?#8220;Varargs”机制。借助q一机制Q可以定义能和多个实参相匚w的Ş参。从而,可以用一U更单的方式Q来传递个数可变的实参。本文介l这一机制的用方法,以及(qing)q一机制与数l、泛型、重载之间的怺作用时的若干问题?/p> <p style="text-indent: 2em"></p> <hr /> J2SE 1.5提供?#8220;Varargs”机制。借助q一机制Q可以定义能和多个实参相匚w的Ş参。从而,可以用一U更单的方式Q来传递个数可变的实参。本文介l这一机制的用方法,以及(qing)q一机制与数l、泛型、重载之间的怺作用时的若干问题? <p> </p> <p style="text-indent: 2em">到J2SE 1.4为止Q一直无法在JavaE序里定义实参个数可变的Ҏ(gu)——因为Java要求实参QArgumentsQ和形参QParametersQ的数量和类型都必须逐一匚wQ而Ş参的数目是在定义Ҏ(gu)时就已经固定下来了。尽可以通过重蝲机制Qؓ(f)同一个方法提供带有不同数量的形参的版本,但是q仍然不能达到让实参数量L变化的目的?/p> <p style="text-indent: 2em">然而,有些Ҏ(gu)的语义要求它们必能接受个数可变的实参——例如著名的mainҎ(gu)Q就需要能接受所有的命o(h)行参Cؓ(f)实参Q而命令行参数的数目,事先Ҏ(gu)无法定下来?/p> <p style="text-indent: 2em">对于q个问题Q传l上一般是采用“利用一个数l来包裹要传递的实参”的做法来应付?/p> <p style="text-indent: 2em">1. 用数l包裹实?/p> <p style="text-indent: 2em">“用数l包裹实?#8221;的做法可以分成三步:(x)首先Qؓ(f)q个Ҏ(gu)定义一个数l型的参敎ͼ然后在调用时Q生成一个包含了所有要传递的实参的数l;最后,把这个数l作Z个实参传递过厅R?/p> <p style="text-indent: 2em">q种做法可以有效的达?#8220;让方法可以接受个数可变的参数”的目的,只是调用时的形式不够单?/p> <p style="text-indent: 2em">J2SE 1.5中提供了Varargs机制Q允许直接定义能和多个实参相匚w的Ş参。从而,可以用一U更单的方式Q来传递个数可变的实参?/p> <p style="text-indent: 2em">Varargs的含?/p> <p style="text-indent: 2em">大体说来Q?#8220;Varargs”?#8220;variable number of arguments”的意思。有时候也被简单的UCؓ(f)“variable arguments”Q不q因一U叫法没有说明是什么东西可变,所以意义稍微有Ҏ(gu)p?/p> <p style="text-indent: 2em">2. 定义实参个数可变的方?/p> <p style="text-indent: 2em">只要在一个Ş参的“cd”?#8220;参数?#8221;之间加上三个q箋?#8220;.”Q即“...”Q英文里的句中省略号Q,可以让它和不确定个实参相匹配。而一个带有这L(fng)形参的方法,是一个实参个数可变的Ҏ(gu)?/p> <p style="text-indent: 2em">清单1Q一个实参个数可变的Ҏ(gu)</p> <p style="text-indent: 2em">private static int sumUp(int... values) { }</p> <p style="text-indent: 2em">注意Q只有最后一个Ş参才能被定义?#8220;能和不确定个实参相匹?#8221;的。因此,一个方法里只能有一个这L(fng)形参。另外,如果q个Ҏ(gu)q有其它的Ş参,要把它们攑ֈ前面的位|上?/p> <p style="text-indent: 2em">~译器会(x)在背地里把这最后一个Ş参{化ؓ(f)一个数lŞ参,q在~译出的class文g里作上一个记P表明q是个实参个数可变的Ҏ(gu)?/p> <p style="text-indent: 2em">清单2Q实参个数可变的Ҏ(gu)的秘密Ş?/p> <p style="text-indent: 2em">private static int sumUp(int[] values) { }</p> <p style="text-indent: 2em">׃存在着q样的{化,所以不能再个类定义一个和转化后的Ҏ(gu){֐一致的Ҏ(gu)?/p> <p style="text-indent: 2em">清单3Q会(x)D~译错误的组?/p> <p style="text-indent: 2em">private static int sumUp(int... values) { } private static int sumUp(int[] values) { }</p> <p style="text-indent: 2em">I白的存亡问?/p> <p style="text-indent: 2em">Ҏ(gu)J2SE 1.5的语法,?#8220;...”前面的空白字W是可有可无的。这样就有在“...”前面dI白字符QŞ?#8220;Object ... args”Q和?#8220;...”前面不加I白字符QŞ?#8220;Object... args”Q的两种写法。因为目前和J2SE 1.5盔R合的Java Code Conventionsq没有正式发布,所以无法知道究竟哪一U写法比较正l。不q,考虑到数l参C?#8220;Object [] args”?#8220;Object[] args”两种书写方式Q而正l的写法是不?#8220;[]”前添加空白字W,g采取不加I白?#8220;Object... args”的写法在整体上更协调一些?/p> <p style="text-indent: 2em">3. 调用实参个数可变的方?/p> <p style="text-indent: 2em">只要把要传递的实参逐一写到相应的位|上Q就可以调用一个实参个数可变的Ҏ(gu)。不需要其它的步骤?/p> <p style="text-indent: 2em">清单4Q可以传递若q个实参</p> <p style="text-indent: 2em">sumUp(1, 3, 5, 7);</p> <p style="text-indent: 2em">在背地里Q编译器?x)把q种调用q程转化为用“数组包裹实参”的Ş式:(x)</p> <p style="text-indent: 2em">清单5Q偷偷出现的数组创徏</p> <p style="text-indent: 2em">sumUp(new int[]{1, 2, 3, 4});</p> <p style="text-indent: 2em">另外Q这里说?#8220;不确定个”也包括零个,所以这L(fng)调用也是合乎情理的:(x)</p> <p style="text-indent: 2em">清单6Q也可以传递零个实?/p> <p style="text-indent: 2em">sumUp();</p> <p style="text-indent: 2em">q种调用Ҏ(gu)被编译器U密转化之后的效果,则等同于q样Q?/p> <p style="text-indent: 2em">清单7Q零实参对应I数l?/p> <p style="text-indent: 2em">sumUp(new int[]{});</p> <p style="text-indent: 2em">注意q时传递过ȝ是一个空数组Q而不是null。这样就可以采取l一的Ş式来处理Q而不必检到底属于哪U情c(din)?/p> <p style="text-indent: 2em">4. 处理个数可变的实?/p> <p style="text-indent: 2em">处理个数可变的实参的办法Q和处理数组实参的办法基本相同。所有的实参Q都被保存到一个和形参同名的数l里。根据实际的需要,把这个数l里的元素读Z后,要蒸要煮Q就可以随意了?/p> <p style="text-indent: 2em">清单8Q处理收到的实参?/p> <p style="text-indent: 2em">private static int sumUp(int... values) {      int sum = 0;      for (int i = 0; i < values.length; i++) {          sum += values[i];      }      return sum; }</p> <p style="text-indent: 2em">5. 转发个数可变的实?/p> <p style="text-indent: 2em">有时候,在接受了一l个数可变的实参之后Q还要把它们传递给另一个实参个数可变的Ҏ(gu)。因为编码时无法知道接受来的q一l实参的数目Q所?#8220;把它们逐一写到该出现的位置上去”的做法ƈ不可行。不q,qƈ不意味着q是个不可完成的dQ因有另外一U办法,可以用来调用实参个数可变的方法?/p> <p style="text-indent: 2em">在J2SE 1.5的编译器的眼中,实参个数可变的方法是最后带了一个数lŞ参的Ҏ(gu)的特例。因此,事先把整l要传递的实参攑ֈ一个数l里Q然后把q个数组作ؓ(f)最后一个实参,传递给一个实参个数可变的Ҏ(gu)Q不?x)造成M错误。借助q一Ҏ(gu),可以顺利的完成转发了?/p> <p style="text-indent: 2em">清单9Q{发收到的实参?/p> <p style="text-indent: 2em">public class PrintfSample {      public static void main(String[] args) {          //打印?#8220;Pi:3.141593 E:2.718282”          printOut("Pi:%f E:%f\n", Math.PI, Math.E);      }      private static void printOut(String format, Object... args) {          //J2SE 1.5里PrintStream新增的printf(String format, Object... args)Ҏ(gu)          System.out.printf(format, args);      } }</p> <p style="text-indent: 2em">Java里的“printf”?#8220;sprintf”</p> <p style="text-indent: 2em">C语言里的printfQ按一定的格式输出字符Ԍ和sprintfQ按一定的格式l合字符Ԍ是十分经典的使用Varargs机制的例子。在 J2SE 1.5中,也分别在java.io.PrintStreamcdjava.lang.StringcM提供了类似的功能?/p> <p style="text-indent: 2em">按一定的格式输出字符串的功能Q可以通过调用PrintStream对象的printf(String format, Object... args)Ҏ(gu)来实现?/p> <p style="text-indent: 2em">按一定的格式l合字符串的工作Q则可以通过调用StringcȝString format(String format, Object... args)静态方法来q行?/p> <p style="text-indent: 2em">6. 是数l?不是数组Q?/p> <p style="text-indent: 2em">管在背地里Q编译器?x)把能匹配不定个实参的形参Q{化ؓ(f)数组形参Q而且也可以用数组包了实参Q再传递给实参个数可变的方法;但是Q这q不表示“能匹配不定个实参的形参”?#8220;数组形参”完全没有差异?/p> <p style="text-indent: 2em">一个明昄差异是,如果按照调用实参个数可变的方法的形式Q来调用一个最后一个Ş参是数组形参的方法,只会(x)D一?#8220;cannot be applied to”的编译错误?/p> <p style="text-indent: 2em">清单10Q一?#8220;cannot be applied to”的编译错?/p> <p style="text-indent: 2em">private static void testOverloading(int[] i) {      System.out.println("A"); } public static void main(String[] args) {      testOverloading(1, 2, 3);//~译出错 }</p> <p style="text-indent: 2em">׃q一原因Q不能在调用只支持用数组包裹实参的方法的时候(例如在不是专门ؓ(f)J2SE 1.5设计W三方类库中遗留的那些)Q直接采用这U简明的调用方式?/p> <p style="text-indent: 2em">如果不能修改原来的类Qؓ(f)要调用的Ҏ(gu)增加参数个数可变的版本,而又想采用这U简明的调用方式Q那么可以借助“引入外加函数QIntroduce Foreign MethodQ?#8221;?#8220;引入本地扩展QIntoduce Local ExtensionQ?#8221;的重构手法来q似的达到目的?/p> <p style="text-indent: 2em">7. 当个数可变的实参遇到泛型</p> <p style="text-indent: 2em">J2SE 1.5中新增了“泛型”的机Ӟ可以在一定条件下把一个类型参数化。例如,可以在编写一个类的时候,把一个方法的形参的类型用一个标识符Q如TQ来代表Q至于这个标识符到底表示什么类型,则在生成q个cȝ实例的时候再行指定。这一机制可以用来提供更充分的代码重用和更严格的编译时cd查?/p> <p style="text-indent: 2em">不过泛型机制却不能和个数可变的Ş参配合用。如果把一个能和不定个实参相匚w的Ş参的cdQ用一个标识符来代表,那么~译器会(x)l出一?#8220;generic array creation”的错误?/p> <p style="text-indent: 2em">清单11Q当Varargs遇上泛型</p> <p style="text-indent: 2em">private static <T> void testVarargs(T... args) {//~译出错 }</p> <p style="text-indent: 2em">造成q个现象的原因在于J2SE 1.5中的泛型机制的一个内在约束——不能拿用标识符来代表的cd来创一cd的实例。在出现支持没有了这个约束的Java版本之前Q对于这个问题,基本没有太好的解军_法?/p> <p style="text-indent: 2em">不过Q传l的“用数l包?#8221;的做法,q不受这个约束的限制?/p> <p style="text-indent: 2em">清单12Q可以编译的变通做?/p> <p style="text-indent: 2em">private static <T> void testVarargs(T[] args) {      for (int i = 0; i < args.length; i++) {          System.out.println(args[i]);      } }</p> <p style="text-indent: 2em">8. 重蝲中的选择问题</p> <p style="text-indent: 2em">Java支持“重蝲”的机Ӟ允许在同一个类拥有许多只有形参列表不同的方法。然后,q译器Ҏ(gu)调用时的实参来选择到底要执行哪一个方法?/p> <p style="text-indent: 2em">传统上的选择Q基本是依照“Ҏ(gu)者优?#8221;的原则来q行。一个方法的Ҏ(gu)E度Q取决于Z让它利q行而需要满的条g的数目,需要条件越多的特D?/p> <p style="text-indent: 2em">在引入Varargs机制之后Q这一原则仍然适用Q只是要考虑的问题丰富了一些——传l上Q一个重载方法的各个版本之中Q只有Ş参数量与实参数量正好一致的那些有被q一步考虑的资根{但是Varargs机制引入之后Q完全可以出C个版本都能匹配,在其它方面也别无二致Q只是一个实参个数固定,而一个实参个数可变的情况?/p> <p style="text-indent: 2em">遇到q种情况Ӟ所用的判定规则?#8220;实参个数固定的版本优先于实参个数可变的版?#8221;?/p> <p style="text-indent: 2em">清单13Q实参个数固定的版本优先</p> <p style="text-indent: 2em">public class OverloadingSampleA {      public static void main(String[] args) {          testOverloading(1);//打印出A          testOverloading(1, 2);//打印出B          testOverloading(1, 2, 3);//打印出C      }      private static void testOverloading(int i) {          System.out.println("A");      }      private static void testOverloading(int i, int j) {          System.out.println("B");      }      private static void testOverloading(int i, int... more) {          System.out.println("C");      } }</p> <p style="text-indent: 2em">如果在编译器看来Q同时有多个Ҏ(gu)h相同的优先权Q它?yu)׃?x)陷入无法到底调用哪个方法作Z个选择的状态。在q样的时候,它就?x)生一?“reference to 被调用的Ҏ(gu)?is ambiguous”的编译错误,q耐心的等候作了一些修改,以免除它的qh的新源代码的到来?/p> <p style="text-indent: 2em">在引入了Varargs机制之后Q这U可能导致迷惑的情况Q又增加了一些。例如现在可能会(x)有两个版本都能匹配,在其它方面也如出一辙,而且都是实参个数可变的冲H发生?/p> <p style="text-indent: 2em">清单14Q左右都不是Qؓ(f)难了~译?/p> <p style="text-indent: 2em">public class OverloadingSampleB {      public static void main(String[] args) {          testOverloading(1, 2, 3);//~译出错      }      private static void testOverloading(Object... args) {      }      private static void testOverloading(Object o, Object... args) {      } }</p> <p style="text-indent: 2em">另外Q因为J2SE 1.5中有“Autoboxing/Auto-Unboxing”机制的存在,所以还可能发生两个版本都能匚wQ而且都是实参个数可变Q其它方面也一模一P只是一个能接受的实参是基本cdQ而另一个能接受的实参是包裹cȝ冲突发生?/p> <p style="text-indent: 2em">清单15QAutoboxing/Auto-Unboxing带来的新问题</p> <p style="text-indent: 2em">public class OverloadingSampleC {      public static void main(String[] args) {          /* ~译出错 */          testOverloading(1, 2);          /* q是~译出错 */          testOverloading(new Integer(1), new Integer(2));      }      private static void testOverloading(int... args) {      }      private static void testOverloading(Integer... args) {      } }</p> <p style="text-indent: 2em">9. 归纳ȝ</p> <p style="text-indent: 2em">?#8220;用数l包?#8221;的做法相比,真正的实参个数可变的Ҏ(gu)Q在调用时传递参数的操作更ؓ(f)单,含义也更为清楚。不q,q一机制也有它自w的局限,q不是一个完无~的解决Ҏ(gu)?/p> </div> </div> </div> </div> </td> </tr> </tbody> </table> <img src ="http://www.aygfsteel.com/FaithChen/aggbug/324684.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/FaithChen/" target="_blank">FaithChen</a> 2010-06-28 16:55 <a href="http://www.aygfsteel.com/FaithChen/archive/2010/06/28/324684.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Sping注解入门http://www.aygfsteel.com/FaithChen/articles/324448.htmlFaithChenFaithChenFri, 25 Jun 2010 08:05:00 GMThttp://www.aygfsteel.com/FaithChen/articles/324448.htmlhttp://www.aygfsteel.com/FaithChen/comments/324448.htmlhttp://www.aygfsteel.com/FaithChen/articles/324448.html#Feedback0http://www.aygfsteel.com/FaithChen/comments/commentRss/324448.htmlhttp://www.aygfsteel.com/FaithChen/services/trackbacks/324448.html阅读全文

FaithChen 2010-06-25 16:05 发表评论
]]>
DWR学习(fn)W记http://www.aygfsteel.com/FaithChen/articles/208333.htmlFaithChenFaithChenMon, 16 Jun 2008 06:55:00 GMThttp://www.aygfsteel.com/FaithChen/articles/208333.htmlhttp://www.aygfsteel.com/FaithChen/comments/208333.htmlhttp://www.aygfsteel.com/FaithChen/articles/208333.html#Feedback0http://www.aygfsteel.com/FaithChen/comments/commentRss/208333.htmlhttp://www.aygfsteel.com/FaithChen/services/trackbacks/208333.htmlDWR是一个框Ӟ单的说就是能够在javascript直接调用javaҎ(gu)Q而不必去写一大堆的javascript代码。它的实现是Zajax的,可以实现无刷新效果?br />     |上有不DWR的例子,但大都只是某U方法的调用Q本文只在用层面上介绍DWRQƈ不涉更多的技术与设计Q其目的是让初学者能够很快的学会(x)各种javaҎ(gu)在javascript中是如何调用的?/p>

    本文以DWR 1.1 为基Q对于DWR 2.0Q因没有正式发布版,故不做介l?/p>

一?dwr配置之web.xml
   1 、最配|?br /> <servlet>
  <servlet-name>dwr-invoker</servlet-name>
  <servlet-class>uk.ltd.getahead.dwr.DWRServlet</servlet-class>
</servlet>
<servlet-mapping>
  <servlet-name>dwr-invoker</servlet-name>
  <url-pattern>/dwr/*</url-pattern>
</servlet-mapping>
2、当我们想看DWR自动生成的测试页QUsing debug/test modeQ时Q可在servlet配置中加?br /> <init-param>
  <param-name>debug</param-name>
  <param-value>true</param-value>
</init-param>
q个参数DWR默认是false。如果选择trueQ我们可以通过 http://localhost:port/app/dwr看到你部|的每个DWR class。ƈ且可以测试java代码的每个方法是否运行正常。ؓ(f)?a class="channel_keylink" target="_blank">安全考虑Q在正式环境下你一定把q个参数设ؓ(f)false?br /> 3、多个dwr.xml文g的配|?br /> 可能有几U情况,我们一一列D。一个servletQ多个dwr.xml配置文gQ多个servletQ每个servlet对应一个或多个dwr.xml配置文g?br /> 3.1、一个servletQ多个dwr.xml配置文g
<servlet>
    <servlet-name>dwr-invoker</servlet-name>
    <servlet-class>uk.ltd.getahead.dwr.DWRServlet</servlet-class>
    <init-param>
      <param-name>config-1</param-name>
      <param-value>WEB-INF/dwr1.xml</param-value>
    </init-param>
    <init-param>
      <param-name>config-2</param-name>
      <param-value>WEB-INF/dwr2.xml</param-value>
    </init-param>
</servlet>
?q种配置下,param-name的值必Mconfig开头。param-name可以?gt;=0个。如果没有param-nameQ那么将?x)读?WEB-INF/dwr.xml。如果有大于零个param-nameQ那么WEB-INF/dwr.xml文g不?x)被d?br /> 3.2 、多?servlet Q每?servlet 对应一个或多个 dwr.xml
<servlet>
   <servlet-name>dwr-invoker</servlet-name>
    <servlet-class>uk.ltd.getahead.dwr.DWRServlet</servlet-class>
</servlet>
<servlet>
   <servlet-name>dwr-invoker1</servlet-name>
   <servlet-class>uk.ltd.getahead.dwr.DWRServlet</servlet-class>
   <init-param>
     <param-name>config-admin</param-name>
     <param-value>WEB-INF/dwr1.xml</param-value>
   </init-param>
   <init-param>
     <param-name>debug</param-name>
     <param-value>true</param-value>
   </init-param>
</servlet>
<servlet-mapping>
<servlet-name>dwr-invoker</servlet-name>
   <url-pattern>/dwr/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
   <servlet-name>dwr-invoker1</servlet-name>
   <url-pattern>/dwr1/*</url-pattern>
</servlet-mapping>
在这U情况下Q我们可以根?J2EE security 来控制权限,针对不同 url, 加不同的角色?/p>


二?dwr使用?br /> 1、调用没有返回值和参数的JAVAҎ(gu)
1.1、dwr.xml的配|?br /> <dwr>
<allow>
<create creator="new" javascript="testClass" >
<param name="class" value= "com.dwr.TestClass" />
<include method="testMethod1"/>
</create>
</allow>
</dwr>
<allow> 标签中包括可以暴露给 javascript 讉K的东ѝ?br /> <create> 标签中指?javascript 中可以访问的 java c,q定?DWR 应当如何获得要进行远E的cȝ实例?creator="new" 属性指?java cd例的生成方式Q?new 意味着 DWR 应当调用cȝ默认构造函数来获得实例Q其他的q有 spring 方式Q通过?IOC 容器 Spring q行集成来获得实例等{?javascript=" testClass " 属性指?javascript代码讉K对象时用的名称?br /> <param> 标签指定要公开l?javascript ?java cd?br /> <include> 标签指定要公开l?javascript 的方法。不指定的话公开所有方法?br /> <exclude> 标签指定要防止被讉K的方法?br /> 1.2、javascript中调?br /> 首先Q引?javascript 脚本
<script src='dwr/interface/ testClass.js'></script>
<script src='dwr/engine.js'></script>
<script src='dwr/util.js'></script>
其中 TestClass.js ?dwr Ҏ(gu)配置文g自动生成的, engine.js ?util.js ?dwr 自带的脚本文件?br /> 其次Q编写调?java Ҏ(gu)?javascript 函数
Function callTestMethod1(){
      testClass.testMethod1();
}
2、调用有单返回值的javaҎ(gu)
2.1、dwr.xml的配|?br /> 配置?.1
<dwr>
<allow>
<create creator="new" javascript="testClass" >
<param name="class" value= "com.dwr.TestClass" />
<include method="testMethod2"/>
</create>
</allow>
</dwr>
2.2、javascript中调?br /> 首先Q引?javascript 脚本
其次Q编写调?java Ҏ(gu)?javascript 函数和接收返回值的回调函数
Function callTestMethod2(){
      testClass.testMethod2(callBackFortestMethod2);
}
Function callBackFortestMethod2(data){
     // 其中 date 接收Ҏ(gu)的返回?br />      // 可以在这里对q回D行处理和昄{等
alert("the return value is " + data);
}
其中 callBackFortestMethod2 是接收返回值的回调函数
3、调用有单参数的javaҎ(gu)
3.1、dwr.xml的配|?br /> 配置?.1
<dwr>
<allow>
<create creator="new" javascript="testClass" >
<param name="class" value= "com.dwr.TestClass" />
<include method="testMethod3"/>
</create>
</allow>
</dwr>
3.2、javascript中调?br /> 首先Q引?javascript 脚本
其次Q编写调?java Ҏ(gu)?javascript 函数
Function callTestMethod3(){
                 // 定义要传?java Ҏ(gu)中的参数
      var data;
      // 构造参?br />       data = “test String”;
      testClass.testMethod3(data);
}
4、调用返?a class="channel_keylink" target="_blank">JavaBean的javaҎ(gu)
4.1、dwr.xml的配|?br /> <dwr>
<allow>
<create creator="new" javascript="testClass" >
<param name="class" value= "com.dwr.TestClass" />
<include method="testMethod4"/>
</create>
<convert converter="bean" match=" "com.dwr.TestBean">
                  <param name="include" value="username,password" />
</convert>
</allow>
</dwr>
<creator> 标签负责公开用于 Web q程的类和类的方法, <convertor> 标签则负责这些方法的参数和返回类型?convert 元素的作用是告诉 DWR ?a class="channel_keylink" target="_blank">服务?/a>?Java 对象表示和序列化?JavaScript 之间如何转换数据cd?DWR 自动地在 Java ?JavaScript 表示之间调整单数据类型。这些类型包?Java 原生cd和它们各自的装c表C,q有 String ?Date 、数l和集合cd?DWR 也能?JavaBean 转换?JavaScript 表示Q但是出?a class="channel_keylink" target="_blank">安全性的原因Q要求显式的配置Q?<convertor> 标签是完成此功能的?converter="bean" 属性指定{换的方式采用 JavaBean 命名规范Q?match=""com.dwr.TestBean" 属性指定要转换?javabean 名称Q?<param> 标签指定要{换的 JavaBean 属性?br /> 4.2 、javascript中调?br /> 首先Q引?javascript 脚本
其次Q编写调?java Ҏ(gu)?javascript 函数和接收返回值的回调函数
Function callTestMethod4(){
      testClass.testMethod4(callBackFortestMethod4);
}
Function callBackFortestMethod4(data){
     // 其中 date 接收Ҏ(gu)的返回?br /> // 对于 JavaBean q回|有两U方式处?br />              // 不知道属性名U时Q用如下方?br />            for(var property in data){
              alert("property:"+property);
              alert(property+":"+data[property]);
           }
// 知道属性名U时Q用如下方?br />            alert(data.username);
           alert(data.password);
}
其中 callBackFortestMethod4 是接收返回值的回调函数
5、调用有JavaBean参数的javaҎ(gu)
5.1、dwr.xml的配|?br /> 配置?.1
<dwr>
<allow>
<create creator="new" javascript="testClass" >
<param name="class" value= "com.dwr.TestClass" />
<include method="testMethod5"/>
</create>
<convert converter="bean" match=" com.dwr.TestBean">
                  <param name="include" value="username,password" />
</convert>
</allow>
</dwr>
5.2 、javascript中调?br /> 首先Q引?javascript 脚本
其次Q编写调?java Ҏ(gu)?javascript 函数
Function callTestMethod5(){
                 // 定义要传?java Ҏ(gu)中的参数
      var data;
      // 构造参敎ͼ date 实际上是一?object
      data = { username:"user", password:"password"  }
      testClass.testMethod5(data);
}
6、调用返回List、Set或者Map的javaҎ(gu)
6.1、dwr.xml的配|?br /> 配置?.1
<dwr>
<allow>
<create creator="new" javascript="testClass" >
<param name="class" value= "com.dwr.TestClass" />
<include method="testMethod6"/>
</create>
<convert converter="bean" match= "com.dwr.TestBean ">
<param name="include" value="username,password" />
</convert>
</allow>
</dwr>
注意Q如?List ?Set 或?Map 中的元素均ؓ(f)单类型(包括其封装类Q或 String ?Date 、数l和集合cdQ则不需?lt;convert>标签?br /> 6.2 、javascript中调?以返回ListZQList的元素ؓ(f)TestBean)
首先Q引?javascript 脚本
其次Q编写调?java Ҏ(gu)?javascript 函数和接收返回值的回调函数
Function callTestMethod6(){
      testClass.testMethod6(callBackFortestMethod6);
}
Function callBackFortestMethod6(data){
     // 其中 date 接收Ҏ(gu)的返回?br /> // 对于 JavaBean q回|有两U方式处?br />              // 不知道属性名U时Q用如下方?br />            for(var i=0;i<data.length;i++){
for(var property in data){
                  alert("property:"+property);
                  alert(property+":"+data[property]);
               }
}
// 知道属性名U时Q用如下方?br /> for(var i=0;i<data.length;i++){
               alert(data.username);
               alert(data.password);
}
}
7、调用有List、Set或者Map参数的javaҎ(gu)
7.1、dwr.xml的配|?br /> <dwr>
<allow>
<create creator="new" javascript="testClass" >
<param name="class" value= "com.dwr.TestClass" />
<include method="testMethod7"/>
</create>
<convert converter="bean" match= "com.dwr.TestBean ">
<param name="include" value="username,password" />
</convert>
</allow>
<signatures>
<![CDATA[
import java.util.List;
import com.dwr.TestClass;
import com.dwr.TestBean;
TestClass.testMethod7(List<TestBean>);
]]>
</signatures>
</dwr>
<signatures> 标签是用来声?java Ҏ(gu)?List ?Set 或?Map 参数所包含的确切类Q以?java 代码作出判断?br /> 7.2 、javascript中调?以返回ListZQList的元素ؓ(f)TestBean)
首先Q引?javascript 脚本
其次Q编写调?java Ҏ(gu)?javascript 函数
Function callTestMethod7(){
// 定义要传?java Ҏ(gu)中的参数
      var data;
      // 构造参敎ͼ date 实际上是一?object 数组Q即数组的每个元素均?object
data = [
                      {
                         username:"user1",
                         password:"password2"
                      },
                      {
                         username:"user2",
                         password:" password2"
                      }
                  ];
      testClass.testMethod7(data);
}
注意Q?br /> 1?对于W?6 U情况,如果 java Ҏ(gu)的返回gؓ(f) Map Q则在接收该q回值的 javascript 回调函数中如下处理:(x)
function callBackFortestMethod(data){
           // 其中 date 接收Ҏ(gu)的返回?br />            for(var property in data){
                  var bean = data[property];
                  alert(bean.username);
                  alert(bean.password);
              }
}
2?对于W?7 U情况,如果 java 的方法的参数?Map Q假讑օ key ?String Q?value ?TestBean Q,则在调用该方法的 javascript 函数中用如下Ҏ(gu)构造要传递的参数Q?br /> function callTestMethod (){
              // 定义要传?java Ҏ(gu)中的参数
              var data;
              // 构造参敎ͼ date 实际上是一?object Q其属性名?Map ?key Q属性gؓ(f) Map ?value
              data = {
                         "key1":{
                             username:"user1",
                            password:"password2"
                         },
                         "key2":{
                            username:"user2",
                            password:" password2"
                         }
                     };
              testClass.testMethod(data);
}
q且?dwr.xml 中增加如下的配置D?br /> <signatures>
<![CDATA[
import java.util.List;
import com.dwr.TestClass;
import com.dwr.TestBean;
TestClass.testMethod7(Map<String,TestBean>);
]]>
</signatures>
3?׃上可以发玎ͼ对于 java Ҏ(gu)的返回gؓ(f) List(Set) 的情况, DWR 其转化?Object 数组Q传递个 javascript Q对?java Ҏ(gu)的返回gؓ(f) Map 的情况, DWR 其转化Z?Object Q其?Object 的属性ؓ(f)?Map ?key |属性gؓ(f)?Map 相应?value 倹{?br /> 4?如果 java Ҏ(gu)的参Cؓ(f) List(Set) ?Map 的情况, javascript 中也要根?3 U所_(d)构造相应的 javascript 数据来传递到 java 中?br />



FaithChen 2008-06-16 14:55 发表评论
]]>
hibernatel定参数cdhttp://www.aygfsteel.com/FaithChen/articles/184269.htmlFaithChenFaithChenThu, 06 Mar 2008 07:18:00 GMThttp://www.aygfsteel.com/FaithChen/articles/184269.htmlhttp://www.aygfsteel.com/FaithChen/comments/184269.htmlhttp://www.aygfsteel.com/FaithChen/articles/184269.html#Feedback0http://www.aygfsteel.com/FaithChen/comments/commentRss/184269.htmlhttp://www.aygfsteel.com/FaithChen/services/trackbacks/184269.html (1)使用 ? 指定参数
...
Query query = session.createQuery("from Student s where
              s.age > ? and s.name like ? ");
query.setInteger(0,18);
query.setString(1,"%abc%");
...
(2)使用 : 后跟变量的方法设|参?br /> ...
Query query = session.createQuery("from Student s where
              s.age > :minAge and s.name like :likeName ");
query.setInteger("minAge",18);
query.setString("likeName","%ABC%");
...
(3)setEntity()Ҏ(gu)

setEntity()Ҏ(gu)把参C一个持久类的实例绑?例如下面的示?br /> ...
Team team = (Team)session.get(Team.class,"5f45saf45sdf456f");
Query query = session.createQuery("from Student s where s.team = :team");
query.setEntity("team",team);  //讄参数为team实例
...
?上述的team对象可以是持久对象也可以是脱对?/p>

(4)setParameter()Ҏ(gu)

setParameter()Ҏ(gu)的全U是setParameter(String paraName,实例,实例cd),q个Ҏ(gu)
可以l定Mcd的参?其中W三个参数可以省?hibernate要以Ҏ(gu)实例推断出绝大部?br /> 对应的映类?
下面?3)中的代码做一下改?br /> query.setParameter("team",team,Hibernate.entity(Team.class)).
或者query.setparameter("team",team).

(5)setPorperties()Ҏ(gu)

该方法的全称是setProperties(cd?.它将cd例的属性名与参数值相对应
...
Student student = new Student();
student.setAge("18");
Query query = sesion.createQuery("from Student s where s.age = :age");
query.setProperties(student);  //讄参数为student对象
...
注意:HQL语句中的变量age必须和student的属性age同名,否则?x)出?



FaithChen 2008-03-06 15:18 发表评论
]]>
XML的四U处理方?/title><link>http://www.aygfsteel.com/FaithChen/articles/184155.html</link><dc:creator>FaithChen</dc:creator><author>FaithChen</author><pubDate>Thu, 06 Mar 2008 02:09:00 GMT</pubDate><guid>http://www.aygfsteel.com/FaithChen/articles/184155.html</guid><wfw:comment>http://www.aygfsteel.com/FaithChen/comments/184155.html</wfw:comment><comments>http://www.aygfsteel.com/FaithChen/articles/184155.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/FaithChen/comments/commentRss/184155.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/FaithChen/services/trackbacks/184155.html</trackback:ping><description><![CDATA[四种xml操作方式的基本用方? <p>xml文gQ?/p> <p>Q?xml version="1.0" encoding="GB2312"?Q?br /> QRESULTQ?br />     QVALUEQ?<br />         QNOQA1234Q?NOQ?<br />        QADDRQ四川省XX县XX镇XX路XDXXP/ADDRQ?br />     Q?VALUEQ?br />     QVALUEQ?<br />         QNOQB1234Q?NOQ?<br />        QADDRQ四川省XX市XX乡XX村XXl</ADDRQ?br />     Q?VALUEQ?br /> Q?RESULTQ?</p> <p>1QDOM</p> <p>import java.io.*;<br /> import java.util.*;<br /> import org.w3c.dom.*;<br /> import javax.xml.parsers.*; </p> <p>public class MyXMLReader{ <br />  public static void main(String arge[]){ </p> <p>  long lasting =System.currentTimeMillis(); <br />   try{  <br />    File f=new File("data_10k.xml"); <br />    DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance(); <br />    DocumentBuilder builder=factory.newDocumentBuilder(); <br />    Document doc = builder.parse(f); <br />    NodeList nl = doc.getElementsByTagName("VALUE"); <br />    for (int i=0;iQnl.getLength();i++){ <br />     System.out.print("车牌L(fng):" + doc.getElementsByTagName("NO").item(i).getFirstChild().getNodeValue()); <br />     System.out.println("车主地址:" + doc.getElementsByTagName("ADDR").item(i).getFirstChild().getNodeValue()); <br />    } <br />   }catch(Exception e){ <br />    e.printStackTrace(); <br /> } </p> <p>2QSAX</p> <p>import org.xml.sax.*;<br /> import org.xml.sax.helpers.*;<br /> import javax.xml.parsers.*; </p> <p>public class MyXMLReader extends DefaultHandler { </p> <p> java.util.Stack tags = new java.util.Stack(); <br />  public MyXMLReader() { <br />   super();<br />    } </p> <p> public static void main(String args[]) { <br />   long lasting = System.currentTimeMillis(); <br />   try { <br />    SAXParserFactory sf = SAXParserFactory.newInstance(); <br />    SAXParser sp = sf.newSAXParser(); <br />    MyXMLReader reader = new MyXMLReader(); <br />    sp.parse(new InputSource("data_10k.xml"), reader); <br />   } catch (Exception e) { <br />    e.printStackTrace(); <br />   } </p> <p>  System.out.println("q行旉Q? + (System.currentTimeMillis() - lasting) + "毫秒");} <br />   public void characters(char ch[], int start, int length) throws SAXException { <br />   String tag = (String) tags.peek(); <br />   if (tag.equals("NO")) {  <br />    System.out.print("车牌L(fng)Q? + new String(ch, start, length));<br />     }<br />     if (tag.equals("ADDR")) { <br />   System.out.println("地址:" + new String(ch, start, length));<br />     }<br />    } </p> <p>  public void startElement(String uri,String localName,String qName,Attributes attrs) { <br />   tags.push(qName);}<br /> }  </p> <p>3Q?JDOM</p> <p>import java.io.*;<br /> import java.util.*;<br /> import org.jdom.*;<br /> import org.jdom.input.*; </p> <p>public class MyXMLReader { </p> <p> public static void main(String arge[]) { <br />   long lasting = System.currentTimeMillis(); <br />   try { <br />    SAXBuilder builder = new SAXBuilder();  <br />    Document doc = builder.build(new File("data_10k.xml"));  <br />    Element foo = doc.getRootElement();  <br />    List allChildren = foo.getChildren();  <br />    for(int i=0;iQallChildren.size();i++) {  <br />     System.out.print("车牌L(fng):" + ((Element)allChildren.get(i)).getChild("NO").getText()); <br />     System.out.println("车主地址:" + ((Element)allChildren.get(i)).getChild("ADDR").getText()); <br />    } <br />   } catch (Exception e) { <br />    e.printStackTrace(); <br /> } </p> <p>}</p> <p>4QDOM4J</p> <p>import java.io.*;<br /> import java.util.*;<br /> import org.dom4j.*;<br /> import org.dom4j.io.*; </p> <p>public class MyXMLReader { </p> <p> public static void main(String arge[]) { <br />   long lasting = System.currentTimeMillis(); <br />   try { <br />    File f = new File("data_10k.xml"); <br />    SAXReader reader = new SAXReader(); <br />    Document doc = reader.read(f); <br />    Element root = doc.getRootElement(); <br />    Element foo; <br />    for (Iterator i = root.elementIterator("VALUE"); i.hasNext();) { <br />     foo = (Element) i.next(); <br />     System.out.print("车牌L(fng):" + foo.elementText("NO")); <br />     System.out.println("车主地址:" + foo.elementText("ADDR")); <br />    } <br />   } catch (Exception e) { <br />    e.printStackTrace(); <br />     } <br /> }</p> <img src ="http://www.aygfsteel.com/FaithChen/aggbug/184155.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/FaithChen/" target="_blank">FaithChen</a> 2008-03-06 10:09 <a href="http://www.aygfsteel.com/FaithChen/articles/184155.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>DWR尝http://www.aygfsteel.com/FaithChen/articles/184044.htmlFaithChenFaithChenWed, 05 Mar 2008 08:40:00 GMThttp://www.aygfsteel.com/FaithChen/articles/184044.htmlhttp://www.aygfsteel.com/FaithChen/comments/184044.htmlhttp://www.aygfsteel.com/FaithChen/articles/184044.html#Feedback0http://www.aygfsteel.com/FaithChen/comments/commentRss/184044.htmlhttp://www.aygfsteel.com/FaithChen/services/trackbacks/184044.html介:(x)
DWR可以帮助开发h员完成应用AJAX技术的webE序Q它可以让浏览器上的javascriptҎ(gu)调用q行在web服务器上javaҎ(gu)?br /> DWR主要׃部门l成。javascript与web服务器通信q更新web;q行在web服务器的Servlet处理hq把响应发回览器?br /> DWR采用新颖的方法实CAJAX(本来也没有确切的定义)Q在java代码基础上动态的生成javascript代码。web开发者可以直接调用这些javascript代码Q然而真正的代码是运行在web服务器上的java code。出与安全考虑Q开发者必配|哪些java class暴露lDWR.(dwr.xml)
DWR不认为浏览器和web服务器之间协议重要,把系l界面放在首位。最大挑战是java method call的同步特征与ajax异步Ҏ(gu)之间的矛盾。在异步模型里,l果只有在方法结束后才有效。DWR解决了这个问题,把回调函数当成参Cl方法,处理完成后,自动调用回调Ҏ(gu)?br /> 配置Q?/strong>

  1. web.xmlQ?nbsp;<servlet>
        <servlet-name>dwr-invoker</servlet-name>
        <servlet-class>org.directwebremoting.servlet.DwrServlet</servlet-class>
        <init-param>
                   <param-name>debug</param-name>
            <param-value>false</param-value>
        </init-param>
        <init-param>  
                   <param-name>crossDomainSessionSecurity</param-name>   
                   <param-value>false</param-value>  
            </init-param>
       </servlet>

       <servlet-mapping>
         <servlet-name>dwr-invoker</servlet-name>
         <url-pattern>/dwr/*</url-pattern>
       </servlet-mapping>

  2. dwr.xml:<?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE dwr PUBLIC "-//GetAhead Limited//DTD Direct Web Remoting 2.0//EN" "http://www.getahead.ltd.uk/dwr/dwr20.dtd">
    <dwr>
     <allow>
      <create creator="spring" javascript="main_MenuCatalogDWR" scope="page">
       <param name="beanName" value="/main/MenuCatalogDWR"/>
      </create>
      <create creator="spring" javascript="main_TreeDWR" scope="page">
       <param name="beanName" value="/main/TreeDWR"/>
      </create>
      <create creator="spring" javascript="main_OperateFilterDWR" scope="page">
       <param name="beanName" value="/main/OperateFilterDWR"/>
      </create>
      <create creator="spring" javascript="main_RightTreeDWR" scope="page">
       <param name="beanName" value="/main/RightTreeDWR"/>
      </create>
      <convert converter="dom4j" match="org.directwebremoting.convert.DOM4JConverter">
      </convert>
      <convert converter="dom" match="org.directwebremoting.convert.DOMConverter">
      </convert>
     </allow>
    </dwr>

   3.jsp面讄Q?br />         //以下两行是dwr所必需?br />         <script type='text/javascript' src="<c:url value='/dwr/engine.js'/>"></script>
                              <script type='text/javascript' src="<c:url value='/dwr/util.js'/>"></script> 
        <script type='text/javascript' src="<c:url value='/dwr/interface/main_MenuCatalogDWR.js'/>"></script>
说明Q?lt;script type='text/javascript' src="<c:url value='/dwr/engine.js'/>"></script>
            <script type='text/javascript' src="<c:url value='/dwr/util.js'/>"></script> 是dwr所必需?br />    <script type='text/javascript' src="<c:url value='/dwr/interface/main_MenuCatalogDWR.js'/>"></script>主要作用是:(x)
            dwr/interface/q种h到来Q(如上面的<script type='text/javascript' src="<c:url  value='/dwr/interface/main_MenuCatalogDWR.js'/>"></script>QDWR做一件伟大的事。把我们在WEB-INF/dwr.xml中的
           <create creator="spring" javascript="main_MenuCatalogDWR" scope="page">
                  <param name="beanName" value="/main/MenuCatalogDWR"/>
           </create>转化为javascript函数?nbsp;

4.beanName配置Q本目spring配置文g为action-servlet.xmlQ?br />  <bean name="/main/MenuCatalogDWR" class="com.icsshs.webapp.main.MenuCatalogDWR" singleton="false">
        <property name="hsRoleRightManager">
            <ref bean="hsRoleRightManager"/>
        </property>
    </bean>
5.jsp面调用Q?br /> function menucatalog(){
     main_MenuCatalogDWR.execute("",callbackok);
    }
    function callbackok(data){
        var root0=data.documentElement;
        if (root0.childNodes.length>0){
            if (root0.childNodes(0).childNodes.length==0) return;
            $("mainmenu").innerHTML=root0.childNodes(0).childNodes(0).text;
            key=root0.childNodes(1).childNodes(0).text;
            if (parent.frames.leftFrame.document.readyState == "complete"){
                setmenuclick(key);
            }else{
                setTimeout("setmenuclick('"+key+"')",500);
            }
        }
    }

说明Qcallbackok为回调函敎ͼdata为dwrq回的结果集



FaithChen 2008-03-05 16:40 发表评论
]]>
վ֩ģ壺 | ɫ| ³| ϳ| | | | | | | | | | ͨ| ˮ| | | | ̩| | ɳ| ̨| | ½| ޳| | | ʡ| | ˫Ѽɽ| | | ͩ®| ɽ| | | | | Ϫ| | |