<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
<channel>
<title><![CDATA[财富猪java站 - java随写]]></title>
<link>http://www.caifuzhu.com.cn/</link>
<description><![CDATA[java学习站，让我们每天进步一点点！]]></description>
<language>zh-cn</language>
<copyright><![CDATA[Copyright 2005 PBlog2 v2.4]]></copyright>
<webMaster><![CDATA[zhouhaizhe@126.com(财富猪)]]></webMaster>
<generator>PBlog2 v2.4</generator> 
<image>
	<title>财富猪java站</title> 
	<url>http://www.caifuzhu.com.cn/images/logos.gif</url> 
	<link>http://www.caifuzhu.com.cn/</link> 
	<description>财富猪java站</description> 
</image>

			<item>
			<link>http://www.caifuzhu.com.cn/default.asp?id=107</link>
			<title><![CDATA[最新出炉2010暴强语录]]></title>
			<author>zhouhaizhe@126.com(admin)</author>
			<category><![CDATA[java随写]]></category>
			<pubDate>Fri,05 Mar 2010 12:45:36 +0800</pubDate>
			<guid>http://www.caifuzhu.com.cn/default.asp?id=107</guid>	
		<description><![CDATA[1.知道你过得不好，我也就安心了。<br/><br/>2.这位帅哥，你好像我下一任男友<br/><br/>3.伯母你好，我是你儿子的男朋友<br/><br/>4.不要叫我宅女，请叫我居里夫人<br/><br/>5.真羡慕你这么年轻就认识我了。<br/><br/>6.最近总是失眠，16小时就醒一次。<br/><br/>7.人人都说我丑，其实我只是美得不明显。<br/><br/>8.别到处嚷嚷世界抛弃了你，世界原本就不是属于你<br/><br/>9.我们要向前看，不错过些歪瓜劣枣怎么知道什么是好<br/><br/>10.爱情是一杯酒 我小心翼翼捧给心爱的人 他不小心碰撒了 于是我兑上了水<br/><br/>11.生活不是林黛玉，不会因为忧伤而风情万种。<br/><br/>12.已经将整个青春都用来检讨青春，还要把整个生命都用来怀疑生命?<br/><br/>13.请转告王子,老娘还在披荆斩棘的路上,还有雪山未翻、大河未过、巨龙未杀、帅哥未泡……叫他继&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;续死睡吧!<br/><br/>14.人和猪的区别就是：猪一直是猪，而人有时却不是人<br/><br/>15.我爱你时，你说什么就是什么。 我不爱你时，你说你是什么。<br/><br/>16.你说...你喜欢我?其实...我一开始...其实我也...唉跟你说了吧,其实我也挺喜欢我自己的.<br/><br/>17.要不是打不过你，我早跟你翻脸了。<br/><br/>18.来世记得早点来娶我。<br/><br/>19.让我流泪的人，我一定会让你流血。<br/><br/>20.别轻易对别人说爱，别固执的将别人心门打开，又玩笑着离开。<br/>]]></description>
		</item>
		
			<item>
			<link>http://www.caifuzhu.com.cn/default.asp?id=101</link>
			<title><![CDATA[nginx+tomcat架构下获取真实IP的办法 ]]></title>
			<author>zhouhaizhe@126.com(admin)</author>
			<category><![CDATA[java随写]]></category>
			<pubDate>Sun,14 Feb 2010 13:07:50 +0800</pubDate>
			<guid>http://www.caifuzhu.com.cn/default.asp?id=101</guid>	
		<description><![CDATA[第一步：在nginx.conf中配置反向代理时把真实IP带上，例如：<br/><br/>server { <br/>&nbsp;&nbsp;&nbsp;&nbsp;listen 80; <br/>&nbsp;&nbsp;&nbsp;&nbsp;server_name&nbsp;&nbsp;boyan.com; <br/>&nbsp;&nbsp;&nbsp;&nbsp;location ~ ^/(WEB-INF)/ { <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;deny all; <br/>&nbsp;&nbsp;&nbsp;&nbsp; } <br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;location / { <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;proxy_pass <a href="http://localhost:8888" target="_blank">http://localhost:8888</a>; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;proxy_set_header&nbsp;&nbsp;X-Real-IP&nbsp;&nbsp;$remote_addr;<br/>&nbsp;&nbsp;&nbsp;&nbsp;}<br/>&nbsp;&nbsp;}<br/><br/>第二步：应用程序中用 String ip = request.getHeader(&#34;X-Real-IP&#34;);替代String ip = request.getRemoteAddr();即可<br/>转：<a href="http://www.blogjava.net/boyanxiu/archive/2010/02/09/312411.html" target="_blank">http://www.blogjava.net/boyanxiu/archive/2010/02/09/312411.html</a><br/><br/>]]></description>
		</item>
		
			<item>
			<link>http://www.caifuzhu.com.cn/default.asp?id=100</link>
			<title><![CDATA[eclipse插件开发:使用AST生成类]]></title>
			<author>zhouhaizhe@126.com(admin)</author>
			<category><![CDATA[java随写]]></category>
			<pubDate>Sun,14 Feb 2010 13:06:55 +0800</pubDate>
			<guid>http://www.caifuzhu.com.cn/default.asp?id=100</guid>	
		<description><![CDATA[本代码演示如何通过AST生成一个完整的类, 最终生成的代码比较乱, 编译无法通过,重点在于对AST的使用, 无需考虑最后生成的结果.<br/><br/>以下是最终生成的代码(语法有严重错误, 请不要计较这些):<br/>package com.aptech.lzh;<br/><br/>import java.util.Date;<br/>import java.util.Random;<br/><br/>public class Program {<br/>&nbsp;&nbsp;&nbsp;&nbsp;public static void main(String[] arg) {<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Program program = new Program();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String r = program.getString(&#34;中国&#34;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(r);<br/>&nbsp;&nbsp;&nbsp;&nbsp;}<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;public Program(int a, int[] b, final Integer c) {<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;super(null);<br/>&nbsp;&nbsp;&nbsp;&nbsp;}<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;public String getString(String p) {<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String newString = new String(&#34;初始值&#34;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;newString = &#34;你好&#34;;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String result = newString.indexOf(&#34;值&#34;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;newString = name + &#34;你好&#34;;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return newString;<br/>&nbsp;&nbsp;&nbsp;&nbsp;}<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;public String isOdd(int a) throws NullPointerException, Exception {<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (a &lt; 0)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throw new Exception(&#34;数字不能为负数&#34;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (a % 2 == 0)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return &#34;偶数&#34;;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else {<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(&#34;完&#34;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return &#34;奇数&#34;;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br/>&nbsp;&nbsp;&nbsp;&nbsp;}<br/>}<br/><br/>源代码:<br/>package ast.test.demo;<br/><br/>import o&#114;g.eclipse.jdt.core.dom.AST;<br/>import o&#114;g.eclipse.jdt.core.dom.Assignment;<br/>import o&#114;g.eclipse.jdt.core.dom.Block;<br/>import o&#114;g.eclipse.jdt.core.dom.ClassInstanceCreation;<br/>import o&#114;g.eclipse.jdt.core.dom.CompilationUnit;<br/>import o&#114;g.eclipse.jdt.core.dom.ExpressionStatement;<br/>import o&#114;g.eclipse.jdt.core.dom.IfStatement;<br/>import o&#114;g.eclipse.jdt.core.dom.ImportDeclaration;<br/>import o&#114;g.eclipse.jdt.core.dom.InfixExpression;<br/>import o&#114;g.eclipse.jdt.core.dom.MethodDeclaration;<br/>import o&#114;g.eclipse.jdt.core.dom.MethodInvocation;<br/>import o&#114;g.eclipse.jdt.core.dom.Modifier;<br/>import o&#114;g.eclipse.jdt.core.dom.NumberLiteral;<br/>import o&#114;g.eclipse.jdt.core.dom.PackageDeclaration;<br/>import o&#114;g.eclipse.jdt.core.dom.PrimitiveType;<br/>import o&#114;g.eclipse.jdt.core.dom.ReturnStatement;<br/>import o&#114;g.eclipse.jdt.core.dom.SingleVariableDeclaration;<br/>import o&#114;g.eclipse.jdt.core.dom.StringLiteral;<br/>import o&#114;g.eclipse.jdt.core.dom.SuperConstructorInvocation;<br/>import o&#114;g.eclipse.jdt.core.dom.ThrowStatement;<br/>import o&#114;g.eclipse.jdt.core.dom.TypeDeclaration;<br/>import o&#114;g.eclipse.jdt.core.dom.TypeLiteral;<br/>import o&#114;g.eclipse.jdt.core.dom.VariableDeclarationFragment;<br/>import o&#114;g.eclipse.jdt.core.dom.VariableDeclarationStatement;<br/>import o&#114;g.eclipse.jdt.core.dom.Assignment.Operator;<br/>import o&#114;g.eclipse.jdt.core.dom.Modifier.ModifierKeyword;<br/><br/>public class Demo {<br/>&nbsp;&nbsp;&nbsp;&nbsp;public static void main(String[] args) {<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AST ast = AST.newAST(AST.JLS3);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CompilationUnit compilationUnit = ast.newCompilationUnit();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//创建类<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TypeDeclaration programClass = ast.newTypeDeclaration();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;programClass.setName(ast.newSimpleName(&#34;Program&#34;));<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;programClass.modifiers().add(ast.newModifier(ModifierKeyword.PUBLIC_KEYWORD));<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;compilationUnit.types().add(programClass);<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//创建包<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PackageDeclaration packageDeclaration = ast.newPackageDeclaration();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;packageDeclaration.setName(ast.newName(&#34;com.aptech.lzh&#34;));<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;compilationUnit.setPackage(packageDeclaration);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//要导入的包<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String[] imports = {&#34;java.util.Date&#34;, &#34;java.util.Random&#34;};<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(String imp : imports){<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ImportDeclaration importDeclaration = ast.newImportDeclaration();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;importDeclaration.setName(ast.newName(imp));<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;compilationUnit.imports().add(importDeclaration);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//创建一个main方法<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MethodDeclaration main = ast.newMethodDeclaration();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;main.setName(ast.newSimpleName(&#34;main&#34;));<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;main.modifiers().add(ast.newModifier(Modifier.ModifierKeyword.PUBLIC_KEYWORD));<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;main.modifiers().add(ast.newModifier(ModifierKeyword.STATIC_KEYWORD));<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;main.setReturnType2(ast.newPrimitiveType(PrimitiveType.VOID));<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;programClass.bodyDeclarations().add(main);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Block mainBlock = ast.newBlock();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;main.setBody(mainBlock);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//给main方法定义String[]参数<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SingleVariableDeclaration mainParameter = ast.newSingleVariableDeclaration();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mainParameter.setName(ast.newSimpleName(&#34;arg&#34;));<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mainParameter.setType(ast.newArrayType(ast.newSimpleType(ast.newName(&#34;String&#34;))));<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;main.parameters().add(mainParameter);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//创建Pragram对象: Program program=new Program();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;VariableDeclarationFragment fragment = ast.newVariableDeclarationFragment();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fragment.setName(ast.newSimpleName(&#34;program&#34;));<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;VariableDeclarationStatement statement = ast.newVariableDeclarationStatement(fragment);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;statement.setType(ast.newSimpleType(ast.newSimpleName(&#34;Program&#34;)));<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ClassInstanceCreation classInstanceCreation = ast.newClassInstanceCreation();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;classInstanceCreation.setType(ast.newSimpleType(ast.newSimpleName(&#34;Program&#34;)));<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fragment.setInitializer(classInstanceCreation);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mainBlock.statements().add(statement);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//调用getString方法:String r = program.getString(&#34;中国&#34;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MethodInvocation methodInvocation = ast.newMethodInvocation();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;methodInvocation.setExpression(ast.newSimpleName(&#34;program&#34;));<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;methodInvocation.setName(ast.newSimpleName(&#34;getString&#34;));<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//String参数<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;StringLiteral stringLiteral = ast.newStringLiteral();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stringLiteral.setLiteralValue(&#34;中国&#34;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;methodInvocation.arguments().add(stringLiteral);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//创建变量<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;VariableDeclarationFragment fragment2 = ast.newVariableDeclarationFragment();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fragment2.setName(ast.newSimpleName(&#34;r&#34;));<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;VariableDeclarationStatement statement3 = ast.newVariableDeclarationStatement(fragment2);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;statement3.setType(ast.newSimpleType(ast.newSimpleName(&#34;String&#34;)));<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fragment2.setInitializer(methodInvocation);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mainBlock.statements().add(statement3);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//输出r的值: System.out.println(r);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MethodInvocation methodInvocation2 = ast.newMethodInvocation();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;methodInvocation2.setExpression(ast.newName(&#34;System.out&#34;));<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;methodInvocation2.setName(ast.newSimpleName(&#34;println&#34;));<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;methodInvocation2.arguments().add(ast.newSimpleName(&#34;r&#34;));<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ExpressionStatement statement2 = ast.newExpressionStatement(methodInvocation2);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mainBlock.statements().add(statement2);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//构造方法<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MethodDeclaration constructorMethod = ast.newMethodDeclaration();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;constructorMethod.setConstructor(true);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;constructorMethod.setName(ast.newSimpleName(&#34;Program&#34;));<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;constructorMethod.modifiers().add(ast.newModifier(ModifierKeyword.PUBLIC_KEYWORD));<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//基本类型的参数<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SingleVariableDeclaration p1 = ast.newSingleVariableDeclaration();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p1.setName(ast.newSimpleName(&#34;a&#34;));<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p1.setType(ast.newPrimitiveType(PrimitiveType.INT));<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//int[]类型的参数<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SingleVariableDeclaration p2 = ast.newSingleVariableDeclaration();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p2.setName(ast.newSimpleName(&#34;b&#34;));<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p2.setType(ast.newArrayType(ast.newPrimitiveType(PrimitiveType.INT)));<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//引用类型的参数<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SingleVariableDeclaration p3 = ast.newSingleVariableDeclaration();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p3.setName(ast.newSimpleName(&#34;c&#34;));<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p3.setType(ast.newSimpleType(ast.newName(&#34;Integer&#34;)));<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p3.modifiers().add(ast.newModifier(ModifierKeyword.FINAL_KEYWORD));<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;constructorMethod.parameters().add(p1);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;constructorMethod.parameters().add(p2);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;constructorMethod.parameters().add(p3);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Block constructBlock = ast.newBlock();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;constructorMethod.setBody(constructBlock);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;programClass.bodyDeclarations().add(constructorMethod);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SuperConstructorInvocation superConstructorInvocation = ast.newSuperConstructorInvocation();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;constructBlock.statements().add(superConstructorInvocation);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;superConstructorInvocation.arguments().add(ast.newNullLiteral());<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/**//*定义一个方法,形如:<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public String getString(String name){<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String newString = name + &#34;你好&#34;;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return newString;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MethodDeclaration getString = ast.newMethodDeclaration();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;getString.setName(ast.newSimpleName(&#34;getString&#34;));<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;getString.modifiers().add(ast.newModifier(ModifierKeyword.PUBLIC_KEYWORD));<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SingleVariableDeclaration p = ast.newSingleVariableDeclaration();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p.setName(ast.newSimpleName(&#34;p&#34;));<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p.setType(ast.newSimpleType(ast.newName(&#34;String&#34;)));<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;getString.parameters().add(p);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;getString.setReturnType2(ast.newSimpleType(ast.newSimpleName(&#34;String&#34;)));<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//创建块<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Block block = ast.newBlock();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;getString.setBody(block);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;programClass.bodyDeclarations().add(getString);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//方法内容----定义String变量<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;VariableDeclarationFragment fragment = ast.newVariableDeclarationFragment();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fragment.setName(ast.newSimpleName(&#34;newString&#34;));<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;VariableDeclarationStatement statement = ast.newVariableDeclarationStatement(fragment);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//String newString = &#34;初始值&#34;;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/**//*StringLiteral stringLiteral2 = ast.newStringLiteral();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stringLiteral2.setLiteralValue(&#34;初始值&#34;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fragment.setInitializer(stringLiteral2);*/<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ClassInstanceCreation classInstanceCreation = ast.newClassInstanceCreation();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;classInstanceCreation.setType(ast.newSimpleType(ast.newName(&#34;String&#34;)));<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SingleVariableDeclaration p1 = ast.newSingleVariableDeclaration();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;StringLiteral stringLiteral3 = ast.newStringLiteral();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stringLiteral3.setLiteralValue(&#34;初始值&#34;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;classInstanceCreation.arguments().add(stringLiteral3);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fragment.setInitializer(classInstanceCreation);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;statement.setType(ast.newSimpleType(ast.newName(&#34;String&#34;)));<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Assignment assignment = ast.newAssignment();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;assignment.setLeftHandSide(ast.newSimpleName(&#34;newString&#34;));<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;StringLiteral stringLiteral = ast.newStringLiteral();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stringLiteral.setLiteralValue(&#34;你好&#34;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;assignment.setRightHandSide(stringLiteral);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;assignment.setOperator(Operator.ASSIGN);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ExpressionStatement statement2 = ast.newExpressionStatement(assignment);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;block.statements().add(statement);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;block.statements().add(statement2);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//方法调用<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MethodInvocation methodInvocation = ast.newMethodInvocation();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;methodInvocation.setExpression(ast.newName(&#34;newString&#34;));<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;methodInvocation.setName(ast.newSimpleName(&#34;index&#34;)); //方法名<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;StringLiteral stringLiteral2 = ast.newStringLiteral();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stringLiteral2.setLiteralValue(&#34;值&#34;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;methodInvocation.arguments().add(stringLiteral2);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;VariableDeclarationFragment fragment2 = ast.newVariableDeclarationFragment();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fragment2.setInitializer(methodInvocation);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fragment2.setName(ast.newSimpleName(&#34;result&#34;));<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;VariableDeclarationStatement statement3 = ast.newVariableDeclarationStatement(fragment2);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;statement3.setType(ast.newSimpleType(ast.newName(&#34;String&#34;)));<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;block.statements().add(statement3);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;StringLiteral stringLiteral4 = ast.newStringLiteral();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stringLiteral4.setLiteralValue(&#34;你好&#34;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;InfixExpression infixExpression = ast.newInfixExpression();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;infixExpression.setLeftOperand(ast.newName(&#34;name&#34;));<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;infixExpression.setOperator(org.eclipse.jdt.core.dom.InfixExpression.Operator.PLUS);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;infixExpression.setRightOperand(stringLiteral4);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Assignment assignment2 = ast.newAssignment();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;assignment2.setLeftHandSide(ast.newSimpleName(&#34;newString&#34;));<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;assignment2.setOperator(Operator.ASSIGN);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;assignment2.setRightHandSide(infixExpression);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ExpressionStatement statement4 = ast.newExpressionStatement(assignment2);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;block.statements().add(statement4);<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ReturnStatement rs = ast.newReturnStatement();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rs.setExpression(ast.newName(&#34;newString&#34;));<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;block.statements().add(rs);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/** *//**<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * 定义一个方法,形如:<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * public String isOdd(int a) throws NullPointerException, Exception{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp; if(a &lt; 0) throw new Exception(&#34;数字不能为负数&#34;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp; if(a % 2 == 0){<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return &#34;偶数&#34;;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp; }else{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(&#34;完&#34;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return &#34;奇数&#34;;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp; }<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MethodDeclaration methodDeclaration = ast.newMethodDeclaration();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;methodDeclaration.setName(ast.newSimpleName(&#34;isOdd&#34;));<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;methodDeclaration.modifiers().add(ast.newModifier(ModifierKeyword.PUBLIC_KEYWORD));<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;methodDeclaration.setReturnType2(ast.newSimpleType(ast.newSimpleName(&#34;String&#34;)));<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//设置参数<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SingleVariableDeclaration singleVariableDeclaration = ast.newSingleVariableDeclaration();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;singleVariableDeclaration.setName(ast.newSimpleName(&#34;a&#34;));<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;singleVariableDeclaration.setType(ast.newPrimitiveType(PrimitiveType.INT));<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;methodDeclaration.parameters().add(singleVariableDeclaration);<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//抛出异常<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;methodDeclaration.thrownExceptions().add(ast.newSimpleName(&#34;NullPointerException&#34;));<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;methodDeclaration.thrownExceptions().add(ast.newSimpleName(&#34;Exception&#34;));<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//创建块{}<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Block isOddBlock = ast.newBlock();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;methodDeclaration.setBody(isOddBlock);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//创建if与异常<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IfStatement ifStatement = ast.newIfStatement();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//表达式 a &lt; 0<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;InfixExpression infixExpression = ast.newInfixExpression();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;infixExpression.setLeftOperand(ast.newSimpleName(&#34;a&#34;));<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;infixExpression.setOperator(org.eclipse.jdt.core.dom.InfixExpression.Operator.LESS);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NumberLiteral numberLiteral = ast.newNumberLiteral(&#34;0&#34;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;infixExpression.setRightOperand(numberLiteral);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ifStatement.setExpression(infixExpression);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//设置if中的内容<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ThrowStatement throwStatement = ast.newThrowStatement();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ClassInstanceCreation classInstanceCreation = ast.newClassInstanceCreation();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;classInstanceCreation.setType(ast.newSimpleType(ast.newSimpleName(&#34;Exception&#34;)));<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;StringLiteral stringLiteral = ast.newStringLiteral();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stringLiteral.setLiteralValue(&#34;数字不能为负数&#34;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;classInstanceCreation.arguments().add(stringLiteral);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throwStatement.setExpression(classInstanceCreation);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ifStatement.setThenStatement(throwStatement);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//if(a % 2 == 0)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IfStatement ifStatement2 = ast.newIfStatement();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;InfixExpression infixExpression2 = ast.newInfixExpression();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;infixExpression2.setLeftOperand(ast.newSimpleName(&#34;a&#34;));<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;infixExpression2.setOperator(org.eclipse.jdt.core.dom.InfixExpression.Operator.REMAINDER);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NumberLiteral numberLiteral2 = ast.newNumberLiteral(&#34;2&#34;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;infixExpression2.setRightOperand(numberLiteral2);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;InfixExpression infixExpression3 = ast.newInfixExpression();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;infixExpression3.setLeftOperand(infixExpression2);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;infixExpression3.setOperator(org.eclipse.jdt.core.dom.InfixExpression.Operator.EQUALS);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NumberLiteral numberLiteral3 = ast.newNumberLiteral(&#34;0&#34;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;infixExpression3.setRightOperand(numberLiteral3);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ifStatement2.setExpression(infixExpression3);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//return &#34;偶数&#34;;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ReturnStatement returnStatement = ast.newReturnStatement();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;StringLiteral stringLiteral2 = ast.newStringLiteral();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stringLiteral2.setLiteralValue(&#34;偶数&#34;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;returnStatement.setExpression(stringLiteral2);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ifStatement2.setThenStatement(returnStatement);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//else<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Block elseBlock = ast.newBlock();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MethodInvocation methodInvocation = ast.newMethodInvocation();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;methodInvocation.setExpression(ast.newName(&#34;System.out&#34;));<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;methodInvocation.setName(ast.newSimpleName(&#34;println&#34;));<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;StringLiteral stringLiteral4 = ast.newStringLiteral();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stringLiteral4.setLiteralValue(&#34;完&#34;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;methodInvocation.arguments().add(stringLiteral4);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ExpressionStatement statement = ast.newExpressionStatement(methodInvocation);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;elseBlock.statements().add(statement);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ReturnStatement returnStatement2 = ast.newReturnStatement();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;StringLiteral stringLiteral3 = ast.newStringLiteral();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stringLiteral3.setLiteralValue(&#34;奇数&#34;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;returnStatement2.setExpression(stringLiteral3);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;elseBlock.statements().add(returnStatement2);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ifStatement2.setElseStatement(elseBlock);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;isOddBlock.statements().add(ifStatement);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;isOddBlock.statements().add(ifStatement2);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;programClass.bodyDeclarations().add(methodDeclaration);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(compilationUnit.toString());<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;}<br/>}<br/>]]></description>
		</item>
		
			<item>
			<link>http://www.caifuzhu.com.cn/default.asp?id=96</link>
			<title><![CDATA[求一组序列的全排列 ]]></title>
			<author>zhouhaizhe@126.com(admin)</author>
			<category><![CDATA[java随写]]></category>
			<pubDate>Wed,29 Jul 2009 21:23:30 +0800</pubDate>
			<guid>http://www.caifuzhu.com.cn/default.asp?id=96</guid>	
		<description><![CDATA[先来复习一下概率论的基础知识：<br/>n 个数，从中取 m 个进行进行排列，有多少中排法。<br/>如果不同位置可以重复：<br/>第 1 个位置有 n 种选法<br/>第 2 个位置有 n 种选法<br/>......<br/>第 m 个位置有 n 种选法<br/>根据乘法原理：总共 n**m 种排法<br/><br/>如果不能重复<br/>第 1 个位置有 n 种选法<br/>第 2 个位置有 n-1 种选法<br/>......<br/>第 m 个位置有 n-m+1 种选法<br/>根据乘法原理：<br/>总共 n*(n-1)*....*(n-m+1)种排法<br/>全排列就是 n! 种排法&nbsp;&nbsp; <br/><br/><br/>如果我们要编程生成所有的排列，基本上都是嵌套循环<br/><br/>假如 list 有 n 个元素，从中选 2 个进行排列，伪代码基本如下<br/><br/>for i=0 to list.length-1<br/>&nbsp;&nbsp;&nbsp;&nbsp;for j=0 to list.length-1{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//找到一种排列方法<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;temp=list[i,j]<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//根据情况排除重复<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;..<br/>&nbsp;&nbsp;&nbsp;&nbsp;}<br/><br/><br/>问题是上面的例子，我们知道选 2 个元素排列，所以循环是 2 层。<br/>但是，如果我们求得是 P(list,n)，n 并不确定，我们不知道循环是几层，要想写一个通用的函数，只能借鉴上面的思想，但是不能使用上面的形式<br/><br/><br/>我的想法是：<br/>1、用一个数组 repeat[] 来保存每层的循环变量：repeat[0] 保存第 0 层循环变量的位置，repeat[1] 保存第 1 层循环变量的位置......repeat[n-1] 保存第 n-1 层循环变量的位置<br/>2、标记当前正在第几层循环：layer<br/>3、集合长度已知 ：size = list.length<br/>4、临时数组：temp[]，长度为 n <br/>3、算法描述如下：<br/>循环体（layer == 0 且 repeat[0]== size&nbsp;&nbsp;则退出循环）<br/>{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;如果（前 n-1 层）<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;取出该层循环变量：pos=repeat[layer]<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;如果 (pos 到达该层末尾，即 pos==size)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;temp[layer]=null<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;repeat[layer]=0//该层循环变量归零<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;layer--//回到上一层<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;continue<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;否则<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;temp[layer]=list[pos]<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;repeat_count[layer]++//该层循环变量增加1<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;layer++//层数增加 1<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;continue<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;否则（在最内层）<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;不停改变 temp 最后一个元素，每改变一次，就得到一种新的组合，该层循环变量增加1<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;当最内层也到达 List 末尾：将该层循环变量归零，回到上层<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br/>} <br/><br/><br/>下面是我用 Python 编写的 permutation 函数，接受三个参数<br/>第一个参数：如果数字则返回排列数；如果是集合，则返回排列的集合<br/>第二个参数：选几个数排列，默认全排序<br/>第三个参数：是否允许重复，默认不允许<br/>例子：<br/>print permutation(10),&#39;\n&#39;&nbsp;&nbsp; #全排列数<br/>print permutation(10,2),&#39;\n&#39; #10 选 2 排列数<br/>print permutation(10,duplicate=True),&#39;\n&#39;&nbsp;&nbsp;#允许重复的全排列<br/>&nbsp;&nbsp;&nbsp;&nbsp;<br/>li=[&#39;a&#39;,&#39;b&#39;,&#39;c&#39;]<br/>print &#39;全排列：&#39;,permutation(li),&#39;\n&#39;<br/>print &#39;选2 ：&#39;,permutation(li,2),&#39;\n&#39;<br/>print &#39;允许重复 ：&#39;,permutation(li,duplicate=True),&#39;\n&#39;<br/><br/><br/>运行结果：<br/><br/><br/><br/><br/>下面给出源代码：<br/>]]></description>
		</item>
		
			<item>
			<link>http://www.caifuzhu.com.cn/default.asp?id=95</link>
			<title><![CDATA[pdf生成的解决方案]]></title>
			<author>zhouhaizhe@126.com(admin)</author>
			<category><![CDATA[java随写]]></category>
			<pubDate>Wed,29 Jul 2009 21:22:24 +0800</pubDate>
			<guid>http://www.caifuzhu.com.cn/default.asp?id=95</guid>	
		<description><![CDATA[《根据批量URL生成有书签的pdf文档的解决方案》一文作为一个完整的解决方案，主要有四个要点<br/><br/>（1）详细描述了解决方案的思路， <br/><br/>（2）提出了一种描述URL的xml文件，称之为h2p文件 <br/><br/>（3）根据h2p文件生成pdf文档的工具称为h2p-tool，同时h2p-tool还能对h2p文件进行编辑，从而制作自己的pdf电子书。<br/><br/>（4）h2p文件是该解决方案的资源文件，收集url是件费时费力的事情，所以该解决方案还提供了下载h2p文件的链接<br/><br/>H2p是我自己定义的一种xml格式，我私下里是希望这种格式能够被大家接受，所以我定义了dtd，并且开发了一个编辑h2p文件的工具h2p-tool，而且在javaei网站上提供了大量的h2p文件作为资源下载。有了h2p，制作自己的pdf电子书将变得很容易。<br/><br/>如果想让h2p为大家所接受，h2p必须不断的发展。因为现在h2p应用还是很简单很原始。主要表现在，生成的pdf是原html的完全再现，这是他的优点也是他的弱点。<br/><br/>说是优点，是因为pdf的呈现效果和在浏览器里风格一样。<br/><br/>说是缺点，是因为既然生成了pdf，我们希望pdf里主要突出文章的主题内容，而不希望有原来网页里的那么多的图片和广告，而且还希望原来是分页的内容自动合并到一个pdf里。<br/><br/>所以，就此缺点，我提出两个可能的展望。<br/><br/>（1）制定一种规范，该规范要求网站为每篇博客提供一个为h2p专用的链接（姑且叫h2p链接吧），根据这个链接打开的博客文章是没有广告的，那么h2p文件的连接采用这种h2p链接，生成的pdf就没有上述的缺点了。这个想法可能与网站的盈利相悖，因为如果提供h2p链接，很多人将会之点击h2p链接，这样，就避开了网站投放的广告。<br/><br/>（2）第二种可能的展望就是，各网站提供一个webservice的编程接口，通过该编程接口，用程序访问每篇博客文章，这样得到的文章就是没有广告的干净的文章。<br/><br/>这两种展望的目的主要是为了生成干净的pdf文档，显然，要实现这两个展望是很困难的，除非大家都很接受h2p这个思路，并且对这种应用很迫切，才会有人来大力推动。想想rss的普及，那也是一波三折，最终还是因为其便捷的使用模式而被大家所接受。<br/><br/>私下里是希望大家能接受并喜欢h2p的。<br/><br/>]]></description>
		</item>
		
			<item>
			<link>http://www.caifuzhu.com.cn/default.asp?id=94</link>
			<title><![CDATA[事半功倍学习Struts框架的方法]]></title>
			<author>zhouhaizhe@126.com(admin)</author>
			<category><![CDATA[java随写]]></category>
			<pubDate>Sat,04 Jul 2009 11:38:56 +0800</pubDate>
			<guid>http://www.caifuzhu.com.cn/default.asp?id=94</guid>	
		<description><![CDATA[来源: 51cto<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;由于Struts框架在全球的广泛使用，学习它的人也非常之多，但是大部分人花费了太多不必要的时间和精力在一些不太重要的地方，导致学习代价高昂，成效也不是很好。我这里根据多年培训经验的总结，精心设计了一套学习Struts框架的曲线，让大伙学习Struts框架既快且准，节省大伙宝贵的时间，一定会对各位学习者大有帮助。 <br/><br/>　　大家知道，Struts是Apache基金会Jakarta项目组的一个开源项目，它采用MVC设计模式，是一个基于SunJ2EE平台的WEB表现层框架。这里有几个概念值得大家关注：开源，MVC，J2EE，WEB表现层，框架。我来逐一解释。<br/>　　开源：不用多说，源代码可以让你一行一行仔细分析，深入了解其内部实现机制。<br/>　　MVC：它强制性的使应用程序的输入、处理和输出分开。使用MVC应用程序被分成三个核心部件：模型、视图、控制器。它们各自处理自己的任务。MVC享有“全球第一设计模式”的美誉，是当前很流行的一种设计理念和思想，你要学好Struts，必要要让这种思想深入骨髓。(我在另一篇文章中对MVC进行过阐述，关于MVC的流程及例子请参阅拙作：<a href="http://blog.csdn.net/lenotang/archive/2008/06/18/2562348.aspx" target="_blank">http://blog.csdn.net/lenotang/archive/2008/06/18/2562348.aspx</a>)<br/>　　J2EE：J2EE是使用Java技术开发企业级应用的一种事实上的工业标准。J2EE将组成一个完整企业级应用的不同部分纳入不同的容器(Container)，每个容器中都包含若干组件(这些组件是需要部署在相应容器中的)，同时各种组件都能使用各种J2EEService/API。其中最常用的容器就是WEB容器（就是我们常说的WEB服务器），里面最核心的两个组件就是JSP和SERVLET。而Struts就是基于这两种技术，依赖于WEB容器。<br/>　　WEB表现层：我们常说的J2EE四层体系架构：WEB表现层，业务逻辑层，持久层，数据库层。这是一种逻辑划分。WEB表现层的特点就是依靠WEB服务器，直接跟客户端（一般是WEB浏览器）打交道。Struts处于WEB表现层，主要就是接受并处理用户请求，并将处理结果响应给用户。<br/>　　框架：通俗地讲，框架就是一个“半成品”，它做了一些通用的东西让你去配置和扩展。框架的强大之处不是说它能让你做什么，而是它不能让你做什么！它使混乱的东西变得结构化。我们来打个比方。框架就像是一间有很多屋梁的房子，当你需要扩建房子的时候，譬如增加新的房间、窗户和过道或者在卧室增加一个壁炉，由于屋梁的限制，你并没有什么其他的选择。虽然较少的屋梁会让你有更多的选择，但是当台风来袭或者发生地震的时候，你让家人住在这样一间只有屋顶的房子里，恐怕不会觉得安全吧。总之，框架是在结构和创造力之间的一个精确的天平。<br/>　　好了。这里假设大家已经理解了上述概念，并会用JSP/SERVLET做一些普通的WEB应用程序。现在就让我们来看看如何学习Struts框架吧。这里我以Struts1.2版本为例。（Struts2.0的实现跟以前的版本有很大不同，我以后会讲到。）让我们出发吧！<br/>　　首先，你要照书本或者网上的例子跑一个最简单的Struts应用，就是在客户端显示一个HELLOWORLD的那种，这叫先睹为快。在这里你开始接触到做Struts应用需要的东西：Struts的JAR包，核心控制器ActionServlet在web.xml上的配置，针对具体用户请求URL的Action的编写以及Struts应用的核心配置文件Struts-config.xml。做完后停下来思考一下。<br/>　　然后，你开始跑一个稍微大点的用户登陆的应用，成功就跳转到我们的主页面，失败就继续回到登陆页面。我们引入ActionForm组件和对后台数据库的操作。这个时候MVC发挥作用了。ActionServlet和自己编写的Action分别充当前，后端控制器组件，DAO/DTO充当了模型组件，JSP充当视图组件。Struts-config.xml也变的饱满起来，上面开始多了些配置datasources，form-beans,action-mappings。做完后到网上找一些好的参考资料或者利用自己经典的Struts的案头书（最好是有图解），开始认真琢磨Struts的运行原理和执行流程，特别要好生体会ActionForm组件的作用和Struts-config.xml这个核心配置文件每一处用到的配置。这个时候，你应该开始有些领悟：我们自己写的Action还有ActionForm类一定要继承框架已有的Action和ActionForm，写完了之后还必须得将它们配置到Struts-config.xml中去。<br/>　　接着，你已经对Struts框架有了大致的了解，可能开始对Struts的其他主题感兴趣了，OK,现在扩充你的登陆应用吧。先加上验证，不然你的系统会不堪一击。验证分为客户端验证和服务器端验证。服务器端的验证我们可以在ActionForm里面的validate()方法里做，也可以在随后的Action类的execute()方法里做，甚至可以使用验证框架。这里大家要把重点方在验证框架的学习上。做好后再加上资源国际化I18N，针对不同区域不同语言的客户提供不同语言版本的页面显示。我们开始写资源属性文件，开始在Struts-config.xml里面配置,开始使用Struts自带的标签,等。这个里面涉及的知识点都很多，需要大家耐心细致地学习。大家在跑这个应用的时候会发现各种各样的异常和问题。不要害怕，这些错误都是我们的好朋友，我们要把它们通通都记录下来，并坚韧地排除掉它们。这里要记住：尽量避免重复犯错，不要在同一个地方跌倒两次。<br/>做完后，认真总结和思考<br/>　　再接着，你把上面的都基本消化了，但是总隐隐觉得不够系统和完整，你就开始做几个CRUD的应用，完成普通的增删查改的工作。在做这些应用的过程中，你要认真总结核心配置文件Struts-config.xml里面的8个重要节点元素的配置以及它们的顺序，每个节点的重要属性，特别是里的子节点的属性是重中之重，一定要好好理解并灵活运用。<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;你也要开始系统地学习Struts里面的标签。但这个时候千万不要追求大而全，只学习几种常用的标签就可以了，重点放在html,bean,还有logic标签上。这时候还有些小知识点你也许要用到，譬如：文件上传控件，防止信息重复提交，自定义标签，cookie的使用等等。这就是个相对比较耗时间和精力的阶段了，你要做的就是不断地参考，不断地思考，不断地总结，最好还能和志同道合的人不断地争论。<br/>　　慢慢地，你对Struts框架有了一个全局性的宏观把握，用它来完成一些小模块的开发已经没有太大问题，你已经开始志得意满了：Struts不过如此嘛！如果你到了这一步，我首先要恭喜你，你接近成功了。但我也要小心地提醒你：Struts里面还有很多东西值得挖掘！你不妨多问一下自己，软件有一个人开发的吗？页面我使用了良好的布局吗？页面导航都是那么简单吗？我的所有做法就不能有更简单的实现了吗？我对学习Struts框架的好处了如指掌了吗？好的，如果你想通了，带着这些问题，你就会重新披挂上阵，开始学习Struts的多模块开发，开始学习tiles框架，开始认真研读Struts的源代码，开始学习一些更简单有效的Action组件类和ActionForm组件类……，真应了一句古语：吾生也有涯，知也无涯！最后呢，大家可能会悟出一些道理：譬如Struts框架基本的好处就是用配置代替编码，它是一个半成品，是让我们扩展和配置的等等。<br/>　　上面我粗略地勾勒了一下学习Struts的曲线。归纳一下：学习框架需要循序渐进，实例驱动，思考总结。实际上，我在做培训的过程中发现，如果我们在学习Struts之前，自己动手写过一个简易的MVC框架，学习Struts将会非常轻松，大概只需要五天的时间，而且可以学的非常好。大家不要认为框架就是很庞大很复杂的怪兽，自己绝对无法写出来。其实，无非就是将我们所理解的朴素思想用代码实现出来罢了。好了，时间关系，今天就写到这里，祝愿大家学的开心！]]></description>
		</item>
		
			<item>
			<link>http://www.caifuzhu.com.cn/default.asp?id=90</link>
			<title><![CDATA[星星跟随鼠标]]></title>
			<author>zhouhaizhe@126.com(admin)</author>
			<category><![CDATA[java随写]]></category>
			<pubDate>Tue,23 Jun 2009 22:21:22 +0800</pubDate>
			<guid>http://www.caifuzhu.com.cn/default.asp?id=90</guid>	
		<description><![CDATA[这段程序放在&lt;body&gt;与&lt;/body&gt;之间 <br/>&lt;script language=javascript&gt;<br/>if (!document.layers&amp;&amp;!document.all)<br/>event=&#34;test&#34;<br/>function showtip2(current,e,text){<br/><br/>if (document.all&amp;&amp;document.readyState==&#34;complete&#34;){<br/>document.all.tooltip2.innerHTML=&#39;&lt;marquee style=&#34;border:1px solid black&#34;&gt;&#39;+text+&#39;&lt;/marquee&gt;&#39;<br/>document.all.tooltip2.style.pixelLeft=event.clientX+document.body.scrollLeft+10<br/>document.all.tooltip2.style.pixelTop=event.clientY+document.body.scrollTop+10<br/>document.all.tooltip2.style.visibility=&#34;visible&#34;<br/>}<br/><br/>else if (document.layers){<br/>document.tooltip2.document.nstip.document.write(&#39;&lt;b&gt;&#39;+text+&#39;&lt;/b&gt;&#39;)<br/>document.tooltip2.document.nstip.document.close()<br/>document.tooltip2.document.nstip.left=0<br/>currentscroll=setInterval(&#34;scrolltip()&#34;,100)<br/>document.tooltip2.left=e.pageX+10<br/>document.tooltip2.top=e.pageY+10<br/>document.tooltip2.visibility=&#34;show&#34;<br/>}<br/>}<br/>function hidetip2(){<br/>if (document.all)<br/>document.all.tooltip2.style.visibility=&#34;hidden&#34;<br/>else if (document.layers){<br/>clearInterval(currentscroll)<br/>document.tooltip2.visibility=&#34;hidden&#34;<br/>}<br/>}<br/><br/>function scrolltip(){<br/>if (document.tooltip2.document.nstip.left&gt;=-document.tooltip2.document.nstip.document.width)<br/>document.tooltip2.document.nstip.left-=5<br/>else<br/>document.tooltip2.document.nstip.left=150<br/>}<br/>&lt;/script&gt;<br/>&lt;script language=&#34;JavaScript&#34;&gt;<br/>function YY_Layerfx(yyleft,yytop,yyfnx,yyfny,yydiv,yybilder,yyloop,yyto,yycnt,yystep) { <br/> if ((document.layers)||(document.all)){<br/>&nbsp;&nbsp;with (Math) {yynextx= eval(yyfnx)}<br/>&nbsp;&nbsp;with (Math) {yynexty= eval(yyfny)}<br/>&nbsp;&nbsp;yycnt=(yyloop &amp;&amp; yycnt&gt;=yystep*yybilder)?0:yycnt+yystep;<br/>&nbsp;&nbsp;if (document.layers){<br/>&nbsp;&nbsp;&nbsp;&nbsp;eval(yydiv+&#34;.top=&#34;+(yynexty+yytop))<br/>&nbsp;&nbsp;&nbsp;&nbsp;eval(yydiv+&#34;.left=&#34;+(yynextx+yyleft))<br/>&nbsp;&nbsp;}<br/>&nbsp;&nbsp;if (document.all){<br/>&nbsp;&nbsp;&nbsp;&nbsp;eval(&#34;yydiv=yydiv.replace(/.layers/gi, &#39;.all&#39;)&#34;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;eval(yydiv+&#34;.style.pixelTop=&#34;+(yynexty+yytop));<br/>&nbsp;&nbsp;&nbsp;&nbsp;eval(yydiv+&#34;.style.pixelLeft=&#34;+(yynextx+yyleft));<br/>&nbsp;&nbsp;}<br/>&nbsp;&nbsp;argStr=&#39;YY_Layerfx(&#39;+yyleft+&#39;,&#39;+yytop+&#39;,&#34;&#39;+yyfnx+&#39;&#34;,&#34;&#39;+yyfny+&#39;&#34;,&#34;&#39;+yydiv+&#39;&#34;,&#39;+yybilder+&#39;,&#39;+yyloop+&#39;,&#39;+yyto+&#39;,&#39;+yycnt+&#39;,&#39;+yystep+&#39;)&#39;;<br/>&nbsp;&nbsp;if (yycnt&lt;=yystep*yybilder){eval(yydiv+&#34;.yyto=setTimeout(argStr,yyto)&#34;);}<br/> }<br/><br/>}<br/>function YY_Mousetrace(evnt) { <br/> if (yyns4)<br/>&nbsp;&nbsp;{if (evnt.pageX) {yy_ml=evnt.pageX;&nbsp;&nbsp;yy_mt=evnt.pageY;}&nbsp;&nbsp;}<br/> else{<br/>&nbsp;&nbsp; yy_ml=(event.clientX + document.body.scrollLeft);<br/>&nbsp;&nbsp; yy_mt=(event.clientY + document.body.scrollTop);<br/> }<br/> if (yy_tracescript)eval(yy_tracescript)<br/>}<br/>&lt;/script&gt;<br/>&lt;script language=&#34;JavaScript&#34;&gt;<br/>function PopWin()<br/>{<br/>&#160;&#160;&#160;&#160;var PopWin = window.open(&#34;new.htm&#34;,&#34;PopWin&#34;,&#34;toolbar=no,directries=no,scrollBars=yes,height=350,width=400&#34;);<br/>}<br/>&lt;/script&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;div id=&#34;tooltip2&#34;<br/>style=&#34;position:absolute;visibility:hidden;clip:rect(0 150 50 0);width:150px;background-color:lightyellow&#34;&gt; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;layer name=&#34;nstip&#34; width=&#34;1000px&#34; bgcolor=&#34;lightyellow&#34;&gt; &lt;/layer&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/div&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;div id=&#34;yyd0&#34;<br/>style=&#34;position:absolute; left:10px; top:50px; width:3px; height:3px; z-index:1; background-color: #19636c; layer-background-color: #19636c; border: 1px none #000000; clip: rect(0 3 3 0)&#34;&gt;&lt;/div&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;div<br/>id=&#34;yyd1&#34;<br/>style=&#34;position:absolute; left:20px; top:50px; width:3px; height:3px; z-index:1; background-color: #708574; layer-background-color: #708574; border: 1px none #000000; clip: rect(0 3 3 0)&#34;&gt;&lt;/div&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;div<br/>id=&#34;yyd2&#34;<br/>style=&#34;position:absolute; left:30px; top:50px; width:3px; height:3px; z-index:1; background-color: #379bbf; layer-background-color: #379bbf; border: 1px none #000000; clip: rect(0 3 3 0)&#34;&gt;&lt;/div&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;div<br/>id=&#34;yyd3&#34;<br/>style=&#34;position:absolute; left:40px; top:50px; width:3px; height:3px; z-index:1; background-color: #25184c; layer-background-color: #25184c; border: 1px none #000000; clip: rect(0 3 3 0)&#34;&gt;&lt;/div&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;div<br/>id=&#34;yyd4&#34;<br/>style=&#34;position:absolute; left:50px; top:50px; width:3px; height:3px; z-index:1; background-color: #31bd3c; layer-background-color: #31bd3c; border: 1px none #000000; clip: rect(0 3 3 0)&#34;&gt;&lt;/div&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;div<br/>id=&#34;yyd5&#34;<br/>style=&#34;position:absolute; left:60px; top:50px; width:3px; height:3px; z-index:1; background-color: #c11efd; layer-background-color: #c11efd; border: 1px none #000000; clip: rect(0 3 3 0)&#34;&gt;&lt;/div&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;script&gt;<br/>var yyns4=window.Event?true:false; var yy_mt = 0; var yy_ml = 0;<br/>document.onmousemove = YY_Mousetrace;<br/>yy_tracescript = &#39;&#39;;<br/><br/>if (yyns4){ document.captureEvents(Event.MOUSEMOVE);<br/>&nbsp;&nbsp;YY_Mousetrace(&#39;&#39;,&#39;,document.YY_Mousetrace1&#39;)}<br/><br/>YY_Layerfx(0,0,&#39;yy_ml+cos((15*sin(yycnt/39.83007847812662))+0)*150*(sin(10+yycnt/20)+0.2)*cos(yycnt/20)&#39;,&#39;yy_mt+sin((15*sin(yycnt/34.224861639800686))+0)*150*(sin(10+yycnt/20)+0.2)*cos(yycnt/20)&#39;,&#39;document.layers[\&#39;yyd0\&#39;]&#39;,2000,true,80,0,1);<br/><br/>YY_Layerfx(0,0,&#39;yy_ml+cos((15*sin(yycnt/27.66510707209673))+30)*150*(sin(10+yycnt/20)+0.2)*cos(yycnt/20)&#39;,&#39;yy_mt+sin((15*sin(yycnt/9.240632767417667))+30)*150*(sin(10+yycnt/20)+0.2)*cos(yycnt/20)&#39;,&#39;document.layers[\&#39;yyd1\&#39;]&#39;,2000,true,80,0,1);<br/><br/>YY_Layerfx(0,0,&#39;yy_ml+cos((15*sin(yycnt/16.45318944579641))+60)*150*(sin(10+yycnt/20)+0.2)*cos(yycnt/20)&#39;,&#39;yy_mt+sin((15*sin(yycnt/16.0564452288292))+60)*150*(sin(10+yycnt/20)+0.2)*cos(yycnt/20)&#39;,&#39;document.layers[\&#39;yyd2\&#39;]&#39;,2000,true,80,0,1);<br/><br/>YY_Layerfx(0,0,&#39;yy_ml+cos((15*sin(yycnt/6.95348954836835))+90)*150*(sin(10+yycnt/20)+0.2)*cos(yycnt/20)&#39;,&#39;yy_mt+sin((15*sin(yycnt/44.13697049887155))+90)*150*(sin(10+yycnt/20)+0.2)*cos(yycnt/20)&#39;,&#39;document.layers[\&#39;yyd3\&#39;]&#39;,2000,true,80,0,1);<br/><br/>YY_Layerfx(0,0,&#39;yy_ml+cos((15*sin(yycnt/33.90077294583733))+120)*150*(sin(10+yycnt/20)+0.2)*cos(yycnt/20)&#39;,&#39;yy_mt+sin((15*sin(yycnt/2.2378828869411587))+120)*150*(sin(10+yycnt/20)+0.2)*cos(yycnt/20)&#39;,&#39;document.layers[\&#39;yyd4\&#39;]&#39;,2000,true,80,0,1);<br/><br/>YY_Layerfx(0,0,&#39;yy_ml+cos((15*sin(yycnt/37.858312521039835))+150)*150*(sin(10+yycnt/20)+0.2)*cos(yycnt/20)&#39;,&#39;yy_mt+sin((15*sin(yycnt/18.083839795990098))+150)*150*(sin(10+yycnt/20)+0.2)*cos(yycnt/20)&#39;,&#39;document.layers[\&#39;yyd5\&#39;]&#39;,2000,true,80,0,1);<br/>&lt;/script&gt;<br/>&lt;script&gt;<br/><br/>if (!document.layers&amp;&amp;!document.all)<br/>event=&#34;test&#34;<br/>function showtip2(current,e,text){<br/><br/>if (document.all&amp;&amp;document.readyState==&#34;complete&#34;){<br/>document.all.tooltip2.innerHTML=&#39;&lt;marquee style=&#34;border:1px solid black&#34;&gt;&#39;+text+&#39;&lt;/marquee&gt;&#39;<br/>document.all.tooltip2.style.pixelLeft=event.clientX+document.body.scrollLeft+10<br/>document.all.tooltip2.style.pixelTop=event.clientY+document.body.scrollTop+10<br/>document.all.tooltip2.style.visibility=&#34;visible&#34;<br/>}<br/><br/>else if (document.layers){<br/>document.tooltip2.document.nstip.document.write(&#39;&lt;b&gt;&#39;+text+&#39;&lt;/b&gt;&#39;)<br/>document.tooltip2.document.nstip.document.close()<br/>document.tooltip2.document.nstip.left=0<br/>currentscroll=setInterval(&#34;scrolltip()&#34;,100)<br/>document.tooltip2.left=e.pageX+10<br/>document.tooltip2.top=e.pageY+10<br/>document.tooltip2.visibility=&#34;show&#34;<br/>}<br/>}<br/>function hidetip2(){<br/>if (document.all)<br/>document.all.tooltip2.style.visibility=&#34;hidden&#34;<br/>else if (document.layers){<br/>clearInterval(currentscroll)<br/>document.tooltip2.visibility=&#34;hidden&#34;<br/>}<br/>}<br/><br/>function scrolltip(){<br/>if (document.tooltip2.document.nstip.left&gt;=-document.tooltip2.document.nstip.document.width)<br/>document.tooltip2.document.nstip.left-=5<br/>else<br/>document.tooltip2.document.nstip.left=150<br/>}<br/>&lt;/script&gt;<br/>&lt;script language=&#34;JavaScript&#34;&gt;<br/>function YY_Layerfx(yyleft,yytop,yyfnx,yyfny,yydiv,yybilder,yyloop,yyto,yycnt,yystep) { <br/> if ((document.layers)||(document.all)){<br/>&nbsp;&nbsp;with (Math) {yynextx= eval(yyfnx)}<br/>&nbsp;&nbsp;with (Math) {yynexty= eval(yyfny)}<br/>&nbsp;&nbsp;yycnt=(yyloop &amp;&amp; yycnt&gt;=yystep*yybilder)?0:yycnt+yystep;<br/>&nbsp;&nbsp;if (document.layers){<br/>&nbsp;&nbsp;&nbsp;&nbsp;eval(yydiv+&#34;.top=&#34;+(yynexty+yytop))<br/>&nbsp;&nbsp;&nbsp;&nbsp;eval(yydiv+&#34;.left=&#34;+(yynextx+yyleft))<br/>&nbsp;&nbsp;}<br/>&nbsp;&nbsp;if (document.all){<br/>&nbsp;&nbsp;&nbsp;&nbsp;eval(&#34;yydiv=yydiv.replace(/.layers/gi, &#39;.all&#39;)&#34;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;eval(yydiv+&#34;.style.pixelTop=&#34;+(yynexty+yytop));<br/>&nbsp;&nbsp;&nbsp;&nbsp;eval(yydiv+&#34;.style.pixelLeft=&#34;+(yynextx+yyleft));<br/>&nbsp;&nbsp;}<br/>&nbsp;&nbsp;argStr=&#39;YY_Layerfx(&#39;+yyleft+&#39;,&#39;+yytop+&#39;,&#34;&#39;+yyfnx+&#39;&#34;,&#34;&#39;+yyfny+&#39;&#34;,&#34;&#39;+yydiv+&#39;&#34;,&#39;+yybilder+&#39;,&#39;+yyloop+&#39;,&#39;+yyto+&#39;,&#39;+yycnt+&#39;,&#39;+yystep+&#39;)&#39;;<br/>&nbsp;&nbsp;if (yycnt&lt;=yystep*yybilder){eval(yydiv+&#34;.yyto=setTimeout(argStr,yyto)&#34;);}<br/> }<br/><br/>}<br/>function YY_Mousetrace(evnt) { //v1.2 copyright (c)1999 Yaromat<br/> if (yyns4)<br/>&nbsp;&nbsp;{if (evnt.pageX) {yy_ml=evnt.pageX;&nbsp;&nbsp;yy_mt=evnt.pageY;}&nbsp;&nbsp;}<br/> else{<br/>&nbsp;&nbsp; yy_ml=(event.clientX + document.body.scrollLeft);<br/>&nbsp;&nbsp; yy_mt=(event.clientY + document.body.scrollTop);<br/> }<br/> if (yy_tracescript)eval(yy_tracescript)<br/>}<br/>&lt;/script&gt;<br/>&lt;script language=&#34;JavaScript&#34;&gt;<br/>function PopWin()<br/>{<br/>&#160;&#160;&#160;&#160;var PopWin = window.open(&#34;new.htm&#34;,&#34;PopWin&#34;,&#34;toolbar=no,directries=no,scrollBars=yes,height=350,width=400&#34;);<br/>}<br/>&lt;/script&gt;]]></description>
		</item>
		
			<item>
			<link>http://www.caifuzhu.com.cn/default.asp?id=89</link>
			<title><![CDATA[javamail sendMail]]></title>
			<author>zhouhaizhe@126.com(admin)</author>
			<category><![CDATA[java随写]]></category>
			<pubDate>Tue,16 Jun 2009 12:16:40 +0800</pubDate>
			<guid>http://www.caifuzhu.com.cn/default.asp?id=89</guid>	
		<description><![CDATA[/* <br/><br/>此篇僅介紹用javamail實現發送郵件功能，其中涉及smtp認證，郵件附件發送，及HTML內容郵件等。 <br/>其他有關多郵箱的實現，接收POP3郵件及IMAP等內容。 <br/><br/>如下程式需要：javamail，JAF包，j2ee.jar包含了上述兩個包，建議大家安裝J2SDKEE或直接拷貝j2ee.jar，將其添加到jbuilder的library中，<br/>或系統ClassPath中 <br/><br/>*/ <br/><br/><br/>/** <br/>* @author Haley haley_hj@163.com <br/>* @QQ:87823050<br/>* @homepage:<a href="http://haley.yeah.net" target="_blank">http://haley.yeah.net</a><br/>* @12/18/2002<br/>*/ <br/><br/>import java.util.*; <br/>import javax.mail.*; <br/>import javax.mail.internet.*; <br/>import java.util.Date; <br/>import javax.activation.*; <br/>import java.io.*; <br/><br/>public class sendMail { <br/><br/>private MimeMessage mimeMsg; //MIME郵件物件 <br/><br/>private Session session; //郵件會話物件 <br/>private Properties props; //系統屬性 <br/>private boolean needAuth = false; //smtp是否需要認證 <br/><br/>private String username = &#34;&#34;; //smtp認證用戶名和密碼 <br/>private String password = &#34;&#34;; <br/><br/>private Multipart mp; //Multipart物件,郵件內容,標題,附件等內容均添加到其中後再生成MimeMessage物件 <br/><br/><br/>public sendMail() { <br/>setSmtpHost(&#34;172.24.15.228&#34;);//指定郵件伺服器 <br/>cr&#101;ateMimeMessage(); <br/>} <br/><br/>public sendMail(String smtp){ <br/>setSmtpHost(smtp); <br/>cr&#101;ateMimeMessage(); <br/>} <br/><br/><br/>/** <br/>* @param hostName String <br/>*/ <br/>public void setSmtpHost(String hostName) { <br/>System.out.println(&#34;設置系統屬性：mail.smtp.host = &#34;+hostName); <br/>if(props == null)props = System.getProperties(); //獲得系統屬性物件 <br/><br/>props.put(&#34;mail.smtp.host&#34;,hostName); //設置SMTP主機 <br/>} <br/><br/><br/>/** <br/>* @return boolean <br/>*/ <br/>public boolean cr&#101;ateMimeMessage() <br/>{ <br/>try{ <br/>System.out.println(&#34;準備獲取郵件會話對象！&#34;); <br/>session = Session.getDefaultInstance(props,null); //獲得郵件會話對象 <br/>} <br/>catch(Exception e){ <br/>System.err.println(&#34;獲取郵件會話物件時發生錯誤！&#34;+e); <br/>return false; <br/>} <br/><br/>System.out.println(&#34;準備創建MIME郵件對象！&#34;); <br/>try{ <br/>mimeMsg = new MimeMessage(session); //創建MIME郵件物件 <br/>mp = new MimeMultipart(); <br/><br/>return true; <br/>} <br/>catch(Exception e){ <br/>System.err.println(&#34;創建MIME郵件物件失敗！&#34;+e); <br/>return false; <br/>} <br/>} <br/><br/><br/><br/>/** <br/>* @param need boolean <br/>*/ <br/>public void setNeedAuth(boolean need) { <br/>System.out.println(&#34;設置smtp身份認證：mail.smtp.auth = &#34;+need); <br/>if(props == null)props = System.getProperties(); <br/><br/>if(need){ <br/>props.put(&#34;mail.smtp.auth&#34;,&#34;true&#34;); <br/>}else{ <br/>props.put(&#34;mail.smtp.auth&#34;,&#34;false&#34;); <br/>} <br/>} <br/><br/><br/><br/>/** <br/>* @param name String <br/>* @param pass String <br/>*/ <br/>public void setNamePass(String name,String pass) { <br/>username = name; <br/>password = pass; <br/>} <br/><br/><br/>/** <br/>* @param mailSubject String <br/>* @return boolean <br/>*/ <br/>public boolean setSubject(String mailSubject) { <br/>System.out.println(&#34;設置郵件主題！&#34;); <br/>try{ <br/>mimeMsg.setSubject(mailSubject); <br/>return true; <br/>} <br/>catch(Exception e) { <br/>System.err.println(&#34;設置郵件主題發生錯誤！&#34;); <br/>return false; <br/>} <br/>} <br/><br/><br/><br/>/** <br/>* @param mailBody String <br/>*/ <br/>public boolean setBody(String mailBody) { <br/>try{ <br/>BodyPart bp = new MimeBodyPart(); <br/>bp.setContent(&#34;&lt;meta http-equiv=Content-Type content=text/html; charset=gb2312&gt;&#34;+mailBody,&#34;text/html;charset=GB2312&#34;); <br/>mp.addBodyPart(bp); <br/><br/>return true; <br/>} <br/>catch(Exception e){ <br/>System.err.println(&#34;設置郵件正文時發生錯誤！&#34;+e); <br/>return false; <br/>} <br/>} <br/><br/><br/>/** <br/>* @param name String <br/>* @param pass String <br/>*/ <br/>public boolean addFileAffix(String filename) { <br/><br/>System.out.println(&#34;增加郵件附件：&#34;+filename); <br/><br/>try{ <br/>BodyPart bp = new MimeBodyPart(); <br/>FileDataSource fileds = new FileDataSource(filename); <br/>bp.setDataHandler(new DataHandler(fileds)); <br/>bp.setFileName(fileds.getName()); <br/><br/>mp.addBodyPart(bp); <br/><br/>return true; <br/>} <br/>catch(Exception e){ <br/>System.err.println(&#34;增加郵件附件：&#34;+filename+&#34;發生錯誤！&#34;+e); <br/>return false; <br/>} <br/>} <br/><br/><br/><br/>/** <br/>* @param name String <br/>* @param pass String <br/>*/ <br/>public boolean setFrom(String from) { <br/>System.out.println(&#34;設置發信人！&#34;); <br/>try{ <br/>mimeMsg.setFrom(new InternetAddress(from)); //設置發信人 <br/>return true; <br/>} <br/>catch(Exception e) <br/>{ return false; } <br/>} <br/><br/><br/>/** <br/>* @param name String <br/>* @param pass String <br/>*/ <br/>public boolean setTo(String to){ <br/>if(to == null)return false; <br/><br/>try{ <br/>mimeMsg.setRecipients(Message.RecipientType.TO,InternetAddress.parse(to)); <br/>return true; <br/>} <br/>catch(Exception e) <br/>{ return false; } <br/><br/>} <br/><br/>/** <br/>* @param name String <br/>* @param pass String <br/>*/ <br/>public boolean setCopyTo(String copyto) <br/>{ <br/>if(copyto == null)return false; <br/>try{ <br/>mimeMsg.setRecipients(Message.RecipientType.CC,(Address[])InternetAddress.parse(copyto)); <br/>return true; <br/>} <br/>catch(Exception e) <br/>{ return false; } <br/>} <br/><br/><br/>/** <br/>* @param name String <br/>* @param pass String <br/>*/ <br/>public boolean sendout() <br/>{ <br/>try{ <br/>mimeMsg.setContent(mp); <br/>mimeMsg.saveChanges(); <br/>System.out.println(&#34;正在發送郵件....&#34;); <br/><br/>Session mailSession = Session.getInstance(props,null); <br/>Transport transport = mailSession.getTransport(&#34;smtp&#34;); <br/>transport.connect((String)props.get(&#34;mail.smtp.host&#34;),username,password); <br/>transport.sendMessage(mimeMsg,mimeMsg.getRecipients(Message.RecipientType.TO)); <br/>//transport.send(mimeMsg); <br/><br/>System.out.println(&#34;發送郵件成功！&#34;); <br/>transport.close(); <br/><br/>return true; <br/>} <br/>catch(Exception e) <br/>{ <br/>System.err.println(&#34;郵件發送失敗！&#34;+e); <br/>return false; <br/>} <br/>} <br/><br/><br/>/** <br/>* Just do it as this <br/>*/ <br/>public static void main(String[] args) { <br/><br/>String mailbody = &#34;&lt;meta http-equiv=Content-Type content=text/html; charset=big5&gt;&#34;+ <br/>&#34;&lt;div align=center&gt;&lt;a href=http://haley.yeah.net&gt; Haley &lt;/a&gt;&lt;/div&gt;&#34;; <br/><br/>sendMail themail = new sendMail(&#34;172.24.15.228&#34;); <br/>themail.setNeedAuth(true); <br/><br/>if(themail.setSubject(&#34;JavaMail&#34;) == false) return; <br/>if(themail.setBody(mailbody) == false) return; <br/>if(themail.setTo(&#34;haley@172.24.15.228&#34;) == false) return; <br/>if(themail.setFrom(&#34;haley@172.24.15.228&#34;) == false) return; <br/>if(themail.addFileAffix(&#34;c:\\sqlnet.log&#34;) == false) return; <br/>themail.setNamePass(&#34;haley&#34;,&#34;584520&#34;); <br/><br/>if(themail.sendout() == false) return; <br/>} <br/>} <br/>]]></description>
		</item>
		
			<item>
			<link>http://www.caifuzhu.com.cn/default.asp?id=88</link>
			<title><![CDATA[四个有害的Java编码习惯]]></title>
			<author>zhouhaizhe@126.com(admin)</author>
			<category><![CDATA[java随写]]></category>
			<pubDate>Tue,16 Jun 2009 12:14:32 +0800</pubDate>
			<guid>http://www.caifuzhu.com.cn/default.asp?id=88</guid>	
		<description><![CDATA[&nbsp;&nbsp;程序中的编码风格让我们的编程工作变得轻松，特别是程序维护员，他们要经常阅读其他人编写的程序编码，这一点尤其突出。编码规范从根本上解决了程序维护员的难题；规范的编码阅读和理解起来更容易，也可以快速的不费力气的借鉴别人的编码。对将来维护你编码的人来说，你的编码越优化，他们就越喜欢你的编码，理解起来也就越快。 <br/><br/>　　同样，高水平的编码风格（例如固定的封闭结构）目的在于改善设计和使编码更易于理解。事实上，最后有些人会认为改善设计和提高编码的易读性是一回事。<br/>　　本文中你会看到一些流行的编码风格被面向读者的更易于接受的风格所替代。有人争论说这些风格都已经被大家广泛使用，不应该简单的为了达到读者的期望而抛弃。然而，读者的期待只是其中一方面的原因，不可能凌驾于所有因素之上。列出四种常见的问题：<br/>　　1.对局域变量(localvariables)、参数(methodarguments)、字段(fields)这三种变量的命名没有区分:<br/>　　对看编码的人来说，首先要弄清这些数据如何定义的？看一个类时，得弄清楚每个条目是局域变量？字段？还是参数？有必要使用一个简单的命名约定来定义这些变量，增加易读性。<br/>　　很多权威机构规范过字段变量用以区分它与其它的变量，但这远远不够。可以把对字段的合理的命名约定逻辑也应用在参数上面。先看示例1：没有进行区分这三种变量的类定义，如下所示：<br/>　　示例1：<br/>　　public boolean equals (t arg)<br/>　　if (! (arg instanceof Range)) return false;<br/>　　Range other = (Range) arg;<br/>　　return start.equals(other.start)&amp;&amp;end.equals(other.end);<br/>　　在这个方法中，arg直接用argument的缩写，虽然大家一看就知道这是参数了，但这种命名方式却丢失了参数代表的对象本身的含义。大家知道这是参数，却不知道这是什么参数。如果方法的参数多一点，都按照arg1，arg2这样的方式命名，阅读代码的时候很头疼。另外两个字段变量，start和end，突然凭空而出，想一下才知道这应该是字段。当然，这个方法很短，造成的困难还不大，如果这个方法比较长的话，突然看到start和end两个变量，一般会先在前面找一下是不是局部变量，然后才能确定是类的字段变量。<br/>　　这个问题貌似微不足道，但为什么要让代码阅读者花费额外时间在这些琐碎的问题上呢？如果有个方案能让代码阅读者一目了然的明白变量是那种变量，为什么不采用呢？就如同SteveMcConnell在《代码大全》中说的:&#34;让人费神去琢磨神秘杀人凶手这没有问题，但你不需要琢磨程序代码，代码是用来阅读的。<br/>　　接下来看示例2，使用命名约定后对示例1重写以后的代码，用到的命名约定有：<br/>　　参数定义时名字加前缀a<br/>　　字段定义时名字加前缀f<br/>　　局域变量定义时不加任何前缀<br/>　　示例2：对变量类型进行区分<br/>　　public boolean equals (t aOther)<br/>　　if (! (aOther instanceof Range)) return false;<br/>　　Range other = (Range) aOther;<br/>　　return fStart.equals(other.fStart)&amp;&amp;fEnd.equals(other.fEnd);<br/>　　你可能反对示例2中的风格，反对过时了的匈牙利符号，但是我认为反对是错误的，因为匈牙利符号能详细说明信息的类型。上面的命名约定区分了类型。而且这样做分清了字段、变量和局域变量，这是两种完全不同的概念。这种命名约定的方式并不像看起来那么微不足道：当这些约定用在程序编码中时，会大大降低理解的难度，因为你可以不需要先分辨这些变量，省去不少时间。<br/>　　2.按层次划分包，而不是根据特征或功能划分最常见的划分应用序就是按层次命名包：<br/>　　com.blah.action 、com.blah.dao 、com.blah.model、com.blah.util<br/>　　也就是说，把具有同样特征或者功能的类划分到了不同的包里。因为成员的属性对其他成员应该是可见的，这就意味着几乎应用程序中所有的类都是公共的。实际上，这种按层次划分包的方法完全扔掉了Java的包内私有。包内私有应该彻底不使用。现在，包内私有是Java程序语言中设计者的默认作用域。这种包的划分习惯也违反了面向对象编程的核心原则之--尽量保持私有以减少影响,因为这种习惯强迫你必须扩大类的作用域。由于一些奇怪的原因，一些Java组织不赞成这种命名，似乎不公正的。<br/>　　另一种风格是按特征划分命名：<br/>　　com.blah.painting 、com.blah.buyer、com.blah.seller、com.blah.auction 、com.blah.webmaster、com.blah.useraccess、com.blah.util<br/>　　这里，成员不按行为划分，而是按照不同特征的类划分，每个成员都关联不同的特征。这种方法下包在最初使用是被定义。<br/>　　例如：在Web应用程序中，“com.blah.painting”包可能由下列成员组成：<br/>　　Painting.java: 一个model对象<br/>　　PaintingDAO.java: 一个数据存取对象Dao<br/>　　PaintingAction.java: 一个控制或者行为对象<br/>　　statements.sql: Dao对象使用的SQl文件<br/>　　view.jsp: Jsp文件<br/>　　需要特别说是的是，这种划分方法，每一个包都包含所有成员有关的特征文件，而不仅仅是Java源文件。这种按特征划分包的方法，要求在做删除操作时要注意，删除一个特征时要删掉它的整个目录，不能保存在源码中。<br/>　　这种方法优于按层次划分包的方法，表现在以下几点：<br/>　　包是高内聚的，并且模块化，包与包之间的耦合性被降到最低。<br/>　　代码的自描述性增强. 读者只需看包的名字就对程序有些什么功能或特征有了大概的印象。在《代码大全》中, SteveMcConnell将自描述性的代码比作 &#34;易读的圣杯&#34;，来表达它的易读性。<br/>　　把类按照每个特征和功能区分开可以很容易实现分层设计。<br/>　　相关的成员在同一个位置。不需要为了编辑一个相关的成员而去浏览整个源码树。<br/>成员的作用域默认是包内私有。只有当另外的包需要访问某个成员的时候，才把它修改为public.(需要注意的是修改一个类为public，并不意味着它的所有类成员都应该改为public。public成员和包内私有(package-private)成员是可以在同一个类里共存的。)<br/>　　删除一个功能或特征只需要简单的删除一个文件夹。<br/>　　每个包内一般只有很少的成员，这样包可以很自然的按照进化式发展。如果包慢慢变的太大，就可以再进行细分，把它重构为两个或者更多新的包，类似于物种进化。而按照层次划分的方式，就没办法进化式发展，重构也不容易。<br/>　　一些框架推荐使用层层定义包的传统的方式做为包的命名方法：由于使用传统的包命名，开发者总能知道在哪个位置可以找到这些项目，但是为什么避免人们这样做呢？使用另一种按特征定义包的风格，就不需要这种单调的操纵，因此，按特征定义完全超越了任何其它命名约定。约书亚布洛赫在《高效的Java》一书中说到：区分一个设计好坏的唯一重要因素是模块内部隐藏的数据和其它模块中涉及的实现过程的程度。<br/>　　共2页: 1 [2]<br/>　　内容导航<br/>　　第 1 页：变量的命名区分 第 2 页：习惯用JavaBeans而不是不可变对象<br/>　　 3.习惯用JavaBeans而不是不可变对象<br/>　　不可变对象是构造后状态不改变。Scala的主要创造者MartinOdersky最近还称赞过这种不可变对象。在《高效的Java》一书中，JoshuaBloch列举了大量实例支持使用不可变对象，并总结了很多优点。但他的意见，似乎很大程度上被忽略。大多数程序使用JavaBeans来替代不可变对象。JavaBean明显要比不可变对象复杂的多，因为它的巨大的声明空间。粗略的讲，你可以把JavaBean看作是与不可变对象完全相反的对象：它允许最大的可变性。JavaBean常被用来做数据库记录的映射。假如你要从数据库记录集映射一行为对象，不考虑现有的持久化方案和框架，你会将这个对象设计成什么样子？跟javabean相似呢还是完全不一样？我认为会完全不一样，说明如下：<br/>　　它不包含一个无参数构造方法（这一特征是javabean必备的。）。作者认为一个数据库记录的对象如果不包含任何数据是没有意义的。一个数据库表的所有字段都是可选的情况有多少？<br/>　　It would likely not have anything to say about eventsandlisteners.(不太明白作者的意思)<br/>　　它不强迫你用可变的对象。<br/>　　它内部有一个数据验证机制。这样一个验证机制对大多数数据库应用非常重要。(记住对象的第一原则：一个对象应该同时封装数据和对数据的操作。在这种情况下，操作就是验证数据。)<br/>　　数据验证机制可以给最终用户(end user)报错。<br/>　　按照javabeans的说明，javabeans是用来解决特殊领域的问题:在图形界面程序的设计中充当小部件。说明中绝对没有提到数据库。但现在通常用javabean来做数据库记录的映射。从实际角度来讲，许多被广泛使用的框架要求应用程序使用JavaBeans（或者其它类似的规范）来映射数据库记录。这种滥用不利于编程者了解和使用不可变对象。<br/>　　4.私有成员排在其它成员的前面类成员的排序没有按照成员的作用域的大小排列，而是把private放在前面。<br/>　　以前的好莱坞影片开头总是长篇的荣誉。同样地，大多数Java类把私有成员放在最前面。示例3给出这种风格的典型例子：<br/>　public class OilWell implements EnergySource<br/>　　private Long id;<br/>　　private String name;<br/>　　private String location;<br/>　　private Date discoveryDate;<br/>　　private Long totalReserves;<br/>　　private Long productionToDate;<br/>　　public Long getId()<br/>　　return id;<br/>　　public void setId(Long id)<br/>　　this.id = id; //..elided<br/>　　然而，如果把私有成员定义放在后面，读者阅读会更容易。因为人们认识一个事物的通常过程都是从一般到特殊，从抽象层次来说，是从高层次到低层次的认识过程。如果你倒过来的话，读者就不能从整体上把握事物，也不能抓住事物的本质，只能在一堆具体的片段中迷失。<br/>　　整体的抽象让你忽略了细节。抽象的层次越高，你可以忽略越多的细节。读者阅读一个类时可以忽略的细节越多他会越高兴。脑袋里填充太多的细节是痛苦的，所以细节越少越好。因此，将私有成员放在最后会显得更富有同情心，因为这样阻止了不必要的细节显露给读者。<br/>　　本来C++程序的习惯也是像Java一样把private成员放在最开始。然而，C++社区迅速的认识到这是一个有害的规范，这个规范现在已经被修正。这里给出一个经典的C＋＋风格指南里的注释：<br/>　　注意:public 接口应该放在class的最开始，其次是protected成员，最后是private成员。原因是:<br/>　　程序员应该更关心接口而不是具体实现。<br/>　　当程序员需要用一个类的时候，他们需要的是接口而不是实现。<br/>　　把接口放在开始是非常有意义的。把实现部分，私有部分，放在开始是一个历史遗留问题。最后还是要反复强调一下，一个类的接口的重要性超过实现细节。<br/>　　同样，伦敦大学帝国学院关于C++的指面中也说到：把公有的部分放在前面，读者会更感兴趣阅读，然后是保护的部分，最后是私有的部分。<br/>　　有人会持反对意见，认为读者可以使用程序文档来理解类，而不是直接看源代码。这种理由似乎不成立，因为程序文档中没有相关的实现细节，这时看源代码是很有必要的。<br/>　　所有的技术文档，通常都把难理解的信息放在开头，比如抽象的学术论文。为什么Java不打破这种常规呢？把私有成员放在最开头部分看起来是不是打破常规的好习惯。这种习惯似乎是sun早期的编码规范造成的。<br/>　　将代码按照javadoc的顺序编排是非常好的：首先是构造方法，然后是非私有方法，最后是私有部分和方法。这样读者阅读的时候很自然的从抽象层次的高向低运动。<br/>　　本文所讲的是一些Java的不好习惯和风格需要改变。最终的目地是希望我们的代码易读性更强，让读者更易于理解。]]></description>
		</item>
		
			<item>
			<link>http://www.caifuzhu.com.cn/default.asp?id=85</link>
			<title><![CDATA[　自 动 跳 转]]></title>
			<author>zhouhaizhe@126.com(admin)</author>
			<category><![CDATA[java随写]]></category>
			<pubDate>Wed,13 May 2009 18:05:23 +0800</pubDate>
			<guid>http://www.caifuzhu.com.cn/default.asp?id=85</guid>	
		<description><![CDATA[&lt;meta http-equiv=&#34;refresh&#34; content=&#34;10; url=http:\\www.yiqun.info&#34;&gt;]]></description>
		</item>
		
</channel>
</rss>