2008年12月30日星期二

开始学习struts2

开始学习struts2今天第一次感觉到经济危机在我身边了,部门现在没有在做的项目了
经济危机中,赶紧为自己充充电,好到时候柳暗花明又一村,哈哈
学struts2
据说struts2基于webwork,基本上跟struts1没啥关系,如果有webwork的经验上手会很迅速
我没接触过webwork,就知道有这么个东西
今儿开始第一个struts
见过好多blog写有struts2的入门步骤,俺也写一个,为自己造个轮子,加深印象。
首先下载struts2的jar包,到http://struts.apache.org/,右上角有个struts2的链接,今天下到的是
struts2的2.0.14,昨天在javaeye上看到发布Struts2.1.3 发布了,只是主页还没看到,不止一次听大拿们说过不要追求新版本,哈哈
下载后的目录:app--struts的例子
              docs-doc文档
              lib-struts的jar包或依赖包
              src-源码
HelloWorld:

1、index.jsp
耳目一新的是,不需要用到struts html标签,这只是猜测,或许例子过于简单?今天工作中还感觉struts1的html标签真是不好用,想加个class、maxlength、size都不好使,让我很是郁闷。希望在继续学习中真的能耳目一新。
struts的action惯例后缀名改成了.action,不再像struts1的.do了,说是延续到webwork的惯例。
下面的页面代码submit的时候将提交到login.action
index.jsp
<body>
<form action="login.action" method="post">
      username:<input type="text" name="username"/>
      password:<input type="password" name="password"/>
      <input type="submit" value="submit"/>
</form>
</body>
2、Action类
struts2的Action可是大进步,不用再继承任何类,实现了松耦合,它好像将struts1的ActionForm融合了进来,据说 struts2不再用ActionForm,页面上对应的字段写在了Action中,struts2框架会自动调用get/set方法,在我印象里 struts1中的Action对象不是线程安全的,会在不同线程间重用,所以谨慎在里面定义字段,在这看来struts2的Action不是这样的,只 是猜测
package com.mystart.action;

public class LoginAction {

    private String username;
    private String password;
  
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
  
    public String execute() throws Exception{
        return "success";
    }
}

3、jsp、java类都定义了,现在要它们联系起来-struts配置文件
新的struts配置文件有个package包的概念,还没闹明白这个package的详细用法,有待继续深入
<action>标签有变化,type变成了class,path变成了name,struts1中name属性是制定ActionForm的,现在ActionForm没有了
forward变成了result,result的默认name=success

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd">


<struts>
    <package name="struts" extends="struts-default">
        <action name="login" class="com.mystart.action.LoginAction">
            <result name="success">/result.jsp</result>
        </action>
    </package>

</struts>

