Java Home

Java技术修炼中...
posts - 20, comments - 22, trackbacks - 0, articles - 0
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

2006年7月9日

FreeMarker是一个模板引擎,一个基于模板生成文本输出的通用工具,使用纯Java编写

FreeMarker被设计用来生成HTML Web页面,特别是基于MVC模式的应用程序

虽然FreeMarker具有一些编程的能力,但通常由Java程序准备要显示的数据,由FreeMarker生成页面,通过模板显示准备的数据

FreeMarker不是一个Web应用框架,而适合作为Web应用框架一个组件

FreeMarker与容器无关,因为它并不知道HTTP或Servlet;FreeMarker同样可以应用于非Web应用程序环境

FreeMarker更适合作为Model2框架(如Struts)的视图组件,你也可以在模板中使用JSP标记库

FreeMarker是免费的

1、通用目标

能够生成各种文本:HTML、XML、RTF、Java源代码等等

易于嵌入到你的产品中:轻量级;不需要Servlet环境

插件式模板载入器:可以从任何源载入模板,如本地文件、数据库等等

你可以按你所需生成文本:保存到本地文件;作为Email发送;从Web应用程序发送它返回给Web浏览器

2、强大的模板语言

所有常用的指令:include、if/elseif/else、循环结构

在模板中创建和改变变量

几乎在任何地方都可以使用复杂表达式来指定值

命名的宏,可以具有位置参数和嵌套内容

名字空间有助于建立和维护可重用的宏库,或者将一个大工程分成模块,而不必担心名字冲突

输出转换块:在嵌套模板片段生成输出时,转换HTML转义、压缩、语法高亮等等;你可以定义自己的转换

3、通用数据模型

FreeMarker不是直接反射到Java对象,Java对象通过插件式对象封装,以变量方式在模板中显示

你可以使用抽象(接口)方式表示对象(JavaBean、XML文档、SQL查询结果集等等),告诉模板开发者使用方法,使其不受技术细节的打扰

4、为Web准备

在模板语言中内建处理典型Web相关任务(如HTML转义)的结构

能够集成到Model2 Web应用框架中作为JSP的替代

支持JSP标记库

为MVC模式设计:分离可视化设计和应用程序逻辑;分离页面设计员和程序员

5、智能的国际化和本地化

字符集智能化(内部使用UNICODE)

数字格式本地化敏感

日期和时间格式本地化敏感

非US字符集可以用作标识(如变量名)

多种不同语言的相同模板

6、强大的XML处理能力

<#recurse> 和<#visit>指令(2.3版本)用于递归遍历XML树

在模板中清楚和直觉的访问XML对象模型

posted @ 2007-06-19 08:26 Yemoo'S Java Blog 阅读(491) | 评论 (0)编辑 收藏

当jsp程序出现异常时,往往是直接输出到浏览器页面上的,这样以来,可能使最终用户感到不知所措,也可能因为暴露服务器某些信息而导致服务器的安全性问题。在jsp里我们可以通过制定errorPage="xxx"以使当程序出现错误时转向指定的错误页面,但如果前期没有考虑到这个办法而在系统完成后再去这些工作则工作量可能会很大,好在jsp规范提供了一种简单的解决办法,通过在web.xml中设定全局错误处理页面来对整个项目有效,web.xml中对于不同的http返回结果或异常类型可以有不同的处理方式。
在xml中配置如下:
<error-page>
   <error-code>500</error-code>
   <location>error.jsp</location>
</error-page>
<error-page>
   <error-code>404</error-code>
   <location>notfound.jsp</location>
</error-page>

通过以上配置,程序会自动根据错误类型转向不同的错误页面。

posted @ 2007-06-06 15:59 Yemoo'S Java Blog 阅读(1754) | 评论 (0)编辑 收藏

前段时间作了一个简单的系统,其中涉及到后台管理,当然也就遇到了权限验证的问题,由于初次做J2EE项目,所有这些东西懂我来说都是个开始。
对于权限验证,如果程序由目录划分,如管理员访问的页面都放在admin下,这样我们可以写一个权限验证的过滤器,然后配置admin目录都要经过这个过滤器即可。这样对于jsp页面的权限验证比较容易。但对于action(控制器类)就不好控制了,因为action是没有目录概念的,如我们访问action的地址为:http://xxx/sample/ac1.action,同时如果使用http://xxx/sample/xx/xx/ac1.action同样可以访问,这是因为只要在这个项目目录下,访问的页面如果为action则struts就会去查询这个action名字对应的类,而不管前面的目录结构。因此我们不能再用过滤器对管理员部分的action进行验证。经过查看struts2的相关资料发现了拦截器这个有用的东西。通过struts2的配置文件的包管理功能和拦截器可以轻松的对指定的action做管理(拦截),如
===================================================
<package name="user" extends="struts-default">
  <!-- 前台用户操作部分 -->
  <!-- 框架页,显示分类 -->
  <action name="queryCateForwardUI"
   class="com.topsoft.bookmanage.web.action.QueryCateForwardActionUI">
   <result>/mainPage.jsp</result>
  </action>
    。。。。。
