2009年1月8日星期四

开始学习struts2(四)

关于类型转换还有一种写法:public class ConverterPoint extends StrutsTypeConverter {

//    @Override
//    public Object convertValue(Map context, Object value, Class toType) {
//        if(Point.class == toType){
//            String[] params = (String[])value;
//            params = params[0].split(",");
//            Point point = new Point();
//            point.setX(Integer.parseInt(params[0]));
//            point.setY(Integer.parseInt(params[1]));
//            return point;
//           
//        }else if(String.class == toType){
//            Point point = (Point)value;
//            return "x=" + point.getX() + ",y=" + point.getY();
//        }
//        return super.convertValue(context, value, toType);
//    }

    @Override
    public Object convertFromString(Map arg0, String[] arg1, Class arg2) {
        String[] params = arg1;//(String[])value;
        params = params[0].split(",");
        Point point = new Point();
        point.setX(Integer.parseInt(params[0]));
        point.setY(Integer.parseInt(params[1]));
        return point;
    }

    @Override
    public String convertToString(Map arg0, Object arg1) {
        Point point = (Point)arg1;
        return "x=" + point.getX() + ",y=" + point.getY();
    }

   
}
原来是继承ognl.DefaultTypeConverter类,现在改成继承 org.apache.struts2.util.StrutsTypeConverter类了,看 org.apache.struts2.util.StrutsTypeConverter的源码可知道 org.apache.struts2.util.StrutsTypeConverter是个抽象类,并实现了 ognl.TypeConverter,org.apache.struts2.util.StrutsTypeConverter中有两个要实现的方法 一个convertFromString,一个convertToString,看方法名字就知道一个从字符串转换成Object,一个是将Object 转换成String,这样好像更加清晰

另外还有一种全局转换的配置,就是建立一个统一的属性文件,文件名为xwork-conversion.properties,与struts.xml位于统一目录下,里面的配置改成了
com.test.struts2.data.Point=com.test.struts2.action.ConverterPoint
意思是所有com.test.struts2.data.Point类型的对象都要通过com.test.struts2.action.ConverterPoint来转换

2009年1月5日星期一

开始学习struts2(三)

struts2局部类型转换

需求为:在页面的文本框输入一个x、y坐标,之间用","隔开,Action中有一个Point类型的属性,Point类里面有两个字段,分别是 x,y,int型,要求当页面提交时将文本框中的字符串转换成Point对象,当Action返回到页面时将Point转换成字符串显示

1、首先做一个jsp用于输入和提交:point.jsp

<s:form action="Converter">
<s:textfield name="point" label="Point"></s:textfield>
<s:textfield name="point.x" label="Point.X"></s:textfield>
<s:textfield name="point.y" label="Point.Y"></s:textfield>
<s:submit label="submit"></s:submit>
</s:form>

2、再建一个用于显示的jsp-converter.jsp

<body>
<s:property value="point"/><br>
<s:property value="point.x"/><br>
<s:property value="point.y"/><br>
</body>

3、Action类 ConverterAction

public class ConverterAction extends ActionSupport{

private Point point;

public Point getPoint() {
return point;
}

public void setPoint(Point point) {
this.point = point;
}

public String execute()throws Exception {
return "success";
}
}

4、struts.xml

<action name="Converter"
class="com.test.struts2.action.ConverterAction">
<result name="success">/converter.jsp</result>
<result name="input">/point.jsp</result>
</action>

5、转换类 ConverterPoint

public class ConverterPoint extends DefaultTypeConverter {

@Override
public Object convertValue(Map context, Object value, Class toType) {
if(Point.class == toType){
String[] params = (String[])value;
params = params[0].split(",");
Point point = new Point();
point.setX(Integer.parseInt(params[0]));
point.setY(Integer.parseInt(params[1]));
return point;

}else if(String.class == toType){
Point point = (Point)value;
return "x=" + point.getX() + ",y=" + point.getY();
}
return super.convertValue(context, value, toType);
}


}

6、配置转换
在ConverterAction 类的同一目录下定义属性文件ConverterAction-conversion.properties,注意文件 名,-conversion.properties为固定不变,ConverterAction为Action的名字,文件内容:

point=com.test.struts2.action.ConverterPoint

Ok了,这样就完工了

开始学习struts2(二)

前两天初步认识了一下struts2
今儿看来教程的第二三讲,搞清了一些前面的一些猜测或是疑问
1、struts2是不用<html:...>标签了,统一成了<s:...>
如下这样:
<s:form action="Converter">
<s:textfield name="point" label="Point"></s:textfield>
<s:submit label="submit"></s:submit>
</s:form>
显示效果:

注意到<s:textfield name="point" label="Point"></s:textfield>
中的label属性,它指定了文本框前面显示的内容,还自动加了冒号,哈哈,挺聪明的嘛,但是担心这样在复杂的页面设计中是不是好使。

哦对了,要想这么写,要在页面上方加上这个:<%@ taglib prefix="s" uri="/struts-tags" %>

2、Action
前面说的Action不再需要继承任何struts类,现在看来要失望了,为了方便起见还是建议集成ActionSupport类,目前觉得有用的是 ActionSupport中定义了几个static的result name,比如SUCCESS、ERROR,原来的return "success";现在可以写成return super.SUCCESS;,将标识用的字符串常量定义成static的是一直提倡的,还有就是validate()方法,验证有错误可以调用 addFieldError()方法,好像就是struts1 ActionForm里的东西,有所改进的是super.addFieldError("username", "username is null");将在页面中显示的效果为:错误信息"username is null"将在名字为"username"文本框的上面显示,这些如果能用ajax实现就好了。
对于Action解耦,可能在于它不再需要HttpServletRequest 、HttpServletResponse这样的容器运行时参数吧

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()
}