随笔:0 文章:35 评论:2 引用:0
博客园 首页 发新随笔
发新文章 联系 订阅订阅管理

2012年4月11日

本文来自http://sun4love.iteye.com/blog/1068254 转载请注明
 
IE,chrome,ff,opera测试通过
 
Java代码 复制代码 收藏代码
  1. /**
  2. * User: sunflower
  3. * Date: 11-6-2
  4. * Time: 上午10:45
  5. */
  6. public class IndexController extends GenericForwardComposer {
  7. public void onDownfile() {
  8. try {
  9. String charset = "UTF-8";
  10. //服务器文件名
  11. String fileName = "Sip坐席通讯协议.txt";
  12. //编码后文件名
  13. String encodedName = null;
  14. encodedName = URLEncoder.encode(fileName,charset);
  15. //将空格替换为+号
  16. encodedName =encodedName.replace("%20","+");
  17. HttpServletRequest httpRequest =(HttpServletRequest) Executions.getCurrent().getNativeRequest();
  18. //解决ie6 bug 或者是火狐浏览器
  19. if (encodedName.length() > 150
  20. ||Servlets.isGecko(httpRequest)
  21. ||Servlets.isGecko3(httpRequest)) {
  22. encodedName = new String(fileName.getBytes(charset), "ISO8859-1");
  23. }
  24. Filedownload.save(new FileInputStream(ZkUtils.getRealPath("/" + fileName)),
  25. "application/octet-stream", encodedName);
  26. catch (Exception e) {
  27. }
  28. }
  29. }
我直接修改了org.zkoss.web.servlet.http包底下的Https类的encodeFilename方法也可以解决这个问题.
Java代码 复制代码 收藏代码
  1. private static String encodeFilename(String flnm) {
  2. String filename = Strings.escape(flnm, "\"") ;
  3. [color=red]try {
  4. filename =URLEncoder.encode(filename, "UTF-8");
  5. catch (UnsupportedEncodingException e) {
  6. e.printStackTrace();
  7. }[/color]
  8. return '"' + filename+ '"';
  9. }

或者

  1. Execution ex = Executions.getCurrent();
  2. HttpServletRequest request = (HttpServletRequest) ex.getNativeRequest();
  3. if (request.getHeader("User-Agent").indexOf("MSIE") != -1) {// ie
  4. docFilename = URLEncoder.encode(docFilename, "UTF-8");
  5. else {// firefox
  6. docFilename = MimeUtility.encodeText(docFilename, "GBK""B");
  7. }

 

posted @ 2012-04-11 10:41 AnsenQ 阅读(12) 评论(0)  编辑

2011年7月7日

JAVA从J2SE5开始提供名为annotation(注释,标注)的功能。Java的annotation,可以附加在package, class, method, field等上面,相当于给它们添加了额外的辅助信息。附加在package, class, method, field等上的Annotation,如果没有外部解析工具等对其加以解析和处理的情况,本身不会对Java的源代码或class等产生任何影响,也不会对它们的执行产生任何影响。

但借助外部工具,比如javac,EJB容器等,可以对附加在package, class, method, field的annotation进行解析,可以根据annotation而做出相应的处理,比如运行时改变对象/方法的行为。

Java标准Annotation

@Deprecated 相当于Javadoc的@deprecated,被@Deprecated标注的对象class, method等被注明为不推荐使用。主要用于javac等编译工具。
@Override 注明对象method重载了父类的方法。javac等编译工具编译时会根据此Annotation判断重载方法是否正确。
@SuppressWarnings 告诉javac等编译器忽略所指定的特定的警告信息。
@Target 被定义的annotation可以附加在那些对象上。
@Retention annotation的作用期间。

Java标准Annotation的使用
@Deprecated:
@Deprecated
public class TestBean {
    …
}
@SuppressWarnings:
@SuppressWarnings("serial ")
public class TestBean implements java.io.Serializable {
    …
}
@SuppressWarnings(value = {"serial ", "unchecked "})
public String doSth() {
    …
}
@Override:
@Override
public String doSth() {
    …
}
 
Annotation的定义
定义方法:
@interface Annotation名 {定义体}
 
定义例1:
public @interface MyAnnotation {}
该例定义了一个无任何属性/方法的Annotation。
 
定义例2:
public @interface MyAnnotation {
    public String value();
}
该例定义了只有一个方法为value()的Annotation。一般来说,只有一个方法的Annotation,方法名一定定义为value。
定义例3:
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface MyAnnotation {
    public String value();
    public String [] multiValues();
    int number() default 0;
    
}
该例定义了一个具有多方法的Annotation。并设置其中一个方法number的默认值为0。multiValues 方法定义为数组类型。Annotation定义可以用MetaAnnotation(元注释)修饰。MetaAnnotation有以下2个:
@Retention
@Target

我们将在以下对@Retention与@Target加以说明。
 
@Retention
@Retention 可以设置为RetentionPolicy类型的值。
例:
@Retention(RetentionPolicy.RUNTIME)

RetentionPolicy的值说明
RetentionPolicy.CLASS annotation信息将被编译器编译时保存在class文件中,但执行时不会在VM装载。也就是说不能在执行时动态取得annotation信息。未设置@Retention时这将是默认设置值。
RetentionPolicy.RUNTIME annotation信息将被编译器编译时保存在class文件中,执行时也会被VM装载。
RetentionPolicy.SOURCE annotation信息将被编译器编译时舍弃掉。
@Target

@Target表明Annotation可以附加在哪种JAVA元素之上,可以设置为java.lang.annotation.ElementType数组类型的值。
使用例1:

@Target(ElementType.METHOD)


使用例2:

@Target(value={ElementType.CONSTRUCTOR, ElementType.FIELD, ElementType.LOCAL_VARIABLE, ElementType.METHOD})


ElementType是一个枚举类型,它具有以下定义:

ElementType值说明
ElementType.ANNOTATION_TYPE 应用于其他注解的元注解
ElementType.CONSTRUCTOR 构造函数
ElementType.FIELD 字段
ElementType.LOCAL_VARIABLE 方法中的本地变量
ElementType.METHOD 方法
ElementType.PACKAGE
ElementType.PARAMETER 方法的参数
ElementType.TYPE 类,接口或者枚举声明

自定义 Java Annotation

 

 Annotation是一种特殊的interface。所以可以在annotation里定义方法,属性;也可以让某个类从annotation继承(implements)。

下面从简单地范例开始,让我们一步步加深对annotation的了解。

无任何方法/属性Annotation范例:
 
MyAnnotation0.java
package com.test.annotation;

public @interface MyAnnotation0 {
    
}

MyAnnotation0为一个无任何方法和属性的annotation。

使用MyAnnotation0:
TestMyAnnotation0.java

@MyAnnotation0
public class TestMyAnnotation0 {
    @MyAnnotation0
    public void testMethod() {

    }
}
具有一个value方法Annotation范例:
MyAnnotation1.java
public @interface MyAnnotation1 {
    
    /**
     * value method
     * @return value
     */
 
    public String value();
}

MyAnnotation1具有一个名为value的方法。

MyAnnotation1使用:
TestMyAnnotation1.java

@MyAnnotation1("hello ")
public class TestMyAnnotation1 {
    @MyAnnotation1(value="world ")
    public void testMethod() {
    }
}

可以通过@Annotation名(方法名1=值1, 方法名2=值2, …)的形式给annotation赋值。只有一个方法的时候,可以直接省略为:@Annotation名(值1) 的赋值形式。当方法返回一个数组时,可以用 方法名={值1, 值2, …}给其赋值。

具有一个value方法和一个属性Annotation范例:

如果必要,还可以在annotation里为其定义属性。如下:
MyAnnotation2.java

@interface MyAnnotation2 {
    public String value();
    public String myProperty = "hello world ";
}

其中,myProperty只能申明为public或无public修饰(无public修饰时也默认为public)为static, final属性(即使不写也默认为static, final)。

使用例:
TestMyAnnotation2

class TestMyAnnotation2 {
    public static void main(String[] args) {
        System.out.println(MyAnnotation2.myProperty);
    }

    @MyAnnotation2("")
    public void testMethod1() {
    }
}

上例会打印出:

hello world
复杂型annotation的定义与使用

本节介绍较为复杂的annotation定义与使用。
先看代码:
MyAnnotation3.java

public @interface MyAnnotation3 {
    public String value();
    public String[] multiValues();
    int number() default 0;
}

MyAnnotation3具有一个返回String的value方法,返回String[]的multiValues 方法;还有一个返回int 的number方法。其中number方法具有默认值0。

使用例: 
TestMyAnnotation3.java

class TestMyAnnotation3 {
    @MyAnnotation3(value = "call testMethod1 ", multiValues={"1 ", "2 "}, number = 1)
    public void testMethod1() {

    }

    @MyAnnotation3(value = "call testMethod2 ", multiValues={"1 ", "2 "})
    public void testMethod2() {

    }
}

number具有默认值,所以标注时可以不为其赋值。其余方法则必须通过上面介绍的方法赋值。multiValues返回一个String[]数组,所以可以通过multiValues={"1", "2"}为其赋值。
这样说来,annotation到底能起什么作用呢?
1,    编译工具或其他工具可以根据被附加在代码里的annotation信息自动生成配置文件或文档等外部文件。
比如,sun公司就提供了apt(Annotation Processing Tool) 工具,apt工具是一个可以处理annotation的命令行工具,apt提供了在编译期针对源代码级别的解析,并可以在解析时生成新的源代码和其他文件,同时还可以对生成的源代码进行编译。
2,    其他程序可以在运行时动态解析将要被执行的程序里的annotation信息,并根据被附加的annotation信息来执行不同的操作。
比如,EJB3规范就比较广泛地使用了annotation特性。比如只要在POJO为class注明@Stateless注释,EJB容器便会根据此annotation把该POJO注册为无状态的Session Bean。EJB3使用了annotation大大地简化了EJB的开发和配置过程。我们会在其他文章里专门介绍EJB Annotation的原理与使用方法,这里不做详述。

本文通过一个简单地例子来说明怎么在运行期动态解析annotation。Apt工具的使用我们会在近期其他文章里对其加以介绍。

比如,我们定义了MyAnnotation3注释:

MyAnnotation3.java

package com.test.annotation;

import java.lang.annotation.Annotation;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;

@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation3 {
    public String value();
    public String[] multiValues();
    int number() default 0;
}

上面定义了一个名为MyAnnotation3的注释。

我们再定义一个GetMyAnnotation类,该类使用了MyAnnotation3注释:
GetMyAnnotation.java:

package com.test.annotation.test;

import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

import javax.ejb.EJB;
import javax.naming.InitialContext;
import javax.naming.NamingException;

import com.test.annotation.MyAnnotation3;

// 为GetMyAnnotation类附加MyAnnotation3 注释
@MyAnnotation3(value = "Class GetMyAnnotation ", multiValues = {"1 ","2 "})
public class GetMyAnnotation {
    // 为testField1属性附加MyAnnotation3 注释
    @MyAnnotation3(value = "call testField1 ", multiValues={"1 "}, number = 1)
    private String testField1;

    // 为testMethod1方法附加MyAnnotation3 注释
    @MyAnnotation3(value = "call testMethod1 ", multiValues={"1 ", "2 "}, number = 1)
    public void testMethod1() {

    }

    @Deprecated
    @MyAnnotation3(value = "call testMethod2 ", multiValues={"3 ", "4 ", "5 "}) 
    public void testMethod2() {

    }
}

上面的例子GetMyAnnotation非常简单,里面没有任何功能,但是分别为类(class),属性(field),方法(method)申明(附加)了MyAnnotation3 注释。

下面我们用程序TestMyAnnotation3对GetMyAnnotation里MyAnnotation3注释进行解析。

运行时解析annotation 
TestMyAnnotation3.java

public class TestMyAnnotation3 {

    public static void main(String[] args) {
        System.out.println("--Class Annotations-- ");
        if (GetMyAnnotation.class.isAnnotationPresent(MyAnnotation3.class )) {
            System.out.println("[GetMyAnnotation].annotation: ");
            MyAnnotation3 classAnnotation = GetMyAnnotation.class.getAnnotation(MyAnnotation3.class );
            printMyAnnotation3(classAnnotation);
        }
        
        
        System.out.println("--Fields Annotations-- ");
        Field [] fields = GetMyAnnotation.class.getDeclaredFields();
        for (Field field : fields) {
            if (field.isAnnotationPresent(MyAnnotation3.class )) {
                System.out.println("[GetMyAnnotation. " + field.getName() + "].annotation: ");
                MyAnnotation3 fieldAnnotation = field.getAnnotation(MyAnnotation3.class );
                printMyAnnotation3(fieldAnnotation);
            }
        }
        
        System.out.println("--Methods Annotations-- ");
        Method[] methods = GetMyAnnotation.class.getDeclaredMethods();
        for (Method method : methods) {
            System.out.println("[GetMyAnnotation. " + method.getName() + "].annotation: ");
            if (method.isAnnotationPresent(MyAnnotation3.class )) {
                MyAnnotation3 methodAnnotation = method.getAnnotation(MyAnnotation3.class );
                printMyAnnotation3(methodAnnotation);  
            }
        }
    }
    
    private static void printMyAnnotation3(MyAnnotation3 annotation3) {
        if (annotation3 == null ) {
            return;
        }
        
        System.out.println("{value= " + annotation3.value());
        
        String multiValues = "";
        for (String value: annotation3.multiValues()) {
            multiValues += ", " + value;
        }
        
        System.out.println("multiValues= " + multiValues);
        
        System.out.println("number= " + annotation3.number() + "} ");
    }
}


输出:

--Class Annotations--
[GetMyAnnotation].annotation:
{value=Class GetMyAnnotation
multiValues=,1,2
number=0}
--Fields Annotations--
[GetMyAnnotation.testField1].annotation:
{value=call testField1
multiValues=,1
number=1}
--Methods Annotations--
[GetMyAnnotation.testMethod1].annotation:
{value=call testMethod1
multiValues=,1,2
number=1}
[GetMyAnnotation.testMethod2].annotation:
{value=call testMethod2
multiValues=,3,4,5
number=0}



JDK1.5以后的版本提供的跟annotation有关的接口:

interface java.lang.reflect.AnnotatedElement {
    boolean isAnnotationPresent(Class<? extends Annotation> annotationClass);
    <T extends Annotation> T getAnnotation(Class<T> annotationClass);
    Annotation[] getAnnotations();
    Annotation[] getDeclaredAnnotations();
}

该接口主要用来取得附加在类(class),构造方法(constructor),属性(field),方法(method),包(package)上的annotation信息。

JDK1.5与此有关的几个类都实现了AnnotatedElement接口:

java.lang.reflect.AccessibleObject, 
java.lang.reflect.Class, 
java.lang.reflect.Constructor, 
java.lang.reflect.Field, 
java.lang.reflect.Method, 
java.lang.reflect.Package

所以可以利用反射(reflection)功能在程序里动态解析附加的annotation信息。


总结: 
本文通过举例简单地说明了怎么动态解析annotation,大家可以举一反三,利用Java的annotation特性,完成更复杂功能等。    

posted @ 2011-07-07 17:47 AnsenQ 阅读(420) 评论(1)  编辑

2011年7月6日

Tomcat在启动时出现如下异常问题:

严重: IOException while loading persisted sessions: java.io.EOFException
严重: Exception loading sessions from persistent storage

是因为保存在硬盘上的session数据读取失败,问题似乎不大,但是如果不处理一下,每次启动都会出现这个问题,处理方法如下:

将work下面的文件清空,主要是*.ser文件,或者只是删除掉session.ser亦可

错误描述:....while loading persisted sessions: java.io.EOFException... 
分析:EOFException表示输入过程中意外地到达文件尾或流尾的信号,导致从session中获取数据失败。异常是tomcat本身的问题,由于tomcat上次非正常关闭时有一些活动session被持久化(表现为一些临时文件),在重启时,tomcat尝试去恢复这些session的持久化数据但又读取失败造成的。此异常不影响系统的使用。 

posted @ 2011-07-06 15:32 AnsenQ 阅读(36) 评论(0)  编辑

2011年5月24日

nutch环境配置(转)

nutch环境配置备忘:
1、Cygwin安装
我使用的是Cygwin本地安装版,local install,并把所有组件都设为installed即可。
2、解压nutch
将NUTCH-0.9解压后复制到HOME/Administrator下,或者在Cygwin下使用gunzip命令皆可。
3、安装JDK
可能是我的系统最近不正常吧,我的JDK必须安装在nutch目录下才能找到(正确设置了环境变量,可是只要安装在其它位置,就找不到JDK,如果哪位能知道原因,请指教,非常感谢!)我这里的安装路径是:C:\cygwin\home\Administrator\nutch-0.9\JDK

环境变量设置如下:
JAVA_HOME C:\cygwin\home\Administrator\nutch-0.9\JDK
CLASS_PATH 添加 ;C:\cygwin\home\Administrator\nutch-0.9\JDK\lib
NUTCH_JAVA_HOME C:\cygwin\home\Administrator\nutch-0.9\JDK
PATH 添加 ;C:\cygwin\home\Administrator\nutch-0.9\JDK\bin

4、使用爬虫之前的准备
首先在bin目录下新建目录urls,在urls中新建一个文本文家nutch.txt,将要抓取的网站地址输入,比如http://www.sina.com.cn/(注意最后的/一定要有)

打开conf\crawl-urlfilter.txt文件,将
# accept hosts in MY.DOMAIN.NAME
+^http://([a-z0-9]*\.)*MY.DOMAIN.NAME/

改为
# accept hosts in MY.DOMAIN.NAME
+^http://([a-z0-9]*\.)*sina.com.cn/(这里也要有/呦)

打开nutch/conf/nutch-site.xml文件,修改<configuration></configuration>为:
<configuration>
<property>
<name>http.agent.name</name>
<value>HD nutch agent</value>
</property>
<property>
<name>http.agent.version</name>
<value>1.0</value>
</property>
</configuration> 
保存
5、开始爬
进入nutch目录,进入bin目录
$sh nutch crawl urls -dir sina -depth 4 -threads 5 -topN 1000 >&logs/log1.log
crawl:通知nutch.jar,执行crawl的main方法。
urls:存放需要爬行的url.txt文件的目录
-dir sina 爬行后文件保存的位置
-depth 2:爬行次数,或者成为深度,不过还是觉得次数更贴切,建议测试时改为1。
-threads 指定并发的进程 这是设定为 4
-topN :一个网站保存的最大页面数。
**注意sina文件夹不能存在,会报错

曾经出现的错误:
Generator: 0 records selected for fetching, exiting ...
Stopping at depth=0 - no more URLs to fetch.
No URLs to fetch - check your seed list and URL filters.
解决方法:在urls的nutch.txt中再添加一个URL即可,原因现在还不知道。

6、挂上服务器
当爬取网页成功之后,开始配置TOMCAT
TOMCAT的安装目录是:C:\Program Files\Apache Software Foundation\Tomcat 5.5

TOMCAT_HOME C:\Program Files\Apache Software Foundation\Tomcat 5.5
CALSSPATH 添加: %TOMECAT_HOME%\bin;

在服务器关闭的状态下,删除TOMCAT中WEBAPPS文件夹中的ROOT文件夹,将nutch-0.9.war拷贝到webapps下,改名为ROOT.war,启动TOMCAT,会自动解压出ROOT文件。
修改/webapps/ROOT/WEB-INF/classes/nutch-site.xml:

<configuration>
</configuration>
换成
<configuration>
<property>
<name>searcher.dir</name>
<value>C:\cygwin\home\Administrator\nutch-0.9\bin\dlut</value>
</property>
</configuration> 
为了支持中文需要修改tomcat的配置文件,打开tomcat\conf下的server.xml文件,将其中的Connector部分改成如下形式即可:

<Connector port="8080" maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
enableLookups="false"
redirectPort="8443"
acceptCount="100"
connectionTimeout="20000"
disableUploadTimeout="true"
URIEncoding="UTF-8" useBodyEncodingForURI="true" />
注意最后一行的两项是新加的.
利用tomcat搜索 
重启tomcat,在浏览器中输入:http://127.0.0.1:8080
出现nutch搜索界面,
在搜索框中输入java并搜索,将看到你的搜索结果

***曾经出现的错误
org.apache.jasper.JasperException: /search.jsp(151,22) Attribute value language + "/include/header.html" is quoted with " which must be escaped when used within the value
这个错误困扰了我很长时间,后来在http://news.skelter.net/articles/2008/09/24/nutch-0-9-quoted-with-must-be-escaped
找到解答
解决方法是:把search.jsp的第151行改成
<jsp:include page="<%= language + \"/include/header.html\"%>"/>。问题解决
posted @ 2011-05-24 17:39 AnsenQ 阅读(346) 评论(0)  编辑

2011年5月18日

           适配器模式(Adapter Pattern)

  
以下内容是我和小组的兄弟学习设计模式我做的课件,我整理出来和大家分享,有不妥之处敬请指出.
 上次做的桥接模式(Bridge),这次是适配器模式(Adapter).
概述:
      在软件开发过程中,我们要经常要复用我们以前开发的一些“现存对象”,但是这些“现存对象”并不能满足我们新的应用环境。怎样才能良好的复用这些对象,以满足我们的应用环境,这就是适配器(Adapter)所要解决的问题。

意图:
   将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。 
                                                                                                        ——《设计模式》GOF 

生活中的例子:
      在现实生活中,像这种适配器我们经常见到,而且还是经常使用它,如:手机(深信大家都见过),我们手机在充电的时候,不可能直接在220V电源上直接充电,而是手机“充电器”进行转换成手机需要的电压才可以正常充电,否则就不可以完成充电,这个“充电器”就起到了适配的作用。

1.类的Adapter模式结构图 
                
类结构图:
                        
代码实现:
 1namespace Adapter_Pattern
 2{
 3    public interface ITarget
 4    {
 5        void GetPower();
 6    }

 7    /// <summary>
 8    /// 220V电源类;
 9    /// </summary>

10    public class Power
11    {
12        /// <summary>
13        /// 从电源中得到220V的电压;
14        /// </summary>

15        public void GetPoer220V()
16        {
17
18        }

19    }

20    /// <summary>
21    /// 适配器类(充电器);
22    /// </summary>

23    public class Adapter : Power, ITarget
24    {
25        /// <summary>
26        /// 得到想要电压;
27        /// </summary>

28        public void GetPower()
29        {
30            this.GetPoer220V();
31            Console.WriteLine("得到手机的充电电压");
32        }

33    }

客户端调用:
 1namespace Adapter_Pattern
 2{
 3    class Program
 4    {
 5        /// <summary>
 6        /// 这里相当于是手机;
 7        /// </summary>
 8        /// <param name="args"></param>

 9        static void Main(string[] args)
10        {
11            Console.Write("手机:");
12            ITarget Target = new Adapter();
13            Target.GetPower();
14            Console.Read();
15        }

16    }

17}


特点:
  它使用多继承的方式来实现,我们只需要调用得到电压(GetPower())方法,由充电器(Adapter)去将220V的电压转成我们需要的电压供我们使用。
2.对象的Adapter模式结构图 
                    
类结构图:
                        
代码实现:

 1namespace Adapter_Pattern_Object_
 2{
 3    public interface ITarget
 4    {
 5        void GetPower();
 6    }

 7    /// <summary>
 8    /// 220V电源类
 9    /// </summary>

10    public class Power
11    {
12        /// <summary>
13        /// 得到220V电压;
14        /// </summary>

15        public void GetPoer220V()
16        {
17            //在这是220V的电压;
18        }

19    }

20    /// <summary>
21    /// 适配器类(充电器)
22    /// </summary>

23    public class Adapter : ITarget
24    {
25        Power power;
26        /// <summary>
27        /// 适配器的构造函数;
28        /// </summary>
29        /// <param name="power">要适配的电压</param>

30        public Adapter(Power power)
31        {
32            this.power = power;
33        }

34        /// <summary>
35        /// 得到想要的电压;
36        /// </summary>

37        public void GetPower()
38        {
39            power.GetPoer220V();
40            Console.WriteLine("得到手机的充电电压!");
41        }

42    }

43}

44


客户端调用:

 1namespace Adapter_Pattern_Object_
 2{
 3    class Program
 4    {
 5        /// <summary>
 6        /// 这里相当于手机;
 7        /// </summary>
 8        /// <param name="args"></param>

 9        static void Main(string[] args)
10        {
11            Console.Write("手机:");
12
13            Power power=new Power();
14            ITarget Target = new Adapter(power);
15            Target.GetPower();
16
17            Console.Read();
18        }

19    }

20}


总结:

  对于此例子,我们要对手机充电,电力部门不可能给我们提供我们需要的电压,有时候也不一定满足我们的需要,这个就是要我们自己进行转换,这就用到适配器(Adapter)。
  对软件系统中,如果要复用以前的“现存对象”,但是这些对象所提供的接口并不一定能适应我们的新环境,我们就要对其转换成我们需要的接口,来供我们调用。

Adapter在.NET中的应用:

  在ADO.NET中,对于我们从数据库中取出的数据都要放到一个DataSet中,不管你是Access的数据库,还是SQL的数据库,或者是Oracle的数据库都要放到DataSet中。.NET中并没有提供如:SqlDataSet、OleDbDataSet、OracleDataSet等,它只提供了一种DataSet就是用SqlDataAdapte等去填充数据;为什么这一个DataSet能存放不同的数据呢?就是有这些适配器来适配。
DataAdapter结构图:
                             
要点:
1.Adapter模式主要应用于“希望复用一些现存的类,但是接口又与复用环境要求不一致的情况”,在遗留代码复用、类库迁移等方面非常有用。
2.Adapter模式有对象适配器和类适配器两种形式的实现结构,但是类适配器采用“多继承”的实现方式,带来了不良的高耦合,所以一般不推荐使用。对象适配器采用“对象组合”的方式,更符合松耦合精神。
适用性:
 在以下各种情况下使用适配器模式:
1.系统需要使用现有的类,而此类的接口不符合系统的需要。
2.想要建立一个可以重复使用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可能在将来引进的类一起工作。这些源类不一定有很复杂的接口。
3.(对对象适配器而言)在设计里,需要改变多个已有子类的接口,如果使用类的适配器模式,就要针对每一个子类做一个适配器,而这不太实际。

总结:
  总之,通过运用Adapter模式,就可以充分享受进行类库迁移、类库重用所带来的乐趣,以达到更好的复用。

原文出处:http://www.cnblogs.com/houleixx/archive/2008/03/04/1090214.html

posted @ 2011-05-18 15:00 AnsenQ 阅读(57) 评论(0)  编辑

2011年5月12日

摘要: 首先在application中的WEB-INF/web.xml中添加这样的代码段<context>................................<resource-ref> <res-ref-name>jdbc/hsql</res-ref-name> <res-type>javax.sql.DataSource</res-type> <res-auth>Container</res-auth></resource-ref></context>然后在应用的ME阅读全文
posted @ 2011-05-12 17:48 AnsenQ 阅读(41) 评论(0)  编辑

2011年5月11日

摘要: public class ApplicationWatch implements ServletContextListener {private static Logger logger = Logger.getLogger(ArchDataInit.class);public void contextDestroyed(ServletContextEvent event) {logger.info("start ApplicationWatch contextDestroyed method");logger.info("start shutdown threa阅读全文
posted @ 2011-05-11 16:36 AnsenQ 阅读(183) 评论(0)  编辑

2011年5月10日

摘要: 问题出现在CE组(他们的环境是最新的),情况是:在登陆之后就到index.jsp出现异常,然后跳转到/page/main.jsp中,就一直处于刷新状态,后台的异常是:org.hibernate.QueryException: ClassNotFoundException: org.hibernate.hql.ast.HqlToken [from com.giantstone.arch.model.ArchEtlGroup]---------------------------------------------------------------------------------------阅读全文
posted @ 2011-05-10 18:03 AnsenQ 阅读(62) 评论(0)  编辑

2011年5月9日

摘要: <exclude name="**/WEB-INF/lib/share_lib/**"/> 这样的意思是表示删除share_lib这个文件夹阅读全文
posted @ 2011-05-09 18:46 AnsenQ 阅读(103) 评论(0)  编辑

2011年5月7日

摘要: 在使用归档系统的时候发现只要运行过ETL脚本之后,系统就一直不响应了,在使用了java6/bin/jvisualvm这个工具监测应用线程的实时情况之后,发现thread已经满了,因为我使用的是spring中直接用JDBC连接数据库,只是简单的设置了用户名,密码,驱动类,和URL之类的东西,并没有指定它的线程池中的具体设置,所以设置最大活动数(maxActive)和最大等待数(maxWait)都为100之后,问题解决,运行ETL脚本之后,系统还是能迅速地响应。阅读全文
posted @ 2011-05-07 09:35 AnsenQ 阅读(26) 评论(0)  编辑

公告


Powered By: 博客园
模板提供沪江博客