</package>
<!-- 管理员操作部分 -->
 <package name="manager" extends="struts-default">
  <!-- 拦截器 -->
  <interceptors>
   <interceptor name="auth" class="com.topsoft.common.LogonInterceptor" />
   <interceptor-stack name="authStack"> 
                <interceptor-ref name="auth"/> 
                <interceptor-ref name="paramsPrepareParamsStack"/> 
            </interceptor-stack> 
  </interceptors>
  <!-- 默认执行的拦截器 -->
  <default-interceptor-ref name="authStack"/>
  <!-- 全局Action映射 -->
  <global-results>
   <result name="login" type="redirect">/managerLoginUI.action</result>
  </global-results>
  
  <!-- 后台管理首页面UI -->
  <action name="managerIndexUI"
   class="com.topsoft.bookmanage.web.action.ManagerIndexActionUI">
   <result>/admin/index.jsp</result>
  </action>
 。。。。。。
</package>
=================================================

通过使用拦截器+过滤器可以完美解决权限验证的问题。

posted @ 2007-06-06 15:17 Yemoo'S Java Blog 阅读(4966) | 评论 (6)编辑 收藏

struts.action.extension
          The URL extension to use to determine if the request is meant for a Struts action
           用URL扩展名来确定是否这个请求是被用作Struts action,其实也就是设置 action的后缀,例如login.do的'do'字。

struts.configuration
          The org.apache.struts2.config.Configuration implementation class
            org.apache.struts2.config.Configuration接口名

struts.configuration.files
          A list of configuration files automatically loaded by Struts
           struts自动加载的一个配置文件列表

struts.configuration.xml.reload
          Whether to reload the XML configuration or not
           是否加载xml配置(true,false)

struts.continuations.package
           The package containing actions that use Rife continuations
           含有actions的完整连续的package名称

struts.custom.i18n.resources
          Location of additional localization properties files to load
           加载附加的国际化属性文件(不包含.properties后缀)

struts.custom.properties
          Location of additional configuration properties files to load
           加载附加的配置文件的位置


struts.devMode
          Whether Struts is in development mode or not
           是否为struts开发模式

struts.dispatcher.parametersWorkaround
          Whether to use a Servlet request parameter workaround necessary for some versions of WebLogic
            (某些版本的weblogic专用)是否使用一个servlet请求参数工作区(PARAMETERSWORKAROUND)

struts.enable.DynamicMethodInvocation
          Allows one to disable dynamic method invocation from the URL
            允许动态方法调用

struts.freemarker.manager.classname
          The org.apache.struts2.views.freemarker.FreemarkerManager implementation class
           org.apache.struts2.views.freemarker.FreemarkerManager接口名

struts.i18n.encoding
          The encoding to use for localization messages
           国际化信息内码

struts.i18n.reload
          Whether the localization messages should automatically be reloaded
           是否国际化信息自动加载

struts.locale
          The default locale for the Struts application
           默认的国际化地区信息

struts.mapper.class
          The org.apache.struts2.dispatcher.mapper.ActionMapper implementation class
            org.apache.struts2.dispatcher.mapper.ActionMapper接口

struts.multipart.maxSize
          The maximize size of a multipart request (file upload)
           multipart请求信息的最大尺寸(文件上传用)

struts.multipart.parser
          The org.apache.struts2.dispatcher.multipart.MultiPartRequest parser implementation for a multipart request (file upload)
          专为multipart请求信息使用的org.apache.struts2.dispatcher.multipart.MultiPartRequest解析器接口(文件上传用)


struts.multipart.saveDir
          The directory to use for storing uploaded files
           设置存储上传文件的目录夹

struts.objectFactory
          The com.opensymphony.xwork2.ObjectFactory implementation class
           com.opensymphony.xwork2.ObjectFactory接口(spring)

struts.objectFactory.spring.autoWire
          Whether Spring should autoWire or not
           是否自动绑定Spring

struts.objectFactory.spring.useClassCache
          Whether Spring should use its class cache or not
           是否spring应该使用自身的cache

struts.objectTypeDeterminer
          The com.opensymphony.xwork2.util.ObjectTypeDeterminer implementation class
            com.opensymphony.xwork2.util.ObjectTypeDeterminer接口

struts.serve.static.browserCache
          If static content served by the Struts filter should set browser caching header properties or not
           是否struts过滤器中提供的静态内容应该被浏览器缓存在头部属性中

struts.serve.static
          Whether the Struts filter should serve static content or not
           是否struts过滤器应该提供静态内容

struts.tag.altSyntax
          Whether to use the alterative syntax for the tags or not
           是否可以用替代的语法替代tags

struts.ui.templateDir
          The directory containing UI templates
           UI templates的目录夹

struts.ui.theme
          The default UI template theme
           默认的UI template主题

struts.url.http.port
          The HTTP port used by Struts URLs
           设置http端口

struts.url.https.port
          The HTTPS port used by Struts URLs
           设置https端口

struts.url.includeParams
          The default includeParams method to generate Struts URLs
          在url中产生 默认的includeParams


struts.velocity.configfile
          The Velocity configuration file path
           velocity配置文件路径

struts.velocity.contexts
          List of Velocity context names
           velocity的context列表


struts.velocity.manager.classname
          org.apache.struts2.views.velocity.VelocityManager implementation class
           org.apache.struts2.views.velocity.VelocityManager接口名

struts.velocity.toolboxlocation
          The location of the Velocity toolbox
           velocity工具盒的位置
struts.xslt.nocache
          Whether or not XSLT templates should not be cached
           是否XSLT模版应该被缓存

