??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲人成色4444在线观看,亚洲制服丝袜在线播放,亚洲福利中文字幕在线网址http://www.tkk7.com/huhu/category/1640.htmlHuhu'Blogzh-cnWed, 28 Feb 2007 07:48:42 GMTWed, 28 Feb 2007 07:48:42 GMT60log4j使用CZQ{载)http://www.tkk7.com/huhu/articles/39568.html似水年似水年Thu, 06 Apr 2006 05:32:00 GMThttp://www.tkk7.com/huhu/articles/39568.htmlhttp://www.tkk7.com/huhu/comments/39568.htmlhttp://www.tkk7.com/huhu/articles/39568.html#Feedback0http://www.tkk7.com/huhu/comments/commentRss/39568.htmlhttp://www.tkk7.com/huhu/services/trackbacks/39568.htmllog4j使用CZ
--by blues(zhaochaohua@sina.com)
PART 1 介绍
log4j的好处在于:
1.通过修改配置文gQ就可以军_log信息输出C?console,文g,...),是否输出?br />q样Q在pȝ开发阶D可以打印详l的log信息以跟t系l运行情?而在pȝE_后可以关闭log输出,从而在能跟t系l运行情늚同时,又减了垃圾代码(System.out.println(...){??br />2.使用log4jQ需要整个系l有一个统一的log机制Q有利于pȝ的规划?br />
log4j的用本w很单。但合理地规划一个系l的l一log机制需要周全的考虑?br />
其他关于log4j的信息参看log4j自带的文档?br />
PART II 配置文g详细解释
先看一个配|文件的例子:
1.配置文g的例?br />
log4j.rootLogger=DEBUG
#DAO层log记录到DAOLog,allLog?br />log4j.logger.DAO=DEBUG,A2,A4
#逻辑层log记录到BusinessLog,allLog?br />log4j.logger.Businesslog=DEBUG,A3,A4
#A1--打印到屏q上
log4j.appender.A1=org.apache.log4j.ConsoleAppender
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=%-5p [%t] %37c %3x - %m%n
#A2--打印到文件DAOLog?-专门为DAO层服?br />log4j.appender.A2=org.apache.log4j.DailyRollingFileAppender
log4j.appender.A2.file=DAOLog
log4j.appender.A2.DatePattern='.'yyyy-MM-dd
log4j.appender.A2.layout=org.apache.log4j.PatternLayout
log4j.appender.A2.layout.ConversionPattern=[%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n

#A3--打印到文件BusinessLog?-专门记录逻辑处理层服务log信息
log4j.appender.A3=org.apache.log4j.DailyRollingFileAppender
log4j.appender.A3.file=BusinessLog
log4j.appender.A3.DatePattern='.'yyyy-MM-dd
log4j.appender.A3.layout=org.apache.log4j.PatternLayout
log4j.appender.A3.layout.ConversionPattern=[%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n

#A4--打印到文件alllog?-记录所有log信息
log4j.appender.A4=org.apache.log4j.DailyRollingFileAppender
log4j.appender.A4.file=alllog
log4j.appender.A4.DatePattern='.'yyyy-MM-dd
log4j.appender.A4.layout=org.apache.log4j.PatternLayout
log4j.appender.A4.layout.ConversionPattern=[%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n


2.Appender的?br />一个Appender代表log信息要写向的一个地斏Vlog4j可用的Appender有很多类?q里只考虑3U?ConsoleAppender,FileAppender,DailyRollFileAppender
2.1 ConsoleAppender
如果使用ConsoleAppenderQ那么log信息写到Console。就是直接把信息打印到System.out上了?br />2.2 FileAppender
使用FileAppenderQ那么log信息写到指定的文g中。这应该是比较经怋用到的情c?br />相应圎ͼ在配|文件中应该指定log输出的文件名。如下配|指定了log文g名ؓdemo.txt
log4j.appender.A2.File=demo.txt
注意A2替换为具体配|中Appender的别名?br />2.3 DailyRollingAppender
使用FileAppender可以log信息输出到文件中Q但是如果文件太大了读v来就不方便了。这时就可以使用DailyRollingAppender。DailyRollingAppender可以把Log信息输出到按照日期来区分的文件中。如下配|文件就会每天生一个log文gQ每个log文g只记录当天的log信息Q?br />
log4j.appender.A2=org.apache.log4j.DailyRollingFileAppender
log4j.appender.A2.file=demo
log4j.appender.A2.DatePattern='.'yyyy-MM-dd
log4j.appender.A2.layout=org.apache.log4j.PatternLayout
log4j.appender.A2.layout.ConversionPattern=%m%n


3.Layout的配|?br />Layout指定了log信息输出的样式?br />详细信息h看PatternLayout的javadoc?br />例子1Q显C日期和log信息
log4j.appender.A2.layout=org.apache.log4j.PatternLayout
log4j.appender.A2.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} %m%n
打印的信息是Q?br />2002-11-12 11:49:42,866 SELECT * FROM Role WHERE 1=1 order by createDate desc

例子2Q显C日期,log发生地方和log信息
log4j.appender.A2.layout=org.apache.log4j.PatternLayout
log4j.appender.A2.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} %l "#" %m%n
2002-11-12 11:51:46,313 cn.net.unet.weboa.system.dao.RoleDAO.select(RoleDAO.java:409) "#" SELECT * FROM Role WHERE 1=1 order by createDate desc


例子3Q显ClogU别,旉,调用Ҏ,log信息
log4j.appender.A2.layout=org.apache.log4j.PatternLayout
log4j.appender.A2.layout.ConversionPattern=[%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n
log信息:
[DEBUG] 2002-11-12 12:00:57,376 method:cn.net.unet.weboa.system.dao.RoleDAO.select(RoleDAO.java:409)
SELECT * FROM Role WHERE 1=1 order by createDate desc


PART 3 log4j的?br />log4j使用步骤?个:
3.1.Ҏ配置文g初始化log4j
配置文g如PART 2所叙述。现在讲的是如何在程序中配置log4j?br />log4j可以使用3中配|器来初始化QBasicConfigurator,DOMConfigurator,PropertyConfigurator
q里用的是PropertyConfigurator。用PropertyConfigurator适用于所有的pȝ?br />如下的语?br />PropertyConfigurator.configure("log4j.properties");
׃log4j.properties为配|文件初始化好了log4j环境?br />注意一点:q个语句只需要在pȝ启动的时候执行一ơ。例?在unet webOA目中可以这么用:
在ActionServlet的init()Ҏ中调用一ơ?br />
public class ActionServlet extends HttpServlet{
...
/**
* Initialize global variables
*/
public void init() throws ServletException {
// 初始化Action资源
try{
initLog4j();
...
}catch(IOException e){
throw new ServletException("Load ActionRes is Error");
}
}
...
protected void initLog4j(){
PropertyConfigurator.configure("log4j.properties");
}
...
}//end class ActionServlet

3.2 在需要用log4j的地方获取Logger实例
如下是RoleDAOcM的用例?
static Logger log = Logger.getLogger("DAO");
注意q里使用"DAO"标识W,那么对应的在配置文g中对应的配置信息如下Q?br />
#定义DAO Logger
log4j.logger.DAO=DEBUG,A2
#讄Appender A2的属?br />
log4j.appender.A2=org.apache.log4j.DailyRollingFileAppender
log4j.appender.A2.file=demo
log4j.appender.A2.DatePattern='.'yyyy-MM-dd
log4j.appender.A2.layout=org.apache.log4j.PatternLayout
log4j.appender.A2.layout.ConversionPattern=%-5p %d{yyyy-MM-dd HH:mm:ss} %l%n%m%n

public class RoleDAO extends BaseDBObject
{
...
static Logger log = Logger.getLogger("DAO");
...
public BeanCollection selectAll() throws SQLException
{
StringBuffer sql = new StringBuffer(SQLBUF_LEN);
sql.append("SELECT * FROM " + tableName + " order by roldId");
//System.out.println(sql.toString());
log.debug(sql);
...
}
...
}

3.3 使用Logger对象的debug,info,fatal...Ҏ
log.debug("it is the debug info");

附g1Qlog4j的一个bug
当这样用时QDailyRollingFileAppender不能正确使用Q?br />
public Class RoleDAO(){

static Logger log = Logger.getLogger("DAO");

//在每一ơnew RoleDAO对象的时候都执行一ơconfigure()操作
public RoleDAO(TransactionManager transMgr) throws SQLException
{
...
PropertyConfigurator.configure("log4j.properties");
...
}

public void select(){
...
//使用log4jq行log记录
log.debug("...");
...
}
}
怎么解决:
在系l启动时执行一ơPropertyConfigurator.configure("log4j.properties");
之后׃再执行?

 

 log4j 配置及初始化Ҏ指引Q{Q?br />
写JAVAE序,一般用log4j来写log.
以下l出一些指?以方便?

1. 不需要显式编码去初始?log4j,只要你的配置文g攑֜ CLASSPATH的目录下可以了.
2.用common log而不要直接用log4j?Logger logger = XXX, 例子如下:
在类 ThisIsMyClass 的代码中:
private static Log log = LogFactory.getLog(ThisIsMyClass.class);

log4j ׃自动用步?所q方法初始化.

用ThisIsMyClass.class作ؓ参数d得一个Log对象,
好处是可以更灵zd?log4j 配置文g中配|相应的 appender ?logger
                
 
 

 
 


似水年 2006-04-06 13:32 发表评论
]]>
BeanUtilsLQ{载)http://www.tkk7.com/huhu/articles/39224.html似水年似水年Tue, 04 Apr 2006 09:44:00 GMThttp://www.tkk7.com/huhu/articles/39224.htmlhttp://www.tkk7.com/huhu/comments/39224.htmlhttp://www.tkk7.com/huhu/articles/39224.html#Feedback0http://www.tkk7.com/huhu/comments/commentRss/39224.htmlhttp://www.tkk7.com/huhu/services/trackbacks/39224.html
BeanUtils提供?Java反射和自省API的包装。其主要目的是利用反机制对JavaBean的属性进行处理。我们知道,一个JavaBean通常包含了大量的属性,很多情况下,对JavaBean的处理导致大量get/set代码堆积Q增加了代码长度和阅M码的隑ֺ?br />
二、用法:

BeanUtils是这个包里比较常用的一个工LQ这里只介绍它的copyProperties()Ҏ。该Ҏ定义如下Q?br />

public static void copyProperties(java.lang.Object dest,java.lang.Object orig)
  throws java.lang.IllegalAccessException,
         java.lang.reflect.InvocationTargetException


如果你有两个h很多相同属性的JavaBeanQ一个很常见的情况就是Struts里的PO对象Q持久对象)和对应的ActionFormQ例?Teacher和TeacherForm。我们一般会在Action里从ActionForm构造一个PO对象Q传l的方式是用类g面的语句对属性逐个赋|

//得到TeacherForm
TeacherForm teacherForm=(TeacherForm)form;
//构造Teacher对象
Teacher teacher=new Teacher();
//赋?br />teacher.setName(teacherForm.getName());
teacher.setAge(teacherForm.getAge());
teacher.setGender(teacherForm.getGender());
teacher.setMajor(teacherForm.getMajor());
teacher.setDepartment(teacherForm.getDepartment());

//持久化Teacher对象到数据库
HibernateDAO=;
HibernateDAO.save(teacher);

而用BeanUtils后,代码大大改观了Q如下所C:
//得到TeacherForm
TeacherForm teacherForm=(TeacherForm)form;
//构造Teacher对象
Teacher teacher=new Teacher();
//赋?br />BeanUtils.copyProperties(teacher,teacherForm);
//持久化Teacher对象到数据库
HibernateDAO=;
HibernateDAO.save(teacher);


如果Teacher和TeacherForm间存在名UC相同的属性,则BeanUtils不对q些属性进行处理,需要程序员手动处理。例?Teacher包含modifyDateQ该属性记录最后修Ҏ期,不需要用户在界面中输入)属性而TeacherForm无此属性,那么在上面代码的 copyProperties()后还要加上一句:

teacher.setModifyDate(new Date());


怎么P很方便吧Q除BeanUtils外还有一个名为PropertyUtils的工LQ它也提供copyProperties()ҎQ作用与BeanUtils的同名方法十分相|主要的区别在于后者提供类型{换功能,卛_C个JavaBean的同名属性ؓ不同cdӞ在支持的数据cd范围内进行{换,而前者不支持q个功能Q但是速度会更快一些。BeanUtils支持的{换类型如下:

    * java.lang.BigDecimal
    * java.lang.BigInteger
    * boolean and java.lang.Boolean
    * byte and java.lang.Byte
    * char and java.lang.Character
    * java.lang.Class
    * double and java.lang.Double
    * float and java.lang.Float
    * int and java.lang.Integer
    * long and java.lang.Long
    * short and java.lang.Short
    * java.lang.String
    * java.sql.Date
    * java.sql.Time
    * java.sql.Timestamp


q里要注意一点,java.util.Date是不被支持的Q而它的子cjava.sql.Date是被支持的。因此如果对象包含时间类型的属性,且希望被转换的时候,一定要使用java.sql.Datecd。否则在转换时会提示argument mistype异常?br />
三、优~点Q?br />
Apache Jakarta Commons目非常有用。我曑֜许多不同的项目上或直接或间接C用各U流行的commonslg。其中的一个强大的lg是BeanUtils。我说明如何用BeanUtilslocal实体bean转换为对应的value 对象Q?br />

BeanUtils.copyProperties(aValue, aLocal)


上面的代码从aLocal对象复制属性到aValue对象。它相当单!它不localQ或对应的valueQ对象有多少个属性,只管q行复制。我们假设local对象?00个属性。上面的代码使我们可以无需键入臛_100行的冗长、容易出错和反复的get和setҎ调用。这太棒了!太强大了Q太有用了!

现在Q还有一个坏消息Q用BeanUtils的成本惊人地昂贵Q我做了一个简单的试QBeanUtils所p的时间要过取数据、将其复制到对应?value对象Q通过手动调用get和setҎQ,以及通过串行化将其返回到q程的客h的时间d。所以要心使用q种威力Q?

似水年 2006-04-04 17:44 发表评论
]]>
[转蝲]?到J2EE -- Java 学习历程http://www.tkk7.com/huhu/articles/32693.html似水年似水年Mon, 27 Feb 2006 08:57:00 GMThttp://www.tkk7.com/huhu/articles/32693.htmlhttp://www.tkk7.com/huhu/comments/32693.htmlhttp://www.tkk7.com/huhu/articles/32693.html#Feedback0http://www.tkk7.com/huhu/comments/commentRss/32693.htmlhttp://www.tkk7.com/huhu/services/trackbacks/32693.html
  在开始之前有必要再讨Z下J2ME, J2SE, J2EEq些概念?B>J2SE, The Micro Edition of the Java 2 Platform. 主要用于嵌入式Java,如手机,PDA{等?B>J2SE, Java 2 Platform, Standard Edition, 我们通常所说的JDK(Java Development Kit)包含在此Q是J2EE的基?B>J2EE, Java 2 Platform, Enterprise Edition , 是所谓的企业UJava. q些只是从APIU别上的划分Q实际上SunlJ2EE的定义是Q开发基于组件的多层的企业应用的规范。也是为各U不同的技术定义一个Java的规范,使这些不同的技术结合v来,在Javaq_上构建强壮的企业U应用。从q一Ҏ看,J2EEq个概念应该是涵盖J2ME, J2SE的。比如一个典型的J2EE应用Q网上商店, 它支持web 方式下订单,也支持手Z订单。显然必ȝ到J2SE,J2ME. 所以也׃存在所谓的从J2SE转向J2EE的问题了Q只是后者包含的范围更广而已?BR>
来看看Sunl出的J2EE 相关技术主要分为几大块?BR>1. Web Service技?/B>
-  Java API for XML Processing (JAXP) 
-  Java API for XML Registries (JAXR) 
-  Java API for XML-based RPC (JAX-RPC) 
-    SOAP with Attachments API for Java (SAAJ)

2. lg模型技术(Component Model TechnologiesQ?/B>
-  Java Servlet 
-  JavaServer Pages 
-  JavaServer Faces 
-  Enterprise JavaBeans 
-  Java Message Service 
-    J2EE Connector Architecture

3 .理技?Management Technologies)
-  J2EE Deployment Specification 
-  J2EE Management Specification 
-  J2EE Client Provisioning 
-    Java Authorization Contract for Containers

4.其他相关技?Other J2EE Technologies)
-  JDBC 
-  Java Data Objects (JDO) 
-  CORBA (Java IDL and Java RMI-IIOP) 
-  JavaMail 
-  Transactions
   如此之多的技术难免初学者无所适从Q望而却步。即使是一位经验丰富的J2EE 开发者,又有几个人敢说J2EE相关的技术我都熟l掌握了。不q作Z名普通J2EE应用E序的开发者来_我们只需要重点学习其中的一部分技术就可以了,对于其他部分只要做到心中有数Q哪天需要用C知道跑哪里去扑ֈ资料p了。以我个人的观点Q下面这些技术是一般J2EE应用开发h员所必须熟练掌握的。Java Server Page, Java Servlet, Enterprise JavaBean, JDBC, Transactions.  q有JAXP{XML相关技术,Java Message Service, Java Mail, JDO{等是最好应该掌握的。其他Management TechnologiesQConnector Architecture{等主要是给容器提供商中间g提供商参考的Q应用开发者不需要怎么兛_,{用C再去学习也不q?

语言学习?BR>  首先是J2SE基础.学习一门新技?无外乎阅d实践? 而一本好的参考书对于初学者来说显得格外重? 现在市面上的 Java书籍可以说是铺天盖地, 质量也是良莠不齐, 令初学者无所适从. 所以还是先推荐几本书籍? 目前对于 Java基础知识,大家一般都比较推荐两本? <<Thinking In Java>> ?nbsp;<< Core Java(TM) 2, Volume I?Fundamentals >>.  W一本书不必多说? Bruce Eckel 的大? Jolt获奖书籍. 内容比较全面, 基本늛了java语言的方斚w? q本书提供了相当丰富的例? 非常有利于对学习内容的了? 另外书中W一部分对于OO基本书籍的介l? 我觉得对于刚接触QO的h来说帮助会很? 而且此书是Open Source? 可以从作者网上下?A >http://www.mindview.net/Books/TIJ/而对于习惯于M文版的学习者来? 侯捷译的中文版是不错的选择.  要说q本说的~点可能是对于初学者来说厚了一? q也是一些hq不推荐此书作ؓ初学者学习用书的原因? 后面一?lt;<Core Java(TM) 2, Volume I?Fundamentals>>, 目前已经是第七版? 单从它出版的ơ数来看也可以看出此书受Ƣ迎的程? q本书特点也是讲q比较全面系l? 基本上一路啃下来的话Java语言基础应该过关了. ~点也是太厚? 有点像参考手? 前面部分׃不少幅?nbsp; Swing和Applet,可能对初学者不是很有用.  q有一些像<< Java in a nutshell>>也是比较不错的基书籍.
学习了基本的语言基础,别忘了最重要也是最有用的资料还是JDK文档. 从你学习java的第一天开始JDK文档应该是常备手头了. 如果你碰到问题首先想到的是到论坛上去提问而不是查阅Jdk文档, 那先别l往下学习了,学会查JDK文档? 不夸张的说在我们的初学者论坛中60%的问题是光查一下JDK文档p解决问题? 最新JDK Documentation下蝲地址http://java.sun.com/j2se/1.4.2/download.html(目前最新版是J2SE5 http://java.sun.com/j2se/1.5.0/download.jsp)不能光说不练, 同一下蝲面把JDKl下载回? 安装完后有一Ҏx一? 安装路径下有一个src.zip(有些jdk版本是src.jar), 好东西啊---JDK源代? 老是有h在论坛上问哪里有JDK源代码下? 你说东西放在你安q到处找. 有了q个有些问题需要在论坛上跟人家争来争去?d源代码瞧一下什么疑问都没有? 几个最重要的命令行工具?BR>javac  : ~译源文件到class文g
java:     q行class
jar : 打包工具.
Javadoc :  生成java doc的工?
对于初学java的h来说, 我不推荐使用IDE?nbsp;直接用文本编辑器, 然后用命令行~译q行. q样有利于理解CLASSPATH, PATHq些最基本概念. CLASSPATH是初学者比较容易感觉迷惑的地方.现在?nbsp;IDE太聪明了, l个名字q你自动生成java source code, 自动~译. 可能你运行完了你的第一个Hello World E序, q不知道java ?nbsp;javac是用来做什么的. 至于实际的项目开? 一Ƒ֐适的IDEq是十分重要? 我们E后再对java 开发工具做一些介l? 


J2EE 基础和Java语言q阶

   学习完语a基础, 可以比较自然地转入J2EE实际技术的学习? J2EE实在是比较庞? 而EJB, Servlet , q些核心技术是作ؓ每一个J2EE开发h员所需要掌握的. 关于servlet,  我比较推?lt;<Core Servlet and JSP 2Edition>>?lt;<More Servlets and Java Server Pages>>, W一本是Sun推荐的Servlet教材. W二本是当年Amazon最畅销Java书籍, 五星U书c? q本书机械工业出版社有中文版?lt;<Servlet 与JSP权威指南>>,感觉译得还可以, W二版好像还没有看到有中文版. 两本书都全面pȝCl了JSP和Sevlet知识, 从web服务器配|? JSP, Servlet基本~程, 标记?Tag Lib), qo? 事g框架都有很好地描q? 提供C子也比较实用. 对于EJB学习, 比较著名有两本书, << Enterprise JavaBeans, 3nd Edition>> ?lt;< Mastering Enterprise Java Beans Third Edition>>, 两位作者Richard Monson, Ed Roman都是属于业界重量Uh?而Richard Monson本n是EJB规范专家l成?Ҏ来说, 两本书难分优? W二本书有个好处是可以免费下蝲http://www.theserverside.com/books/wiley/masteringEJB/index.tss.
q是那句?不能光说不练, 不过J2EE 的练习做h有一炚w? 应用服务器是不可的, 最好还得准备个轻量U的数据? 下面单介l一下这些工? 
web服务?Servlet Container)斚w?
Tomcat.   http://jakarta.apache.org/tomcat/
Jetty:      http://jetty.mortbay.org/jetty/
应用服务器常用的?
Jboss:        http://www.jboss.org/products/index
Weblogic:   http://www.bea.com/framework.jsp?CNT=index.htm&FP=/content/products/server
WebSphere: http://www-128.ibm.com/developerworks/downloads/ws/was/?S_TACT=105AGX28&S_CMP=DLMAIN.
Tomcat, Jetty, Jboss都是Open Source. Weblogic ?nbsp;WebSphere是J2EE服务器中的老大Uh? h也不? 不过对于开发者有免费的试用版下蝲.
如果单单只是学习Servlet, 推荐使用Tomcat, 它是Sun官方指定的Servlet, JSP规范的参考实?. 对初学者最重要的是它用比较简? 自带文档比较齐全, 使用者众? 有什么问题容易在论坛上面得到帮助. 如果学习EJB的话, 推荐使用Jboss, 不仅仅是因ؓ它是Open Source?主要是配|比较简? 使用方便. 比如说对于连接数据库, 对于常用的MySQL, Oracle , MS SQL{等都提供了Sample Config文g, 直接拿过来做些小改动扔到Deploy目录下就可以?nbsp;DataSource? 部vJ2EE应用也简? 把整?nbsp;.ear或?war扔到deploy下就可以? 唯一不方便的地方是从 Jboss3.0开? 它的文档开始收费了. 但是对于一些基本的配置, 在网上还是非常容易找到的, 毕竟它太行? 至于 Weblogic, 也比较容易? 不过比vJboss来个头大了很? 通过强大的管理界面得一些常用的配置工作变得十分?  和Jboss比v来它的文档就太多? 直是有点|里八嗦, 比如要部|一?ear文g, 一般我们也是直接扔到domain下的applications目录下就会自动deploy? 但是要看它的文档可是长篇大论, Ҏ吓着初学? 以ؓq又是什么高q学问. 至于WebSphere, 个h不推荐初学者? 相比前俩个Server比较难, 而且狂吃内存.不过在企业市场q个家伙表现不俗, 毕竟是出生于IBMq样的豪? 
数据库方? 目前常见的主要有PostgreSQL, MySQL, Oracle, MS SQL, DB2{等.前面两个是开源数据库, 后面几个基本上垄断着大部分的数据库市? 对于初学者用来做做EJB, JDBC的练? 我推荐MySQL, 理由q是很简? 开源Y件不要钱, 个头用方? 用户众多文档齐全. 下蝲地址http://www.mysql.com/products/mysql/.  PostgreSQL也可以考虑, 不过国内使用者远不如MySQL? 所以要在论坛上问v问题来就方便一些了, 下蝲地址q个阶段, 在看书的同时, 可以l合着学习一些优U的开源项目的源代? q些开源项目的代码风格, 注释都是值得借鉴? 实在太懒也别忘了手头上还有个Jdk的源代码. 其实也不用刻意去找源代码, 在实际的J2EE目开发中, 基本上都会用C些优U的开源项?  Framework可能会用到Spring, Struts, Log机制基本上都会JarkartaCommons Log或者Log4j,  单元试会大多会用Junit, l合目阅读一下其中的一些源代码, 既可以提高自己又寚w目会有所帮助, 说不定因此而得到PM的赏识呢. 一举两? 何乐而不为呢. 呵呵, 有点扯远? q了初学者阶D?该学会如何找到适合自己的Java书籍? 历经数十? 今天的Java技术已l变的如此之庞杂, 我相信即使穷净一个h毕生之精力也不可能把Java所有的相关技术都学? 何况新技术还在层ZI地推出, 3q之前谁会知道Struts会成为Web框架事实上的工业标准. 2q之前谁会知道Hibernate会在今天独领风骚.  既然已经不能指望一ơ性把java技术的Ҏ面面都学个? 在实际中也只能是需要什么技术再学习什么技术了. 而能否选择一本好的参考书c带来的是事半功倍和事倍工?nbsp;的效? 所以我觉得q旉攑֜选择书籍上面q是很值得? 否则你在后面只会花更多的旉. 下面我谈谈自己选择书籍的一些经? 不一定正? 首先看作? 像上面提到的那些书的作? 都是业界鼎鼎大名? 选择他们的书一般错不了. 大家看的书多? 自己怸自然也会有一个list, 哪些作者是信得q的.二看出版C? 计算Zc方?  Oreilly, Addison-Wesley都是公认比较好的出版C? 对于目前比较行的Java技? Oreilly?lt;<XXXX  in  Action>>pd是不错的选择. 另外我还会去看看Amazon|站(http://www.amazon.com/)的书? 一般小?星的书我都不会考虑. q有一个好dtheserverside,http://www.theserverside.com/的书? q里的书评比较有?往往都有很激烈的争论, 里面l常会看C些名人在发言.我要向所有Java 学习者推? 如果我的收藏多w面只能存放两个网?我会选择java.sun 和theserverside. 在这里你可以了解最新的Java动? 可以学习W一手的Java资料, 可以看到Java高手?里面不乏业界大腕)Ȁ烈辩? 
到此阶段, Java Developer的基本功底应该算是打好了?往后就是不断学习喽. l束q一D之?最后再介绍一本书Oreilly ?lt;<Java Threads, Second Edition >>, 因ؓ我觉得多U程~程属于 Java基本? 每一个想学好Java的h都应该好好掌? 



提高?BR>在这个阶D应该从软g架构, Framework层次上来学习? 作ؓ面向对象的圣l?lt;<Design Patterns>>, q本书是不得不推荐的. 不用再多说了, q本在面向对象领域地位完全是属于教父U别?  不管你学习的是什么OO语言, 不管你现在是?Netq是J2EE开? q本书都是你q阶之\上的必读之书. ?lt;<Core J2EE Patterns>>则专门针对于J2EE来讨计模? 书中Sun Java Center的资p计师描述了J2EE关键技术的模式. 最佛_?设计{略和经q验证的解决Ҏ. 对于每一个希望成为J2EE 架构师或者设计师, q本书值得一? 学习设计模式的时?是结合实际的源代码来? 比如看看Junit源代? 你可以看到很多设计模式优雅的实现, 作者之一Erich Gamma本n 是<<Design Patterns>>的作? 至于J2EE的设计模? Sunq开辟了专门的空?A >http://java.sun.com/blueprints/patterns/,  里面有对常用模式的讨论又提供了详l的源代码样? 正如Grady Booch所? 模式对于普遍问题提供了通用的解x? 利用模式q于拥有一个强大的专家队伍.  如果你还没有学习, 现在开始吧. 此外对于面向对象Ҏ? 极限~程的思想也应该有所了解http://www.extremeprogramming.org/ . 对于J2EE目的具体实? Rod Johnson?lt;<Expert One-on-One J2EE Design and Development (Programmer to Programmer)>>也很有h? 该书以作者丰富的实战l验向我们展C如何用可能简单的解决Ҏ构徏J2EE 应用, 书中作者第一ơ提L观点, 很多时? J2EE应用完全没有必要用到EJB, 对于a必称EJB的广大J2EE开发者来? 怎么说也有点惊世咳俗的味? 当然, 作ؓServlet和JDO两个专家l的成员, q可不是作者信口胡驺的. 今天风靡Java世界的Spring 框架最初便是源于此? 而IOC, AOP{概忉|是被时下的java开发者挂在嘴? 最? 作ؓ对Java的深入学? Java技术的各个Specification也有必要一? 暂时写到这里吧. 


似水年 2006-02-27 16:57 发表评论
]]>
变态JAVAE序员面?2?附答? http://www.tkk7.com/huhu/articles/29808.html似水年似水年Tue, 07 Feb 2006 06:51:00 GMThttp://www.tkk7.com/huhu/articles/29808.htmlhttp://www.tkk7.com/huhu/comments/29808.htmlhttp://www.tkk7.com/huhu/articles/29808.html#Feedback0http://www.tkk7.com/huhu/comments/commentRss/29808.htmlhttp://www.tkk7.com/huhu/services/trackbacks/29808.html 变态JAVAE序员面?2?附答?
作? itzealot 发表日期: 2006-01-08 11:35 文章属? 原创 复制链接


W一Q谈谈final, finally, finalize的区别?
  
  W二QAnonymous Inner Class (匿名内部c? 是否可以extends(l承)其它c,是否可以implements(实现)interface(接口)?
  
  W三QStatic Nested Class ?Inner Class的不同,说得多好(面试题有的很W统)?BR>  
  W四Q?amp;?amp;&的区别?BR>  
  W五QHashMap和Hashtable的区别?BR>  
  W六QCollection ?Collections的区别?BR>  
  W七Q什么时候用assert?BR>  
  W八QGC是什? Z么要有GC?
  
  W九QString s = new String("xyz");创徏了几个String Object?
  
  W十QMath.round(11.5){於多少? Math.round(-11.5){於多少?
  
  W十一Qshort s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错?
  
  W十二,sleep() ?wait() 有什么区?
  
  W十三,Java有没有goto?
  
  W十四,数组有没有length()q个Ҏ? String有没有length()q个Ҏ?
  
  W十五,Overload和Override的区别。Overloaded的方法是否可以改变返回值的cd?
  
  W十六,Set里的元素是不能重复的Q那么用什么方法来区分重复与否? 是用==q是equals()? 它们有何区别?
  
  W十七,l我一个你最常见到的runtime exception?BR>  
  W十八,error和exception有什么区?
  
  W十九,List, Set, Map是否l承自Collection接口?
  
  W二十,abstract class和interface有什么区?
  
  W二十一Qabstract的method是否可同时是static,是否可同时是nativeQ是否可同时是synchronized?
  
  W二十二Q接口是否可l承接口? 抽象cL否可实现(implements)接口? 抽象cL否可l承实体c?concrete class)?
  
  W二十三Q启动一个线E是用run()q是start()?
  
  W二十四Q构造器Constructor是否可被override?
  
  W二十五Q是否可以承Stringc?
  
  W二十六Q当一个线E进入一个对象的一个synchronizedҎ后,其它U程是否可进入此对象的其它方?
  
  W二十七Qtry {}里有一个return语句Q那么紧跟在q个try后的finally {}里的code会不会被执行Q什么时候被执行Q在return前还是后?
  
  W二十八Q编E题: 用最有效率的Ҏ出2乘以8{於?
  
  W二十九Q两个对象值相?x.equals(y) == true)Q但却可有不同的hash codeQ这句话对不?
  
  W三十,当一个对象被当作参数传递到一个方法后Q此Ҏ可改变这个对象的属性,q可q回变化后的l果Q那么这里到底是g递还是引用传?
  
  W三十一Qswtich是否能作用在byte上,是否能作用在long上,是否能作用在String?
  
  W三十二Q编E题: 写一个Singleton出来?/P>

Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q?/P>

以下是答案:

Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q?/P>

W一Q谈谈final, finally, finalize的区别?BR>  final—修饰符Q关键字Q如果一个类被声明ؓfinalQ意味着它不能再z出新的子c,不能作ؓ父类被ѝ因此一个类不能既被声明?abstract的,又被声明为final的。将变量或方法声明ؓfinalQ可以保证它们在使用中不被改变。被声明为final的变量必d声明时给定初|而在以后的引用中只能dQ不可修攏V被声明为final的方法也同样只能使用Q不能重?BR>  finally—再异常处理时提?finally 块来执行M清除操作。如果抛Z个异常,那么相匹配的 catch 子句׃执行Q然后控制就会进?finally 块(如果有的话)?BR>  finalize—方法名。Java 技术允怋?finalize() Ҏ在垃圾收集器对象从内存中清除出M前做必要的清理工作。这个方法是由垃圾收集器在确定这个对象没有被引用时对q个对象调用的。它是在 Object cM定义的,因此所有的c都l承了它。子c覆?finalize() Ҏ以整理系l资源或者执行其他清理工作。finalize() Ҏ是在垃圾攉器删除对象之前对q个对象调用的?BR>  
  W二QAnonymous Inner Class (匿名内部c? 是否可以extends(l承)其它c,是否可以implements(实现)interface(接口)?
  匿名的内部类是没有名字的内部cR不能extends(l承) 其它c,但一个内部类可以作ؓ一个接口,由另一个内部类实现?BR>  
  W三QStatic Nested Class ?Inner Class的不同,说得多好(面试题有的很W统)?BR>  Nested Class Q一般是C++的说法)QInner Class (一般是JAVA的说?。Java内部cMC++嵌套cL大的不同在于是否有指向外部的引用上。具体可见http: //www.frontfree.net/articles/services/view.asp?id=704&page=1
  注: 静态内部类QInner ClassQ意味着1创徏一个static内部cȝ对象Q不需要一个外部类对象Q?不能从一个static内部cȝ一个对象访问一个外部类对象
  Hashtablel承自Dictionaryc,而HashMap是Java1.2引进的Map interface的一个实?

  HashMap允许null作ؓ一个entry的key或者valueQ而Hashtable不允?

  q有是QHashMap把Hashtable的containsҎL了,Ҏcontainsvalue和containsKey。因为containsҎҎ让h引v误解?

  最大的不同是,Hashtable的方法是Synchronize的,而HashMap不是Q在
多个U程讉KHashtableӞ不需要自׃ؓ它的Ҏ实现同步Q而HashMap
必Mؓ之提供外同步?BR>  W四Q?amp;?amp;&的区别?BR>  &是位q算W?amp;&是布逻辑q算W?BR>  
  W五QHashMap和Hashtable的区别?BR>  都属于Map接口的类Q实C惟一键映到特定的g?BR>  HashMap cL有分cL者排序。它允许一?null 键和多个 null 倹{?
  Hashtable cM?HashMapQ但是不允许 null 键和 null 倹{它也比 HashMap 慢,因ؓ它是同步的?BR>  Hashtablel承自Dictionaryc,而HashMap是Java1.2引进的Map interface的一个实?

  q有是QHashMap把Hashtable的containsҎL了,Ҏcontainsvalue和containsKey。因为containsҎҎ让h引v误解?

  最大的不同是,Hashtable的方法是Synchronize的,而HashMap不是Q在
多个U程讉KHashtableӞ不需要自׃ؓ它的Ҏ实现同步Q而HashMap
必Mؓ之提供外同步?

  W六QCollection ?Collections的区别?BR>  Collections是个java.util下的c,它包含有各种有关集合操作的静态方法?BR>  Collection是个java.util下的接口Q它是各U集合结构的父接?
  W七Q什么时候用assert?BR>  断言是一个包含布表辑ּ的语句,在执行这个语句时假定该表辑ּ?true。如果表辑ּ计算?falseQ那么系l会报告一?AssertionError。它用于调试目的Q?
  assert(a > 0); // throws an AssertionError if a <= 0
  断言可以有两UŞ式:
  assert Expression1 ;
  assert Expression1 : Expression2 ;
  Expression1 应该L产生一个布倹{?
  Expression2 可以是得Z个值的L表达式。这个值用于生成显C更多调试信息的 String 消息?BR>  断言在默认情况下是禁用的。要在编译时启用断言Q需要?source 1.4 标记Q?
  javac -source 1.4 Test.java
  要在q行时启用断aQ可使用 -enableassertions 或?-ea 标记?
  要在q行旉择用断言Q可使用 -da 或?-disableassertions 标记?
  要系l类中启用断aQ可使用 -esa 或?-dsa 标记。还可以在包的基上启用或者禁用断a?
  可以在预计正常情况下不会到达的Q何位|上攄断言。断a可以用于验证传递给U有Ҏ的参数。不q,断言不应该用于验证传递给公有Ҏ的参敎ͼ因ؓ不管是否启用了断aQ公有方法都必须查其参数。不q,既可以在公有Ҏ中,也可以在非公有方法中利用断言试后置条g。另外,断言不应该以M方式改变E序的状态?
  
  
  W八QGC是什? Z么要有GC? (基础)?BR>  GC是垃圾收集器。Java E序员不用担心内存管理,因ؓ垃圾攉器会自动q行理。要h垃圾攉Q可以调用下面的Ҏ之一Q?
  System.gc()
  Runtime.getRuntime().gc()
  
  W九QString s = new String("xyz");创徏了几个String Object?
  两个对象Q一个是“xyx?一个是指向“xyx”的引用对象s?BR>  
  W十QMath.round(11.5){於多少? Math.round(-11.5){於多少?
  Math.round(11.5)q回QlongQ?2QMath.round(-11.5)q回QlongQ?11;
  
  W十一Qshort s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错?
  short s1 = 1; s1 = s1 + 1;有错Qs1是short型,s1+1是int?不能昑ּ转化为short型。可修改为s1 =(short)(s1 + 1) 。short s1 = 1; s1 += 1正确?BR>  
  W十二,sleep() ?wait() 有什么区? 搞线E的最?BR>  sleep()Ҏ是ɾU程停止一D|间的Ҏ。在sleep 旉间隔期满后,U程不一定立x复执行。这是因为在那个时刻Q其它线E可能正在运行而且没有被调度ؓ攑ּ执行Q除?a)“醒来”的U程h更高的优先
  (b)正在q行的线E因为其它原因而阻塞?BR>  wait()是线E交互时Q如果线E对一个同步对象x 发出一个wait()调用Q该U程会暂停执行,被调对象q入{待状态,直到被唤醒或{待旉到?BR>  W十三,Java有没有goto?
  Goto—java中的保留字,现在没有在java中用?BR>  
  W十四,数组有没有length()q个Ҏ? String有没有length()q个ҎQ?BR>  数组没有length()q个ҎQ有length的属性?BR>  String有有length()q个Ҏ?BR>  
  W十五,Overload和Override的区别。Overloaded的方法是否可以改变返回值的cd?
  Ҏ的重写Overriding和重载Overloading是Java多态性的不同表现。重写Overriding是父cM子类之间多态性的一U表玎ͼ重蝲Overloading是一个类中多态性的一U表现。如果在子类中定义某Ҏ与其父类有相同的名称和参敎ͼ我们说该Ҏ被重?(Overriding)。子cȝ对象使用q个ҎӞ调用子cM的定义,对它而言Q父cM的定义如同被“屏蔽”了。如果在一个类中定义了多个同名的方法,它们或有不同的参C数或有不同的参数cdQ则UCؓҎ的重?Overloading)。Overloaded的方法是可以改变q回值的cd?BR>  
  W十六,Set里的元素是不能重复的Q那么用什么方法来区分重复与否? 是用==q是equals()? 它们有何区别?
  Set里的元素是不能重复的Q那么用iterator()Ҏ来区分重复与否。equals()是判M个Set是否相等?BR>  equals()?=Ҏ军_引用值是否指向同一对象equals()在类中被覆盖Qؓ的是当两个分ȝ对象的内容和cd盔R的话Q返回真倹{?BR>  
  W十七,l我一个你最常见到的runtime exception?BR>  ArithmeticException, ArrayStoreException, BufferOverflowException, BufferUnderflowException, CannotRedoException, CannotUndoException, ClassCastException, CMMException, ConcurrentModificationException, DOMException, EmptyStackException, IllegalArgumentException, IllegalMonitorStateException, IllegalPathStateException, IllegalStateException,
  ImagingOpException, IndexOutOfBoundsException, MissingResourceException, NegativeArraySizeException, NoSuchElementException, NullPointerException, ProfileDataException, ProviderException, RasterFormatException, SecurityException, SystemException, UndeclaredThrowableException, UnmodifiableSetException, UnsupportedOperationException
  
  W十八,error和exception有什么区?
  error 表示恢复不是不可能但很困隄情况下的一U严重问题。比如说内存溢出。不可能指望E序能处理这L情况?BR>  exception 表示一U设计或实现问题。也是_它表C如果程序运行正常,从不会发生的情况?BR>  W十九,List, Set, Map是否l承自Collection接口?
  ListQSet?BR>  
  Map不是
  
  W二十,abstract class和interface有什么区?
  声明Ҏ的存在而不d现它的类被叫做抽象类Qabstract classQ,它用于要创徏一个体现某些基本行为的c,qؓ该类声明ҎQ但不能在该cM实现该类的情c不能创建abstract cȝ实例。然而可以创Z个变量,其类型是一个抽象类Qƈ让它指向具体子类的一个实例。不能有抽象构造函数或抽象静态方法。Abstract cȝ子类为它们父cM的所有抽象方法提供实玎ͼ否则它们也是抽象cMؓ。取而代之,在子cM实现该方法。知道其行ؓ的其它类可以在类中实现这些方法?BR>  接口QinterfaceQ是抽象cȝ变体。在接口中,所有方法都是抽象的。多l承性可通过实现q样的接口而获得。接口中的所有方法都是抽象的Q没有一个有E序体。接口只可以定义static final成员变量。接口的实现与子cȝ|除了该实现类不能从接口定义中l承行ؓ。当cd现特D接口时Q它定义Q即程序体l予Q所有这U接口的Ҏ。然后,它可以在实现了该接口的类的Q何对象上调用接口的方法。由于有抽象c,它允怋用接口名作ؓ引用变量的类型。通常的动态联~将生效。引用可以{换到接口cd或从接口cd转换Qinstanceof q算W可以用来决定某对象的类是否实现了接口?BR>  
  W二十一Qabstract的method是否可同时是static,是否可同时是nativeQ是否可同时是synchronized?
  都不?BR>  
  W二十二Q接口是否可l承接口? 抽象cL否可实现(implements)接口? 抽象cL否可l承实体c?concrete class)?
  接口可以l承接口。抽象类可以实现(implements)接口Q抽象类是否可承实体类Q但前提是实体类必须有明的构造函数?BR>  
  W二十三Q启动一个线E是用run()q是start()?
  启动一个线E是调用start()ҎQɾU程所代表的虚拟处理机处于可运行状态,q意味着它可以由JVM调度q执行。这q不意味着U程׃立即q行。run()Ҏ可以产生必须退出的标志来停止一个线E?BR>  W二十四Q构造器Constructor是否可被override?
  构造器Constructor不能被承,因此不能重写OverridingQ但可以被重载Overloading?BR>  
  W二十五Q是否可以承Stringc?
  StringcLfinalcL不可以ѝ?BR>  
  W二十六Q当一个线E进入一个对象的一个synchronizedҎ后,其它U程是否可进入此对象的其它方?
  不能Q一个对象的一个synchronizedҎ只能׃个线E访问?BR>  
  W二十七Qtry {}里有一个return语句Q那么紧跟在q个try后的finally {}里的code会不会被执行Q什么时候被执行Q在return前还是后?
  会执行,在return前执行?BR>  
  
  W二十八Q编E题: 用最有效率的Ҏ出2乘以8{於?
  有C背景的程序员特别喜欢问这U问题?BR>  
  2 << 3
  
  W二十九Q两个对象值相?x.equals(y) == true)Q但却可有不同的hash codeQ这句话对不?
  不对Q有相同的hash code?BR>  
  W三十,当一个对象被当作参数传递到一个方法后Q此Ҏ可改变这个对象的属性,q可q回变化后的l果Q那么这里到底是g递还是引用传?
  是g递。Java ~程语言只由g递参数。当一个对象实例作Z个参数被传递到Ҏ中时Q参数的值就是对该对象的引用。对象的内容可以在被调用的方法中改变Q但对象的引用是永远不会改变的?BR>  
  
  W三十一Qswtich是否能作用在byte上,是否能作用在long上,是否能作用在String?
  switchQexpr1Q中Qexpr1是一个整数表辑ּ。因此传递给 switch ?case 语句的参数应该是 int?short?char 或?byte。long,string 都不能作用于swtich?BR>  W三十二Q编E题: 写一个Singleton出来?BR>  Singleton模式主要作用是保证在Java应用E序中,一个类Class只有一个实例存在?BR>  一般Singleton模式通常有几U种形式:
  W一UŞ? 定义一个类Q它的构造函Cؓprivate的,它有一个static的private的该cd量,在类初始化时实例话,通过一个public的getInstanceҎ获取对它的引?l而调用其中的Ҏ?BR>  public class Singleton {
  private Singleton(){}
  //在自己内部定义自׃个实例,是不是很奇怪?
  //注意q是private 只供内部调用
  private static Singleton instance = new Singleton();
  //q里提供了一个供外部讉K本class的静态方法,可以直接讉K
  public static Singleton getInstance() {
  return instance;
  }
  }
  W二UŞ?
  public class Singleton {
  private static Singleton instance = null;
  public static synchronized Singleton getInstance() {
  //q个Ҏ比上面有所改进Q不用每ơ都q行生成对象Q只是第一?
  //使用时生成实例,提高了效率!
  if (instance==null)
  instanceQnew Singleton();
  return instance; }
  }
  其他形式:
  定义一个类Q它的构造函Cؓprivate的,所有方法ؓstatic的?BR>  一般认为第一UŞ式要更加安全



似水年 2006-02-07 14:51 发表评论
]]>
一些开源项?/title><link>http://www.tkk7.com/huhu/articles/13705.html</link><dc:creator>似水年</dc:creator><author>似水年</author><pubDate>Thu, 22 Sep 2005 01:08:00 GMT</pubDate><guid>http://www.tkk7.com/huhu/articles/13705.html</guid><wfw:comment>http://www.tkk7.com/huhu/comments/13705.html</wfw:comment><comments>http://www.tkk7.com/huhu/articles/13705.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/huhu/comments/commentRss/13705.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/huhu/services/trackbacks/13705.html</trackback:ping><description><![CDATA[     摘要: 名称 资料 概况 OFBiz http://ofbizchina.com:8080/ http://www.ofbiz.org/ https://ofbiz.dev.java.net/ OFBiz是一个非常著名的开源项目,提供了创建基?..  <a href='http://www.tkk7.com/huhu/articles/13705.html'>阅读全文</a><img src ="http://www.tkk7.com/huhu/aggbug/13705.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/huhu/" target="_blank">似水年</a> 2005-09-22 09:08 <a href="http://www.tkk7.com/huhu/articles/13705.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在J2EE目开发中使用到的一些自己写的基本函?/title><link>http://www.tkk7.com/huhu/articles/11637.html</link><dc:creator>似水年</dc:creator><author>似水年</author><pubDate>Wed, 31 Aug 2005 06:05:00 GMT</pubDate><guid>http://www.tkk7.com/huhu/articles/11637.html</guid><wfw:comment>http://www.tkk7.com/huhu/comments/11637.html</wfw:comment><comments>http://www.tkk7.com/huhu/articles/11637.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/huhu/comments/commentRss/11637.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/huhu/services/trackbacks/11637.html</trackback:ping><description><![CDATA[在J2EE目开发中使用到的一些自己写的基本函?BR><BR>package jing.tools;<BR><BR>import java.util.*;<BR>import java.text.*; //日期处理用到的包<BR>import java.util.regex.*;<BR>import java.lang.*;<BR><BR>/**<BR>* <p>Title: 常用基础函数</p><BR>* <p>Description: 以下全部是静态函?lt;/p><BR>* <p>Copyright: Copyright (c) 2005</p><BR>* <p>Company: 静靖工作?lt;/p><BR>* “@deprecated Method Ҏ?is deprecated?在方法的注释里加上此注释Q表C此Ҏ以后版本不再被支持?BR>* 文g注释只能写在import?cd义前才能在javadoc中出现文件的注释<BR>* @author Ƨ朝?QQ:35712069<BR>* @version 1.0<BR>*/<BR>public class BaseFunction {<BR>    public BaseFunction() {<BR><BR>    }<BR><BR>    /**<BR>     * 拼合一l数lؓ字符丌Ӏ?BR>     * <B>拆分字串按指定字W分解到一l数l用Stringcȝsplit(String regex)</B><BR>     * @param param String[] 数组<BR>     * @param spilt String 字符串之单的分离W?BR>     * @return String<BR>     */<BR>    public static String arrayToString(String[] param, String spilt) {<BR>        String rentunstring;<BR>        StringBuffer tempstr = new StringBuffer();<BR>        int len = param.length;<BR>        for (int i = 0; i < len - 1; i++) {<BR>            tempstr.append(param<I>);<BR>            tempstr.append(spilt);<BR>        }<BR>        tempstr.append(param[len - 1]);<BR>        rentunstring = tempstr.toString();<BR>        return rentunstring;<BR>    }<BR><BR>    /**<BR>     * 产生在start和end之间的num个随机整敎ͼq回值存在HashMap中?BR>     * CZ<BR>     * HashMap hm=BaseFunction.random(1,100,5);<BR>     * Set set=hm.keySet();<BR>     * Iterator it=set.iterator();<BR>     * while(it.hasNext()){<BR>     *     System.out.println(hm.get(it.next()));<BR>     * }<BR>     * @param start int 起始?BR>     * @param end int l束?BR>     * @param num int 生成个数<BR>     * @return HashMap<BR>     */<BR>    public static HashMap random(int start, int end, int num) {<BR>        HashMap hashMap = new HashMap();<BR>        for (int i = 0; i < num; i++) {<BR>            double sru = Math.random() * end;<BR>            int tag = Math.round((float) sru);<BR>            if (tag < start) {<BR>                i--;<BR>            } else {<BR>                hashMap.put(new Integer(i), new Integer(tag));<BR>            }<BR>        }<BR>        return hashMap;<BR>    }<BR><BR><BR>    /**<BR>     * 获取当前旉Q返回时间格?如果调用参数为true时返回yyyy-MM-dd HH:mm:ss<BR>     * Q否则ؓfalse时返回yyyy-MM-DD不带日期格式)<BR>     * @param time boolean<BR>     * @return String<BR>     * @throws Exception<BR>     */<BR>    public static String getNowTime(boolean time) throws java.lang.Exception {<BR>        Date now = new Date();<BR>        String format = "";<BR>        //yyyy-MM-dd HH:mm:ss:S q月日时分秒毫杪<BR>        if (time) {<BR>            format = "yyyy-MM-dd HH:mm:ss";<BR>        } else {<BR>            format = "yyyy-MM-dd";<BR>        }<BR>        SimpleDateFormat sdf = new SimpleDateFormat(format);<BR>        String nowtime = sdf.format(now);<BR>        return nowtime;<BR>    }<BR><BR>    /**<BR>     * HashMap内容转入数组Q?BR>     * CZ<BR>     *    HashMap hashMap = new HashMap();<BR>     *    hashMap.put("ka", "bb");<BR>     *    hashMap.put("kb", "cc");<BR>     *    hashMap.put("jk", "fdsaf");<BR>     *    hashMap.put("ak", "kkkkk");<BR>     *    Object[] obj = BaseFunction.hashMapToArray(hashMap);<BR>     *    for (int i = 0; i < obj.length; i++) {<BR>     *        System.out.println(obj<I>);<BR>     *    }<BR>     * @param param HashMap<BR>     * @return Object[]<BR>     */<BR>    public static Object[] hashMapToArray(HashMap param) {<BR>        int size = param.size();<BR>        if (param == null || param.size() == 0) {<BR>            return null;<BR>        }<BR>        Object[] obj = new Object[size];<BR>        Set set = param.keySet();<BR>        Iterator ite = set.iterator();<BR>        for (int i = 0; ite.hasNext(); i++) {<BR>            obj<I> = param.get(ite.next());<BR>        }<BR>        return obj;<BR>    }<BR><BR>    /**<BR>     * 日期转字W串<BR>     * CZQdateToString(stringToDate("2005-5-2 0:0:10"));<BR>     * @param date Date<BR>     * @return String<BR>     * q回字符串格式ؓ“yyyyqMM月dd?HH时mm分ssU”或“yyyyqMM月dd日?BR>     * Ҏ输入的日期是否含有时间来定输出格式<BR>     */<BR>    public static String dateToString(Date date) {<BR>        Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("GMT+8"),<BR>                                                 Locale.CHINA);<BR>        calendar.clear();<BR>        calendar.setTimeInMillis(date.getTime());<BR>        String format = "";<BR><BR>        /*        if (calendar.get(Calendar.MILLISECOND) == 0 &&<BR>                    calendar.get(Calendar.SECOND) == 0 &&<BR>         calendar.get(Calendar.SECOND) == calendar.get(Calendar.MINUTE) &&<BR>         calendar.get(Calendar.MINUTE) == calendar.get(Calendar.HOUR)) {<BR>                    format = "yyyy'q?MM'?dd'?";<BR>                } else {<BR>                 format = "yyyy'q?MM'?dd'? HH'?mm'?ss'U?";<BR>                }<BR>         */<BR>        format = "yyyy'q?MM'?dd'? HH'?mm'?ss'U?";<BR>        String return_string = "";<BR>        SimpleDateFormat sdf = new SimpleDateFormat(format);<BR>        //yyyy-MM-dd HH:mm:ss:S q月日时分秒毫杪<BR>        return_string = sdf.format(date);<BR>        return return_string;<BR>    }<BR><BR>    /**<BR>     * 字符串{日期<BR>     * CZ:stringToDate("2005-5-2 0:0:10");<BR>     * @param str String<BR>     * 输入字符串日期可用三U格?BR>     * yyyy-MM-dd HH:mm:ss完整?BR>     * yyyy-MM-dd HH:mm不含U?BR>     * yyyy-MM-dd只有日期不含旉<BR>     * @return Date<BR>     * @throws Exception<BR>     */<BR>    public static Date stringToDate(String str) throws Exception {<BR>        Date return_date = null;<BR>        String format = "";<BR>        if (str.length() > 13) {<BR>            format = "yyyy-MM-dd HH:mm:ss";<BR>        } else if (str.length() > 10) {<BR>            format = "yyyy-MM-dd HH:mm";<BR>        } else {<BR>            format = "yyyy-MM-dd";<BR>        }<BR>        try {<BR>            SimpleDateFormat sdf = new SimpleDateFormat(format);<BR>            return_date = sdf.parse(str);<BR>        } catch (ParseException e) {<BR>            throw new Exception(<BR>                    "输入字符串的格式出错(格式为yyyy-MM-dd/yyyy-MM-dd HH:mm/yyyy-MM-dd HH:mm:ss)Q? +<BR>                    e.getMessage());<BR>        }<BR>        return return_date;<BR>    }<BR><BR>    /**<BR>     * q箋产生指定个数的字W串<BR>     * @param str String<BR>     * @param count int<BR>     * @return String<BR>     */<BR>    public static String continuousMakeString(String str, int count) {<BR>        StringBuffer sb = new StringBuffer();<BR>        for (int i = 0; i < count; i++) {<BR>            sb.append(str);<BR>        }<BR>        return (sb.toString());<BR>    }<BR><BR>    /**<BR>     * 字W串开头的所有空格替换成指定的字W?BR>     * 在JSP中经常用到把字符串开头的n个空格替换成n?amp;nbsp;字符<BR>     * 可以用此函数调用CZ<BR>     * replaceStartsWithSpace("  中国  湖南  长沙","&nbsp;");l果为?amp;nbsp;&nbsp;中国  湖南  长沙?BR>     * @param str String<BR>     * @param sub String<BR>     * @return String<BR>     */<BR>    public static String replaceStartsWithSpace(String str, String sub) {<BR>        String returnStr = "";<BR>        String regEx = "\\S"; //非空格字W?BR>        Pattern pattern = Pattern.compile(regEx);<BR>        Matcher matcher = pattern.matcher(str);<BR>        matcher.find();<BR>        int start = matcher.start(); //非空格开始的位置<BR>        for (int i = 0; i < start; i++) {<BR>            returnStr = returnStr + sub;<BR>        }<BR>        returnStr = returnStr + str.substring(start);<BR>        return returnStr;<BR>    }<BR><BR>    /**<BR>     * 查找指定的元素是否存在于元素数组?BR>     * 使用Object支持各种对象数组<BR>     * CZ<BR>     * String[] des = {"ada", "ss", "dd","aa"};<BR>     * System.out.println(BaseFunction.contains(str, "adfab"));<BR>     * @param objArray Object[]<BR>     * @param value Object<BR>     * @return int 如果查到则返回第一ơ在数组中出现的下标|查不到则q回gؓ-1<BR>     */<BR>    public static int contains(Object[] objArray, Object value) {<BR>        int j = -1;<BR>        for (int i = 0; i < objArray.length; i++) {<BR>            if (objArray<I>.equals(value)) { //查到则返回下?BR>                j = i;<BR>                break;<BR>            }<BR>        }<BR>        return j;<BR>    }<BR><BR>    /**<BR>     * 字符串数l中是否包含指定的字W串?BR>     * @param strings 字符串数l?BR>     * @param string 字符?BR>     * @param caseSensitive 是否大小写敏?true区分大小?false不区分大写)<BR>     * @return 包含时返回trueQ否则返回false<BR>     * @since  0.4<BR>     */<BR>    public static boolean contains(String[] strings, String string,<BR>                                   boolean caseSensitive) {<BR>        for (int i = 0; i < strings.length; i++) {<BR>            if (caseSensitive == true) {<BR>                if (strings<I>.equals(string)) {<BR>                    return true;<BR>                }<BR>            } else {<BR>                if (strings<I>.equalsIgnoreCase(string)) {<BR>                    return true;<BR>                }<BR>            }<BR>        }<BR>        return false;<BR>    }<BR><BR>    /**<BR>     * 数组拯,使用System.arraycopy()速度更快,把source数据内容拯到destination?BR>     * 使用Object则支持多U对象数l?BR>     * CZ<BR>     * String[] des = {"ada", "ss", "dd","aa"};<BR>     * String[] src = new String[8];<BR>     * BaseFunction.copy(des, src);<BR>     * @param source Object[]<BR>     * @param destination Object[]<BR>     */<BR>    public static void copy(Object[] source, Object[] destination) {<BR>        if (destination == null || source == null) {<BR>            throw new java.lang.NullPointerException("数组没有初始化!");<BR>        }<BR>        if (destination.length < source.length) {<BR>            throw new java.lang.ArrayIndexOutOfBoundsException("两数l长度不相等!");<BR>        }<BR>        for (int i = 0; i < source.length; i++) {<BR>            destination<I> = source<I>;<BR>        }<BR>    }<BR><BR>    /**<BR>     * 去除数组中的重复元素Q调用示?BR>     * String[] src = {"dafdfad", "asdfasdf", "dafdfad", "adfasdf", "dafdfad","dafdfad"};<BR>     * Object[] test =BaseFunction.wipeOffRepeat(src);<BR>     * @param objArray Object[]<BR>     * @return Object[]<BR>     */<BR>    public static Object[] wipeOffRepeat(Object[] objArray) {<BR>        Object[] obj = null;<BR>        ArrayList list = new ArrayList();<BR>        for (int i = 0; i < objArray.length; i++) {<BR>            list.add(objArray<I>);<BR>        }<BR>        //去除list中的重复对象<BR>        HashSet h = new HashSet(list);<BR>        list.clear();<BR>        list.addAll(h);<BR>        obj = list.toArray();<BR>        return obj;<BR>    }<BR><BR>    /**<BR>     * 四舍五入<BR>     * @param param double 要进行四舍五入的?BR>     * @param num int 保留的小C?BR>     * @return double<BR>     */<BR>    public static double round(double param, int num) {<BR>        NumberFormat nf = NumberFormat.getNumberInstance();<BR>        nf.setMaximumFractionDigits(num);<BR>        double returndouble = Double.parseDouble(nf.format(param));<BR>        return returndouble;<BR>    }<BR><BR>    /**<BR>     * d数做试?BR>     * @param args String[]<BR>     * @throws Exception<BR>     */<BR>    public static void main(String[] args) throws Exception {<BR>        /*        System.out.println(BaseFunction.dateToString(stringToDate(<BR>                        "2005-5-2 0:0:10")));<BR>                System.out.println(BaseFunction.getTime(true));<BR>                System.out.println(BaseFunction.continuousMakeString(" ", 10));<BR>                System.out.println(BaseFunction.replaceStartsSpace(<BR>                        " fadsfas   dfsd", "&nbsp;"));<BR>         */<BR>        /*        HashMap hm=BaseFunction.random(1,100,5);<BR>                Set set=hm.keySet();<BR>                Iterator it=set.iterator();<BR>                while(it.hasNext()){<BR>                    System.out.println(hm.get(it.next()));<BR>                }<BR>         */<BR>        //System.out.println(BaseFunction.replaceStartsWithSpace("  中国  湖南  长沙","&nbsp;"));<BR>        System.out.println(BaseFunction.round(0.25689,2));<BR>    }<BR>}<BR></I></I></I></I></I></I></I></I></I><img src ="http://www.tkk7.com/huhu/aggbug/11637.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/huhu/" target="_blank">似水年</a> 2005-08-31 14:05 <a href="http://www.tkk7.com/huhu/articles/11637.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何q速成为Java高手http://www.tkk7.com/huhu/articles/7811.html似水年似水年Sat, 16 Jul 2005 02:42:00 GMThttp://www.tkk7.com/huhu/articles/7811.htmlhttp://www.tkk7.com/huhu/comments/7811.htmlhttp://www.tkk7.com/huhu/articles/7811.html#Feedback0http://www.tkk7.com/huhu/comments/commentRss/7811.htmlhttp://www.tkk7.com/huhu/services/trackbacks/7811.html

如何q速成为Java高手

cdQ{?作者:zsq 日期Q?004-12-28 09:33:00




    很多|友问我学习Java有没有什么捷?我说“无他,唯手熟尔”。但是我却很愿意自己学习的一些经验写出来Q以便后来者少走弯?帮助别h是最大的快乐嘛!

  要想学好JavaQ首先要知道Java的大致分cR我们知道,自从Sun推出Java以来Q就力图使之无所不包Q所以Java发展到现在,按应用来分主要分Z大块QJ2SE,J2ME和J2EE,q也是Sun ONE(Open Net Environment)体系。J2SE是Java2的标准版Q主要用于桌面应用Y件的~程QJ2ME主要应用于嵌入是pȝ开发,如手机和PDA的编E;J2EE是Java2的企业版Q主要用于分布式的网l程序的开发,如电子商务网站和ERPpȝ。J2SE开发桌面应用Y件比起VC,VB,DEPHIq些传统开发语a来说Q优势好象ƈ不明显。J2ME对于初学者来_好象又有Ҏ奥,而且一般开发者很难有开发环境。所以现在应用最q泛又最好学的就是J2EE了。J2EE又包括许多组Ӟ如Jsp,Servlet,JavaBean,EJB,JDBC,JavaMail{。要学习h可不是一两天的事?

  那么又该如何学习J2EE呢?当然Java语法得先看一看的QI/O包,Util包,Lang包你都熟悉了吗?然后再从JSP学v。如果你学过HTMLQ那么事情要好办的多Q如果没有,那你快去补一补HTML基础吧。其实JSP中的Java语法也不多,它更象一个脚本语aQ有点象ASP。然后你p学一学Servlet了。Servlet是服务器端程序,他负责生成发送给客户端的HTML文g。JSP在执行时Q也是先转换成Servlet再运行的。虽说JSP理论上可以完全取代ServletQ这也是SUN推出JSP的本意,可是Servlet用来控制程跌{q是挺方便的Q也令程序更清晰。接下来你应该学习一下Javabean了,可能你早q不管JSP在HTML中嵌Java代码的؜乱方式了Q这U方式跟ASP又有什么区别呢Q还好,SUN提供了Javabean可以把你的JSP中的Java代码装hQ便于调用也便于重用。接着是EJB了,EJB是Enterprise JavaBean,看名字好象它是JavabeanQ可是它和Javabeanq是有区别的。它是一个体pȝ构,你可以搭建更安全、更E_的企业应用。它的大量代码已׃间gQ也是我们常听到的Weblogic,Websphereq些J2EE服务器)完成了,所以我们要做的E序代码量很,大部分工作都在设计和配置中间件上。至于JDBCQ就不用我多说了Q你如果用java~过存取数据库的E序Q就应该很熟悉。还有,如果你要用Java~发送电子邮件的E序Q你得看看Javamail了?

  好了Q对Java和J2EE有了一些基本概念之后,你就应该~一些程序了Q千万不要纸上谈兵哦。最好找一些有实例且带光盘的书来看Q这L到好的程序就可以直接Ctrl+C再Ctrl+VQ也不用x老大架再亲自把它 再输一遍吧Q再说直接复制还不用怕出错,何乐而不为呢Q还有就是要l常上一些好的Java~程文章Q有好的文章要Cut下来Q有问题管问,只要问题不是太傻Q一般高手都会回{你的?/P>

 下面介绍几个好的Java斚w的编E网站:

  CSDN论坛 http://www.csdn.net/ 中国最有名的技术论坛,《程序员》杂志就是他们出版的Q你可以在上面提出问题,马上有人回{你Q如果你觉得好,你可以给那h加分Q?

  Java研究l织http://www.javaresearch.org/ 上面有很多原创文章,高手q是挺多的;

  Java开发?http://www.chinajavaworld.com/ 那里Java资料比较全;

  java.com.cn http://www.java.com.cn/ 看这域名q道有多牛Q注册用户快接近一万了Q同时在UhC在一千左叻I人气很旺的;

  IBM的开发者网lhttp://www-900.ibm.com/developerWorks/cn/java/index.shtml IBM永远的蓝色巨人;

  那么我书也看了,E序也做了,别h问我的问题我都能解决了,是不是就成ؓ高手了呢Q当然没那么单,q只是万里长征走完了W一步。不信?那你出去接一个项目,你知道怎么下手吗,你知道怎么设计吗,你知道怎么l织人员q行开发吗Q你现在脑子里除了一些散q代码之外Q可能再没有别的东西了吧Q你现在最~的是实际的工作l验Q而不是书本上那些凭空惛_来的E序。所以你快去找一份Java的编E工作来做吧Q如果是在校学生可以dD啊)Q在实践中提高自己,那才是最快的。不q你得祈在公司里碰C个高手,而且他还愿意不厌其烦地教你,q样好象有点隑֓Q?

  q有一个办法就是读开放源码的E序了。我们知道开放源码大都出自高手,他们设计合理Q考虑周到Q再加上有广大的E序员参与,代码的hD然是字字珠叽Q铿锉|力(对不P偶最q《金装四大才子》看多了Q。学Java必读的两个开源程序就是Jive和Pet Store.。Jive是国外一个非常著名的BBSE序Q完全开放源码。论坛的设计采用了很多先q的技术,如Cache、用戯证、Filter、XML{,而且论坛完全屏蔽了对数据库的讉KQ可以很L的在不同数据库中UL。论坛还有方便的安装和管理程序,q是我们qx~程时容易忽略的一部䆾Q中国程序员一般只注重~程的技术含量,却完全不考虑用户的感受,q就是我们与国外软g的差距所在)。Jive的资料在很多|站上都有,大家可以找来研究一下。相信你d代码后,会有p换骨的感觉。遗憄是Jive?.5以后׃再无条g的开放源代码Q同时有licence限制。不q幸好还有中国一的JavaE序员关注它Q外国h不开源了Q中国h׃能开源吗Q这里向大家推荐一个汉化的Jive版本—J道。Jive(J道版)是由中国Java界大名鼎鼎的banq在Jive 2.1版本基础上改~而成, 全中文,增加了一些实用功能,如脓图,用户头像和用戯料查询等Q而且有一个开发团队在不断升。你可以讉Kbanq的网站http://www.jdon.com/ M载,或到同济技术论坛的服务器上ftp://nro.shtdu.edu.cnMQ安装上有什么问题,可以到论坛上L问。Pet Store.Q宠物店Q是SUN公司Z演示其J2EE~程规范而推出的开放源码的E序Q应该很h权威性,惛_J2EE和EJB的朋友不要错q了?

  你一定会高兴地说Q哈哈,原来成ؓJava高手p么简单啊!记得Tomjava也曾到q一个项目经理,LJava很简单,只要三个月就可以学会。其实说q种话的人就如当q小日本L“三个月拿下中国”一样大a不惭。不是TomjavaghQ你现在只是学到了Java的骨Ӟ却还没有学到Java的精髓。接下来你得研究设计模式了。设计模式是高E序员真正掌握面向对象核心思想的必修课。设计模式ƈ不是一U具?技?,它讲q的是思想Q它不仅仅展CZ接口或抽象类在实际案例中的灵zd用和智慧Q让你能够真正掌握接口或抽象cȝ应用Q从而在原来的Java语言基础上跃q一步,更重要的是,设计模式反复向你一个宗旨:要让你的E序可能的可重用。关于设计模式的资料Q还是向大家推荐banq的网站http://www.jdon.com/ Q他把GOF?3U模式以通俗易懂的方式诠释出来,UJava描述Q真是经怸的经典。有旉再研I一下MVCl构Q把Model-View-Control分离开的设计思想Q吧Q现在很行的Structs是它的一U实现方式,不过Structs用v来实在是很繁Q我们只要学习其_N卛_Q我们完全可以设计自qMVCl构。然后你再研I一下Y件Refactoring(重整)和极限XP~程Q相信你又会上一个台阶?

  做完q些Q你不如整理一下你的Java代码Q把那些l典的程序和常见的应用整理出来,再精心打造一番,提高光用性和可扩展性。你再找几个志同道合的朋友成立一个工作室吧,你可以去承接一些项目做了,一开始可能有些困难,可是你有技术积累,又考虑周全Q接下项目来可以q速作完,怿大家以后都会来找你的Q所以Money哗啦啦的来了。。。。。?

  当然你也可以参加一些开源项目,一斚w可以提高自己Q另一斚w也是Z国Y件事业做贡献嘛!开发者在互联|上用CVS合作开发,用QQ,MSN,E-mail讨论联系Q天南v北的E序员分散在各地却同时开发同一个YӞ是不是很有意思呢Q?/P>

下面介绍两个好的开源项目网站:

  湖北省Y件公共开发^台http://gro.clinux.org/

  共创联盟http://cosoft.org.cn/

  哇,好高兴哦Q我l于成ؓ高手了!非也Q非也。古ZQ“识时务者ؓ俊杰”。你知道计算机界现在的发展Ş势吗Q你知道微Y?NET蓝图和SUN ONE计划之间的明争暗斗吗?你知道计机技术将向何处发展吗?其实从各大计机厂商最q的动作,都可以看出来“Web服务是下一代互联网应用的制高点”,而微软的.NET蓝图和SUN ONE计划的斗争焦点,也就是Web服务。Web服务是一个崭新的分布式计模型,它是一pd标准的综合(XML,SOAP,UDDI,WSDL和WSFL{)。它使得不同语言~写的Y件能够轻易的集成hQɾ|络资源和Web站点变成一U服务而不是؜q垃圾场。不q的来Q我们就可以在家里点M下鼠标,可以完成出门旅游的全部准备工作Q包括定飞机,定旅游线路,定好戉K{。请注意Q这所有的一切都是Web站点间自动完成的Q再也不用象现在一P表面上是电子商务Q实际上很多环节都是人工操作。也怽会觉得这是天方夜谈,不过p的说Q你也很有可能承接一个项目,要集成两个企业的ERPpȝ。很有可能上怼业的pȝ是用Dephi~的Q而下怼业的pȝ是用Java~的。你说你是Java高手Q大安看者你怎么做呢。所以啊Q你q得学习新技术,如Web服务Q而且你Dephi也要懂一点吧QDephi6现在已经提供Web服务的控件了Q?你编的JavapȝQ可能要?NET集成Q所以你.NET要懂一点吧Q到最后,你可能发C已经成ؓJava高手了,但很多时间却在搞别的技术。太极张三丰里说Q最厉害的招式就是没有招式,可能是q个道理吧!

  因ؓ刚刚兴vQ所以网上Web服务的资料不是很多,我还是给大家推荐几个|站吧:

  中国UDDI技术联盟http://www.uddi-china.org/

  CSDN的柴晓\专栏http://www.csdn.net/develop/author/ColumnAuthor/fennivel/ Q注Q柴晓\也是互联|上一个有名的人物Q他发表q很多关于Web服务的文章,q出了一书,应该U的上是中国Web服务技术的先行者)

  IBM的开发者网l的XML&Web Service专栏:

  http://www-900.ibm.com/developerWorks/cn/xml/index.shtml?csdn IBM可是Web服务的力推?

  呜…你费劲千心万苦Qȝ成ؓJava高手了,怎叫Z由喜极而泣呢!是啊Q真不容易,真不单,真叫人感动啊Q那么打个电话告诉我吧,什么?我的电话L是多?昏到Q你打电话问不就知道了吗Q真是的…?



似水年 2005-07-16 10:42 发表评论
]]>
Dom4j ~码问题d解决http://www.tkk7.com/huhu/articles/6607.html似水年似水年Thu, 23 Jun 2005 09:50:00 GMThttp://www.tkk7.com/huhu/articles/6607.htmlhttp://www.tkk7.com/huhu/comments/6607.htmlhttp://www.tkk7.com/huhu/articles/6607.html#Feedback0http://www.tkk7.com/huhu/comments/commentRss/6607.htmlhttp://www.tkk7.com/huhu/services/trackbacks/6607.html在dom4j的范例和|上行的《DOM4J 使用介》这教E中新徏一个xml文档的代码都cM如下

public void createXML(String fileName) {

Document doc 
= org.dom4j.DocumentHelper.createDocument();

Element root 
= doc.addElement("book");

root.addAttribute(
"name""我的图书");



Element childTmp;

childTmp 
= root.addElement("price");

childTmp.setText(
"21.22");



Element writer 
= root.addElement("author");

writer.setText(
"李四");

writer.addAttribute(
"ID""001");



try {

org.dom4j.io.XMLWriter xmlWriter 
= new org.dom4j.io.XMLWriter(

new FileWriter(fileName));

xmlWriter.write(doc);

xmlWriter.close();

}


catch (Exception e) {

System.
out.println(e);

}


}


在上面的代码中输Z用的是FileWriter对象q行文g的输出。这是不能正确q行文g~码的原因所在,java中由Writercȝ承下来的子类没有提供~码格式处理Q所以dom4j也就无法对输出的文gq行正确的格式处理。这时候所保存的文件会以系l的默认~码Ҏ件进行保存,在中文版的window下java的默认的~码为GBKQ也是所虽然我们标识了要xml保存为utf-8格式但实际上文g是以GBK格式来保存的Q所以这也就是ؓ什么能够我们用GBK、GB2312~码来生成xml文g能正的被解析,而以UTF-8格式生成的文件不能被xml解析器所解析的原因?BR>好了现在我们扑ֈ了原因所在了Q我们来找解军_法吧。首先我们看看dom4j是如何实现编码处理的


public XMLWriter(OutputStream out) throws UnsupportedEncodingException {

//System.out.println("In OutputStream");

this.format = DEFAULT_FORMAT;

this.writer = createWriter(out, format.getEncoding());

this.autoFlush = true;

namespaceStack.push(Namespace.NO_NAMESPACE);

}




public XMLWriter(OutputStream out, OutputFormat format) throws UnsupportedEncodingException {

//System.out.println("In OutputStream,OutputFormat");

this.format = format;

this.writer = createWriter(out, format.getEncoding());

this.autoFlush = true;

namespaceStack.push(Namespace.NO_NAMESPACE);

}





/**

* Get an OutputStreamWriter, use preferred encoding.

*/


protected Writer createWriter(OutputStream outStream, String encoding) throws UnsupportedEncodingException {

return new BufferedWriter(

new OutputStreamWriter( outStream, encoding )

);

}


׃面的代码我们可以看出dom4j对编码ƈ没有q行什么很复杂的处理,完全通过java本n的功能来完成。所以我们在使用dom4j的来生成我们的XML文g时不应该直接为在构徏XMLWriterӞ不应该直接ؓ其赋一个Writer对象Q而应该通过一个OutputStream的子cd象来构徏。也是说在我们上面的代码中Q不应该用FileWriter对象来构建xml文档Q而应该用FileOutputStream对象来构建所以将代码修改入下Q?BR>
public void createXML(String fileName) {

Document doc 
= org.dom4j.DocumentHelper.createDocument();

Element root 
= doc.addElement("book");

root.addAttribute(
"name""我的图书");



Element childTmp;

childTmp 
= root.addElement("price");

childTmp.setText(
"21.22");



Element writer 
= root.addElement("author");

writer.setText(
"李四");

writer.addAttribute(
"ID""001");



try {
//注意q里的修?/SPAN>


org.dom4j.io.XMLWriter xmlWriter 
= new org.dom4j.io.XMLWriter(

new FileOutputStream(fileName));

xmlWriter.write(doc);

xmlWriter.close();

}


catch (Exception e) {

System.
out.println(e);

}


}


xDOM4J的问题编码问题算是告一D落Q希望对此文章对其他朋友有用?BR>

似水年 2005-06-23 17:50 发表评论
]]>
用JavaE序获取l对路径http://www.tkk7.com/huhu/articles/5688.html似水年似水年Tue, 07 Jun 2005 08:19:00 GMThttp://www.tkk7.com/huhu/articles/5688.htmlhttp://www.tkk7.com/huhu/comments/5688.htmlhttp://www.tkk7.com/huhu/articles/5688.html#Feedback0http://www.tkk7.com/huhu/comments/commentRss/5688.htmlhttp://www.tkk7.com/huhu/services/trackbacks/5688.html    情况是这LQ我的Tomcat装在了c盘,而我的虚拟目录设在了E:/work下, 我在E:/work/test/image下有个图片,test.gif 我想通过E序删掉它,但他的绝对\径不定(Z考虑到程序以后的UL,l对路径是不定??

    假设del.jsp文g在e:/work/test 下,用下面的E序好像可以删掉Q?/P>

<!--原始的del.jsp源文?->
<%@ page contentType="text/html; charset=GBK" errorPage="" %>
<%request.setCharacterEncoding("GBK");%>
<%@ page language="java" import="java.sql.*" import="java.util.*" import ="java.text.*" import="java.io.*"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=GBK">
<title>删除成功面</title>
</head>
<body>
File f=new File("/image/",test.gif);
boolean a=f.delete();
out.print("a="+a);
</body>
</html>

    但事实上不行Q你会发现a=false;

    q就需要获取其l对路径Q?我们用javaE序来做一个专门来获取l对路径的javaBean(path_test.java)可以了?

path_test.java的代码如下:
package pathtest;
import java.io.*;
import javax.servlet.*;
import javax.servlet.jsp.PageContext;//导入PageContextc,不要忘了
public class path_test
{

protected ServletContext m_application;
private boolean m_denyPhysicalPath;
public path_test()
{

}
public final void initialize(PageContext pageContext)
throws ServletException
{
m_application = pageContext.getServletContext();

}

public String getPhysicalPath(String filePathName, int option)
throws IOException
{
String path = new String();
String fileName = new String();
String fileSeparator = new String();
boolean isPhysical = false;
fileSeparator=System.getProperty("file.separator");
if(filePathName == null)
throw new IllegalArgumentException("There is no specified destination file (1140).");
if(filePathName.equals(""))
throw new IllegalArgumentException("There is no specified destination file (1140).");
if(filePathName.lastIndexOf("\\") >= 0)
{
path = filePathName.substring(0, filePathName.lastIndexOf("\\"));
fileName = filePathName.substring(filePathName.lastIndexOf("\\") + 1);
}
if(filePathName.lastIndexOf("/") >= 0)
{
path = filePathName.substring(0, filePathName.lastIndexOf("/"));
fileName = filePathName.substring(filePathName.lastIndexOf("/") + 1);
}
path = path.length() != 0 ? path : "/";
java.io.File physicalPath = new java.io.File(path);
if(physicalPath.exists())
isPhysical = true;
if(option == 0)
{
if(isVirtual(path))
{
path = m_application.getRealPath(path);
if(path.endsWith(fileSeparator))
path = path + fileName;
else
path = String.valueOf((new StringBuffer(String.valueOf(path))).append(fileSeparator).append(fileName));
return path;
}
if(isPhysical)
{
if(m_denyPhysicalPath)
throw new IllegalArgumentException("Physical path is denied (1125).");
else
return filePathName;
} else
{
throw new IllegalArgumentException("This path does not exist (1135).");
}
}
if(option == 1)
{
if(isVirtual(path))
{
path = m_application.getRealPath(path);
if(path.endsWith(fileSeparator))
path = path + fileName;
else
path = String.valueOf((new StringBuffer(String.valueOf(path))).append(fileSeparator).append(fileName));
return path;
}
if(isPhysical)
throw new IllegalArgumentException("The path is not a virtual path.");
else
throw new IllegalArgumentException("This path does not exist (1135).");
}
if(option == 2)
{
if(isPhysical)
if(m_denyPhysicalPath)
throw new IllegalArgumentException("Physical path is denied (1125).");
else
return filePathName;
if(isVirtual(path))
throw new IllegalArgumentException("The path is not a physical path.");
else
throw new IllegalArgumentException("This path does not exist (1135).");
}

else
{
return null;
}

}
private boolean isVirtual(String pathName) //判断是否是虚拟\?
{
if(m_application.getRealPath(pathName) != null)
{
java.io.File virtualFile = new java.io.File(m_application.getRealPath(pathName));
return virtualFile.exists();
}

else
{
return false;
}
}

}

    对path_test.java~译后,得到包pathtest,里面有path_test.classc,

    把整个包攑ֈ虚拟目录的classes下,然后再把del.jsp文gҎ如下E序Q一切都OK了!

<!--改后的del.jsp的源文g-->
<%@ page contentType="text/html; charset=GBK" errorPage="" %>
<%request.setCharacterEncoding("GBK");%>
<%@ page language="java" import="java.sql.*" import="java.util.*" import ="java.text.*" import="java.io.*"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=GBK">
<title>删除成功面</title>
</head>
<body>
<jsp:useBean id="pathtest" scope="page" class="pathtest.path_test" />
pathtest.initialize(pageContext);//初始?
String dir1=pathtest.getPhysicalPath("/test/image/",0);//传参?
out.print(dir1);//输出的是l对路径
File file=new File(dir1,"test.gif");//生成文g对象
boolean a=file.delete();
out.print("a="+a);
</body">
</html>

    此时a=true;表示删除成功Q?

    到此为止Q问题全部搞定?



似水年 2005-06-07 16:19 发表评论
]]>
վ֩ģ壺 aƬձþ| ĻƬa| www޾Ʒþþ| aëƬëƬѹۿó| þ˾þۺ| ҳվ߿| һػaaaƬѿ| Ļ| ѹۿձwwվһ | 91㽹߹ۿ| ߾þ֮ۺ߾þ| AVۺɫһAV| aëƬaѿԿ| xxxxxܴƬ߹ۿ| av| ˿Ů͵ԲĻ| 100000žž18| þѹƷ| ޳avƬ| þþƷ㽶| ѹۿ˳վ| Ļվ| GOGOGOѹۿ| AVXXX鶹| ˳ɵӰ߹ۿɫ| ޹Ӱavַ| þþwwwëƬ| Ʒ鶹˳վ| ߾Ʒ޵һ| ˳7777Ӱ߹ۿ| ޾Ʒ2345| ִִˬaëƬѿ| Ƶרһ| ŮƵƵƵҳ| ƷۺרĻѲ | ƬAëƬ| aۺaav| һëƬ| ۺϾƷ㽶þ97| ޹þþþƷС˵| AV˳ۺ|