4、最后启动struts2,配置web.xml
struts1的web.xml配置是放在<servlet>中,也就是是一个servlet
struts2变成了一个过滤器Filter
struts1中<url-pattern>被配置成拦截.do的链接
struts2变成了拦截所有链接 /*

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4"
    xmlns="http://java.sun.com/xml/ns/j2ee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
    http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
  
<filter>
      <filter-name>struts2</filter-name>
      <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
</filter>
<filter-mapping>
      <filter-name>struts2</filter-name>
      <url-pattern>/*</url-pattern>
</filter-mapping>
<welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>

以上是驴了个struts的视频教程,今儿看了第一节课,看完后做了一下总结,里面有一些自己的理解,有不对的地方请兄弟们指正,别光光说我是猪,猪也要进步啊,嘿嘿,每一步都有疑问,明天带着问题接着看下一节,睡觉去。

2008年12月29日星期一

自定义Annotation

自定义Annotation
早就知道jdk5加了新特性Annotation,但是没研究过,前几天公司培训,有一部分是介绍jdk5新特性的,一个是注解一个泛型
今儿复习一下注解
    //用@Deprecated声明该方法不建议使用
    @Deprecated public void doSomething1(){
        Map map = new HashMap();
        map.put("some", "thing");
        System.out.println(map);
    }
   
    //用@SuppressWarnings声明不再进行类型检查
    @SuppressWarnings(value={"unchecked"})
    public void doSomething2(){
        Map map = new HashMap();
        map.put("some", "thing");
    }


写一个自定义注解先
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
//要在运行时使用这个注解,必须声明成RUNTIME
Annotation分为三种级别:RUNTIME、CLASS、SOURCE
@Retention(RetentionPolicy.RUNTIME)
public @interface SomeAnnotation{
    String value();
    String name();
}

下面来使用这个自定义注解:
import java.lang.reflect.Method;
public class AnnotationTest {
   
    @SomeAnnotation(value="value1",name="name1")
    public void doSomething3(){
       
    }
   
    public static void main(String[] args){
   
        Class<AnnotationTest> c = AnnotationTest.class;
        try {
            //利用反射得到方法doSomething3
            Method method = c.getMethod("doSomething3");
            //查找doSomething3方法是否有SomeAnnotation的Annotation
            if(method.isAnnotationPresent(SomeAnnotation.class)){
                System.out.println("找到SomeAnnotation");
                //得到SomeAnnotation
                SomeAnnotation annotation = method.getAnnotation(SomeAnnotation.class);
                System.out.println("annotation.value="+annotation.value());
                System.out.println("annotation.name="+annotation.name());
            }else{
                System.out.println("没有找到omeAnnotation");
            }
        } catch (SecurityException e) {
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        }
    }
}

输出结果:
找到SomeAnnotation
annotation.value=value1
annotation.name=name1

2008年12月21日星期日

[转载]Windows2008优化设置

机器:x31 ,cpu1.7,内存1g,安装分区14g

安装系统

下载2008rc0的iso文件,

可以刻盘全新安装或者用虚拟光驱加载iso文件安装

注意,pe下面我没有成功,成功过的低胸说说方法

安装之前最好有个key,key目前是可以免费申请的

有key的话,安装的时候可以选上安装完毕激活系统

没有key的话,装好之后再去微软申请也可以

系统激活之后,就可以使用到08年4月了

安装可以选择标准版、企业版、数据中心版等版本

安装版本要和申请的key对应,否则会提示错误的

系统安装的速度还是比较快的,基本上无需手动干预

2008安装好之后,会提示设定密码,密码是必须的

设好密码就可以登录系统了

安装硬件驱动

系统安装完毕就是驱动的安装

大部分支持vista系统的驱动都可以安装在2008上面

+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+

系统默认有一些烦人的提示,主要有这几个

取消登录时按“ctrl+alt+del”登录系统

如果不想每次开机的时候都按一次 ctrl+alt+del

打开开始菜单的管理工具的本地安全策略

依次进入:本地策略、安全选项

找到:交互式登录 无需按ctrl+alt+del

然后双击,设置为“已启用”

这样每次开机的时候,就可以直接输入密码登录系统了

加快登录的时间

关闭“关机事件跟踪”

如果不想每次关机的时候都出现“关机事件跟踪”的对话框

在开始菜单的运行输入“gpedit.msc”打开组策略编辑器

依次进入:计算机配置、管理模板、系统

在最下面找到“显示 关闭事件跟踪程序”

双击进入属性,设为“禁用”就可以了

调整默认IE ESC(IE增强安全设置)

2008的ie7默认情况下开启了安全设置

不修改的情况下,每次打开新的网站ie都会问是否安全站点

作为服务器使用的话,可以提高服务器的安全性

但是如果作为桌面使用的话,就会很烦人

打开“服务器管理器”,在“安全信息”下面点击“配置 IE ESC”

设置“管理员”和“用户”都是“禁用”即可解决

+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+

作为桌面系统使用的时候,我们需要对2008进行一些调整:

调整系统性能

进入控制面板的系统和维护,打开“高级系统设置”

选择性能下面的“设置”

在“视觉效果”标签下面选择“调整为最佳性能”

在“高级”标签下面的“处理器计划”选择“程序”

在“高级”标签下面的“虚拟内存”选择“让系统自动管理”

在“数据执行保护”标签下面,选择“仅为基本 windows 服务和程序启用 DEP”

安装“桌面体验”

打开“服务器管理器”,点击“添加功能”

勾选“桌面体验”和“高质量 windows 音频视频体验”

按照提示安装“桌面体验”(需要重启电脑)

在“服务”中将“Themes”服务设为自动并开启

在“控制面板、外观和个性化”里面就可以使用vista主题了

完成以上步骤后,windows媒体播放器 也会自动添加到开始的程序组

安装vistacodecs

可以将wmp 11打造成几乎万能的播放器。

最新vistacodecs(VistaCodecs_v448_BETA1 for x86)

下载地址:http://download.pchome.net/multimedia/media/download_37143.html

开启图片预览

ws2008默认没有开启图片预览功能,可以依照下图开启图片预览功能

进入控制面板的文件夹选项

在查看标签下面找到“始终显示图标,从不显示缩略图”

取消前面的“打钩”即可

使用 ClearType 字体

如果觉得2008下面的字体显示有毛边,可以启用 ClearType 字体

让字体显示更漂亮,打开控制面板,进入“外观设置”

点击对话框右下角的“效果”,然后勾选使用 ClearType

+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+-=+

优化系统服务

2008作为一个服务器系统提供了大量的服务,作为桌面使用的低胸无需那么多服务

低胸们可以根据自己的实际需要对个别服务进行禁用或手动

以下给出部分可以停止的服务供大家参考

Diagnostic Policy Service 禁用

Diagnostic Service Host 手动

Diagnostic System Host 手动

IKE and AuthIP IPsec Keying Modules 手动

KtmRm for Distributed Transaction Coordinator手动

Office Source Engine 手动

Offline Files 禁用

Portable Device Enumerator Service 禁用

Problem Reports and Solutions Control Panel Support 手动

Remote Registry 禁用

Secondary Logon 手动

Server 禁用

System Event Notification Service 手动

Tablet PC Input Service 禁用

Windows Error Reporting Service 禁用

Windows Remote Management (WS-Management) 手动

没有打印机、扫描仪、数码相机的朋友可以禁用下面两个服务

Print Spooler

Windows Image Acquisition (WIA)

2008年11月24日星期一

javascript根据生日计算年龄

<SCRIPT LANGUAGE="JavaScript">
<!--
var birthday=new Date("1983-12-31".replace(/-/g, "\/"));
var d=new Date();
var age = d.getFullYear()-birthday.getFullYear()-((d.getMonth()<birthday.getMonth()|| d.getMonth()==birthday.getMonth() && d.getDate()<birthday.getDate())?1:0);
alert(age);
//-->
</SCRIPT>

2008年11月7日星期五

重温Hibernate基础--get/load的区别

下了个Hibernate视频教程听,虽然一年多以前跟老师学过Hibernate,但现在听听还是有很多收获的,发现自己的知识知道的都是些皮毛,用了很久的东西,知道怎么操作怎么用,但要说说它的所以然,摇摇头,呵呵

根据主键Id得到一个持久对象,Hibernate中有两个方法,一个get,一个load,他们两个参数相同,都返回一个Object

它们的区别:
执行get方法即时生成查询sql去查询数据库得到相应的pojo,如果数据库中没有相应记录,则返回null
执行load方法不会即时产生sql语句,而是在用到返回的对象时采取查询数据库,也就是load方法有默认的延迟加载,在执行load方法后返回的不是 一个pojo对象,是pojo对象的一个代理(据说Hibernate是用代理的方式实现延迟加载的,这块还迷糊),如果数据库中没有相应记录,load 方法会抛出异常ObjectNotFoundException
看了一下我们用MyEclipse hibernate工具通过数据库生成的DAO类,它的findById方法是用的session.get()方法,这是即时获得pojo对象,如果是 load方法,在执行完load后如果关闭了session,那在接下来用到这个pojo对象时恐怕会报session已关闭的错误。
还有就是这两个方法的第二个参数id,它必须是实现了java.io.Serializable接口,也就是可序列化的。

今天好像是立冬,冬天到了,抓紧时间充充电,明天接着学...

2008年11月6日星期四

VMware下Redhot4 host-only模式下上网配置过程

学习Linux,装了个VMware,在上面装了个红帽4
前辈建议用host-only连接方式,好处是与host建立一个私有的网络,跟外界没有关系,A private network shared with the host
在这种方式下Linux如何上网呢

1、首先,安装VMware后windows下会多出两块虚拟网卡,VMware Network Adapter VMnet1(为host-only方式用)和VMware Network Adapter VMnet8(为NAT方式用),将这两块网卡的IP都设为自动获取。

2、将window上自己的网卡设为共享

3、进入Linux,应用程序-系统设置-网络

选中eth0,点编辑,做如下配置

完成后点确定,然后点击激活,OK,打开firefox试试看

学习Linux

学习Linux

下了个Linux的视频教程

学了几个命令记录下来

其中对于Linux名字的解释挺有意思,Linux is not unix,:-D

Linux中认为所有的硬件,所有的设备都是文件,文件分为字符文件,和块设备(就是二进制的),它将所有的设备都放在dev目录中

cd / 访问根目录
ls 显示目录中的文件列表
cd dev 访问dev目录
mkdir my 创建目录my
rmdir my 删除目录my
mount /dev/cdrom /mnt/my 将cdrom挂载到my目录
nmount /dev/cdrom 解除挂载
whoami 显示当前用户
pwd     显示当前所在目录

2008年10月30日星期四

javascript 单引号转义

在传递sql串时遇到单引号转义的问题
javascript中可以用双引号又可以用单引号,乱了,乱了
网上搜到一个这样的好使了
<BODY onLoad='javascript:alert("<html><body onload=\"&#39;rrrr&#39;\">")'>
参考:http://topic.csdn.net/t/20021223/14/1291582.html

2008年10月28日星期二

js判断iframe加载完成

<iframe src="http://hi.baidu.com/liuspring" onreadystatechange="if(this.readyState=='complete')alert('加载完成');"></iframe>

2008年10月24日星期五

DWR Convert

DWR不能识别以
Class c = Class.forName(ClassName);
方式产生的对象,
它被是别为java.lang.Class

随机快速排序算法

随机快速排序算法:
还没怎么整明白,有点晕
Java语言: import java.util.*;
public class Test {


    int[] x = {3,7,5,6,4,9,8,1};
    int comps = 0;
    void quicksort(int l, int u)
    {
        int i, m;
        if (l >= u) return;
        swap(l, getRandom(l, u));
        m = l;
       
        comps += u - 1;
        for (i = l+1; i <= u; i++){
            //comps++;
            if (x[i] < x[l])
                swap(++m, i);
        }
        swap(l, m);
        quicksort(l, m-1);
        quicksort(m+1, u);
    }
   
    void swap(int a,int b){
        int temp = x[a];
        x[a] = x[b];
        x[b] = temp;
    }
   
    int getRandom(int min,int max){
          return (int)(Math.random()*(max-min+1)) + min;
          //Math.round(Math.random()*(Max-Min)+Min);
    }
   
    public static void main(String[] args) {
        Test t = new Test();
        System.out.println(Arrays.toString(t.x));
        t.quicksort(0,t.x.length - 1);
        System.out.println(t.comps);
        System.out.println(Arrays.toString(t.x));
    }
   

}

2008年10月15日星期三

javascript 将给定日期增加n个月

//将给定日期增加NumDay个月
    function addDate(dtDate,NumDay){
        var date = new Date(dtDate);
        var lIntval = parseInt(NumDay);
        date.setMonth(date.getMonth() + lIntval);
        return date.getYear() +'-' + (date.getMonth()+1) + '-' +date.getDate();
    }

addDate("2008-01-01".replace(/-/g, "\/"),2);


=======================================
// addDate("5",5,"2004/12/1 00:00:00")
function addDate(type,NumDay,dtDate){
   var date = new Date(dtDate)
type = parseInt(type) //类型
lIntval = parseInt(NumDay)//间隔
switch(type){
   case 6 ://年
date.setYear(date.getYear() + lIntval)
break;
case 7 ://季度
date.setMonth(date.getMonth() + (lIntval * 3) )
break;
case 5 ://月
date.setMonth(date.getMonth() + lIntval)
break;
case 4 ://天
date.setDate(date.getDate() + lIntval)
break
case 3 ://时
date.setHours(date.getHours() + lIntval)
break
case 2 ://分
date.setMinutes(date.getMinutes() + lIntval)
break
case 1 ://秒
date.setSeconds(date.getSeconds() + lIntval)
break;
default:
   
}
return date.getYear() +'-' + (date.getMonth()+1) + '-' +date.getDate()+ ' '+ date.getHours()+':'+date.getMinutes()+':'+date.getSeconds()
}

2008年9月26日星期五

等我白头发了~~

早上,
上班,
公司楼下等电梯,
旁边站一男子,
微微发福,
个不高,
遂俯视,
手拿车钥匙(大大的那种带遥控的那种明显汽车钥匙),
另一手拿一大块手机(智能的手写的那种),摆弄着
肩背笔记本,
崭新崭新的,
顿生羡慕,
羡慕ing,
往上看,
面色红润,
一看就是吃了早饭了,
再往上,
短发,
1/3白色,
遂心想:嗯,等我也这些白头发了,
我也背这些装备,
呵呵,咧嘴......

2008年9月25日星期四

用Url Rewrite Filter重写url

今天发现一个好东西

Url Rewrite Filter

它可以实现url重写,从而隐藏实际的url,同时使url看起来更美观,简单

最令人兴奋的是它一下解决了一值在寻找的blog用户访问自己的空间的问题

比如 就显示我的空间

1、下载Url Rewrite Filter

2、在项目的web.xml配置过滤器

XML语言:<filter>
<filter-name>UrlRewriteFilter</filter-name>
<filter-class>org.tuckey.web.filters.urlrewrite.UrlRewriteFilter</filter-class>
<init-param>
<param-name>logLevel</param-name>
<param-value>debug</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>UrlRewriteFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping> 3、将urlrewrite-2.6.0.jar放入lib文件夹4、新建urlrewrite.xml文件置于WEB-INF目录5、配置urlrewrite.xmlXML语言: 临时自用代码@代码发芽网<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE urlrewrite PUBLIC "-//tuckey.org//DTD UrlRewrite 2.6//EN"
"http://tuckey.org/res/dtds/urlrewrite2.6.dtd">

<!--

Configuration file for UrlRewriteFilter
http://tuckey.org/urlrewrite/

-->
<urlrewrite>
<rule>
<from>^/([a-z]+)/?$</from>
<to type= "forward" >/blogView.do?go=$1</to>
</rule>

<rule>
<note> 这是一个通用请求url rewrite</note>
<from>^/([a-z0-9A-Z_]+)/([a-z0-9A-Z_]+)/?$</from>
<to type= "forward" >/$2.do?go=$1</to>
</rule>


<outbound-rule>
<note>
The outbound-rule specifies that when response.encodeURL is called (if you are using JSTL c:url)
the url /rewrite-status will be rewritten to /test/status/.

The above rule and this outbound-rule means that end users should never see the
url /rewrite-status only /test/status/ both in thier location bar and in hyperlinks
in your pages.
</note>
<from>/rewrite-status</from>
<to>/test/status/</to>
</outbound-rule>

</urlrewrite>url匹配使用正则表达式的规则,实验中发现一个问题,就是必须把里面的正则表达式用小括号括起来,在正则表达式中叫分组不然会报异常:java.lang.IndexOutOfBoundsException: No group 2哈哈,前几日还费劲的自己写Servlet重写url呢,原来这有现成的,更加觉得自己现在的水平遇到的问题网上的前辈们早都遇到过了,一定要站在巨人的肩膀上,少走弯路啊。把我的servlet贴在这,呵呵,参考自blojsomJava语言: 临时自用代码@代码发芽网package com.capinfo.servlet;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import com.capinfo.util.PageConstraint;
import com.capinfo.util.PigBlogUtil;


import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;


/**
*
* @author Administrator
*
*/
public class PigBlogServlet extends HttpServlet {

protected Log _logger = LogFactory.getLog(PigBlogServlet.class);



/**
* Initialize
*
* @param servletConfig {@link ServletConfig}
* @throws ServletException If there is an error initializing
*/
public void init(ServletConfig servletConfig) throws ServletException {
super.init(servletConfig);
}

/**
* Handle requests made to
*
* @param httpServletRequest {@link HttpServletRequest} request
* @param httpServletResponse {@link HttpServletResponse} response
* @throws ServletException If there is an error serving the request
* @throws IOException If there is an error serving the request
*/
protected void service(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws ServletException, IOException {


// Make sure that we have a request URI ending with a / otherwise we need to
// redirect so that the browser can handle relative link generation
// if (!httpServletRequest.getRequestURI().endsWith("/")) {
// StringBuffer redirectURL = new StringBuffer();
// redirectURL.append(httpServletRequest.getRequestURI());
// redirectURL.append("/");
// if (httpServletRequest.getParameterMap().size() > 0) {
// redirectURL.append("?");
// redirectURL.append(PigBlogUtil.convertRequestParams(httpServletRequest));
// }
//
// if (_logger.isDebugEnabled()) {
// _logger.debug("Redirecting the user to: " + redirectURL.toString());
// }
//
// httpServletResponse.sendRedirect(redirectURL.toString());
//
// return;
// }



// Check for an overriding id
String blogId = httpServletRequest.getParameter(PageConstraint.GO);
if (PigBlogUtil.checkNullOrBlank(blogId)) {
String blogIdFromPath = PigBlogUtil.getBlogFromPath(httpServletRequest.getPathInfo());
if (blogIdFromPath == null) {
blogId = PageConstraint.GO1;
} else {
blogId = blogIdFromPath;
}
}

if (PigBlogUtil.checkNullOrBlank(blogId)) {
httpServletResponse.sendError(HttpServletResponse.SC_NOT_FOUND, "Blog ID not specified");

return;
}
StringBuffer redirectURL = new StringBuffer();

//redirectURL.append(httpServletRequest.getContextPath());
System.out.println(httpServletRequest.getRequestURI());
if(httpServletRequest.getRequestURI().indexOf("/blog/") > -1 && httpServletRequest.getRequestURI().indexOf(".jsp") == -1 ){
if(!httpServletRequest.getRequestURI().endsWith("/") && httpServletRequest.getRequestURI().indexOf(".do") > -1){
redirectURL.append(httpServletRequest.getRequestURI().substring(httpServletRequest.getRequestURI().lastIndexOf("/"), httpServletRequest.getRequestURI().length()));

}else if(httpServletRequest.getRequestURI().indexOf("/blog/") == -1){

}else{
redirectURL.append("/blogView.do");

}
redirectURL.append("?go=");
redirectURL.append(blogId);

httpServletRequest.getRequestDispatcher(redirectURL.toString())
.forward((ServletRequest)httpServletRequest, (ServletResponse)httpServletResponse);
//httpServletResponse.sendRedirect(redirectURL.toString());
}else{
httpServletRequest.getRequestDispatcher(httpServletRequest.getRequestURI())
.forward((ServletRequest)httpServletRequest, (ServletResponse)httpServletResponse);
//httpServletResponse.sendRedirect(httpServletRequest.getRequestURI());
}
System.out.println(redirectURL.toString());
return;


}

/**
* Take out of service
*/
public void destroy() {
super.destroy();

if (_logger.isDebugEnabled()) {
_logger.debug(" destroyed");
}
}
}

2008年9月19日星期五

让我们记住这些“中国名牌”~~~

我的心啊,哇凉哇凉地啊

真不知道有什么是安全的

连婴儿都害,禽兽不如





检出三聚氰胺婴幼儿配方乳粉企业名单

     1、石家庄三鹿集团股份有限公司生产的三鹿牌婴幼儿配方乳粉

     2、上海熊猫乳品有限公司生产的熊猫可宝牌婴幼儿配方乳粉

     3、青岛圣元乳业有限公司生产的圣元牌婴幼儿配方乳粉

     4、山西古城乳业集团有限公司生产的古城牌婴幼儿配方乳粉

     5、江西光明英雄乳业股份有限公司生产的英雄牌婴幼儿配方乳粉

     6、宝鸡惠民乳品(集团)有限公司生产的惠民牌婴幼儿配方乳粉

     7、内蒙古蒙牛乳业(集团)股份有限公司生产的蒙牛牌婴幼儿配方乳粉

     8、中澳合资多加多乳业(天津)有限公司生产的可淇牌婴幼儿配方乳粉

     9、广东雅士利集团股份有限公司生产的雅士利牌婴幼儿配方乳粉

     10、湖南培益乳业有限公司生产的南山倍益牌婴幼儿配方乳粉

     11、黑龙江省齐宁乳业有限责任公司生产的婴幼儿配方乳粉2段基粉

     12、山西雅士利乳业有限公司生产的雅士利牌婴幼儿配方乳粉

     13、深圳金必氏乳业有限公司生产的金必氏牌婴幼儿配方乳粉

