2009年3月30日星期一

vs2008 无法打开项目文件

vs2008 无法打开项目文件 .vsproj .vdproj
此安装不支持该项目类型C:\Documents and Settings\Administrator\Local Settings\Temp

因为莫名其妙的错误,刚刚重新ghost了系统,然后重装了vs2008,之后打开我原来的项目报上面的错误,狂晕,项目文件我也没动过啊,搜索微软帮助,建议重装vs2008,重装vs2008后可以了

==
今天想学学WPF,靠,打开我原来建的一个WPF项目还报上面的错误,突然想到我以前装过vs2008 sp1

大大提醒了我

装上sp1后 OK

转载:

安装中文VS2008 SP1 和.NETFRAMEWORK 3.5SP1后智能提示是英文的解决办法
期待已久的VS2008 SP1 和.NET FRAMEWORK 3.5 SP1都出来了

下载地址

Microsoft Visual Studio 2008 Service Pack 1 (iso)

http://www.microsoft.com/downloads/details.aspx?displaylang=zh-cn&FamilyID=27673c47-b3b5-4c67-bd99-84e525b5ce61

Visual Studio 2008 Team Foundation Server Service Pack 1(iso)

http://www.microsoft.com/downloads/details.aspx?displaylang=zh-cn&FamilyID=9e40a5b6-da41-43a2-a06d-3cee196bfe3d

Microsoft .NET Framework 3.5 Service Pack 1

http://www.microsoft.com/downloads/details.aspx?displaylang=zh-cn&FamilyID=ab99342f-5d1a-413d-8319-81da479ab0d7

      第一时间安装完后,智能提示却是英文的,呵呵这对于我这个英文不好的人来说,有点郁闷,重新装了好几次.NETFROAMWORK 3.5 SP1语言包都解决不了问题,后来就用备份的资源文件替换掉ZH-CN目录。问题解决掉了呵呵,下载地址

点击下载(2.0)

完了解压后,替换掉

C:\Windows\Microsoft.NET\Framework\v2.0.50727\zh-CN 目录,

点击下载(3.0)

完了解压后,替换掉

C:\Program Files\Reference Assemblies\Microsoft\Framework\v3.0\zh-CN目录

点击下载(3.5)

完了解压后,替换掉

C:\Program Files\Reference Assemblies\Microsoft\Framework\v3.5\zh-CN目录

2009年3月26日星期四

myeclipse7插件安装

import java.io.File;
import java.util.ArrayList;
import java.util.List;

public class Test {
private String path;

public Test(String path) {
   this.path = path;
}

public void print() {
   List list = getFileList(path);
   if (list == null) {
    return;
   }

   int length = list.size();
   for (int i = 0; i < length; i++) {
    String result = "";
    String thePath = getFormatPath(getString(list.get(i)));
    File file = new File(thePath);
    if (file.isDirectory()) {
     String fileName = file.getName();
     if (fileName.indexOf("_") < 0) {
      continue;
     }
     String[] filenames = fileName.split("_");
     String filename1 = filenames[0];
     String filename2 = filenames[1];
     result = filename1 + "," + filename2 + ",file:/" + path + "\\"
       + fileName + "";
     System.out.println(result);
    } else if (file.isFile()) {
     String fileName = file.getName();
     if (fileName.indexOf("_") < 0) {
      continue;
     }
     int last = fileName.lastIndexOf("_");// 最后一个下划线的位置
     String filename1 = fileName.substring(0, last);
     String filename2 = fileName.substring(last + 1, fileName
       .length() - 4);
     result = filename1 + "," + filename2 + ",file:/" + path + "\\"
       + fileName + ",4,false";
     System.out.println(result);
    }
   }
}

public List getFileList(String path) {
   path = getFormatPath(path);
   path = path + "/";
   File filePath = new File(path);
   if (!filePath.isDirectory()) {
    return null;
   }
   String[] filelist = filePath.list();
   List filelistFilter = new ArrayList();

   for (int i = 0; i < filelist.length; i++) {
    String tempfilename = getFormatPath(path + filelist[i]);
    filelistFilter.add(tempfilename);
   }
   return filelistFilter;
}

public String getString(Object object) {
   if (object == null) {
    return "";
   }
   return String.valueOf(object);
}

public String getFormatPath(String path) {
   path = path.replaceAll("\\\\", "/");
   path = path.replaceAll("//", "/");
   return path;
}

public static void main(String[] args) {
   new Test(
     "D:\\Program Files\\Genuitec\\Common\\Dropins\\JSEclipse\\eclipse\\plugins")
     .print();//插件路径
}
}
执行完之后,将控制台中打印出的执行结果,直接复制到下面这个文件中: C:\Genuitec\MyEclipse 7.0\configuration\org.eclipse.equinox.simpleconfigurator\bundles.info

