??xml version="1.0" encoding="utf-8" standalone="yes"?> java1.5Ҏ(gu)参数不确?/span> Java?Test(Object...args){}"Ҏ(gu)声明的理解——J2SE5?#8220;Varargs”机制收藏 转自Q?/p>
孙v?(sun.haitao@126.com) http://blog.csdn.net/avius 2004q??日最初发表,2004q??9日最后修?/p>
J2SE 1.5提供?#8220;Varargs”机制。借助q一机制Q可以定义能和多个实参相匚w的Ş参。从而,可以用一U更单的方式Q来传递个数可变的实参。本文介l这一机制的用方法,以及(qing)q一机制与数l、泛型、重载之间的怺作用时的若干问题?/p>
到J2SE 1.4为止Q一直无法在JavaE序里定义实参个数可变的Ҏ(gu)——因为Java要求实参QArgumentsQ和形参QParametersQ的数量和类型都必须逐一匚wQ而Ş参的数目是在定义Ҏ(gu)时就已经固定下来了。尽可以通过重蝲机制Qؓ(f)同一个方法提供带有不同数量的形参的版本,但是q仍然不能达到让实参数量L变化的目的?/p>
然而,有些Ҏ(gu)的语义要求它们必能接受个数可变的实参——例如著名的mainҎ(gu)Q就需要能接受所有的命o(h)行参Cؓ(f)实参Q而命令行参数的数目,事先Ҏ(gu)无法定下来?/p>
对于q个问题Q传l上一般是采用“利用一个数l来包裹要传递的实参”的做法来应付?/p>
1. 用数l包裹实?/p>
“用数l包裹实?#8221;的做法可以分成三步:(x)首先Qؓ(f)q个Ҏ(gu)定义一个数l型的参敎ͼ然后在调用时Q生成一个包含了所有要传递的实参的数l;最后,把这个数l作Z个实参传递过厅R?/p>
q种做法可以有效的达?#8220;让方法可以接受个数可变的参数”的目的,只是调用时的形式不够单?/p>
J2SE 1.5中提供了Varargs机制Q允许直接定义能和多个实参相匚w的Ş参。从而,可以用一U更单的方式Q来传递个数可变的实参?/p>
Varargs的含?/p>
大体说来Q?#8220;Varargs”?#8220;variable number of arguments”的意思。有时候也被简单的UCؓ(f)“variable arguments”Q不q因一U叫法没有说明是什么东西可变,所以意义稍微有Ҏ(gu)p?/p>
2. 定义实参个数可变的方?/p>
只要在一个Ş参的“cd”?#8220;参数?#8221;之间加上三个q箋?#8220;.”Q即“...”Q英文里的句中省略号Q,可以让它和不确定个实参相匹配。而一个带有这L(fng)形参的方法,是一个实参个数可变的Ҏ(gu)?/p>
清单1Q一个实参个数可变的Ҏ(gu) private static int sumUp(int... values) { } 注意Q只有最后一个Ş参才能被定义?#8220;能和不确定个实参相匹?#8221;的。因此,一个方法里只能有一个这L(fng)形参。另外,如果q个Ҏ(gu)q有其它的Ş参,要把它们攑ֈ前面的位|上?/p>
~译器会(x)在背地里把这最后一个Ş参{化ؓ(f)一个数lŞ参,q在~译出的class文g里作上一个记P表明q是个实参个数可变的Ҏ(gu)?/p>
清单2Q实参个数可变的Ҏ(gu)的秘密Ş?/p>
private static int sumUp(int[] values) { } ׃存在着q样的{化,所以不能再个类定义一个和转化后的Ҏ(gu){一致的Ҏ(gu)?/p>
清单3Q会(x)D~译错误的组?/p>
private static int sumUp(int... values) { } private static int sumUp(int[] values) { } I白的存亡问?/p>
Ҏ(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>
3. 调用实参个数可变的方?/p>
只要把要传递的实参逐一写到相应的位|上Q就可以调用一个实参个数可变的Ҏ(gu)。不需要其它的步骤?/p>
清单4Q可以传递若q个实参 sumUp(1, 3, 5, 7); 在背地里Q编译器?x)把q种调用q程转化为用“数组包裹实参”的Ş式:(x) 清单5Q偷偷出现的数组创徏 sumUp(new int[]{1, 2, 3, 4}); 另外Q这里说?#8220;不确定个”也包括零个,所以这L(fng)调用也是合乎情理的:(x) 清单6Q也可以传递零个实?/p>
sumUp(); q种调用Ҏ(gu)被编译器U密转化之后的效果,则等同于q样Q?/p>
清单7Q零实参对应I数l?/p>
sumUp(new int[]{}); 注意q时传递过ȝ是一个空数组Q而不是null。这样就可以采取l一的Ş式来处理Q而不必检到底属于哪U情c(din)?/p>
4. 处理个数可变的实?/p>
处理个数可变的实参的办法Q和处理数组实参的办法基本相同。所有的实参Q都被保存到一个和形参同名的数l里。根据实际的需要,把这个数l里的元素读Z后,要蒸要煮Q就可以随意了?/p>
清单8Q处理收到的实参?/p>
private static int sumUp(int... values) { int sum = 0; for (int i = 0; i < values.length; i++) { sum += values[i]; } return sum; } 5. 转发个数可变的实?/p>
有时候,在接受了一l个数可变的实参之后Q还要把它们传递给另一个实参个数可变的Ҏ(gu)。因为编码时无法知道接受来的q一l实参的数目Q所?#8220;把它们逐一写到该出现的位置上去”的做法ƈ不可行。不q,qƈ不意味着q是个不可完成的dQ因有另外一U办法,可以用来调用实参个数可变的方法?/p>
在J2SE 1.5的编译器的眼中,实参个数可变的方法是最后带了一个数lŞ参的Ҏ(gu)的特例。因此,事先把整l要传递的实参攑ֈ一个数l里Q然后把q个数组作ؓ(f)最后一个实参,传递给一个实参个数可变的Ҏ(gu)Q不?x)造成M错误。借助q一Ҏ(gu),可以顺利的完成转发了?/p>
清单9Q{发收到的实参?/p>
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); } } Java里的“printf”?#8220;sprintf” C语言里的printfQ按一定的格式输出字符Ԍ和sprintfQ按一定的格式l合字符Ԍ是十分经典的使用Varargs机制的例子。在 J2SE 1.5中,也分别在java.io.PrintStreamcdjava.lang.StringcM提供了类似的功能?/p>
按一定的格式输出字符串的功能Q可以通过调用PrintStream对象的printf(String format, Object... args)Ҏ(gu)来实现?/p>
按一定的格式l合字符串的工作Q则可以通过调用StringcȝString format(String format, Object... args)静态方法来q行?/p>
6. 是数l?不是数组Q?/p>
管在背地里Q编译器?x)把能匹配不定个实参的形参Q{化ؓ(f)数组形参Q而且也可以用数组包了实参Q再传递给实参个数可变的方法;但是Q这q不表示“能匹配不定个实参的形参”?#8220;数组形参”完全没有差异?/p>
一个明昄差异是,如果按照调用实参个数可变的方法的形式Q来调用一个最后一个Ş参是数组形参的方法,只会(x)D一?#8220;cannot be applied to”的编译错误?/p>
清单10Q一?#8220;cannot be applied to”的编译错?/p>
private static void testOverloading(int[] i) { System.out.println("A"); } public static void main(String[] args) { testOverloading(1, 2, 3);//~译出错 } ׃q一原因Q不能在调用只支持用数组包裹实参的方法的时候(例如在不是专门ؓ(f)J2SE 1.5设计W三方类库中遗留的那些)Q直接采用这U简明的调用方式?/p>
如果不能修改原来的类Qؓ(f)要调用的Ҏ(gu)增加参数个数可变的版本,而又想采用这U简明的调用方式Q那么可以借助“引入外加函数QIntroduce Foreign MethodQ?#8221;?#8220;引入本地扩展QIntoduce Local ExtensionQ?#8221;的重构手法来q似的达到目的?/p>
7. 当个数可变的实参遇到泛型 J2SE 1.5中新增了“泛型”的机Ӟ可以在一定条件下把一个类型参数化。例如,可以在编写一个类的时候,把一个方法的形参的类型用一个标识符Q如TQ来代表Q至于这个标识符到底表示什么类型,则在生成q个cȝ实例的时候再行指定。这一机制可以用来提供更充分的代码重用和更严格的编译时cd查?/p>
不过泛型机制却不能和个数可变的Ş参配合用。如果把一个能和不定个实参相匚w的Ş参的cdQ用一个标识符来代表,那么~译器会(x)l出一?#8220;generic array creation”的错误?/p>
清单11Q当Varargs遇上泛型 private static <T> void testVarargs(T... args) {//~译出错 } 造成q个现象的原因在于J2SE 1.5中的泛型机制的一个内在约束——不能拿用标识符来代表的cd来创一cd的实例。在出现支持没有了这个约束的Java版本之前Q对于这个问题,基本没有太好的解军_法?/p>
不过Q传l的“用数l包?#8221;的做法,q不受这个约束的限制?/p>
清单12Q可以编译的变通做?/p>
private static <T> void testVarargs(T[] args) { for (int i = 0; i < args.length; i++) { System.out.println(args[i]); } } 8. 重蝲中的选择问题 Java支持“重蝲”的机Ӟ允许在同一个类拥有许多只有形参列表不同的方法。然后,q译器Ҏ(gu)调用时的实参来选择到底要执行哪一个方法?/p>
传统上的选择Q基本是依照“Ҏ(gu)者优?#8221;的原则来q行。一个方法的Ҏ(gu)E度Q取决于Z让它利q行而需要满的条g的数目,需要条件越多的特D?/p>
在引入Varargs机制之后Q这一原则仍然适用Q只是要考虑的问题丰富了一些——传l上Q一个重载方法的各个版本之中Q只有Ş参数量与实参数量正好一致的那些有被q一步考虑的资根{但是Varargs机制引入之后Q完全可以出C个版本都能匹配,在其它方面也别无二致Q只是一个实参个数固定,而一个实参个数可变的情况?/p>
遇到q种情况Ӟ所用的判定规则?#8220;实参个数固定的版本优先于实参个数可变的版?#8221;?/p>
清单13Q实参个数固定的版本优先 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"); } } 如果在编译器看来Q同时有多个Ҏ(gu)h相同的优先权Q它?yu)׃?x)陷入无法到底调用哪个方法作Z个选择的状态。在q样的时候,它就?x)生一?“reference to 被调用的Ҏ(gu)?is ambiguous”的编译错误,q耐心的等候作了一些修改,以免除它的qh的新源代码的到来?/p>
在引入了Varargs机制之后Q这U可能导致迷惑的情况Q又增加了一些。例如现在可能会(x)有两个版本都能匹配,在其它方面也如出一辙,而且都是实参个数可变的冲H发生?/p>
清单14Q左右都不是Qؓ(f)难了~译?/p>
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) { } } 另外Q因为J2SE 1.5中有“Autoboxing/Auto-Unboxing”机制的存在,所以还可能发生两个版本都能匚wQ而且都是实参个数可变Q其它方面也一模一P只是一个能接受的实参是基本cdQ而另一个能接受的实参是包裹cȝ冲突发生?/p>
清单15QAutoboxing/Auto-Unboxing带来的新问题 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) { } } 9. 归纳ȝ ?#8220;用数l包?#8221;的做法相比,真正的实参个数可变的Ҏ(gu)Q在调用时传递参数的操作更ؓ(f)单,含义也更为清楚。不q,q一机制也有它自w的局限,q不是一个完无~的解决Ҏ(gu)?/p>
本文以DWR 1.1 为基Q对于DWR 2.0Q因没有正式发布版,故不做介l?/p>
一?dwr配置之web.xml
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 />
3、Log4j的配|文?br />
虽然可以不用配置文gQ而在E序中实现配|,但这U方法在如今的系l开发中昄是不可取的,能采用配|文件的地方一定一定要用配|文件。Log4j支持?U格式的配置文gQXML格式和Java的property格式Q本人更喜欢后者,首先看一个简单的例子吧,如下Q?br />
log4j.rootLogger=debug, stdout, R
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
# Pattern to output the caller's file name and line number.
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] (%F:%L) - %m%n
log4j.appender.R=org.apache.log4j.RollingFileAppender
log4j.appender.R.File=example.log
log4j.appender.R.MaxFileSize= 100KB
# Keep one backup file
log4j.appender.R.MaxBackupIndex=1
log4j.appender.R.layout=org.apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern=%p %t %c - %m%n
首先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
log4j.appender.appenderName.option1 = value1
...
log4j.appender.appenderName.option = valueN
Log4j提供的appender有以下几U:(x)
org.apache.log4j.ConsoleAppenderQ控制台Q?br />
org.apache.log4j.FileAppenderQ文Ӟ
org.apache.log4j.DailyRollingFileAppenderQ每天生一个日志文Ӟ
org.apache.log4j.RollingFileAppenderQ文件大到达指定尺寸的时候生新文gQ?br />
org.apache.log4j.WriterAppenderQ将日志信息以流格式发送到L指定的地方)
配置日志信息的格式(布局Q,其语法ؓ(f)Q?br />
log4j.appender.appenderName.layout = fully.qualified.name.of.layout.class
log4j.appender.appenderName.layout.option1 = value1
....
log4j.appender.appenderName.layout.option = valueN
Log4j提供的layout有以下几U:(x)
org.apache.log4j.HTMLLayoutQ以HTML表格形式布局Q,
org.apache.log4j.PatternLayoutQ可以灵zd指定布局模式Q,
org.apache.log4j.SimpleLayoutQ包含日志信息的U别和信息字W串Q,
org.apache.log4j.TTCCLayoutQ包含日志生的旉、线E、类别等{信息)
www.jhaccp.com.cn
Log4J采用cMC语言中的printf函数的打印格式格式化日志信息Q打印参数如下:(x) %m 输出代码中指定的消息
%p 输出优先U,即DEBUGQINFOQW(xu)ARNQERRORQFATAL
%r 输出自应用启动到输出该log信息耗费的毫U数
%c 输出所属的cȝQ通常是所在类的全?br />
%t 输出产生该日志事件的U程?br />
%n 输出一个回车换行符QW(xu)indowsq_?#8220;rn”QUnixq_?#8220;n”
%d 输出日志旉点的日期或时_(d)默认格式为ISO8601Q也可以在其后指定格式,比如Q?d{yyy MMM dd HHQmmQssQSSS}Q输出类|(x) 2002q?0?8?22Q?0Q?8Q?21
%l 输出日志事g的发生位|,包括cȝ名、发生的U程Q以?qing)在代码中的行数。D例:(x)Testlog4.mainQTestLog4.javaQ?0Q?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 />
import com.foo.Bar;
import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;
public class MyApp {
static Logger logger = Logger.getLogger(MyApp.class.getName());
public static void main(String[] args) {
// BasicConfigurator replaced with PropertyConfigurator.
PropertyConfigurator.configure(args[0]);
logger.info("Entering application.");
Bar bar = new Bar();
bar.doIt();
logger.info("Exiting application.");
}
}
]]>
J2SE 1.5提供?#8220;Varargs”机制。借助q一机制Q可以定义能和多个实参相匚w的Ş参。从而,可以用一U更单的方式Q来传递个数可变的实参。本文介l这一机制的用方法,以及(qing)q一机制与数l、泛型、重载之间的怺作用时的若干问题?
]]>
]]>
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 />
]]>
...
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)出?
Q?xml version="1.0" encoding="GB2312"?Q?br />
QRESULTQ?br />
QVALUEQ?
QNOQA1234Q?NOQ?
QADDRQ四川省XX县XX镇XX路XDXXP/ADDRQ?br />
Q?VALUEQ?br />
QVALUEQ?
QNOQB1234Q?NOQ?
QADDRQ四川省XX市XX乡XX村XXl</ADDRQ?br />
Q?VALUEQ?br />
Q?RESULTQ?
1QDOM
import java.io.*;
import java.util.*;
import org.w3c.dom.*;
import javax.xml.parsers.*;
public class MyXMLReader{
public static void main(String arge[]){
long lasting =System.currentTimeMillis();
try{
File f=new File("data_10k.xml");
DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
DocumentBuilder builder=factory.newDocumentBuilder();
Document doc = builder.parse(f);
NodeList nl = doc.getElementsByTagName("VALUE");
for (int i=0;iQnl.getLength();i++){
System.out.print("车牌L(fng):" + doc.getElementsByTagName("NO").item(i).getFirstChild().getNodeValue());
System.out.println("车主地址:" + doc.getElementsByTagName("ADDR").item(i).getFirstChild().getNodeValue());
}
}catch(Exception e){
e.printStackTrace();
}
2QSAX
import org.xml.sax.*;
import org.xml.sax.helpers.*;
import javax.xml.parsers.*;
public class MyXMLReader extends DefaultHandler {
java.util.Stack tags = new java.util.Stack();
public MyXMLReader() {
super();
}
public static void main(String args[]) {
long lasting = System.currentTimeMillis();
try {
SAXParserFactory sf = SAXParserFactory.newInstance();
SAXParser sp = sf.newSAXParser();
MyXMLReader reader = new MyXMLReader();
sp.parse(new InputSource("data_10k.xml"), reader);
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("q行旉Q? + (System.currentTimeMillis() - lasting) + "毫秒");}
public void characters(char ch[], int start, int length) throws SAXException {
String tag = (String) tags.peek();
if (tag.equals("NO")) {
System.out.print("车牌L(fng)Q? + new String(ch, start, length));
}
if (tag.equals("ADDR")) {
System.out.println("地址:" + new String(ch, start, length));
}
}
public void startElement(String uri,String localName,String qName,Attributes attrs) {
tags.push(qName);}
}
3Q?JDOM
import java.io.*;
import java.util.*;
import org.jdom.*;
import org.jdom.input.*;
public class MyXMLReader {
public static void main(String arge[]) {
long lasting = System.currentTimeMillis();
try {
SAXBuilder builder = new SAXBuilder();
Document doc = builder.build(new File("data_10k.xml"));
Element foo = doc.getRootElement();
List allChildren = foo.getChildren();
for(int i=0;iQallChildren.size();i++) {
System.out.print("车牌L(fng):" + ((Element)allChildren.get(i)).getChild("NO").getText());
System.out.println("车主地址:" + ((Element)allChildren.get(i)).getChild("ADDR").getText());
}
} catch (Exception e) {
e.printStackTrace();
}
}
4QDOM4J
import java.io.*;
import java.util.*;
import org.dom4j.*;
import org.dom4j.io.*;
public class MyXMLReader {
public static void main(String arge[]) {
long lasting = System.currentTimeMillis();
try {
File f = new File("data_10k.xml");
SAXReader reader = new SAXReader();
Document doc = reader.read(f);
Element root = doc.getRootElement();
Element foo;
for (Iterator i = root.elementIterator("VALUE"); i.hasNext();) {
foo = (Element) i.next();
System.out.print("车牌L(fng):" + foo.elementText("NO"));
System.out.println("车主地址:" + foo.elementText("ADDR"));
}
} catch (Exception e) {
e.printStackTrace();
}
}
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回的结果集