     14、施恩(广州)婴幼儿营养品有限公司生产的施恩牌婴幼儿配方乳粉

     15、广州金鼎乳制品厂生产的金鼎牌婴幼儿配方乳粉

     16、内蒙古伊利实业集团股份有限公司生产的伊利牌儿童配方乳粉

     17、烟台澳美多营养品有限公司生产的澳美多牌婴幼儿配方乳粉

     18、青岛索康营养科技有限公司生产的爱可丁牌婴幼儿配方乳粉

     19、西安市阎良区百跃乳业有限公司生产的御宝牌婴幼儿配方乳粉

     20、烟台磊磊乳品有限公司生产的磊磊牌婴幼儿配方乳粉

     21、上海宝安力乳品有限公司生产的宝安力牌婴幼儿配方乳粉

     22、福鼎市晨冠乳业有限公司生产的聪尔壮牌婴幼儿配方乳粉


普元培训第五天

培训最后一天,报表~

感觉普元的报表有点水晶的味道,弄了个分组报表,又建数据源又建数据集有设行分组,列分组的,赶紧挺麻烦,没有用润乾好使,虽然润乾工作量也挺大

看来老板要贴了心上普元了,接下来可能要实战了,不知道啥样,现在有两点困难;

1\、普元报的错误,无从下手,不知道哪出的毛病,比如有时在展现层的毛病,而在逻辑处理层报错,摸不着头脑啊。

2、普元的构件不熟悉,据说有1000多个构件,不像java api一样按照功能分的包,它是按层分的包,业务逻辑层构件、运算层构件、展现层构件。要实现一个功能怎么能知道构件包里有没有现成的,恐怕这只能慢慢熟悉那些构件库了

3、觉得普元的报表系统不怎么样,至少没有什么让人耳目一新的,工作流系统还挺强,对工作流不熟悉,不敢说什么,然后就是可维护性,可扩展性,可能一直是自己写代码的,看不见代码总觉得不踏实最然功能实现了并以更迅速的

4、听头儿说这是未来软件开发的趋势,听得我直郁闷,未来开发就是这么托构件然后用连线一拉基本完事儿了吗?!得,要不我还是转行做小买卖去吧,呜呜,总的来说,觉得这种模式对程序员个人的发展没多大好处,核心代码都被封装好了,不知道什么是类,对象,方法,面向对象,也能轻而易举做软件工程师了,呵呵,工程师以后不值钱喽。

自己的一点感觉,胡侃一通,不知道合不合乎逻辑,在前面的blog里有朋友留言说"千万别被普元忽悠了",哈哈,不知道那位兄弟的理由是什么,想多听听大家的意见,望广留言,多谢多谢多谢!!!

通过Xpath来访问数据

通过Xpath来访问数据

例子1:Entity的格式

<root>

<data>

<myEntity>

<myField1>1234</myField1>

<myField2>This is demo</myField2>

</myEntity>

</data>

</root>

例子2:EntityList的格式为

<root>

<data>

<list length=2>

<myEntity name="test1">

<myField1>1234</myField1>

<myField2>This is demo</myField2>

</myEntity>

<myEntity name="test2">

<myField1>2345</myField1>

<myField2>This is demo</myField2>

</myEntity>

<list>

</data>

</root>

通过Xpath来访问数据,比如

/root/data /myEntity将访问到例子1中的<myEntity>实体

/root/data/myEntity/ myField1 将访问到例子1中的myField1,结果为1234

/root/data/list/myEntity[@name="test1"]将访问例子2中的<myEntity name="test1"> 实体

/root/data/list/myEntity[@name="test1"]/myField1将访问例子2中的myField1,值为1234

普元培训第四天

第四天还没来得及写呢,现在已经是第五天了呵呵

昨天临时以前的项目要改写东西,听的断断续续

还是一些关于工作流的知识,只是更加复杂一下,跟着文档一个劲儿的复制黏贴

也不知道所以然

据说下午还要考试,晕

普元培训第三天

今天接着培训普元EOS

百度竟然长度限制文章这么小气

2008年9月18日星期四

显示帮助的div

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">  
<html xmlns="http://www.w3.org/1999/xhtml">  
<HEAD>  
<TITLE>code by:haiwa - 随滚动条移动的层 - 中国asp之家 - www.aspxhome.com</TITLE>  
<META HTTP-EQUIV="Content-Type" CONTENT="text/html" charset="gb2312">  
</HEAD>  
<style>  
<!--  
.div{  
position: absolute;  
border: 2px solid red;  
background-color: #EFEFEF;  
line-height:90px;  
font-size:12px;  
z-index:1000;  
}  
-->  
</style>  
<BODY>  
<div id="Javascript.Div1" class="div" style="width: 240px; height:90px" align="center">正中...</div>  
<SCRIPT LANGUAGE="JavaScript">  
function sc1(){  
document.getElementById("Javascript.Div1").style.top=(document.documentElement.scrollTop+(document.documentElement.clientHeight-document.getElementById("Javascript.Div1").offsetHeight)/2)+"px";  
document.getElementById("Javascript.Div1").style.left=(document.documentElement.scrollLeft+(document.documentElement.clientWidth-document.getElementById("Javascript.Div1").offsetWidth)/2)+"px";  
}  
</SCRIPT>  


<div id="Javascript.Div2" class="div" style="width: 240px; height:90px" align="center">左上...</div>  
<SCRIPT LANGUAGE="JavaScript">  
function sc2(){  
document.getElementById("Javascript.Div2").style.top=(document.documentElement.scrollTop)+"px";  
document.getElementById("Javascript.Div2").style.left=(document.documentElement.scrollLeft)+"px";  
}  
</SCRIPT>  

<div id="Javascript.Div3" class="div" style="width: 240px; height:90px" align="center">左下...</div>  
<SCRIPT LANGUAGE="JavaScript">  
function sc3(){  
document.getElementById("Javascript.Div3").style.top=(document.documentElement.scrollTop+document.documentElement.clientHeight-document.getElementById("Javascript.Div3").offsetHeight)+"px";  
document.getElementById("Javascript.Div3").style.left=(document.documentElement.scrollLeft)+"px";  
}  
</SCRIPT>  

<div id="Javascript.Div4" class="div" style="width: 240px; height:90px" align="center">右上...</div>  
<SCRIPT LANGUAGE="JavaScript">  
function sc4(){  
document.getElementById("Javascript.Div4").style.top=(document.documentElement.scrollTop)+"px";  
document.getElementById("Javascript.Div4").style.left=(document.documentElement.scrollLeft+document.documentElement.clientWidth-document.getElementById("Javascript.Div4").offsetWidth)+"px";  
}  
</SCRIPT>  

<div id="Javascript.Div5" class="div" style="width: 240px; height:90px" align="center">右下...</div>  
<SCRIPT LANGUAGE="JavaScript">  
function sc5(){  
document.getElementById("Javascript.Div5").style.top=(document.documentElement.scrollTop+document.documentElement.clientHeight-document.getElementById("Javascript.Div5").offsetHeight)+"px";  
document.getElementById("Javascript.Div5").style.left=(document.documentElement.scrollLeft+document.documentElement.clientWidth-document.getElementById("Javascript.Div5").offsetWidth)+"px";  
}  
</SCRIPT>  


<SCRIPT LANGUAGE="JavaScript">  
<!--  
function scall(){  
sc1();sc2();sc3();sc4();sc5();  
}  
window.onscroll=scall;  
window.onresize=scall;  
window.onload=scall;  
//-->  
</SCRIPT>  
<div style="position: absolute; top: 0px; left: 0px; width: 10000px; height: 4000px;"></div>  
</BODY>  
</HTML>

2008年9月16日星期二

第一次使用Subversion,Attempted to lock an already-locked dir

一直苦恼与不能实现广域网的版本控制,终于发现Google code就提供这种服务,它使用Subversion来控制版本,下了一个TortoiseSVN 1.5.1
装上,捣鼓了半天终于上传上Google code了,哈哈。有成就感
这两天有搞了个eclipse插件subclipse,运行起来以后无论commit还是update都提示错误:

Attempted to lock an already-locked dir

通过搜索,解决办法是 执行clearup操作,就好了
记录在这,Subversion还要继续研究

Google Code Host的使用说明(转)

by shootsoft

http://www.shootsoft.net

1. Eclipse的Subversion使用说明

开发工具以Eclipse为主,所以Eclipse首先需要安装一个Subversion的插件。参考下面的网址:

http://www.ibm.com/developerworks/cn/opensource/os-ecl-subversion/

项目组的所有成员必须都要按照以上的操作安装好插件,并且注册Google的Gmail帐户。

2.Google Code Host说明

项目组组长到http://code.google.com/hosting/创建新项目(Create a new project)过程省略。最后会看到项目的协作平台网址:http://code.google.com/p/group6homework/。(group6homework是项目名称)组长创建完成后还需要把组员的帐户添加进来:通过[Administer]—[Project Members]就可以对项目组成员帐户进行管理。

创建完成后组长需要安装http://tortoisesvn.net/downloads Subversion的客户端插件进行项目首次的Check In操作。

操作如下:

到Eclipse的项目的workspace目录下,进入需要协作的项目的目录,比如我的:

D:"shootsoft"GP6Platform

单击鼠标右键,选择[TortoiseSVN]—[Import]然后输入:

https://group6homework.googlecode.com/svn/trunk/

注意:

  • 这里网址如果你不太清楚可以登录

http://code.google.com/p/group6homework/source查看

  • Google Code Host使用的密码是随机生成的,如果已经登录Google,可以查看以下网址获得密码:

http://code.google.com/hosting/settings

首次登录可能需要安装证书和输入密码。完成后TortoiseSVN就会自动把文件夹

D:"shootsoft"workspace"GP6Platform下的所有文件同步到服务器上去了。

3. Google Code Host与Eclipse

Check In操作完成后组长还需要将项目Check Out出来,真正和Eclipse中的项目结合,组员也需要这样做:

1.将自己的项目文件夹备份并且从Eclipse中删除。需要选择第一项,连同文件夹一起删除。

2.按照http://www.ibm.com/developerworks/cn/opensource/os-ecl-subversion/中的说明进行Import操作,操作结果如下所示:

3.这时点击Next按钮,选择第一项,然后点击Finish按钮。

4.通过Windows菜单,[Show View]—[Other]

5.在弹出的新窗口中选择“SVN—SVN资源库”

6.在刚才Import进来的那个资源库上单击鼠标右键,选择“检出为(A)...”

7.然后在新窗口中中输入项目名称

点击“Finish”按钮。

稍微等待一会儿,程序就会全部下载回来了。

8.我的Tomcat5补丁放在了D:"Tomcat5补丁目录下,请各位参考我的未知把补丁放置好。

如果导入的项目有红叉叉,在项目上点击鼠标右键,选择“Close Project”然后再打开就好了。这时可以清楚的看到项目上图标发生了一点点变化:

在上面的第3步上,按道理应该可以作为项目可以直接检出,但是我这里操作总是出错,所以只有按照稍微烦琐一点的步骤来操作了。

4. Subversion的使用

如果你对某一个文件进行了修改,想要把这个文件提交到服务器上去,就需要在需要提交的文件上单击鼠标右键,通过Team菜单来[提交]

如果你需要把修改过的文件使用服务器上的来覆盖,可以通过Team菜单的[更新]来进行。

Subversion的使用非常简单,但是要深入探究也可以说上几千字,还是建议通过官方或者非官方的教程来学习:

http://www.baidu.com/s?tn=searches_dg&ie=utf-8&word=subversion+%E6%95%99%E7%A8%8B

http://www.baidu.com/s?wd=Subversion+Eclipse&cl=3

2008年9月12日星期五

普元EOS培训第二天

今天剖析了昨天三下两下生成的增删改查的代码(能看到的代码也仅仅限于jsp页面中的一些标签),其他的要看的话都是xml,要用EOS的设计器看才是类似于流程图的东西

感觉看不到亲切的java代码很不爽,呵呵

然后练习自定义运算逻辑,这下自己写类了呵呵,eos能够由向导自动生成类和方法体,就像Myeclipse中新建struts的action一样,发现eos的方法都是静态的,都是返回一个int整型值,参数列表也都是Document doc, BizContext param,看起来只有方法名可以自定义了,呵呵!

之前说过普元这套东西都是用xml格式传递参数的,这里就是从param中获取xml,然后拆解每个要用到的节点,来获取传入的参数,然后经过处理后把返回值再放到xml节点中,好费劲。

然后是handler,为了灵活的加入新的处理,可以在一个业务逻辑的前后加入多个handler,跟一般的过滤器写法没什么差别。

然后是jsp Tag自定义,也是继承了javax.servlet.jsp.tagext.TagSupport,没有普元的东西

再然后是复杂查询,多表查询,他是创建一个查询实体,就是视图啦

一天下来对普元EOS了解的多了些,它以方法为单位作为构成构件,以达到重用的目的,各个层之间以xml格式作为联系,开发人员基本上已图形化开发,不接触底层技术,给程序员的门槛降低了(大学生就业更难了呵呵),开发系统开始工业化,把零件装起来,螺丝拧上就OK了

可能经历实际开发了,会有多一些不一样的感触吧

还是没闹明白难道这就是所谓SOA吗???

用Zoundry发blog

想找个离线发布blog的工具,折腾了一晚上

大家评论说Zoundry不错,就下载下来安装了,如何配置成为了一个问题,我有多个blog想同时更新

下面搜集了几个blog配置的地址,供参考

blogjava

http://www.blogjava.net/yourblog/services/metaweblog.aspx

bloggers

https://www.blogger.com/feeds/default/blogs (不稳定,有时成功有时不成功,可能是太和谐了)

blogbus

http://rpc.blogbus.com/blogger

csdn blog

http://blog.csdn.net/youraccount/services/MetaBlogApi.aspx

2008年9月11日星期四

普元EOS培训第一天

普元EOS,面向构件的开发

公司要购进普元的EOS开发工具,组织为期5天的培训

为了今天的培训我把我的笔记本系统都重装了,折腾了半天装数据库,装EOS,装EOS补丁,不知道干嘛不做一个集成了补丁的安装包

安装过程中要配置数据库,要初始化数据库,会向数据库中自动建好多表,然后安装成功后可以在服务控制台管理。

首先做了个HelloWorld

界面就是这样的


首先新建一个构件包(面向构件的开发嘛),每个构建包下有页面构件page,展现逻辑构件pr,业务逻辑构件biz,数据逻辑构件data等等。

我的理解就是每个构件就相当于分层架构中的一层,page就是jsp页面,pr是Struts的action,biz是spring的bean,data是hibernate的映射,普元在这之上又进行了封装,以前我们在各个层之间传递数据通常由一个DTO数据传递对象,而普元在各个层用xml来传递,普元把普遍通用的实现逻辑处理都封装成了构件,我们只要调用构件就行了。