E:\Program Files\Genuitec\Common\plugins\vss\eclipse\plugins\org.vssplugin_1.6.1

2009年3月19日星期四

hibernate异常

备案:
java.lang.IllegalStateException: No data type for node: org.hibernate.hql.ast.tree.IdentNode


hibernate查询时报上面的异常,仔细检查hql写的有不对的地方,我就是把逗号,写成点.

2009年2月17日星期二

获取这个月的最后一天

给你一个日期2009-01-01 00:00:00 获取这个月的最后一天。
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date=null;
try {
    date = sdf.parse("2009-12-01 00:00:00");
} catch (ParseException e) {
    e.printStackTrace();
}
Calendar calendar = new GregorianCalendar();
calendar.setTime(date);
calendar.set(Calendar.DATE, calendar
        .getActualMaximum(Calendar.DATE));
Date d = calendar.getTime();
System.out.println(sdf.format(d));

2009年2月5日星期四

开始学习struts2(七)

好久没写了,过了个年,过了七天猪的日子,吃了睡睡了吃中间偶尔看看电视,为假期准备了几个电影都没看,唉:-(忙,上了几天班了,怎么感觉这周过的这么慢呢,刚刚刚周四
昨儿看了一集struts2

总结几点

1、struts.xml中的package标签有个abstract="true"属性,如果为true,则这个package中不能有<action>标签,为true表示这个package为一个抽象package,就像java中的接口中不能有方法实现似的。

2、package标签还有个namespace属性,它关系到这个package中的action访问路径,默认是"",比如

<package name= "capinfo" extends= "struts-default" namespace="/hello">
<action name= "HelloWorld"
class= "com.capinfo.struts2.action.HelloWordAction" >
<result>/HelloWorld.jsp</result>
</action>
</package>

则jsp中则应为<form action="/hello/HelloWorld.action" method="post">,如果没有找到hello/HelloWorld.action则会寻找namespace为""的,也就是HelloWorld.action,如果再没有,就会抛出异常。

3、在struts1中可以有多个struts-config.xml的文件,只要在web.xml配置org.apache.struts.action.ActionServlet时加到config参数中,以逗号分隔,在struts2中也可以有多个struts.xml形式的文件,这次不需要修改web.xml了,在struts.xml中添加诸如
<include file=""/>就Ok了

4、关于struts各种参数的配置信息位于struts2-core.jar/org.apache.struts2/default.properties中,如果要修改里面的配置,有两种方式,一是在struts.xml中配置,例如<constant name="struts.devMode" value="true" />,二是在classess中建一个struts.properties,在里面配置比如struts.i18n.encoding=GBK,在struts2-core.jar/org.apache.struts2/default.properties中有一下这句注释,说明了struts.properties将覆盖default.properties中的配置

### Struts default properties
###(can be overridden by a struts.properties file in the root of the classpath)
###

就总结这么些先。

2009年2月2日星期一

2009年全年放假安排

一、元旦:1月1日至3日放假,共3天。其中,1月1日(星期四、新年)为法定节假日,1月3日(星期六)为公休日。1月4日(星期日)公休日调至1月2日(星期五)。1月4日(星期日)上班。  

二、春节:1月25日至31日放假,共7天。其中,1月25日(星期日、农历除夕)、1月26日(星期一、农历正月初一)、1月27日(星期二、农历正月初二)为法定节假日,1月31日(星期六)照常公休;1月25日(星期日)公休日调至1月28日(星期三),1月24日(星期六)、2月1日(星期日)两个公休日调至1月29日(星期四)、1月30日(星期五)。1月24日(星期六)、2月1日(星期日)上班。  

三、清明节:4月4日至6日放假,共3天。其中,4月4日(星期六、农历清明当日)为法定节假日,4月5日(星期日)照常公休。4月4日(星期六)公休日调至4月6日(星期一)。  

四、劳动节:5月1日至3日放假,共3天。其中,5月1日(星期五、“五一”国际劳动节)为法定节假日,5月2日(星期六)、5月3日(星期日)照常公休。  

五、端午节:5月28日至30日放假,共3天。其中,5月28日(星期四、农历端午当日)为法定节假日,5月30日(星期六)照常公休;5月31日(星期日)公休日调至5月29日(星期五);5月31日(星期日)上班。  

六、国庆节、中秋节:10月1日至8日放假,共8天。其中,10月1日(星期四)、10月2日(星期五)、10月3日(星期六)为国庆节法定节假日,10月4日(星期日)照常公休;10月3日(星期六)公休日及中秋节分别调至10月5日(星期一)、10月6日(星期二),9月27日(星期日)、10月10日(星期六)公休日调至10月7日(星期三)、10月8日(星期四)。9月27日(星期日)、10月10日(星期六)上班。

2009年1月17日星期六

开始学习struts2(六)

前两天实践了关于拦截器的具体实现,说实话关于底层实现还没有看明白,看jdk的源码中的
public static Class<?> getProxyClass(ClassLoader loader,Class<?>... interfaces)
方法,好长啊
迂回一下,今儿看struts2的具体拦截器Interceptor怎么配置
配置可比自己写实现拦截器容易多了
1、首先写一个拦截器类,拦截器类有两只写法(目前俺知道的)
一种是显示com.opensymphony.xwork2.interceptor.Interceptor接 口,com.opensymphony.xwork2.interceptor.Interceptor接口有三个方法destroy()、init() 和String intercept(ActionInvocation actionInvocation),跟过滤器差不多
这里指出的是init初始化方法将在容器启动是调用这个方法。
package com.test.interceptor;

/**
* Created by IntelliJ IDEA.
* User: Administrator
* Date: 2009-1-15
* Time: 16:34:17
* To change this template use File | Settings | File Templates.
*/
import com.opensymphony.xwork2.interceptor.Interceptor;
import com.opensymphony.xwork2.ActionInvocation;

public class MyInterceptor implements Interceptor{

    public void destroy() {

    }

    public void init() {

    }

    public String intercept(ActionInvocation actionInvocation) throws Exception {

        System.out.println("test intercept begin");
        String result = actionInvocation.invoke();
        System.out.println("test intercept finish");
        return result;
    }
}
另一种就是继承com.opensymphony.xwork2.interceptor.AbstractInterceptor,这是个抽象类,并实 现了com.opensymphony.xwork2.interceptor.Interceptor接口,分别实现了init和destroy方法, 但什么都没做,继承AbstractInterceptor后,实现intercept方法就行了,
这里指出的是在intercept方法中执行actionInvocation.invoke();执行所拦截的action中的方法;
2、拦截器写完了剩下就是配置了,这里要用到struts.xml的组织结构<struts>中有<package>包的的概 念,包与包之间可以继承extends,就像子类继承父类一样,子类将拥有父类的属性和配置,我们一般都继承extends="struts- default",而struts-default定义在struts2-core.jar 中的struts-default.xml中,struts-default包中定义了很多struts2提供的拦截器和拦截器栈(拦截器栈可以包含多个 拦截器或拦截器栈),struts2的好多功能都是实现在这些拦截器中,其中有个<default-interceptor-ref name="defaultStack"/>标签定义了默认的拦截器,如果<action>配置中没有拦截器配置,那就调用默认拦截 器,如果有拦截器配置,要么同时加上默认拦截器,要么在自己的package中加入设置默认拦截器的标签。
<package name="capinfo" extends="struts-default">
        <interceptors>
            <interceptor name="myInterceptor" class="com.test.interceptor.MyInterceptor">
            </interceptor>
        </interceptors>
        <action name="HelloWorld"
            class="com.capinfo.struts2.action.HelloWordAction">
            <result>/HelloWorld.jsp</result>
            <interceptor-ref name="myInterceptor"></interceptor-ref>
            <interceptor-ref name="defaultStack"></interceptor-ref>
        </action>

        <!-- Add your actions here -->
    </package>

2009年1月14日星期三

开始学习struts2(五)

说是struts2的核心就是拦截器
先看看拦截器的实现
实现拦截器有这么几个东西构成
1、目标对象-将被拦截的对象,这个对象中的方法被调用是将被拦截
要求目标对象面向接口编程,首先要定义接口package com.test.interceptor;

/**
* Created by IntelliJ IDEA.
* User: Administrator
* Date: 2009-1-9
* Time: 17:37:23
* 面向接口编程
* 目标对象的接口
*/
public interface TargetInterface {
    public void doSomething();
}目标对象实现
package com.test.interceptor;

/**
* Created by IntelliJ IDEA.
* User: Administrator
* Date: 2009-1-9
* Time: 17:36:26
* 目标对象
*/
public class Target implements TargetInterface{
    public void doSomething(){
        System.out.println("do something");
    }
}
2、拦截器对象-里面包含在调用目标对象前或后要调用的方法package com.test.interceptor;

/**
* Created by IntelliJ IDEA.
* User: Administrator
* Date: 2009-1-9
* Time: 17:39:32
* 拦截器
*/
public class Interceptor {
    public void before(){
        System.out.println("before");
    }

    public void after(){
        System.out.println("after");
    }
}
3、处理器-处理器决定拦截器如何拦截目标对象
package com.test.interceptor;

/**
* Created by IntelliJ IDEA.
* User: Administrator
* Date: 2009-1-9
* Time: 17:41:08
*/
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

/**
* 处理器
* 在这里将目标对象Target和拦截器Interceptor联系在了一起
*/
public class MyHandler implements InvocationHandler{

    /**
     * 目标对象
     * 将来目标对象的方法将被注入interceptor
     */
    private Object object;

    /**
     * 拦截器
     * MyHandler负责将Interceptor这个拦截器注入到传入的目标对象object
     */
    private Interceptor interceptor = new Interceptor();

    public void setObject(Object object){
        this.object = object;
    }

    /**
     * 实现InvocationHandler接口的方法
     * @param o 在其上调用方法的代理实例
     * @param method 对应于在代理实例上调用的接口方法的 Method 实例
     * @param objects 包含传入代理实例上方法调用的参数值的对象数组
     * @return 从代理实例的方法调用返回的值
     * @throws Throwable
     */
    public Object invoke(Object o, Method method, Object[] objects) throws Throwable {
        Object result = null;
        interceptor.before();
        result = method.invoke(object,objects);
        interceptor.after();
        return result;
    }
}
4、代理对象-用于得到目标对象的代理对象
package com.test.interceptor;

/**
* Created by IntelliJ IDEA.
* User: Administrator
* Date: 2009-1-9
* Time: 17:50:52
* 代理类
*/
import java.lang.reflect.Proxy;
public class MyProxy {
    /**
     * 返回obj的,处理器为MyHandler的代理对象
     * @param obj 目标对象
     * @return 目标对象的代理对象
     */
    public Object getProxy(Object obj){
        MyHandler myHandler = new MyHandler();
        myHandler.setObject(obj);
        return Proxy.newProxyInstance(obj.getClass().getClassLoader(),
                obj.getClass().getInterfaces(),myHandler);
    }
}
5、最后客户调用代码package com.test.interceptor;

/**
* Created by IntelliJ IDEA.
* User: Administrator
* Date: 2009-1-9
* Time: 17:55:45
* 客户调用
*/
public class Client {
    public static void main(String[] args){
        //目标对象
        TargetInterface target = new Target();
        //代理对象
        MyProxy myProxy = new MyProxy();
        //通过代理对象得到目标对象的代理
        TargetInterface proxy = (TargetInterface)myProxy.getProxy(target);
        //通过目标对象的代理调用目标对象的方法
        proxy.doSomething();
    }
}

//输出:
//before
//do something
//after
将自己的理解写了注释,现在只理解到这个程度,像
Proxy.newProxyInstance
里面是怎么实现的,还没深入考究
继续努力

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)