posted @ 2007-05-20 19:05 Yemoo'S Java Blog 阅读(536) | 评论 (0)编辑 收藏

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">

<beans>

  建立一个数据源
 <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
  <property name="driverClassName">
   <value>com.microsoft.jdbc.sqlserver.SQLServerDriver</value>
  </property>
  <property name="url">
   <value>jdbc:microsoft:sqlserver://192.168.0.6:1433</value>
  </property>
  <property name="username">
   <value>sa</value>
  </property>
  <property name="password">
   <value></value>
  </property>
 </bean>

  建立会话工厂类,这个类使用spring专门为hibernate3提供LocalSessionFactoryBean
 
 <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
  <property name="dataSource">
   <ref local="dataSource" />  --引用上面的数据源
  </property>
  <property name="mappingResources">  --调入映射文档
   <list>
    <value>com/yourcompany/User.hbm.xml</value> 
   </list>
  </property>
  <property name="hibernateProperties">  --相关设置
   <props>
    <prop key="hibernate.dialect">org.hibernate.dialect.SQLServerDialect</prop>
    <prop key="hibernate.show_sql">true</prop>
   </props>
  </property>
 </bean>
  

    定义事务管理器,这个也是 spring专门为hibernate3提供的HibernateTransactionManager 事务管理器
 <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
  <property name="sessionFactory">
   <ref local="sessionFactory" />   --引用会话工厂类
  </property>
 </bean>

 定义实体DAO
 <bean id="userDAO" class="com.yourcompany.UserDAOImp">
  <property name="sessionFactory">
   <ref local="sessionFactory" />--引用会话工厂类
  </property>
 </bean>
 

 为上面的实体DAO定义一个代理(proxy)类,这是spring为解决事务问题而提供TransactionProxyFactoryBean动态事务代理类
 <bean id="userDAOProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
  <property name="transactionManager">
   <ref bean="transactionManager" />  --指定事务管理器(需要是spring专用的)
  </property>
  <property name="target"> --目标实体DAO类
   <ref local="userDAO" />
  </property>
  <property name="transactionAttributes"> --定义要使用事务的方法
   <props>
    <prop key="insert*">PROPAGATION_REQUIRED</prop>  --所有insert开头的方法都使用事务,出错要回滚
    <prop key="get*">PROPAGATION_REQUIRED,readOnly</prop> --所有get开头的方法都使用只读事务
    <prop key="is*">PROPAGATION_REQUIRED,readOnly</prop>--所有ist开头的方法都使用只读事务
   </props>
  </property>
 </bean>

  为 path="/login" 的struts action 定义实际的action类,该action 已经进行 type="org.springframework.web.struts.DelegatingActionProxy"设置
  <bean name="/login" class="com.yourcompany.struts.action.LoginAction" singleton="false">
    <property name="userDAO">
    <ref bean="userDAOProxy" />  --注意,这里指定的userDAO是上面定义的代理类
  </property>
 </bean>
</beans> 