       之后又来了复杂点有刺激的,通过向导实现对一个单表的增删改查,向导跟vs.net中的那个数据连接,数据适配器拖到页面上选择表,选择字段,就自动生成了增删改查,只是vs.net中可以看到生成的C#的代码,而普元生成的只是一堆xml。


原来一天未必能完成的事,现在十分钟做完,能傻瓜的都傻瓜了,真的也要下岗了。

哦,对了,这些和SOA怎么联系上呢?

2008年9月5日星期五

jsp下载文件的问题

要提供给客户一个下载xml文件备份的功能
思路确定了
生成xml
在服务器指定目录创建文件
取得文件路径,弹出下载框

Java语言:01 <%@ page contentType="text/html;charset=UTF-8" language="java"%>
02 <%@ page import="java.io.*" %>
03 <%
04      String pathurl = (String)request.getAttribute("pathurl");
05      if(pathurl !=null && !pathurl.equals("")){
06    
07             String addressReport = application.getRealPath("/")+"saveFiles"+File.separator+pathurl;
08             //String addressReport = PageConstraint.XML_PATH_SEND+pathurl;
09            addressReport = addressReport.replace(File.separator,File.separator+File.separator);
10           
11           //   设置响应头和下载保存的文件名
12           response.setContentType("APPLICATION/OCTET-STREAM;charset=UTF-8");
13           response.setHeader("Content-Disposition",
14           "attachment;   filename=\""   +   pathurl   +   "\"");
15           
16           //   打开指定文件的流信息
17           java.io.FileInputStream   fileInputStream   =
18           new   java.io.FileInputStream(addressReport);
19           
20           写出流信息
21           int   i;
22           while   ((i=fileInputStream.read())   !=   -1)   {
23               out.write(i);
24           }
25    
26           fileInputStream.close();
27           out.close();
28           
29     }
30   %>
这么写在jsp文件中的代码,开始试验没有问题,但是如果xml中有中文,就会是乱码,xml文件是使用utf8生成的,猜想可能是在流读取的时候编码不对,于是在网上搜得了下面这样的写法,通过InputStreamReader设置了编码UTF-8
测试成功

Java语言:
01 <%@ page contentType="text/html;charset=UTF-8" language="java"%>
02 <%@ page import="java.io.*" %>
03 <%
04      String pathurl = (String)request.getAttribute("pathurl");
05      if(pathurl !=null && !pathurl.equals("")){
06    
07             String addressReport = application.getRealPath("/")+"saveFiles"+File.separator+pathurl;
08             //String addressReport = PageConstraint.XML_PATH_SEND+pathurl;
09            addressReport = addressReport.replace(File.separator,File.separator+File.separator);
10           
11           //   设置响应头和下载保存的文件名
12           response.setContentType("APPLICATION/OCTET-STREAM;charset=UTF-8");
13           response.setHeader("Content-Disposition",
14           "attachment;   filename=\""   +   pathurl   +   "\"");
15           
16           //   打开指定文件的流信息
17           java.io.FileInputStream   fileInputStream   =
18           new   java.io.FileInputStream(addressReport);
19           
20           //   写出流信息
21           //int   i;
22           //while   ((i=fileInputStream.read())   !=   -1)   {
23           //out.write(i);
24           //}
25    
26           //fileInputStream.close();
27           //out.close();
28          
29           InputStreamReader   reader=new   InputStreamReader(fileInputStream,"UTF-8");
30           int   i=0;
31           while((i=reader.read())!=-1){
32               out.write(i);
33
34           }
35           reader.close();
36           fileInputStream.close();
37           out.close();
38     }
39 %>
总结:还是对java的流相关只是掌握不清啊,不能熟练运用

sqlServer2000与sqlServer2005的错误

一哥们在学C#,同时学的是sqlServer2005,是啊,我接触C#那会儿才.net1.1,现在都3.x了
让我帮忙调式一下程序,而我的机器尚没有sql05,只有sql2000,期间听说过05和2000可以同时安装,装吧,要不没法附加他那2005的数据库,费了好大劲装好了,开始附加数据库,但是死活附加不上去,错误提示:执行Transact_SQL语句或批处理时发生了异常。未能在sysindexes中找到数据库ID 9 对象ID 1 对应的行,请对sysindexes运行DBCC CHECKTABLE


按照提示,执行 DBCC CHECKTABLE 还是没有效果
遂在google上搜,有网友遇到这个问题是因为同时装了sql2000,卸载了2000重装sql2005就成功了
晕,这下功夫耗大了
卸载吧,同学提供了一个干净卸载的工具来卸载,早就知道卸载sql2000卸不干净,重装会出问题,于是采用此工具
“微软的Windows_Installer_清理实用工具msicuu2”
可谁知道,这东西帮了倒忙,好像得先运行卸载程序,再运行这个“微软的Windows_Installer_清理实用工具msicuu2”可以帮忙将注册表之类的垃圾清理掉,但是我直接运行了这个“微软的Windows_Installer_清理实用工具msicuu2”,结果sql2000还在并且可以运行,在控制面板卸载,提示 找不到D:\Program Files\Microsoft SQL Server\MSSQL\Uninst.isu
晕,这是干啥的啊
接着google
找到一网友的播客http://www.anywolfs.com/liuhui/article.asp?id=257,提出了解决办法,用之,终于可以卸载了
接着卸载sql2005,哎,等等,现在是不是可以附加了呢,试,.....还是不行,呵呵
卸载吧
哦?从控制面板貌似sql05也卸载不了了,卸了好几次也没反应啊,倒是不报错

试了好几次,貌似选哪个都不好使,点下一步,一会儿窗口就自己消失了
啊,啊啊,晕,先睡觉,明儿再搞定05
谁位大哥遇到过,提示一下啊......

难道是hibernate装聪明?

今天开发中遇到一个奇怪的hibernate错误
我的数据库中一个表中有个字段名叫id,但是它并不是主键
用hibernate映射后为

XML语言:1 <id name="apprId" type="java.lang.Long">
2     <column name="APPR_ID" precision="11" scale="0" />
3     <generator class="assigned" />
4 </id>
5 <property name="Id" type="java.lang.Long">
6     <column name="ID" precision="11" scale="0" />
7 </property>而我当执行这样的hibernate的HQL的时候
SQL语言:1 from RcUApprInfo as model where model.Id = ?
hibernate解析成sql语句竟然是
SQL语言:1 select ...... from rc_u_appr_info where as model where model.APPR_ID = ?

跟踪了好几遍,都是这样

在确定自己的代码没问题后,想到可能是hibernate理解错了
于是将Id改成了别的名
再试,竟然没问题了
难道hibernate将凡是叫Id的都认为成主键??不解 不解

试用Google的浏览器

早上上班来,打开电脑,看到一则最新消息,google发布自己的浏览器了

9月3日消息 9月3日凌晨,谷歌中国与全球同步推出其开源浏览器Google Chrome测试版,中文名为谷歌浏览器.
         下载地址为:http://www.google.com/chrome

记得前几天还看见csdn上新闻说google澄清不会出浏览器跟IE竞争,晕,现在成现实了,google的所有服务差不多用了个遍,这个也不例外,下了一个,惊讶下载文件竟然只有几百K,开始安装才知道也是采用windows live那样的安装方式,还要下载一通。

终于安装完啦,打开


第一感觉很简单,把所有空间都给了页面显示,就像IE按了F11一样,因为在公司是使用代理上网,纳闷的是我也没有配置代理居然一下就能上网,于是打开选项查找,有个设置代理的按钮,点击打开的竟然是IE的选项窗口,google的浏览器调用IE的internate选项,这不是成了遨游?

什么是SOA

引用:面向服务的体系结构(service-oriented architecture,SOA)是一个组件模型,它将应用程序的不同功能单元(称为服务)通过这些服务之间定义良好的接口和契约联系起来。接口是采用中立的方式进行定义的,它应该独立于实现服务的硬件平台、操作系统和编程语言。这使得构建在各种这样的系统中的服务可以以一种统一和通用的方式进行交互。

今天公司组织了一个SOA培训,请的普元公司的工程师来的,按工程师的话说SOA是一种方法,这种方法已经由来已久了也算,在欧美国家早就用这种方法来开发标准的软件系统,那是不是能成为SOA是一种方法呢,呵呵
培训中,工程师演示了普元的产品,他们的一个开发工具EOS包含了AppFream,Report,RishWeb,WorkFlow,软件开发的各个层面都覆盖到了,俺的个娘啊,感觉就是要是这些东西用起来还要我们这些程序员干嘛,只要项目经理就行了,项目经理跟客户确认好需求,然后用普元的工具一通拖拽画出流程图,完了,这就完工了,流程图画出的同时我们的应用也能运行了,看效果吧,呵呵
貌似,做测试的也可以下岗了,因为每一步都是自动生成的,并且可以监控每一步的运行情况。
半天的培训下来,突然有种危机感,如果总经理真的决定在我们部门推行这个EOS系统,那我们岂不是离下岗不远啦?
程序员真不如民工喽。。。

自己的一点点理解 ,功力尚浅,呵呵,欢迎拍砖

控制td换行的css样式

遇到一个棘手的问题,即便是给td限定的宽度,但是如果里面的内容是连续的,IE就认为是一个单词,不会换行,瞎聪明,google了一通,用css把问题解决了,css这玩意太强了,收藏一下,控制td换行的css样式:style="word-wrap:break-word;word-break:break-all;"

1<table width="100%" border="0" cellspacing="1" cellpadding="0">       
2 <tr>
3  <td width="25%" style="word-wrap:break-word;word-break:break-all;"   valign="bottom" >
4   abcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabc</td>
5 </tr>
6</table>

2008年9月3日星期三

试用Google的浏览器 chrome

早上上班来,打开电脑,看到一则最新消息,google发布自己的浏览器了

9月3日消息 9月3日凌晨,谷歌中国与全球同步推出其开源浏览器Google Chrome测试版,中文名为谷歌浏览器.
         下载地址为:http://www.google.com/chrome

记得前几天还看见csdn上新闻说google澄清不会出浏览器跟IE竞争,晕,现在成现实了,google的所有服务差不多用了个遍,这个也不例外,下了一个,惊讶下载文件竟然只有几百K,开始安装才知道也是采用windows live那样的安装方式,还要下载一通。

终于安装完啦,打开

第一感觉很简单,把所有空间都给了页面显示,就像IE按了F11一样,因为在公司是使用代理上网,纳闷的是我也没有配置代理居然一下就能上网,于是打开选项查找,有个设置代理的按钮,点击打开的竟然是IE的选项窗口,google的浏览器调用IE的internate选项,这不是成了遨游?

一点心得

忙里偷闲
一直想写一个blog程序
架子打起来了,用struts1.2+hibernate

如何为用户的url做转向,比如http://www.blogjava.net/liuspring,怎样转向属于liuspring的文章、留言、评论啊等等,简单的说就是liuspring的页面,
这个问题可把我难住了(功力太浅),于是google上搜开源的blog系统,看他们的源码,首先下的roller,费了好大劲把系统配起来了,运行起来那个高兴,接下来晕了,新版本是struts2,还没研究过,看了一下好像struts2能很容易实现我要的,可是我用的是1.x啊,接着搜,Pebble,blojsom DLOG4Jmyblog,都试用了,其中blojsom使用了一个servlet,在里面解析URI,比如请求的地址是/blog/spring/,那么就被解析成/blogView.do?go=spring,以这个地址转向,从而被struts的控制器接收。
这里得用(并且redirectURL必须是相对路径,用完整路径好像还不行,在我这报404错误)
1httpServletRequest.getRequestDispatcher(redirectURL.toString())
2             .forward((ServletRequest)httpServletRequest, (ServletResponse)httpServletResponse);不能用
1httpServletResponse.sendRedirect(redirectURL.toString());因为这样是使IE重定向,请求的URL也随之改变,这个圈儿就转不下去了。

又建立了一个过滤器,用以判断session中的用户是否是当前访问的博客的管理员,比如访问/blog/spring/,判断session中保存的用户是否是spring,然后往request,setAttribute中放一个标示,标示是否具有管理员权限,在jsp页面中获取这个参数以决定是否显示后台管理连接。
到这里,最基本,最挠头的问题暂时解决了,感觉肯定有更加方便、更加精妙、更加简单的方法,只是功力还没涉到那么深,哪位博友看到了不胜赐教,接下来还要攻克的,如何产生静态html页面,如何rss......

2008年9月1日星期一

web.xml中的3种写法

① 完全匹配

