??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲人成色4444在线观看,亚洲制服丝袜在线播放,亚洲福利中文字幕在线网址 http://www.tkk7.com/huhu/category/1640.htmlHuhu'Blog zh-cn Wed, 28 Feb 2007 07:48:42 GMT Wed, 28 Feb 2007 07:48:42 GMT 60 log4j使用CZQ{载) http://www.tkk7.com/huhu/articles/39568.html似水年 似水年 Thu, 06 Apr 2006 05:32:00 GMT http://www.tkk7.com/huhu/articles/39568.html http://www.tkk7.com/huhu/comments/39568.html http://www.tkk7.com/huhu/articles/39568.html#Feedback 0 http://www.tkk7.com/huhu/comments/commentRss/39568.html http://www.tkk7.com/huhu/services/trackbacks/39568.html log4j使用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 ]]>BeanUtilsLQ{载) http://www.tkk7.com/huhu/articles/39224.html似水年 似水年 Tue, 04 Apr 2006 09:44:00 GMT http://www.tkk7.com/huhu/articles/39224.html http://www.tkk7.com/huhu/comments/39224.html http://www.tkk7.com/huhu/articles/39224.html#Feedback 0 http://www.tkk7.com/huhu/comments/commentRss/39224.html http://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? ]]>[转蝲]?到J2EE -- Java 学习历程 http://www.tkk7.com/huhu/articles/32693.html似水年 似水年 Mon, 27 Feb 2006 08:57:00 GMT http://www.tkk7.com/huhu/articles/32693.html http://www.tkk7.com/huhu/comments/32693.html http://www.tkk7.com/huhu/articles/32693.html#Feedback 0 http://www.tkk7.com/huhu/comments/commentRss/32693.html http://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也有必要一? 暂时写到这里吧. ]]> 变态JAVAE序员面?2?附答? http://www.tkk7.com/huhu/articles/29808.html似水年 似水年 Tue, 07 Feb 2006 06:51:00 GMT http://www.tkk7.com/huhu/articles/29808.html http://www.tkk7.com/huhu/comments/29808.html http://www.tkk7.com/huhu/articles/29808.html#Feedback 0 http://www.tkk7.com/huhu/comments/commentRss/29808.html http://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Ş式要更加安全
]]> 一些开源项?/title> http://www.tkk7.com/huhu/articles/13705.html似水年 似水年 Thu, 22 Sep 2005 01:08:00 GMT http://www.tkk7.com/huhu/articles/13705.html http://www.tkk7.com/huhu/comments/13705.html http://www.tkk7.com/huhu/articles/13705.html#Feedback 0 http://www.tkk7.com/huhu/comments/commentRss/13705.html http://www.tkk7.com/huhu/services/trackbacks/13705.html 阅读全文 ]]> 在J2EE目开发中使用到的一些自己写的基本函?/title> http://www.tkk7.com/huhu/articles/11637.html似水年 似水年 Wed, 31 Aug 2005 06:05:00 GMT http://www.tkk7.com/huhu/articles/11637.html http://www.tkk7.com/huhu/comments/11637.html http://www.tkk7.com/huhu/articles/11637.html#Feedback 0 http://www.tkk7.com/huhu/comments/commentRss/11637.html http://www.tkk7.com/huhu/services/trackbacks/11637.html package jing.tools; import java.util.*; import java.text.*; //日期处理用到的包 import java.util.regex.*; import java.lang.*; /** * <p>Title: 常用基础函数</p> * <p>Description: 以下全部是静态函?lt;/p> * <p>Copyright: Copyright (c) 2005</p> * <p>Company: 静靖工作?lt;/p> * “@deprecated Method Ҏ?is deprecated?在方法的注释里加上此注释Q表C此Ҏ以后版本不再被支持?BR>* 文g注释只能写在import?cd义前才能在javadoc中出现文件的注释 * @author Ƨ朝?QQ:35712069 * @version 1.0 */ public class BaseFunction { public BaseFunction() { } /** * 拼合一l数lؓ字符丌Ӏ?BR> * <B>拆分字串按指定字W分解到一l数l用Stringcȝsplit(String regex)</B> * @param param String[] 数组 * @param spilt String 字符串之单的分离W?BR> * @return String */ public static String arrayToString(String[] param, String spilt) { String rentunstring; StringBuffer tempstr = new StringBuffer(); int len = param.length; for (int i = 0; i < len - 1; i++) { tempstr.append(param); tempstr.append(spilt); } tempstr.append(param[len - 1]); rentunstring = tempstr.toString(); return rentunstring; } /** * 产生在start和end之间的num个随机整敎ͼq回值存在HashMap中?BR> * CZ * HashMap hm=BaseFunction.random(1,100,5); * Set set=hm.keySet(); * Iterator it=set.iterator(); * while(it.hasNext()){ * System.out.println(hm.get(it.next())); * } * @param start int 起始?BR> * @param end int l束?BR> * @param num int 生成个数 * @return HashMap */ public static HashMap random(int start, int end, int num) { HashMap hashMap = new HashMap(); for (int i = 0; i < num; i++) { double sru = Math.random() * end; int tag = Math.round((float) sru); if (tag < start) { i--; } else { hashMap.put(new Integer(i), new Integer(tag)); } } return hashMap; } /** * 获取当前旉Q返回时间格?如果调用参数为true时返回yyyy-MM-dd HH:mm:ss * Q否则ؓfalse时返回yyyy-MM-DD不带日期格式) * @param time boolean * @return String * @throws Exception */ public static String getNowTime(boolean time) throws java.lang.Exception { Date now = new Date(); String format = ""; //yyyy-MM-dd HH:mm:ss:S q月日时分秒毫杪 if (time) { format = "yyyy-MM-dd HH:mm:ss"; } else { format = "yyyy-MM-dd"; } SimpleDateFormat sdf = new SimpleDateFormat(format); String nowtime = sdf.format(now); return nowtime; } /** * HashMap内容转入数组Q?BR> * CZ * HashMap hashMap = new HashMap(); * hashMap.put("ka", "bb"); * hashMap.put("kb", "cc"); * hashMap.put("jk", "fdsaf"); * hashMap.put("ak", "kkkkk"); * Object[] obj = BaseFunction.hashMapToArray(hashMap); * for (int i = 0; i < obj.length; i++) { * System.out.println(obj); * } * @param param HashMap * @return Object[] */ public static Object[] hashMapToArray(HashMap param) { int size = param.size(); if (param == null || param.size() == 0) { return null; } Object[] obj = new Object[size]; Set set = param.keySet(); Iterator ite = set.iterator(); for (int i = 0; ite.hasNext(); i++) { obj = param.get(ite.next()); } return obj; } /** * 日期转字W串 * CZQdateToString(stringToDate("2005-5-2 0:0:10")); * @param date Date * @return String * q回字符串格式ؓ“yyyyqMM月dd?HH时mm分ssU”或“yyyyqMM月dd日?BR> * Ҏ输入的日期是否含有时间来定输出格式 */ public static String dateToString(Date date) { Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("GMT+8"), Locale.CHINA); calendar.clear(); calendar.setTimeInMillis(date.getTime()); String format = ""; /* if (calendar.get(Calendar.MILLISECOND) == 0 && calendar.get(Calendar.SECOND) == 0 && calendar.get(Calendar.SECOND) == calendar.get(Calendar.MINUTE) && calendar.get(Calendar.MINUTE) == calendar.get(Calendar.HOUR)) { format = "yyyy'q?MM'?dd'?"; } else { format = "yyyy'q?MM'?dd'? HH'?mm'?ss'U?"; } */ format = "yyyy'q?MM'?dd'? HH'?mm'?ss'U?"; String return_string = ""; SimpleDateFormat sdf = new SimpleDateFormat(format); //yyyy-MM-dd HH:mm:ss:S q月日时分秒毫杪 return_string = sdf.format(date); return return_string; } /** * 字符串{日期 * CZ:stringToDate("2005-5-2 0:0:10"); * @param str String * 输入字符串日期可用三U格?BR> * yyyy-MM-dd HH:mm:ss完整?BR> * yyyy-MM-dd HH:mm不含U?BR> * yyyy-MM-dd只有日期不含旉 * @return Date * @throws Exception */ public static Date stringToDate(String str) throws Exception { Date return_date = null; String format = ""; if (str.length() > 13) { format = "yyyy-MM-dd HH:mm:ss"; } else if (str.length() > 10) { format = "yyyy-MM-dd HH:mm"; } else { format = "yyyy-MM-dd"; } try { SimpleDateFormat sdf = new SimpleDateFormat(format); return_date = sdf.parse(str); } catch (ParseException e) { throw new Exception( "输入字符串的格式出错(格式为yyyy-MM-dd/yyyy-MM-dd HH:mm/yyyy-MM-dd HH:mm:ss)Q? + e.getMessage()); } return return_date; } /** * q箋产生指定个数的字W串 * @param str String * @param count int * @return String */ public static String continuousMakeString(String str, int count) { StringBuffer sb = new StringBuffer(); for (int i = 0; i < count; i++) { sb.append(str); } return (sb.toString()); } /** * 字W串开头的所有空格替换成指定的字W?BR> * 在JSP中经常用到把字符串开头的n个空格替换成n?amp;nbsp;字符 * 可以用此函数调用CZ * replaceStartsWithSpace(" 中国 湖南 长沙"," ");l果为?amp;nbsp; 中国 湖南 长沙?BR> * @param str String * @param sub String * @return String */ public static String replaceStartsWithSpace(String str, String sub) { String returnStr = ""; String regEx = "\\S"; //非空格字W?BR> Pattern pattern = Pattern.compile(regEx); Matcher matcher = pattern.matcher(str); matcher.find(); int start = matcher.start(); //非空格开始的位置 for (int i = 0; i < start; i++) { returnStr = returnStr + sub; } returnStr = returnStr + str.substring(start); return returnStr; } /** * 查找指定的元素是否存在于元素数组?BR> * 使用Object支持各种对象数组 * CZ * String[] des = {"ada", "ss", "dd","aa"}; * System.out.println(BaseFunction.contains(str, "adfab")); * @param objArray Object[] * @param value Object * @return int 如果查到则返回第一ơ在数组中出现的下标|查不到则q回gؓ-1 */ public static int contains(Object[] objArray, Object value) { int j = -1; for (int i = 0; i < objArray.length; i++) { if (objArray.equals(value)) { //查到则返回下?BR> j = i; break; } } return j; } /** * 字符串数l中是否包含指定的字W串?BR> * @param strings 字符串数l?BR> * @param string 字符?BR> * @param caseSensitive 是否大小写敏?true区分大小?false不区分大写) * @return 包含时返回trueQ否则返回false * @since 0.4 */ public static boolean contains(String[] strings, String string, boolean caseSensitive) { for (int i = 0; i < strings.length; i++) { if (caseSensitive == true) { if (strings.equals(string)) { return true; } } else { if (strings.equalsIgnoreCase(string)) { return true; } } } return false; } /** * 数组拯,使用System.arraycopy()速度更快,把source数据内容拯到destination?BR> * 使用Object则支持多U对象数l?BR> * CZ * String[] des = {"ada", "ss", "dd","aa"}; * String[] src = new String[8]; * BaseFunction.copy(des, src); * @param source Object[] * @param destination Object[] */ public static void copy(Object[] source, Object[] destination) { if (destination == null || source == null) { throw new java.lang.NullPointerException("数组没有初始化!"); } if (destination.length < source.length) { throw new java.lang.ArrayIndexOutOfBoundsException("两数l长度不相等!"); } for (int i = 0; i < source.length; i++) { destination = source; } } /** * 去除数组中的重复元素Q调用示?BR> * String[] src = {"dafdfad", "asdfasdf", "dafdfad", "adfasdf", "dafdfad","dafdfad"}; * Object[] test =BaseFunction.wipeOffRepeat(src); * @param objArray Object[] * @return Object[] */ public static Object[] wipeOffRepeat(Object[] objArray) { Object[] obj = null; ArrayList list = new ArrayList(); for (int i = 0; i < objArray.length; i++) { list.add(objArray); } //去除list中的重复对象 HashSet h = new HashSet(list); list.clear(); list.addAll(h); obj = list.toArray(); return obj; } /** * 四舍五入 * @param param double 要进行四舍五入的?BR> * @param num int 保留的小C?BR> * @return double */ public static double round(double param, int num) { NumberFormat nf = NumberFormat.getNumberInstance(); nf.setMaximumFractionDigits(num); double returndouble = Double.parseDouble(nf.format(param)); return returndouble; } /** * d数做试?BR> * @param args String[] * @throws Exception */ public static void main(String[] args) throws Exception { /* System.out.println(BaseFunction.dateToString(stringToDate( "2005-5-2 0:0:10"))); System.out.println(BaseFunction.getTime(true)); System.out.println(BaseFunction.continuousMakeString(" ", 10)); System.out.println(BaseFunction.replaceStartsSpace( " fadsfas dfsd", " ")); */ /* HashMap hm=BaseFunction.random(1,100,5); Set set=hm.keySet(); Iterator it=set.iterator(); while(it.hasNext()){ System.out.println(hm.get(it.next())); } */ //System.out.println(BaseFunction.replaceStartsWithSpace(" 中国 湖南 长沙"," ")); System.out.println(BaseFunction.round(0.25689,2)); } } ]]> 如何q速成为Java高手 http://www.tkk7.com/huhu/articles/7811.html似水年 似水年 Sat, 16 Jul 2005 02:42:00 GMT http://www.tkk7.com/huhu/articles/7811.html http://www.tkk7.com/huhu/comments/7811.html http://www.tkk7.com/huhu/articles/7811.html#Feedback 0 http://www.tkk7.com/huhu/comments/commentRss/7811.html http://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真是的…?
]]>Dom4j ~码问题d解决 http://www.tkk7.com/huhu/articles/6607.html似水年 似水年 Thu, 23 Jun 2005 09:50:00 GMT http://www.tkk7.com/huhu/articles/6607.html http://www.tkk7.com/huhu/comments/6607.html http://www.tkk7.com/huhu/articles/6607.html#Feedback 0 http://www.tkk7.com/huhu/comments/commentRss/6607.html http://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> ]]> 用JavaE序获取l对路径 http://www.tkk7.com/huhu/articles/5688.html似水年 似水年 Tue, 07 Jun 2005 08:19:00 GMT http://www.tkk7.com/huhu/articles/5688.html http://www.tkk7.com/huhu/comments/5688.html http://www.tkk7.com/huhu/articles/5688.html#Feedback 0 http://www.tkk7.com/huhu/comments/commentRss/5688.html http://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问题全部搞定?
]]>
վ֩ģ壺
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˳ۺ |