posted on 2006-12-05 15:40 kelven 阅读(1

posted @ 2007-05-15 08:21 Yemoo'S Java Blog 阅读(410) | 评论 (0)编辑 收藏

今天把jdk从1.6.0卸载后又安装了1.5.04,然后发现netbeans无法启动,提示“Cannot find java.exe...”,在网上看到很多人说要修改环境变量,但是偶的环境变量在安装完jdk后就配置好了,没有问题。
于是又费了老半天的力气,终于解决了,办法如下:
1,启动jdk时 --jdkhome参数指出jdk路径
2,修改netbean目录下的/etc目录下的netbeans.conf中的jdkhome的值为当前jdk路径

使用上面方法中之一即可!

posted @ 2007-03-11 16:54 Yemoo'S Java Blog 阅读(4410) | 评论 (0)编辑 收藏

/**
 *Description:greatest common divisor
 *Author:yemoo 2006.12.06
 
*/

 
public   class  Pt32{
    
// 思路:辗转相除法
      int  divisor1( int  m, int  n){     // 方法一:循环法
          int  temp;
         
if (m < n){     // if m<n,swap m,n
             temp = m;
             m
= n;
             n
= temp;
         }
         
while (m % n != 0 ){
             temp
= n;
             n
= m % n;
             m
= temp;
         }
         
return  n;
     }

     
int  divisor2( int  m, int  n){     // 方法二:递归法
          int  temp;
         
if (m < n){
             temp
= m;
             m
= n;
             n
= temp;
         }
         
return  divisor22(m,n);
     }

    
int  divisor22( int  m, int  n){
        
if (m % n == 0 ){
            
return  n;
        }
else {
            
return  divisor22(n,m % n);
        }
    }

     
public   static   void  main(String args[]){
         KeyboardInput in
= new  KeyboardInput();
         Pt32 obj
= new  Pt32();
         System.out.println(
" input two integer: " );
         
int  a = in.readInt();
         
int  b = in.readInt();
         System.out.println(a
+ " , " + b + " 's greatest common divisor is  " + obj.divisor2(a,b));
     }

 }

使用了辗转相除法,分别使用循环和递归方法实现。

吸取dreamstone大哥的程序写法,发现判断m、n大小的部分可以删除,因为如果m<n求余部分会自动交换两个变量。

改进后程序代码(精简了好多哦):
/**
 *Description:greatest common divisor
 *Author:yemoo 2006.12.07 
*/

 
public class Pt32{
    
//思路:辗转相除法
     int divisor1(int m,int n){    //方法一:循环法
         int temp;
         
while(m%n!=0){
             temp
=n;
             n
=m%n;
             m
=temp;
         }
         
return n;
     }

     
int divisor2(int m,int n){    //方法二:递归法
         if(m%n==0){
            
return n;
        }
else{
            
return divisor2(n,m%n);
        }
     }

     
public static void main(String args[]){
         KeyboardInput in
=new KeyboardInput();
         Pt32 obj
=new Pt32();
         System.out.println(
"input two integer:");
         
int a=in.readInt();
         
int b=in.readInt();
         System.out.println(a
+","+b+"'s greatest common divisor is "+obj.divisor2(a,b));
     }

 }

posted @ 2006-12-07 01:02 Yemoo'S Java Blog 阅读(7749) | 评论 (4)编辑 收藏

游戏产业的快速发展,带动了游戏人才需求的大幅攀升。昨日,北京一家游戏学院在武汉举行首期培训班,专门培养游戏人才。

  据介绍,目前中国的网络游戏玩家已经达到2633万人。中国出版工作者协会游戏工作委员会提供的数字表明,2004年,中国的网络游戏仅销售收入已经上涨47.9%,达到24.7亿元,并且该数字在2009年有望达到109.6亿元。

  而据专家预测,2006年中国网络游戏市场将达93亿元,中国手机游戏市场规模将达5亿元。游戏行业的井喷式发展,引发了游戏专业人才的极度匮乏。游戏研发人才匮乏,特别是中高级人才奇缺的情况,已成为严重制约产业持续发展的“瓶颈”。

  中华英才网近日公布的一项统计表明,从目前人才市场需求看,10类游戏人才最受企业欢迎,分别为:游戏美术设计师(2D/3D)、网游&#8226;客服、3D游戏设计高级讲师、手机游戏设计高级讲师、在线网络游戏设计高级讲师、手机游戏开发工程师、网络游戏开发工程师、J2ME游戏软件工程师、游戏策划师、片区渠道经理。

  职业指导师指出,游戏人才将会成为就业市场下一个新的亮点。

posted @ 2006-12-05 20:44 Yemoo'S Java Blog 阅读(394) | 评论 (0)编辑 收藏

中国有很多精于编码的人,但是中国软件行业,尤其是网络应用开发方面误区很大,很难形成有规模的软件开发力量和产品能力,不但比美国差距甚远,和印度相比也是颇有不如。这些问题不是在于中国程序员的智商和工作努力状况,也不是在于国家和民间对开发的投入程度,而是很大程度上,有一些对技术,对程序开发,对项目设计方面的思想误区,这些误区,导致了软件行业的产品化能力不足,缺乏规模化和大型复用系统研发能力,可以说,改变认识误区,是解决软件行业小作坊模式和个体英雄模式所带来的局限性的重要工作。


程序员是一种技术工作,在IT的发展中有相当重要的地位,从底层硬件通讯协议的建立,到数据传输层的处理,到操作系统的建设,到数据库平台的建设,一直到应用层上各种数据营销平台的搭建,程序员在里面都扮演着举足轻重的角色并为IT事业的发展做出了巨大的贡献。

中国有很多小朋友,他们18,9岁或21,2岁,通过自学也写了不少代码,他们有的代码写的很漂亮,一些技术细节相当出众,也很有钻研精神,但是他们被一些错误的认识和观点左右,缺乏对系统,对程序的整体理解能力,这些人,一个网上的朋友说得很好,他们实际上只是一些Codingfans,压根没有资格称为程序员,但是据我所知,不少小网络公司的CTO就是这样的codingfans,拿着吓人的工资,做着吓人的项目,项目的结局通常也很吓人。
程序员基本素质:

作一个真正合格的程序员,或者说就是可以真正合格完成一些代码工作的程序员,应该具有的素质。

1:团队精神和协作能力
把它作为基本素质,并不是不重要,恰恰相反,这是程序员应该具备的最基本的,也是最重要的安身立命之本。把高水平程序员说成独行侠的都是在呓语,任何个人的力量都是有限的,即便如linus这样的天才,也需要通过组成强大的团队来创造奇迹,那些遍布全球的为linux写核心的高手们,没有协作精神是不可想象的。独行侠可以作一些赚钱的小软件发点小财,但是一旦进入一些大系统的研发团队,进入商业化和产品化的开发任务,缺乏这种素质的人就完全不合格了。

2:文档习惯
说高水平程序员从来不写文档的肯定是乳臭未干的毛孩子,良好的文档是正规研发流程中非常重要的环节,作为代码程序员,30%的工作时间写技术文档是很正常的,而作为高级程序员和系统分析员,这个比例还要高很多。缺乏文档,一个软件系统就缺乏生命力,在未来的查错,升级以及模块的复用时就都会遇到极大的麻烦。

3:规范化,标准化的代码编写习惯
作为一些外国知名软件公司的规矩,代码的变量命名,代码内注释格式,甚至嵌套中行缩进的长度和函数间的空行数字都有明确规定,良好的编写习惯,不但有助于代码的移植和纠错,也有助于不同技术人员之间的协作。
有些codingfans叫嚣高水平程序员写的代码旁人从来看不懂,这种叫嚣只能证明他们自己压根不配自称程序员。代码具有良好的可读性,是程序员基本的素质需求。
再看看整个linux的搭建,没有规范化和标准化的代码习惯,全球的研发协作是绝对不可想象的。
4:需求理解能力
程序员需要理解一个模块的需求,很多小朋友写程序往往只关注一个功能需求,他们把性能指标全部归结到硬件,操作系统和开发环境上,而忽视了本身代码的性能考虑,有人曾经放言说写一个广告交换程序很简单,这种人从来不知道在百万甚至千万数量级的访问情况下的性能指标是如何实现的,对于这样的程序员,你给他深蓝那套系统,他也做不出太极链的并访能力。性能需求指标中,稳定性,并访支撑能力以及安全性都很重要,作为程序员需要评估该模块在系统运营中所处的环境,将要受到的负荷压力以及各种潜在的危险和恶意攻击的可能性。就这一点,一个成熟的程序员至少需要2到3年的项目研发和跟踪经验才有可能有心得。

5:复用性,模块化思维能力
经常可以听到一些程序员有这样的抱怨,写了几年程序,变成了熟练工,每天都是重复写一些没有任何新意的代码,这其实是中国软件人才最大浪费的地方,一些重复性工作变成了熟练程序员的主要工作,而这些,其实是完全可以避免的。
复用性设计,模块化思维就是要程序员在完成任何一个功能模块或函数的时候,要多想一些,不要局限在完成当前任务的简单思路上,想想看该模块是否可以脱离这个系统存在,是否可以通过简单的修改参数的方式在其他系统和应用环境下直接引用,这样就能极大避免重复性的开发工作,如果一个软件研发单位和工作组能够在每一次研发过程中都考虑到这些问题,那么程序员就不会在重复性的工作中耽误太多时间,就会有更多时间和精力投入到创新的代码工作中去。
一些好的程序模块代码,即便是70年代写成的,拿到现在放到一些系统里面作为功能模块都能适合的很好,而现在我看到的是,很多小公司软件一升级或改进就动辄全部代码重写,大部分重复性工作无谓的浪费了时间和精力。

6:测试习惯
作为一些商业化正规化的开发而言,专职的测试工程师是不可少的,但是并不是说有了专职的测试工程师程序员就可以不进行自测;软件研发作为一项工程而言,一个很重要的特点就是问题发现的越早,解决的代价就越低,程序员在每段代码,每个子模块完成后进行认真的测试,就可以尽量将一些潜在的问题最早的发现和解决,这样对整体系统建设的效率和可靠性就有了最大的保证。
测试工作实际上需要考虑两方面,一方面是正常调用的测试,也就是看程序是否能在正常调用下完成基本功能,这是最基本的测试职责,可惜在很多公司这成了唯一的测试任务,实际上还差的远那;第二方面就是异常调用的测试,比如高压力负荷下的稳定性测试,用户潜在的异常输入情况下的测试,整体系统局部故障情况下该模块受影响状况的测试,频发的异常请求阻塞资源时的模块稳定测试等等。当然并不是程序员要对自己的每段代码都需要进行这种完整测试,但是程序员必须清醒认识自己的代码任务在整体项目中的地位和各种性能需求,有针对性的进行相关测试,并尽早发现和解决问题,当然这需要上面提到的需求理解能力。

7:学习和总结的能力
程序员是人才很容易被淘汰,很容易落伍的职业,因为一种技术可能仅仅在三两年内具有领先性,程序员如果想安身立命,就必须不断跟进新的技术,学习新的技能。
善于学习,对于任何职业而言,都是前进所必需的动力,对于程序员,这种要求就更加高了。但是学习也要找对目标,一些小codingfans们,他们也津津乐道于他们的学习能力,一会学会了asp,一会儿学会了php,一会儿学会了jsp,他们把这个作为炫耀的资本,盲目的追逐一些肤浅的,表面的东西和名词,做网络程序不懂通讯传输协议,做应用程序不懂中断向量处理,这样的技术人员,不管掌握了多少所谓的新语言,永远不会有质的提高。
善于总结,也是学习能力的一种体现,每次完成一个研发任务,完成一段代码,都应当有目的的跟踪该程序的应用状况和用户反馈,随时总结,找到自己的不足,这样逐步提高,一个程序员才可能成长起来。
一个不具备成长性的程序员,即便眼前看是个高手,建议也不要选用,因为他落伍的时候马上就到了。
具备以上全部素质的人,应当说是够格的程序员了,请注意以上的各种素质都不是由IQ决定的,也不是大学某些课本里可以学习到的,需要的仅仅是程序员对自己工作的认识,是一种意识上的问题。

posted @ 2006-12-05 20:37 Yemoo'S Java Blog 阅读(321) | 评论 (0)编辑 收藏

/**
 *Description:convert Oct to Dec
 *Author:yemoo 2006.12.05
 
*/

 
public   class  P38{
     
int  convertOct2Dec(String Oct){
         
int  result = 0 ;
         
int  power = 1 ;
         
for ( int  i = Oct.length() - 1 ;i >= 0 ;i -- ,power *= 8 ){
             
char  temp = Oct.charAt(i);
             
int  intTemp = Character.getNumericValue(temp);
             
if (intTemp >= 0 && intTemp < 8 ){
                 result
+= intTemp * power;
             }
else {
                 
if (temp == ' - ' && i == 0 ){
                     result
=- result;
                 }
else {
                     
return  result;
                 }
             }
         }
         
return  result;
     }

     String readInput(){
         KeyboardInput in
= new  KeyboardInput();
         System.out.print(
" Please input a october number: " );
         
return  in.readString();
     }

     
public   static   void  main(String args[]){
         P38 obj
= new  P38();
         String oct
= obj.readInput();
         
int  value = obj.convertOct2Dec(oct);
         System.out.println(
" Oct: " + oct + " ==Dec: " + value);
     }
 }

posted @ 2006-12-05 11:34 Yemoo'S Java Blog 阅读(2026) | 评论 (0)编辑 收藏

今天参考课本写了一个关于二进制与十进制转换的程序,程序算法不难,但写完后测试发现不论是二转十还是十转二,对于大于21亿即超过整数范围的数不能很好的转换。都会变成0.
参考书籍发现使用使用BigInteger可以解决这个问题。
于是查找了下JDK,然后测试几次终于写成功了!
使用心得如下:

1,BigInteger属于java.math.BigInteger,因此在每次使用前都要import 这个类。偶开始就忘记import了,于是总提示找不到提示符。

2,其构造方法有很多,但现在偶用到的有:
BigInteger(String val)
          将 BigInteger 的十进制字符串表示形式转换为 BigInteger。
BigInteger(String val, int radix)
          将指定基数的 BigInteger 的字符串表示形式转换为 BigInteger。
如要将int型的2转换为BigInteger型,要写为BigInteger two=new BigInteger("2"); //注意2双引号不能省略

3,BigInteger类模拟了所有的int型数学操作,如add()==“+”,divide()==“-”等,但注意其内容进行数学运算时不能直接使用数学运算符进行运算,必须使用其内部方法。而且其操作数也必须为BigInteger型。
如:two.add(2)就是一种错误的操作,因为2没有变为BigInteger型。

4,当要把计算结果输出时应该使用.toString方法将其转换为10进制的字符串,详细说明如下:
 StringtoString()
          返回此 BigInteger 的十进制字符串表示形式。
输出方法:System.out.print(two.toString());

5,另外说明三个个用到的函数。   
 BigIntegerremainder(BigInteger val)
          返回其值为 (this % val) 的 BigInteger。
 BigIntegernegate()
          返回其值是 (-this) 的 BigInteger。
 int       compareTo(BigInteger val)
          将此 BigInteger 与指定的 BigInteger 进行比较。
remainder用来求余数。
negate将操作数变为相反数。
compare的详解如下:

compareTo

public int compareTo(BigInteger val)
将此 BigInteger 与指定的 BigInteger 进行比较。对于针对六个布尔比较运算符 (<, ==, >, >=, !=, <=) 中的每一个运算符的各个方法,优先提供此方法。执行这些比较的建议语句是:(x.compareTo(y) <op> 0),其中 <op> 是六个比较运算符之一。

指定者:
接口 Comparable<BigInteger> 中的 compareTo
参数:
val - 将此 BigInteger 与之比较的 BigInteger。
返回:
当此 BigInteger 在数值上小于、等于或大于 val 时,返回 -1,0,或 1。

posted @ 2006-12-05 10:20 Yemoo'S Java Blog 阅读(16425) | 评论 (4)编辑 收藏

    前些时间总是感到迷茫,不知道该学什么,也许是快要毕业的原因吧,我也开始盲目的学习开了,看到社会招聘这个那个,于是乎就什么都想一股脑学完,JAVA,JSP,PHP,JS,ASP.NET.Wap.....结果可想而知,如此只能是什么也学不成,痛惜过去,现在偶完全确定了今后的学习方向---JAVA-->J2EE/ORACLE.
    从今天偶会经常到这里来写下偶的学习心的,痛补以前的过失。各位监视偶啊!
    这里将见证偶从菜鸟变成老鸟的历史过程!
    偶的目标---第一流的JAVA程序员!!!--(人首先要自信,坚定信念,才能成功!)

posted @ 2006-12-05 09:39 Yemoo'S Java Blog 阅读(1097) | 评论 (3)编辑 收藏

这两天看了java面向对象编程部分得内容,感觉有不少需要注意得地方:
重要知识点总结如下:
1,抽象,封装,继承,多态是面向对象程序设计中得四个特点.
2,面向对象得软件开发大体分为:面向对象的分析,面向对象的设计,面向对象的实现.
   可概括为如下过程:分析用户需求,从问题中抽取对象模型;细化模型,设计类,包括类的属性和类间的
   相互关系,同时观察是否有可以直接引用的已有类或部件;选定一种面向对象的编程语言,具体编码实现
  上一阶段类的设计,并在开发过程中引入测试,完善整个解决方案.
3,面向对象程序设计方法的优点是:可重用性,可扩展性,可管理性.
4,类的定义:class前的修饰符分为访问控制符和非访问控制符两大类.访问控制符包括public和private.
   非访问控制符包括abstract(抽象),final(最终).
5,final类是最终类,是不能有子类的类.abstract和final不能同时修饰一个类,因为抽象类本身没有具体对象,
    需要派生出子类后在创建子类的对象.而最终类不可能有子类.
6,创建对象的格式为: 类名 对象名=new 构造方法(参数);注意前面是类名后面是构造方法.
    注意构造方法没有返回类型,也不能写void,主要用于完成类对象的初始化工作,一般不能直接由编程
    直接调用,而是用new运算符来调用.
7,如果class前面由public修饰符,则默认构造方法的前面也应该有public修饰符.
8,类中有static修饰的域或方法,可用类名或对象名访问,否则只能用对象名访问.
9,修饰域的访问控制符可以是:public,private,protected,private protected.非访问控制符可以是:
    static,final,volatile(易失域)
10,类变量的最本质的特点是:他们是类的域,不属于任何一个类的具体对象实例.不是保存在某个对象实例的内存空间中,而是保存在类的内存区域的公共存储单元中.
11,局部变量是在方法体内声明的,只有当方法被调用时他们才存在,因而只能在本方法内使用,不存在访问控制符,也不能声明为静态变量(static),但可以声明为final变量.局部变量必须初始化.
12,修饰方法的访问控制符可以是:public,private,protected,private protected,修饰方法的非访问控制符可以是:static,final,abstract,native(本地方法),synchronized(同步方法)。
13,用static修饰的变量或方法都为类成员,类成员可以用类名或实例名访问,实例成员只能用实例名来访问。
14,如果一个类中含有抽象方法,则此类必须为抽象类,如果抽象类的子类不为抽象类,则子类必须实现父类的所有抽象方法。抽象方法不能用静态方法和最终方法。抽想方法只有函数头的声明,而用分号来替代方法体,没有大括号。如abstract void abstractmethod();
15,this变量用在一个方法的内部,指向当前
对象,当前对象指的是调用当前正在执行的方法的那个对象。super变量是直接指向父类的构造方法,用来引用父类种的变量和方法。(由于他们指的是对象,所以不能通过它来引用类变量和类方法)
16,如果要引用一个包中的多个类,可以用星号来代替。使用星号只能表示本层次的所有类,而不包括子层次下的类。所以经常需要用两条语句来引入两个层次的类:import java.awt.*;import java.awt.event.*;
17,访问修饰符:
--类中限定为public的成员可以被所有的类访问。
--类中先定位private的成员只能被这个类本身访问。同一个类的不同对象可以访问对方的private域变量或调用对方的域方法,这是因为访问保护控制在类的级别上,而不是对象的级别上。
--类中限定为protected的成员可以被这个类本身,它的子类(包括同一个包中和不同包中的子类),以及同一个包中的其他类访问。
--用private protected修饰的成员可以被该类本身访问,也可以被该类的所有子类访问。
--默认访问控制符规定只能被同一个包中的类访问和引用,而不能被其他包的类访问。即他的访问权限是friendly。
18,注意:
----abstract和private,static,final,native不能并列修饰同一个方法。
----abstract类中不能有private修饰的域和方法
----static方法不能处理非static的域。
19,重载方法的参数必须不同,或者是参数个数不同,或者是参数类型不同。重载的多个方法必须返回
相同的数据类型。
20,在java中,一个类获取某一接口定义的功能并不是通过直接继承这个接口的属性和方法来实现的。因为接口中的属性都是常量,接口的方法都是没有方法体的抽象方法,没有具体定义操作。

posted @ 2006-07-22 23:55 Yemoo'S Java Blog 阅读(364) | 评论 (0)编辑 收藏

java支持在命令行下后面直接跟参数:类似 程序名称 参数1 [参数2] ....
对于此类的程序,要注意的问题就是判断后面参数个数和类型是否合法.如果程序需要的参数个数至少是两个,当程序并没有对参数长度进行判断时如果用户值输入一个参数,则程序运行会返回错误!因此应该加以判断:方法如下:
if(args.length<2){
   System.out.println("Usage: String1 String2");
   System.exit(0);
}else{
   ........
}

posted @ 2006-07-21 22:08 Yemoo'S Java Blog 阅读(502) | 评论 (0)编辑 收藏

通过做本章最后得习题,发现如下问题需要偶以后注意:
1,注意用户输入数据得合法性.
   如需要输入一个正整数才有效,如果对用户输入不加判断,当用户输入一个负数时则会产生错误得结果.因此应该进行简单的判断.
int n=0;
   while(n<1)
         n=读取用户输入的值
这样即可保证用户输入得时一个正整数.
2,图形界面中setText()得内容必须时字符串型,因此在输出一个数字型时应该将其转换成字符串型.
  用Integer.toString(),Double.toString()方法即可.
  例,int x=1;aa.setText(Integer.toString(x));
3,图形界面中捕获哪个按钮被按下得方法.
  当存在多个button按钮时,我们都用actionListener(this)来监听.那么如何判断用户点击了哪个按钮呢?
  
用getSource()方法
 
例:btn1.addActionListener(this);btn2.addActionListener(this);
      public void actionPerformed(ActionEvent e){
            if(e.getSource()==btn1)
                  //do anything
            else if(e.getSource==btn2)
                 //do other things
      }

posted @ 2006-07-21 18:56 Yemoo'S Java Blog 阅读(326) | 评论 (0)编辑 收藏

java数组对象有一个很重要的方法getChars();其方法描述为:

public void getChars(int srcBegin,int srcEnd,char dst[],int dstBegin);  将当前字符串的部分字符复制到目标自负数组dst中,从srcBegin(包含在内)到srcEnd(不包含在内)之间的字符复制到目标字符数组中的字符从dstBegin位置开始存放.

使用实例:
String ss="Visual Basic";
char dst[]={'a','b','c','d'};

ss.getChars(
4,6,dst,2);
System.out.println(dst);
输出结果为abal;

注意数组参数只要写入数组名即可,不要带[],输出可以直接用数组名输出全部内容.

posted @ 2006-07-12 10:41 Yemoo'S Java Blog 阅读(3097) | 评论 (2)编辑 收藏

今天看了书本上的杨归三角程序写法后,自己试着去写,但写完后编译总是出现一个错误.
先看代码:
 1 public class YangHui{
 2     public static void main(String args[]){
 3         final int max=10;
 4         int a[][]=new int[max][];
 5         for(int i=0;i<a.length;i++){
 6             int a[i]=new int[i+1];
 7         }
 8         a[0][0]=1;
 9         for(int i=1;i<a.length;i++){
10             a[i][0]=1;
11             a[i][a[i].length-1]=1;
12             for(int j=1;j<a[i-1].length;j++){
13                 a[i][j]=a[i-1][j-1]+a[i-1][j];
14             }
15         }
16         
17         for(int i=0;i<a.length;i++){
18             for(int j=0;j<a[i].length;j++)
19                 System.out.print(a[i][j]+"\t");
20             System.out.println();
21         }
22     }
23 }

JCreator返回如下错误信息:
--------------------------------------------------
D:\Java\JCreator\YangHui.java:6: 需要 ']'
            int a[i]=new int[i+1];
                  ^
1 错误

处理已完成。
---------------------------------------------------
开始怎么都看不出第六行有什么错误,郁闷半天之后看了课本,发现原来多了一个int.突然醒悟这个数组已经在前面声明过了,在这里写int不是重复声明吗?......真是太粗心了,不过给偶一个深刻的教训,一定注意不要范重复声明数组的错误.
删掉int之后编译通过,正确的程序是这样的:

public class YangHui{
    
public static void main(String args[]){
        
final int max=10;
        
int a[][]=new int[max][];
        
for(int i=0;i<a.length;i++){
            a[i]
=new int[i+1];
        }
        a[
0][0]=1;
        
for(int i=1;i<a.length;i++){
            a[i][
0]=1;
            a[i][a[i].length
-1]=1;
            
for(int j=1;j<a[i-1].length;j++){
                a[i][j]
=a[i-1][j-1]+a[i-1][j];
            }
        }
        
        
for(int i=0;i<a.length;i++){
            
for(int j=0;j<a[i].length;j++)
                System.out.print(a[i][j]
+"\t");
            System.out.println();
        }
    }
}


 

posted @ 2006-07-12 01:04 Yemoo'S Java Blog 阅读(345) | 评论 (0)编辑 收藏

这算是一个很简单的程序,但还是值得我这样的初学者去总结一下,毕竟applet不同于application程序:
import java.applet.*;
import java.awt.*;
import java.awt.event.*;

public class LeapyearTest extends Applet implements ActionListener{
    Label result;   
//定义一个输出结果的标签对象
    TextField t1;   //定义一个用于输入年份的文本框
    Button btn; //定义一个button对象
    
    
int year;
    
boolean leap;
    
    
public void init(){
        result
=new Label("请输入要判断的年份:");
        t1
=new TextField(5);
        btn
=new Button("判断");
        
        add(t1);
        add(btn);
        add(result);
        
        btn.addActionListener(
this);    //为按钮注册事件,事件的监听者为当前类的对象this
    }
    
    
public void actionPerformed(ActionEvent e){
        year
=Integer.parseInt(t1.getText());
        
        
if((year%4==0)&&(year%100!=0)){
            leap
=true;
        }
else if(year%400==0){
            leap
=true;
        }
else{
            leap
=false;
        }
        
        
if(leap==true){
            result.setText(
"你输入的年份为闰年!");
        }
else{
            result.setText(
"你输入的年份不是闰年!");
        }
        
        t1.setText(
"");
    }
}

这里有几点需要说明的:
1,applet程序必须引入java.applet.*;
2,使用文本框,按钮等控件需要引入java.awt.*;
3,有事件发生则要引入java.awt.event.*;
4,在类名后加上extends Applet Implements ActionListener
5,添加事件后,当事件被激活后会自动调用actionPerformed函数执行.因此应该为事件写该函数.

posted @ 2006-07-09 23:49 Yemoo'S Java Blog 阅读(1806) | 评论 (2)编辑 收藏

偶是一个java初学者,看了树上一个简单例子,然后自己试着写了下,却发现了很多问题....
例子是一个判断用户输入字母是大写还是小写的.
偶开始这样写:

import  java.io. * ;

public   class  UpLow{
    
public   static   void  main(String args[])  {
        C
har  x;
        System.out.println(
" 请输入一个字母: " );
        x
= (C har )System.in.read();
        
if (Character.isUpperCase(x)){
            System.out.println(
" 你输入了一个大写字母! " );
        }
        
if (Character.isLowerCase(x)){
            System.out.println(
" 你输入了一个小写字母! " );
        }
    }
}
运行调试先后发现如下问题:
1,Char x和(Char)System.in.read()中的Char中c应该小写.
2,由于用到system.in.read()所以应该加上throws IOException.

这么简单一程序就遇到这么多问题...崩溃...
不过这样就给了俺比较深刻的印象,以后一定不会范这些错误了.

用到输出语句"System.in.read()"要在main()中加上throws IOException 语句来抛出异常.

posted @ 2006-07-09 23:16 Yemoo'S Java Blog 阅读(250) | 评论 (0)编辑 收藏