    <url-pattern>/test/list.do</url-pattern>

② 目录匹配

    <url-pattern>/test/*</url-pattern>

③ 扩展名匹配

    <url-pattern>*.do</url-pattern>

servlet-mapping的重要规则:

☆ 容器会首先查找完全匹配,如果找不到,再查找目录匹配,如果也找不到,就查找扩展名匹配。

☆ 如果一个请求匹配多个“目录匹配”,容器会选择最长的匹配。

2008年8月27日星期三

真的好久没更新了

几乎每天都在,只是好久都是只看不写了,看看谁来过了,回访一下,看看谁留言了,回复一下,看看访问量多少了
呵呵,瞅瞅下面的一篇到现在足有两个多月了,时间过得好快啊
最近一段时间,事儿真的很多,公司的事不算忙了,所以也没什么技术问题写一写,一直想弄个blog,还没弄起来,家里有很多事忙
上周末回了趟家,正好赶上下雨,庆幸买上了火车票,还有坐,倒霉的还没赶上火车,到火车站停止检票了,在麦当劳蹲了一宿
凌晨4:30上车,开始闹肚子,哎呦,一直到家,一宿没睡,还闹肚子,我太坚强了,呵呵

想点招,赚钱,极度缺钱

为什么baidu空间不能用windows live writer这样的客户端写blog呢,落伍了啊

2008年6月13日星期五

八兄弟

一直讨厌看电视剧,大都又臭又长
向来只是吃饭的时候,有时候看电视,也总是遥控器不离手,不停的换台
无意中看了会儿 八兄弟~~觉得还不错
讲的是咱老百姓的事儿
讽刺~幽默~
生活~就是不停的迈一道道的坎啊


讲话了,要当就当棍

2008年6月12日星期四

hibernate的save()疑惑

刚整明白一个,呵呵,笨
hibernate save的时候必须启用事务,也就是必须
beginTransaction();
然后
commit();
要不然不会insert

看孙卫琴.精通Hibernate:Java对象持久化技术详解上讲
调用save方法后,hibernate并不会立即insert,而是保存在缓存里,等清理缓存时再insert
什么时候清理缓存呢?
1、事务commit();
2、find方法(hibernate3被废)
3、显示调用flush();
而为什么不用事务,只是在save();后直接显示调用flush();还是没有insert呢?
参考csdn的一个帖子http://topic.csdn.net/u/20080603/19/d6918606-3a62-43a4-b63d-cd292242bbc6.html
因为数据源的问题
真正的原因是数据源conn默认的提交方式,hibernate不管这件事,大部分开源数据源都是默认false的

我试了hibernate的默认连接池,和tomcat中配的连接池用使用事务都没有insert。
下面这段代码能够insert可以说明一些问题
public static void main(String[] args) throws Exception {
SessionFactory sf=HibernateSessionFactory.getSessionFactory();
Session session=sf.openSession();
System.out.println(session.connection().getAutoCommit());
session.connection().setAutoCommit(true);
User u=new User();
u.setName("aaa");
session.save(u);
}

}
而commit和flush的区别就是commit先flush再提交,而flush没有提交
而在close的时候,孙卫琴.精通Hibernate:Java对象持久化技术详解上讲的是hibernate会清空缓存,一个清理,一个清空,一字之差,呵呵

2008年6月4日星期三

roller blog

因为一直想写个自己的blog,用什么架构呢,遂驱使着在网上搜索有什么开放源码的blog程序,roller4.0,貌似挺有名,但资料不多,蒸腾了两天才把系统跑起来
看在OpenSource的介绍:
              Roller Weblogger这个weblogging 设计得比较精巧,源代码是很好的学习资料。它支持weblogging应有的特性如:评论功能,所见即所得HTML编辑,TrackBack,提供页面模板,RSS syndication,blogroll管理和提供一个XML-RPC 接口。

很好的学习资料,哈哈,那就学习学习吧
不过到现在也没看出个什么门道来
系统用了struts2 不熟,struts1还行
用了JPA,不熟,确切的说刚知道这东西
用了velocity,没用过
....还有很多没见过的名词,狂晕
打了个断点跟了几圈,就晕了
呵呵

2008年5月28日星期三

google ajax 翻译

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta http-equiv="content-type" content="text/html; charset=utf-8"/>
    <title>Google AJAX Language API - Hello World</title>
    <script type="text/javascript" src="http://www.google.com/jsapi"></script>
    <script type="text/javascript">

    google.load("language", "1");

    function initialize(str) {
      var text = document.getElementById("text").value;
      google.language.detect(text, function(result) {
        if (!result.error && result.language) {
   google.language.translate(text, result.language, str,
                             function(result) {
     var translated = document.getElementById("translation");
     if (result.translation) {
       translated.innerHTML = result.translation;
            }
          });
        }
      });
    }
    google.setOnLoadCallback(initialize);

    </script>
</head>
<body>
    <input type="text" name="text" value="你好,很高興見到你。"/>
<input type="button" value="汉译英" onclick="javascript:initialize('en')"/>
<input type="button" value="英译汉" onclick="javascript:initialize('zh')"/>
    <div id="translation"></div>
</body>
</html>

JAVA练习题

【程序1】
题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?
1.程序分析: 兔子的规律为数列1,1,2,3,5,8,13,21....
【程序2】
题目:判断101-200之间有多少个素数,并输出所有素数。
1.程序分析:判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被整除,
则表明此数不是素数,反之是素数。
【程序3】
题目:打印出所有的 "水仙花数 ",所谓 "水仙花数 "是指一个三位数,其各位数字立方和等于该数本身。例如:153是一个 "水仙花数 ",因为153=1的三次方+5的三次方+3的三次方。
1.程序分析:利用for循环控制100-999个数,每个数分解出个位,十位,百位。
【程序4】
题目:将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5。
程序分析:对n进行分解质因数,应先找到一个最小的质数k,然后按下述步骤完成:
(1)如果这个质数恰等于n,则说明分解质因数的过程已经结束,打印出即可。
(2)如果n <> k,但n能被k整除,则应打印出k的值,并用n除以k的商,作为新的正整数你n,重复执行第一步。
(3)如果n不能被k整除,则用k+1作为k的值,重复执行第一步。
【程序5】
题目:利用条件运算符的嵌套来完成此题:学习成绩> =90分的同学用A表示,60-89分之间的用B表示,60分以下的用C表示。
1.程序分析:(a> b)?a:b这是条件运算符的基本例子。
【程序6】
题目:输入两个正整数m和n,求其最大公约数和最小公倍数。
1.程序分析:利用辗除法。
【程序7】
题目:输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。
1.程序分析:利用while语句,条件为输入的字符不为 '\n '.
【程序8】
题目:求s=a+aa+aaa+aaaa+aa...a的值,其中a是一个数字。例如2+22+222+2222+22222(此时共有5个数相加),几个数相加有键盘控制。
1.程序分析:关键是计算出每一项的值。
【程序9】
题目:一个数如果恰好等于它的因子之和,这个数就称为 "完数 "。例如6=1+2+3.编程 找出1000以内的所有完数。
【程序10】
题目:一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在 第10次落地时,共经过多少米?第10次反弹多高?
【程序11】
题目:有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?
1.程序分析:可填在百位、十位、个位的数字都是1、2、3、4。组成所有的排列后再去 掉不满足条件的排列。
【程序12】
题目:企业发放的奖金根据利润提成。利润(I)低于或等于10万元时,奖金可提10%;利润高于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可可提成7.5%;20万到40万之间时,高于20万元的部分,可提成5%;40万到60万之间时高于40万元的部分,可提成3%;60万到100万之间时,高于60万元的部分,可提成1.5%,高于100万元时,超过100万元的部分按1%提成,从键盘输入当月利润I,求应发放奖金总数?
1.程序分析:请利用数轴来分界,定位。注意定义时需把奖金定义成长整型。
【程序13】
题目:一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?
1.程序分析:在10万以内判断,先将该数加上100后再开方,再将该数加上268后再开方,如果开方后的结果满足如下条件,即是结果。请看具体分析:
【程序14】
题目:输入某年某月某日,判断这一天是这一年的第几天?
1.程序分析:以3月5日为例,应该先把前两个月的加起来,然后再加上5天即本年的第几天,特殊情况,闰年且输入月份大于3时需考虑多加一天。
【程序15】
题目:输入三个整数x,y,z,请把这三个数由小到大输出。
1.程序分析:我们想办法把最小的数放到x上,先将x与y进行比较,如果x> y则将x与y的值进行交换,然后再用x与z进行比较,如果x> z则将x与z的值进行交换,这样能使x最小。
【程序16】
题目:输出9*9口诀。
1.程序分析:分行与列考虑,共9行9列,i控制行,j控制列。
【程序17】
题目:猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个 第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下 的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少。
1.程序分析:采取逆向思维的方法,从后往前推断。
【程序18】
题目:两个乒乓球队进行比赛,各出三人。甲队为a,b,c三人,乙队为x,y,z三人。已抽签决定比赛名单。有人向队员打听比赛的名单。a说他不和x比,c说他不和x,z比,请编程序找出三队赛手的名单。
1.程序分析:判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被整除, 则表明此数不是素数,反之是素数。
【程序19】
题目:打印出如下图案(菱形)
*
***
******
********
******
***
*
1.程序分析:先把图形分成两部分来看待,前四行一个规律,后三行一个规律,利用双重 for循环,第一层控制行,第二层控制列。
【程序20】
题目:有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13...求出这个数列的前20项之和。
1.程序分析:请抓住分子与分母的变化规律。
【程序21】
题目:求1+2!+3!+...+20!的和
1.程序分析:此程序只是把累加变成了累乘。
【程序22】
题目:利用递归方法求5!。
1.程序分析:递归公式:fn=fn_1*4!
【程序23】
题目:有5个人坐在一起,问第五个人多少岁?他说比第4个人大2岁。问第4个人岁数,他说比第3个人大2岁。问第三个人,又说比第2人大两岁。问第2个人,说比第一个人大两岁。最后问第一个人,他说是10岁。请问第五个人多大?
1.程序分析:利用递归的方法,递归分为回推和递推两个阶段。要想知道第五个人岁数,需知道第四人的岁数,依次类推,推到第一人(10岁),再往回推。
【程序24】
题目:给一个不多于5位的正整数,要求:一、求它是几位数,二、逆序打印出各位数字。
【程序25】
题目:一个5位数,判断它是不是回文数。即12321是回文数,个位与万位相同,十位与千位相同。
【程序26】
题目:请输入星期几的第一个字母来判断一下是星期几,如果第一个字母一样,则继续 判断第二个字母。
1.程序分析:用情况语句比较好,如果第一个字母一样,则判断用情况语句或if语句判断第二个字母。
【程序27】
题目:求100之内的素数
【程序28】
题目:对10个数进行排序
1.程序分析:可以利用选择法,即从后9个比较过程中,选择一个最小的与第一个元素交换, 下次类推,即用第二个元素与后8个进行比较,并进行交换。
【程序29】
题目:求一个3*3矩阵对角线元素之和
1.程序分析:利用双重for循环控制输入二维数组,再将a[i][i]累加后输出。
【程序30】
题目:有一个已经排好序的数组。现输入一个数,要求按原来的规律将它插入数组中。
1. 程序分析:首先判断此数是否大于最后一个数,然后再考虑插入中间的数的情况,插入后此元素之后的数,依次后移一个位置。
【程序31】
题目:将一个数组逆序输出。
1.程序分析:用第一个与最后一个交换。
【程序32】
题目:取一个整数a从右端开始的4~7位。
程序分析:可以这样考虑:
(1)先使a右移4位。
(2)设置一个低4位全为1,其余全为0的数。可用~(~0 < <4)
(3)将上面二者进行&运算。
【程序33】
题目:打印出杨辉三角形(要求打印出10行如下图)
1.程序分析:
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1

【程序34】
题目:输入3个数a,b,c,按大小顺序输出。
1.程序分析:利用指针方法。
【程序35】
题目:输入数组,最大的与第一个元素交换,最小的与最后一个元素交换,输出数组。
【程序36】
题目:有n个整数,使其前面各数顺序向后移m个位置,最后m个数变成最前面的m个数
【程序37】
题目:有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。
【程序38】
题目:写一个函数,求一个字符串的长度,在main函数中输入字符串,并输出其长度。
【程序39】
题目:编写一个函数,输入n为偶数时,调用函数求1/2+1/4+...+1/n,当输入n为奇数时,调用函数1/1+1/3+...+1/n(利用指针函数)
【程序40】
题目:字符串排序。
【程序41】
题目:海滩上有一堆桃子,五只猴子来分。第一只猴子把这堆桃子凭据分为五份,多了一个,这只猴子把多的一个扔入海中,拿走了一份。第二只猴子把剩下的桃子又平均分成五份,又多了一个,它同样把多的一个扔入海中,拿走了一份,第三、第四、第五只猴子都是这样做的,问海滩上原来最少有多少个桃子?
【程序42】
题目:809*??=800*??+9*??+1 其中??代表的两位数,8*??的结果为两位数,9*??的结果为3位数。求??代表的两位数,及809*??后的结果。
【程序43】
题目:求0—7所能组成的奇数个数。
【程序44】
题目:一个偶数总能表示为两个素数之和。
【程序45】
题目:判断一个素数能被几个9整除
【程序46】
题目:两个字符串连接程序
【程序47】
题目:读取7个数(1—50)的整数值,每读取一个值,程序打印出该值个数的*。
【程序48】
题目:某个公司采用公用电话传递数据,数据是四位的整数,在传递过程中是加密的,加密规则如下:每位数字都加上5,然后用和除以10的余数代替该数字,再将第一位和第四位交换,第二位和第三位交换。
【程序49】
题目:计算字符串中子串出现的次数
【程序50】
题目:有五个学生,每个学生有3门课的成绩,从键盘输入以上数据(包括学生号,姓名,三门课成绩),计算出平均成绩,况原有的数据和计算出的平均分数存放在磁盘文件 "stud "中。

有些是C语言的题~但要用JAVA做

转自:http://topic.csdn.net/u/20070514/12/45df0d84-e6f8-4cb4-b9ee-c5101e12c7d6.html

『转csdn』国外工程师这样分析女人


1 追求女人你需要时间和金钱,因此:女人=时间×金钱

2 “时间就是金钱”,所以
时间=金钱

3 因此
女人=金钱×金钱=金钱的平方

4 “金钱是一切麻烦的根源”
金钱=麻烦的平方根

5 因此
女人=麻烦的平方根的乘方
女人=麻烦

危险物质数据表

元素:女人

符号:○+

发现者:亚当

原子量:接受值是55公斤,但据知可在45公斤到225公斤之间浮动

物理特性:

1。体表通常覆盖着粉底与化妆品构成的薄膜
2。毫无意义的沸腾-----毫无理由的结冰
3。以不同状态存在于自然界中,从纯净原材料到普通矿物质均有可能

化学特性:

1。极易与黄金、白金以及所有的贵重宝石发生反应
2。可能在没有任何理由及预警下会引起自发性严重爆炸
3。是人类已知的最强的金钱还原剂

用途:

1。高度装饰性,特别是摆在跑车中
2。对于疏解压力有很大的功效
3。非常有效的厨房清洁剂

危害:

1。将另一更优质样本置于旁边时会发青(指忌妒)
2。同时持有一个样本以上为违法,但数个样本可以在不直接接触的情形下保存在不同的场所

男人与女人争论获胜的可能性

绿字为约会期,蓝字为订婚期,黑字为婚姻期

横轴为年份,竖轴为获胜可能性的百分比


任务:去商场买条裤子

蓝线为男人,红线为女人

每个初学者都应该搞懂的问题 转

对于这个系列里的问题,每个学Java的人都应该搞懂。当然,如果只是学Java玩玩就无所谓了。如果你认为自己已经超越初学者了,却不很懂这些问题,请将你自己重归初学者行列。内容均来自于CSDN的经典老贴。

问题一:我声明了什么!

String s = "Hello world!";

许多人都做过这样的事情,但是,我们到底声明了什么?回答通常是:一个String,内容是“Hello world!”。这样模糊的回答通常是概念不清的根源。如果要准确的回答,一半的人大概会回答错误。
这个语句声明的是一个指向对象的引用,名为“s”,可以指向类型为String的任何对象,目前指向"Hello world!"这个String类型的对象。这就是真正发生的事情。我们并没有声明一个String对象,我们只是声明了一个只能指向String对象的引用变量。所以,如果在刚才那句语句后面,如果再运行一句:

String string = s;

我们是声明了另外一个只能指向String对象的引用,名为string,并没有第二个对象产生,string还是指向原来那个对象,也就是,和s指向同一个对象。

问题二:"=="和equals方法究竟有什么区别?

==操作符专门用来比较变量的值是否相等。比较好理解的一点是:
int a=10;
int b=10;
则a==b将是true。
但不好理解的地方是:
String a=new String("foo");
String b=new String("foo");
则a==b将返回false。

根据前一帖说过,对象变量其实是一个引用,它们的值是指向对象所在的内存地址,而不是对象本身。a和b都使用了new操作符,意味着将在内存中产生两个内容为"foo"的字符串,既然是“两个”,它们自然位于不同的内存地址。a和b的值其实是两个不同的内存地址的值,所以使用"=="操作符,结果会是 false。诚然,a和b所指的对象,它们的内容都是"foo",应该是“相等”,但是==操作符并不涉及到对象内容的比较。
对象内容的比较,正是equals方法做的事。

看一下Object对象的equals方法是如何实现的:
boolean equals(Object o){

return this==o;

}
Object 对象默认使用了==操作符。所以如果你自创的类没有覆盖equals方法,那你的类使用equals和使用==会得到同样的结果。同样也可以看出, Object的equals方法没有达到equals方法应该达到的目标:比较两个对象内容是否相等。因为答案应该由类的创建者决定,所以Object把这个任务留给了类的创建者。

看一下一个极端的类:
Class Monster{
private String content;
...
boolean equals(Object another){ return true;}

}
我覆盖了equals方法。这个实现会导致无论Monster实例内容如何,它们之间的比较永远返回true。

所以当你是用equals方法判断对象的内容是否相等,请不要想当然。因为可能你认为相等,而这个类的作者不这样认为,而类的equals方法的实现是由他掌握的。如果你需要使用equals方法,或者使用任何基于散列码的集合(HashSet,HashMap,HashTable),请察看一下java doc以确认这个类的equals逻辑是如何实现的。

问题三:String到底变了没有?

没有。因为String被设计成不可变(immutable)类,所以它的所有对象都是不可变对象。请看下列代码:

String s = "Hello";
s = s + " world!";

s 所指向的对象是否改变了呢?从本系列第一篇的结论很容易导出这个结论。我们来看看发生了什么事情。在这段代码中,s原先指向一个String对象,内容是 "Hello",然后我们对s进行了+操作,那么s所指向的那个对象是否发生了改变呢?答案是没有。这时,s不指向原来那个对象了,而指向了另一个 String对象,内容为"Hello world!",原来那个对象还存在于内存之中,只是s这个引用变量不再指向它了。
通过上面的说明,我们很容易导出另一个结论,如果经常对字符串进行各种各样的修改,或者说,不可预见的修改,那么使用String来代表字符串的话会引起很大的内存开销。因为 String对象建立之后不能再改变,所以对于每一个不同的字符串,都需要一个String对象来表示。这时,应该考虑使用StringBuffer类,它允许修改,而不是每个不同的字符串都要生成一个新的对象。并且,这两种类的对象转换十分容易。
同时,我们还可以知道,如果要使用内容相同的字符串,不必每次都new一个String。例如我们要在构造器中对一个名叫s的String引用变量进行初始化,把它设置为初始值,应当这样做:
public class Demo {
private String s;
...
public Demo {
s = "Initial Value";
}
...
}
而非
s = new String("Initial Value");
后者每次都会调用构造器,生成新对象,性能低下且内存开销大,并且没有意义,因为String对象不可改变,所以对于内容相同的字符串,只要一个String对象来表示就可以了。也就说,多次调用上面的构造器创建多个对象,他们的String类型属性s都指向同一个对象。
上面的结论还基于这样一个事实:对于字符串常量,如果内容相同,Java认为它们代表同一个String对象。而用关键字new调用构造器,总是会创建一个新的对象,无论内容是否相同。
至于为什么要把String类设计成不可变类,是它的用途决定的。其实不只String,很多Java标准类库中的类都是不可变的。在开发一个系统的时候,我们有时候也需要设计不可变类,来传递一组相关的值,这也是面向对象思想的体现。不可变类有一些优点,比如因为它的对象是只读的,所以多线程并发访问也不会有任何问题。当然也有一些缺点,比如每个不同的状态都要一个对象来代表,可能会造成性能上的问题。所以Java标准类库还提供了一个可变版本,即 StringBuffer。

问题四:final关键字到底修饰了什么?

final使得被修饰的变量"不变",但是由于对象型变量的本质是“引用”,使得“不变”也有了两种含义:引用本身的不变,和引用指向的对象不变。

引用本身的不变:
final StringBuffer a=new StringBuffer("immutable");
final StringBuffer b=new StringBuffer("not immutable");
a=b;//编译期错误

引用指向的对象不变:
final StringBuffer a=new StringBuffer("immutable");
a.append(" broken!"); //编译通过

可见,final只对引用的“值”(也即它所指向的那个对象的内存地址)有效,它迫使引用只能指向初始指向的那个对象,改变它的指向会导致编译期错误。至于它所指向的对象的变化,final是不负责的。这很类似==操作符:==操作符只负责引用的“值”相等,至于这个地址所指向的对象内容是否相等,==操作符是不管的。

理解final问题有很重要的含义。许多程序漏洞都基于此----final只能保证引用永远指向固定对象,不能保证那个对象的状态不变。在多线程的操作中,一个对象会被多个线程共享或修改,一个线程对对象无意识的修改可能会导致另一个使用此对象的线程崩溃。一个错误的解决方法就是在此对象新建的时候把它声明为final,意图使得它“永远不变”。其实那是徒劳的。

问题五:到底要怎么样初始化!

本问题讨论变量的初始化,所以先来看一下Java中有哪些种类的变量。
1. 类的属性,或者叫值域
2. 方法里的局部变量
3. 方法的参数

对于第一种变量,Java虚拟机会自动进行初始化。如果给出了初始值,则初始化为该初始值。如果没有给出,则把它初始化为该类型变量的默认初始值。

int类型变量默认初始值为0
float类型变量默认初始值为0.0f
double类型变量默认初始值为0.0
boolean类型变量默认初始值为false
char类型变量默认初始值为0(ASCII码)
long类型变量默认初始值为0
所有对象引用类型变量默认初始值为null,即不指向任何对象。注意数组本身也是对象,所以没有初始化的数组引用在自动初始化后其值也是null。

对于两种不同的类属性,static属性与instance属性,初始化的时机是不同的。instance属性在创建实例的时候初始化,static属性在类加载,也就是第一次用到这个类的时候初始化,对于后来的实例的创建,不再次进行初始化。这个问题会在以后的系列中进行详细讨论。

对于第二种变量,必须明确地进行初始化。如果再没有初始化之前就试图使用它,编译器会抗议。如果初始化的语句在try块中或if块中,也必须要让它在第一次使用前一定能够得到赋值。也就是说,把初始化语句放在只有if块的条件判断语句中编译器也会抗议,因为执行的时候可能不符合if后面的判断条件,如此一来初始化语句就不会被执行了,这就违反了局部变量使用前必须初始化的规定。但如果在else块中也有初始化语句,就可以通过编译,因为无论如何,总有至少一条初始化语句会被执行,不会发生使用前未被初始化的事情。对于try-catch也是一样,如果只有在try块里才有初始化语句,编译部通过。如果在 catch或finally里也有,则可以通过编译。总之,要保证局部变量在使用之前一定被初始化了。所以,一个好的做法是在声明他们的时候就初始化他们,如果不知道要出事化成什么值好,就用上面的默认值吧!

其实第三种变量和第二种本质上是一样的,都是方法中的局部变量。只不过作为参数,肯定是被初始化过的,传入的值就是初始值,所以不需要初始化。

问题六:instanceof是什么东东?

instanceof是Java的一个二元操作符,和==,>, <是同一类东东。由于它是由字母组成的,所以也是Java的保留关键字。它的作用是测试它左边的对象是否是它右边的类的实例,返回boolean类型的数据。举个例子:

String s = "I AM an Object!";
boolean isObject = s instanceof Object;

我们声明了一个String对象引用,指向一个String对象,然后用instancof来测试它所指向的对象是否是Object类的一个实例,显然,这是真的,所以返回true,也就是isObject的值为True。
instanceof有一些用处。比如我们写了一个处理账单的系统,其中有这样三个类:

public class Bill {//省略细节}
public class PhoneBill extends Bill {//省略细节}
public class GasBill extends Bill {//省略细节}

在处理程序里有一个方法,接受一个Bill类型的对象,计算金额。假设两种账单计算方法不同,而传入的Bill对象可能是两种中的任何一种,所以要用instanceof来判断:

public double calculate(Bill bill) {
if (bill instanceof PhoneBill) {
//计算电话账单
}
if (bill instanceof GasBill) {
//计算燃气账单
}
...
}
这样就可以用一个方法处理两种子类。

然而,这种做法通常被认为是没有好好利用面向对象中的多态性。其实上面的功能要求用方法重载完全可以实现,这是面向对象变成应有的做法,避免回到结构化编程模式。只要提供两个名字和返回值都相同,接受参数类型不同的方法就可以了:

public double calculate(PhoneBill bill) {
//计算电话账单
}

public double calculate(GasBill bill) {
//计算燃气账单
}

所以,使用instanceof在绝大多数情况下并不是推荐的做法,应当好好利用多态。

困扰80后的十大烦恼,你有吗?[转] --情况很真实 意见很中肯~顶

困扰80后的十大烦恼,你有吗?


 1.成天泡在网上,又不知道做什么好。80后最常说的一句话是“无聊”,尽管他们在网络上聊天花去了大把的时间。

  建议:聊天作为一种基本交流方式,所要达到的目的是获得认同。网上聊天很难达到这种认同,所以越聊越无聊。学习和工作累了,玩一玩游戏没错,但是打怪练级那些游戏基本上是得不偿失的,费时间,伤身体,还花钱。可以玩一玩趣味性强的休闲游戏,比如《纸客帝国》之类,轻松幽默,带点无厘头的风格,很能消除疲劳。靠玩游戏来交流感情是不现实的,要交流感情最好还是找个人去咖啡吧,或者堡个电话粥吧。

  成天泡在网上

  2.浮躁,好预测未知妄下定论。对看过的电影和电视剧,会按耐不住向别人透露下一个情节或者结局。对不了解的事物,根据一丁点信息发表长篇大论的见解,并且多半是批判的。对权威毫无理由的不耐烦,但绝不公开挑战,只热衷于影响身边的几个人,并有得到认同的强烈欲望。一旦不能如愿,就不再发言,部分人会暴跳如雷,令旁人费解。

  建议:多出去旅行,多读书,多参加团体活动,多接触社会。世界的绝大部分真相在我们的视野之外,浮躁是个人修养浅薄的表现,人既是社会成员也是自然的组成部分,需要积淀对世界尽可能的多认识,才能达到意识的足够高度,才能让人看起来不那么浮躁。

  该干什么才好......

  3.瘦弱,不爱运动。对健壮的人心存嘲讽,对肌肉和力量心存恐惧。在审美上受日式漫画的影响,崇尚中性美和病态美。与第一点有一定关系,在身体的耐力、韧性和爆发力上,更热衷于后者。但是在受到刺激之后,又会表现出病态的固执。这样就表现为两个极端,一方面弱不禁风,另一方面又偶尔会有惊人之举。

  建议:健身,多进行户外运动。身体是人最接近自然的组成部分,一个健康强壮不容易被击倒的身体可以让我们终生收益。

  病态美其实一点都不美

  4.性格软弱,喜欢为自己的意志不坚定找理由。不喜欢通过沟通达到与外界的意见统一,而是表面妥协,内心强烈反感,表现为通常所说的叛逆。性格软弱表现在与异性相处方面就是易犯花痴,对异性的正常关怀想入非非。在弄清楚是怎么回事之后,即使真的喜欢对方,也不敢大胆追求,而是找个理由退缩。通常的理由是说自己不了解爱情,也不想了解。

  建议:堂而皇之的与人打一架,正儿八经的谈一次恋爱。从自然法则的角度考虑的,作为雄性动物,与同性生物打架和向异性求爱都是走向成熟的标志。

  性格决定命运,软弱往往会丧失自己的利益

  5.消极,拒绝长大。不喜欢被人说成熟,尤其不能容忍被人说是老男人。不耐烦与长辈讨论一些实际的问题,反感政治,厌恶参加长辈在场的应酬。要负责任的事情,会让他们觉得焦虑不安和无奈。

  建议:尝试了解父母的不易。也可以从哲学层面去了解索取和付出之间的辩证关系,就象课本里所说的权利和义务的关系。

  不喜欢成熟,其实是不负责的

  6.选择性自闭,对熟人唠叨不休,对陌生人一言不发。偏爱使用方言或者网络语言等非大众语言。吸烟,但是不敬烟。喝酒,但是不敬酒。不是他们感兴趣的话题,基本上很难交谈下去。多人参与讨论时,如果没有人邀请他发言,即使他已酝酿好发言稿,还是会选择沉默。

  建议:这些其实都是在沟通上遇到的困难。建议扩大知识面,扩大社交圈,改变与人交谈的方式,勇敢表达自己的见解,努力将自己的观点传达并影响其他人。获得认同后就会产生激励,反复几次,就可以走出自闭。

  要多多与人群沟通,不要自闭

  7.习惯熬夜,25岁之前通宵次数明显较多。有时候为了“合理安排时间”,干脆用通宵来减少熬夜次数。实际上下半夜都在打瞌睡。

  建议:与第5点相同,熬夜其实就是自闭在作怪。有熬夜习惯的人,白天就找到了关门睡觉的理由,避免了外界的骚扰。或者白天虽然没有在家睡觉,因为精神上萎靡不振,能造成“外界不关我事”的错觉,也能达到抵制外界骚扰的目的。建议立刻改变作息时间,打开心扉。

  经常熬夜会损害美丽的容颜

  8.毫无理由的高傲。觉得别人不可能了解自己,并以此作为对别人不屑的理由。不愿意听别人的建议,也听不进。这种高傲连他们自己都不知道为什么。

  建议:由于时代因素,80后的自尊更为脆弱,从心理上就更趋向于自我保护,表现为对外界不信任。建议多了解一些社会规则,不管在什么场合,只要你在规则之内,你就是安全的,可以自由表达自己的存在价值。

  不要高傲,比你强的人有很多

  9.做事不按计划,讨厌按部就班,永远不知道钱花到哪里去了。以同时看多部小说,守多部漫画为荣。喜欢同时着手几件事,忙得焦头烂额是他们喜欢的状态,尽管这些事情只要合理安排是完全可以按部就班轻松完成的。

  建议:欲速则不达这个道理就不用说了吧。学会制定计划,可以避免紧急情况下全面崩盘的风险。

  怎么钱又花没了

  10.不问问题,相信百度和谷歌的权威,多数人喜欢用搜索引擎思考,将搜索引擎作为自己的智囊。

  建议:互联网确实给了我们许多方便,但是互联网上的东西很多都是未经考证,经不起推敲的。所以要避免犯错,这个地方正需要80后拿出怀疑精神来,不能依赖互联网而使自身的学习功能退化了。

2008年5月23日星期五

读取文本文件

public static List openFile(File file)
{
   List list = new ArrayList();
     File saveFile = file;
    
     try
     {
         FileReader fileReader = new FileReader(saveFile);
         BufferedReader bufferedReader = new BufferedReader(fileReader);
         String str;
        
         while((str = bufferedReader.readLine()) != null)
         {
         String [] sData = str.split("\\--");
         list.add(sData);
         }
         bufferedReader.close();
         fileReader.close();
     }
     catch(Exception exc){exc.printStackTrace();}
  
     return list;
}

2008年5月22日星期四

javascript 判断是否大于当前日期

function compareDate(DateOne)
   {
    var OneMonth = DateOne.substring(5,DateOne.lastIndexOf ("-"));
    var OneDay = DateOne.substring(DateOne.length,DateOne.lastIndexOf ("-")+1);
    var OneYear = DateOne.substring(0,DateOne.indexOf ("-"));
  
    if (Date.parse(OneMonth+"/"+OneDay+"/"+OneYear) >
     new Date().getTime())
    {
     return true;
    }
    else
    {
     return false;
    }
  
   }

2008年5月21日星期三

看一眼就有新收获

        for(int i = 0;i < list.size();i++){
          dosomething(list.get(i));
       }
      
      
       for(int i = 0,n = list.size();i < n;i++){
          dosomething(list.get(i));
       }
      
       //得闲看了一眼effective java,看一眼就有新收获
       //后一种for循环的写法比前一种有平方级的性能提升
       //因为第一种,每循环一次都要调用一次list.size()方法
       //如果能确定list.size()固定不变,推荐使用后一种循环

郁闷

想自己写个web应用,东瞅瞅西看看,苦于没有思路....

正则表达式30分钟入门教程

需要写个正则替换字符,网上找来个入门教程,很实用

正则表达式30分钟入门教程

2008年5月20日星期二

oracle 随机取记录

select * from (select * from apply_info order by dbms_random.value) where rownum <= 3

2008年5月15日星期四

不用正则表达式替换字符串

public class Test {
/**
* Simplest in Java 1.5, using the replace method, which
* takes CharSequence objects.
*/
public static String replace15(
    String aInput, String aOldPattern, String aNewPattern
){
    return aInput.replace(aOldPattern, aNewPattern);
}

/**
* Not quite as simple in Java 1.4. The replaceAll method works,
* but requires more care, since it uses regular expressions, which
* may contain special characters.
*/
public static String replace14(
    String aInput, String aOldPattern, String aNewPattern
){

    /*
    * The replaceAll method is a bit dangerous to use.
    * The aOldPattern is converted into a regular expression.
    * Thus, if aOldPattern may contain characters which have
    * special meaning to regular expressions, then they must
    * be 'escaped' before being passed to replaceAll. It is
    * easy to forget to do this.
    *
    * In addition, aNewPattern treats '$' as special characters
    * as well: they refer to 'back references'.
    */
    return aInput.replaceAll(aOldPattern, aNewPattern);
    /*
    Here is an alternative implementation using Pattern and Matcher,
    which is preferred when the same pattern is used repeatedly
    final Pattern pattern = Pattern.compile( aOldPattern );
    final Matcher matcher = pattern.matcher( aInput );
    return matcher.replaceAll( aNewPattern );
    */
}

/**
* If Java 1.4 is unavailable, the following technique may be used.
*
* @param aInput is the original String which may contain substring aOldPattern
* @param aOldPattern is the non-empty substring which is to be replaced
* @param aNewPattern is the replacement for aOldPattern
*/
public static String replaceOld(
    final String aInput,
    final String aOldPattern,
    final String aNewPattern
){
     if ( aOldPattern.equals("") ) {
        throw new IllegalArgumentException("Old pattern must have content.");
     }

     final StringBuffer result = new StringBuffer();
     //startIdx and idxOld delimit various chunks of aInput; these
     //chunks always end where aOldPattern begins
     int startIdx = 0;
     int idxOld = 0;
     while ((idxOld = aInput.indexOf(aOldPattern, startIdx)) >= 0) {
       //grab a part of aInput which does not include aOldPattern
       result.append( aInput.substring(startIdx, idxOld) );
       //add aNewPattern to take place of aOldPattern
       result.append( aNewPattern );

       //reset the startIdx to just after the current match, to see
       //if there are any further matches
       startIdx = idxOld + aOldPattern.length();
     }
     //the final chunk will go to the end of aInput
     result.append( aInput.substring(startIdx) );
     return result.toString();
}

/** Example: update an ip address appearing in a link. */
public static void main (String[] aArguments) {
    String OLD_IP = "insert into LOAD_POLIINFO (IDCARD,POLISTAT,JOINDATE,LOADNO) values ('110102197906300508','13',to_date('null ','yyyy-mm-dd'),70990)";
log(replaceOld(OLD_IP,"to_date('null ','yyyy-mm-dd')","null"));
}
private static void log(String aMessage){
    System.out.println(aMessage);
}
}

参考自:http://www.javapractices.com/topic/TopicAction.do?Id=80

             http://biostar.blog.sohu.com/69732830.html

所谓专家 < 蛤蟆

养一群地震局“专家”,不如养一群蛤蟆

2008年5月9日星期五

从指定的数组中随机取n个

import java.util.*;

public class Test
{
public static void main(String[] agrs)
{
   int[] allIdList = new int[]{1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20};
   int[] randomIdList = new Test().getRandomIdList(allIdList,10);
   for(int randomIdList_index = 0;randomIdList_index < randomIdList.length;randomIdList_index++){
    System.out.println(randomIdList[randomIdList_index]);
   }
}


/**
*
* @author liuzhaochun
* @explain:从指定的数组中随机取count个,返回这个数组
* @datetime:2008-5-9
* @return
* @return int [] 包含随机取的count个值的数组
*/
public int[] getRandomIdList(int[] allIdList,int count){
  
   int[] randomIdList = new int[count];
   int randomIdList_index = 0;
   for(int allIdList_index = allIdList.length - 1; randomIdList_index < count;allIdList_index--,randomIdList_index++){
    int temp_Index = (int)(Math.random() * allIdList_index);
    randomIdList[randomIdList_index] = allIdList[temp_Index];
    allIdList[temp_Index] = allIdList[allIdList_index];
   }
   return randomIdList;
}



}

2008年5月5日星期一

C#实现类似Excel自动填充单元格,后面的数字累加

class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine(Next("abc123def345ghi"));
            Console.Read();

        }

        private static string Next(string s)
        {
            if (!isNumber(s.Substring(s.Length-1,1)))
                s = s + "0";
            MatchCollection coll = Regex.Matches(s, @"\d+");
            Match m = coll[coll.Count - 1];

            return s.Substring(0, m.Index) + NextNum(m.Value);
        }
        private static string NextNum(string s)
        {
            char[] cs = s.ToCharArray();
            for (int i = s.Length - 1; i >= 0; i--)
            {
                if (!NextChar(ref   cs[i])) break;
            }
          
            string re = new string(cs);
            if (Int32.Parse(re) == 0)
                re = "1" + re;
            return re;
        }
        private static bool NextChar(ref   char c)
        {
            string p = "01234567890123456789";
            int n = p.IndexOf(c);
            c = p[(n + 1) % 10 + 10 * (n / 10)];
            return (n == 9 || n == 19);
        }
        public static bool isNumber(string str)
        {
            Regex r = new Regex(@"^\d+(\.)?\d*$");
            if (r.IsMatch(str))
            {
                return true;
            }
            else
            {
                return false;
            }
        }

2008年4月30日星期三

五一了嘛 今儿咱民工高产

今儿咱民工真高产,劳动节了嘛,哈哈

真的希望像我那头猪一样啊,呵呵

睡吧,明天太阳会升起

不对,今天的太阳就要升起 呵呵

咯色的垃圾

咯色的垃圾就应该扔到无人烟的垃圾堆里,爱咋咋地去,省的惹别人一身臭

大家离我远点

怎样让自己平静 沉着

我遇到什么事不能解决就慌乱,心烦,跟他娘的女人来事儿似的,呵呵,据说是

更不用说,几件事压在头上了

能够坦然的,游刃有余的处理来自各方的琐事,可能就是比较高的人了吧,呵呵

想想,周末好像有成为黑色的趋势,听着老婆不时的唠叨妹妹的这啊那啊的,不知如何是好

小系统做了半年多还没结项,开始丧失在大大那的赏识

并且占用了我所有的业余时间,老婆都要跑了

而且老扯票撒谎的出去,心都虚了,每次要编个瞎话跟他娘的下地狱似的,痛苦

太嫩....

我真的变了吗

认识我的人大都说我变了

我难以判定,好像是变了,变怎么了?不知道,大多说我变垃圾了

开始时,看电视也好,电影也好,故事也好,两个人吵架,大都是因为互相不理解,有未言明的误会,吵啊吵的不可开交,甚至不可挽回,那时我就告诉自己,遇到这样的事一定要,立刻解释清楚,静下心来坦言,消除了误会,让对方理解了,也就好了。而现在,我很不想去解释,想的是如果言明了就没意思了,唉...可能也不能一概而论,可能也要分什么事情,可能也分什么关系的人,有默契的人可能就不用解释

人啊,郁闷而又闲闲的时候就容易胡思乱想。

开始有点讨厌这个公司了

发现如果某人惹你不高兴了,一段时间内,你看他哪都不顺眼,呵呵

北京人儿啊,都那么自信,自信的让人都只能隐形了

只知道让人干活的公司会是什么样?就像老一辈讲求无私奉献,为实现共产而努力奋斗,呵呵,我们得到什么了呢,老一辈还得到精神上的满足,我们连精神上的都没了,加班费都不好好给报了,我日啊,老子是喜欢钱地。

开始羡慕民工了,呵呵,

可咱翅膀还没长硬,忍着吧

学习 学习 学习

心情不好

心情不好时就抽烟,喝酒,可命的抽,昨晚浏览了个电影,韩国的,一帅哥爱喝酒抽烟,得了肝硬化,放下身边的工作,妈妈,女友,去疗养院了。呵呵,难道韩国有这样的规定?在我的世界不知道谁能做到去疗养院,能去医院看看,听医嘱,就是有条件的了。

从地铁出来都十一点了,看着外面一个个摆摊卖玉米的,等活儿的出租车司机,人活着比他妈狗都难。

今天公司聚餐,老总说她别看那么大岁数了,可比我们健康,让我们一定要注意身体,她每周都至少在健身房呆两个小时,呵呵,不是一个阶层的人啊,俺倒想去健身房,俺还没房住呢,咋整...

唉...内外兼忧啊

五一是什么节来着,我日啊

好像从开始上大学开始有五一放假这一说,大学时候的放假忘了都干啥了,只记得刚上大一的第一个十一是自己一个人在宿舍过的,大家都回家了。

毕业后的五一都该成我的受难日了,呵呵

劳动节?

北京的地铁真便宜

今天晚上花2块钱16*2站地,大半个北京了,刚回来,可累死了,还好赶上了末班车,要不就惨了,身上就10块钱,在这里祝她老爷子生日快乐,呵呵,虽然人家用不着...

鸟人

我这么个鸟人,自己都没办法,唉...

懦弱,咯色,孤僻,小人,虚荣,胆怯,庸俗,冷血

2008年4月29日星期二

被忽悠了 呵呵

被忽悠了呵呵,谢谢

啥是法儿
今儿累坏了,上午改那该死的bug,下午急匆匆跑了趟前门,刚到就公司打电话找,真他娘的倒霉,又急急忙忙敢了回来,干活,下班了,打个电话吧,呵呵,才知道原来是被忽悠了一天,唉...啥是法儿,还是那么地,只能怪自己,回家吧,呵呵
对了,今天骑的自行车,发现也不比原来远多少,当初怎么就冲动买了电动车呢,下了班,慢慢悠悠骑回来了,唉...想想会有回家的劲儿,一个人都没有,都是自个作地,受吧。

唉...最近不顺,没啥精神事儿

五一了,呵呵 ,又

2008年4月28日星期一

我怎么觉得我是那么的咯色

郁闷

做了个小活儿弄得我不得安宁,

心里有事儿,不安,做什么都没心情,烦躁

因为需要给人家去部署,跟公司说有事出去,都不好意思了,好多次了,唉,,,

这么点小事搞的我到处撞墙,老婆都跑了,怪我,太咯色,呵呵,

知道她很想让我带她出去逛街,可我真的是没有心思,又不想让她扫兴,就这么不知如何是好的过了两天

她慌慌着五一回家,我确一点心思没有,回家,向来对我没有吸引力,家里人好像也没问过我回不回去

有个哥们儿真是让我烦,格格不入,也不知是我变了,还是他变了,或许是我太敏感了,越来越咯色

妹妹与老婆的中间是我,让我这个不善维和的笨蛋自己在这发霉,好像现在也没什么,只是老婆发发牢骚,感觉有颗定时炸弹在我心中

下午把跟随我征战北京的自行车骑回来了,骑自行车,爽

自己闷在家里发呆,头疼。

我好想过个快乐的周末,好久没有了。都怪自己没能力,太嫩

以前觉得自己挺会小资的,现在怎么这么机械了呢,越来越俗了。

2008年4月27日星期日

向div中插入动画

//elm: div id

//url:flash url

//w:width

//h:height

function insertFlash(elm, url, w, h, id) {
if (!document.getElementById(elm)) return;
var str = '';
str += '<embed width="'+ w +'" height="'+ h +'" src="'+ url +'" quality="autohigh" wmode="opaque" type="application/x-shockwave-flash" plugspace="http://www.macromedia.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash" id='+id+'></embed>';
document.getElementById(elm).innerHTML = str;
}

2008年4月22日星期二

去掉字符串中多余的空格

import java.util.regex.Matcher; import java.util.regex.Pattern;
public class Test
{


    public static void main(String arg[])
    {
   
        String s = "abc 123    456";
        System.out.println(s);

        while(true){
       
            int index = s.indexOf(" ");
            if(index > 0){
                s = s.replaceAll(" "," ");
            }else{
                break;
            }
        }
       
        System.out.println(s);
    }

public static String replace(String inputStr, String replaceStr) {
            Pattern p = Pattern.compile(" +");
            Matcher m = p.matcher(inputStr);
            return m.replaceAll(replaceStr);
       }


}

C# 在word文档中复制表格并粘帖到下一页中

object oMissing = System.Reflection.Missing.Value;
            Microsoft.Office.Interop.Word._Application oWord;
            Microsoft.Office.Interop.Word._Document oDoc;
            oWord = new Microsoft.Office.Interop.Word.Application();
            //显示word文档
            oWord.Visible = true;
            //取得word文件模板
            object fileName = System.Windows.Forms.Application.StartupPath + "\\word.doc";
            //根据模板生成一个新文档,相当于另存为
            oDoc = oWord.Documents.Add(ref fileName, ref oMissing,
                            ref oMissing, ref oMissing);

            //复制第一个表格
            oDoc.Tables[1].Select();
            oWord.Selection.Copy();

            //在这里操作表格中的文本
            oDoc.Tables[1].Cell(1, 1).Range.Text = "这是第一个表格";

            //下一页
            object mymissing = System.Reflection.Missing.Value;
            object myunit = Microsoft.Office.Interop.Word.WdUnits.wdStory;
            oWord.Selection.EndKey(ref myunit, ref mymissing);
            object pBreak = (int)Microsoft.Office.Interop.Word.WdBreakType.wdPageBreak;
            oWord.Selection.InsertBreak(ref pBreak);

            //粘贴第一个表格
            oWord.Selection.Paste();

            oDoc.Tables[2].Cell(1, 1).Range.Text = "这是第二个表格";