AIR:如何保存图片到本地

核心提示:如果你想保存从视频,图表或表格中获取的图片数据到本地,可以使用BitmapData类。

原文地址:

http://www.adobe.com/cfusion/communityengine/index.cfm?event=showdetails&productId=2&postId=8406

如果你想保存从视频,图表或表格中获取的图片数据到本地,可以使用BitmapData类。

摘要:

使用BitmapData类来创建一个包含了从组件中获取的图片数据的对象,使用mx.graphics.codec包提供的方法编码为JPEG或PNG格式,然后使用AIR API提供的File和FileStream类保存到本地。

具体方法:

首先我们我们需要得到屏幕的截图,要做到这一点,我们要使用BitmapData类。比如我们想从一个命名为myChart的线状图表上获取截图:

[code]import flash.display.BitmapData;
var bmpd:BitmapData = new BitmapData(myChart.width,myChart.height);
bmpd.draw(myChart);[/code]

然后我们需要把bitmapdata对象编译为ByteArray对象,这样我们就可以保存为文件了。这个ByteArray对象需要被格式化,我们可以使用mx.graphics.codec包中的JPEGEncoder和PNGEncoder类来实现它。

编码为JPEG格式:

[code]import mx.graphics.codec.JPEGEncoder;
//create a new instance of the encoder, and set the jpeg compression level from 0 to 100
var jpgenc:JPEGEncoder = new JPEGEncoder(80);
//encode the bitmapdata object and keep the encoded ByteArray
var imgByteArray:ByteArray = jpgenc.encode(bmpd);[/code]

编码为PNG格式:

[code]import mx.graphics.codec.JPEGEncoder;
//create a new instance of the encoder
var pngenc:PNGEncoder = new PNGEncoder();
//encode the bitmapdata object and keep the encoded ByteArray
var imgByteArray:ByteArray = pngenc.encode(bmpd);[/code]

现在我们已经准备好了ByteArray数据,我们只需要把它保存到本地就可以了。我们可以用File和File Stream类来实现。

建立一个JPEG文件参照:

[code]//gets a reference to a new empty jpg image file in user desktop
var fl:File = File.desktopDirectory.resolvePath(”snapshot.jpg”);[/code]

建立一个PNG文件参照:

[code]//gets a reference to a new empty jpg image file in user desktop
var fl:File = File.desktopDirectory.resolvePath(”snapshot.png”);[/code]

现在我们可以把ByteArray用File Stream保存到文件中。

[code]//Use a FileStream to save the bytearray as bytes to the new file
var fs:FileStream = new FileStream();
try{
//open file in write mode
fs.open(fl,FileMode.WRITE);
//write bytes from the byte array
fs.writeBytes(imgByteArray);
//close the file
fs.close();
}catch(e:Error){
trace(e.message);
}[/code]

组件使用例子:用Flex AIR显示文件目录结构 [转载]

下面的例子使用了WindowedApplication容器和FileSystemTree 、FileSystemDataGrid 控件。在这个例子中,当点击FileSystemTree控件中的目录名时,触发一个事件,让FileSystemDataGrid控件去显示选中的目录里的文件:

[code]
<?xml version=”1.0″ encoding=”utf-8″?>
    <mx:WindowedApplication xmlns:mx=”http://www.adobe.com/2006/mxml”>//定义了WindowedApplication容器
        <mx:HDividedBox>//水平分隔控件
        <mx:FileSystemTree id=”tree” //注意id后面的事件处理中要引用
            width=”200″ height=”100%”
            directory=”{new File(’C:\\’)}” //设置默认的目录
            enumerationMode=”directoriesOnly” //例举模式设为只显示目录
            change=”dataGrid.directory = File(tree.selectedItem);”/> //当选择的目录发生变化时,设置dataGrid的当前目录,为tree的当前选择的目录
        <mx:FileSystemDataGrid id=”dataGrid” //注意id前面的事件处理中引用
            width=”100%” height=”100%”
            directory=”{new File(’C:\\’)}”/>
        </mx:HDividedBox>
    </mx:WindowedApplication>[/code]注意:每个组件要定义一个唯一的ID,作为程序引用处理标识

此文 组件使用例子:用Flex AIR显示文件目录结构 首发在:魔力谷-flash风 作者:电介质

版权所有,欢迎转摘,转摘请注明作者和出处!

AIR版校内客户端V0.2版本下载

这是一个利用校内的API做的AIR版本的客户端工具,目前版本0.2,功能很简单,一是发表日志,二是给好友留言,如果不是Flash的安全沙箱的问题,就可以做成Flash版本的了,那样会更好玩,可以加到应用添加到左边的导航条,可惜现在只能做成桌面版本的

下面是截图

1.登陆页面:

[img][attach]68[/attach][/img]
2.登陆后会显示你的头像以及最新的一个状态,然后选择动作,目前只有两个动作,发日志和给好友留言
[img][attach]69[/attach][/img]
3.写日志的界面
[img][attach]70[/attach][/img]
4.如果选择给好友留言,程序首先会自动获取你的所有好友的列表,你选择你的好友后,在右边的输入框里输入内容就可以留言了(这里要感谢李大维的帮助,通过反编译校内提供的jar包,获得了发表日志以及给好友留言的方法以及参数)
[img][attach]71[/attach][/img]
在这个表格里,可以点击id,姓名,或者学校对表格进行排序,进而可以方便的找到好友

下载地址:[file]http://ldsea.cn/flex/xiaonei/XiaoAirV02.rar[/file]

[color=#0000FF][size=5]首先需要下载AIR环境:[/size][/color]
[size=4][url=http://airdownload.adobe.com/air/win/download/1.0/AdobeAIRInstaller.exe]http://airdownload.adobe.com/air/win/download/1.0/AdobeAIRInstaller.exe[/url][/size]

[Flex]Flex的component和container的children的life cycle

详细大家在用Flex的时候都遇到这么一个问题,new出来的component不能直接对其内部的组件进行操作,经常会提示null的错误。当然我们自己在写Script组件的时候,可以把children的创建自己放在constructor里面。这样就不会出现这种问题。但当我们在做mxml组件的时候,这个问题就非常明显了。我们必须遵循Flex的component life cycle。通常的做法是放在property里面,例如

[code]<?xml version="1.0" encoding="utf-8"?>

<mx:Canvas xmlns:mx="http://www.adobe.com/2006/mxml" width="400" height="300">

<mx:Script>

<![CDATA[

private var title:String;

private var bNameChanged:Boolean;

public function set Title(value):void

{

if(title != value)

{

title = value;

bNameChanged = true;

this.invalidateProperties();

}

}

override protected function commitProperties():void

{

super.commitProperties();

if(bNameChanged)

{

bNameChanged = false;

lblName.text = title;

}

}

]]>

</mx:Script>

<mx:Label id="lblName" />

</mx:Canvas>[/code]

然而,你在用一些Container的时候,还是会遇到null的问题,这又是怎么回事呢?例如,你放两个上面的组件在一个TabNavigate里面。

[code]<?xml version="1.0" encoding="utf-8"?>

<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" xmlns:local="*" >

<mx:TabNavigator>

<local:TestComponent id="test1" Title="test 1" />

<local:TestComponent id="test2" Title="test 2" />

</mx:TabNavigator>

</mx:Application>[/code]
试试,保证

Error #1009: 无法访问空对象引用的属性或方法。

这个时候,我开始抱怨了,为什么Flex为什么自己不遵守自己的游戏规则,这里TabNavigator的children还没有创建就会调用,commiteProperties 或者 updateDisplayList方法。这应该是Flex的一个Bug.

现在要解决这个问题就只有让TabNavigator在创建children的时候就要把所有的children都创建。这个时候我们就要关注Container.createPolicy属性了。Container内部的children不是在createChild里面创建的,至于其children的创建时机,就好好看看

ContainerCreationPolicy,而且Container内部的children(即通过mxml加的children)和createChildren里创建的chidren可以理解为不同的类型。

在上面的例子里面的TabNavigator加上 createPolicy = “ALL”所有的文件就解决了。

如果有什么问题,请大家指正.

转自:http://www.cnblogs.com/tionase/archive/2007/04/02/696852.aspx

对 Adobe Flex的 十大误解

转自:http://www.niuc.net/post/141/

首先说明的是,这篇文章不是我原创,而是来自infoq.com上的Jon Rose写的一篇文章,原贴:这里,不过我说的内容根据我的经验有很大部分是与原来不同的.
       对 ADOBE FLEX 的十大误解,在silverlight,ajax的竞争下,很多人都会怀疑,甚至疑问用FLEX吗?FLEX不好,为什么?因为:

1,用户需要重新或者新增安装插件来运行FLEX
     其实,目前在电脑平台上,用的最多的插件应该是Flash Player吧,虽然运行FLEX 需要 9 以上版本,不过按照ADOBE官方的调查,目前电脑平台上,已经有94%的用户安装了Flash Player,而且基本都是 9 或者9以上的版本,所以你基本不用担心用户没办法运行你开发的FLEX程序.
     但是AIR程序呢?OK,这需要等到明年也就是2008,才会正式推出1.0版本的RUNTIME.容量大约为9兆左右,看起来很大,不过值得幸运的是,在用户安装AIR程序时,程序会自动检测下载AIR RUNTIME程序,只要安装一次,以后再运行AIR程序就无需再次安装.

  2,Flash Player 过于封闭
    Flash Player的核心Tamarin Virtual Machine(猴子虚拟机?),目前已经在Mozilla下成为了开源项目,当然作为商业产品,ADOBE还没大方到全部开源这个地步,不过毕竟也算开了点,具体的开源信息可以到osflash.org上查询.根据我的调查,目前已经有几个项目是针对开源了的核心而开发的,
      无论是FLEX还是AIR目前基本是同一步骤向开源方向前进.

  3,Flash 只是在设计动画,视频播放等乱七八糟的方向有长处
    去每个网站,我们都避免不了该死的FLASH广告,有的更加可恶的是还是视频播放,还关不掉。久而久之,Flash就在大众落下了个花蝴蝶的形象.
      FLASH:这不是我的错啊
    我:别急别急,听我细细道来.
      有短必有长,比如动画播放,不就是为增加Flash player的占有率立下了汗马功劳?而且严格上来说,Flash CS3的确是为设计师所准备的,而FLEX却是为程序员所准备的,而两者如此的靠近,就是为了设计师与程序员能够更加完美的合作.而且目前国内开发FLEX的,还有很多是有FLASH基础的.毕竟优秀的设计是会给你的程序加很大分的.更何况FLEX涉及的范围实在太广.

4,FLEX不是开发商业程序的好选择,那只是业余产品
    在几年前,FLASH的代码写法在正统的程序员眼里,那是可笑的。不过随着AS3.0的发布,FLASH,FLEX开发越来越向正统开发方式靠近.那到底是不是开发商业程序的好选择呢?那就看些例子吧.我想这方面,ADOBE应该会有很多程序推荐的.比如这个消息:Oracle Chooses Flex

5,FLEX太贵了.
     这个,这个,在盗版横行的我们这个地方,好象不是个问题.我还听说过这么一个故事:某家外企,来了个德国FLEX开发工程师,牛啊,人家说了用的是正版的.结果要求他把序列号拿出来共享下,结果是满大街都一样的破解注册码.

6,FLEX需要单独的专用服务器
   FLEX可以运行在任何的:web server, application server, and database server.FLEX更应该说是前台程序,我说FLEX涉及的范围太广就是这个问题,你一不小心,很容易迷失在开发服务器端上,因为都能用.比如我喜欢PHP,大部分会用到AMF.

7,FLEX太难学了
   其实FLEX很简单,我想应该是最简单的程序语言了吧.唯一难点是在于他的丰富性.要把持住自己专注一点是比较难的.如果你学过C,C  ,甚至是大学里的编程课程,那学FLEX就太简单了。

8,用FLEX,我的整个大程序需要重新构建
   再次说明FLEX是前台程序,他的后台基本不需要改变,如果你用JAVA或者其他再加EJBs, Spring, POJOs等后台程序开发了一个程序,你无须修后台程序,直接用FLEX就可以调用以上的后台程序.

9 ,FLEX缺少后退键这个功能
   在开发FLASH 网站最需要解答的这个问题,谁也不希望回不到上一页看过的内容,而是重新加载了网站,不过FLEX3目前已经有后退键这个功能.

10 , 我可以用AJAX,SILVERLIGHT做出FLEX可以做出的任何东西.
    理论上来讲,任何技术都是相通的,没有说你做的了,我却做不了。不同的只是花的时间,成本不同而已.你选择AJAX也好,SILVERLIGHT也好,只不过路不同。别忘了,用FLEX也可以做出AJAX,SILVERLIGHT能做出的任何东西.不过FLEX还能用java开发.从FLEX 2以来,多少AJAX开发者投入到FLEX的怀抱啊.SilverLight?哦,这个雷声大雨点小,给我看个耳目一新的DEMO吧.

      磕磕绊绊的翻译总算写完了,下面是个人观点:我们国内的FLEX开发离世界级开发落后了很多,我想很大部分在于ADOBE根本不重视中国市场,当然这也是有客观原因的,毕竟盗版过多,满大街的FLASH产品,基本都是破解,甚至盗窃他人的成果.急功进利是最大的问题,试问国内从2000年到现在出现了多少优秀的FLASH开发工程师呢?最多的应该是动画设计师吧.
      那为什么很多大网站支持silverlight呢?因为:在这里MS很大方,ADOBE不鸟你,我想换谁,都会愿意支持MS,也就是silverlight的.

Flex HTTPService如何给后台传递参数【转载】

最近看一些文档,总结了一些给后台传递参数的方法,列举如下:

方法1:采用URLVariables对象
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
     layout="absolute" fontSize="12"
    >
    <mx:Script>
        <![CDATA[
            import mx.controls.Alert;
            import mx.rpc.events.ResultEvent;
            //对提交给后台的参数进行UTF-8的编码处理
            private function httpEncoding(param:String):String{
                return encodeURIComponent(param);
            }
            private function httpEncoding0(param:String):String{
                return param;//encodeURI(param);
            }
            private function doRequest():void{
                btn_do.enabled=false;
                var url:String = "http://localhost:8600/grid.jsp";
                //以下那样写后台会乱码,不管是否做URI编码转换
                //url += "?user="+httpEncoding0("用户名");
                //url += "&psw="+httpEncoding0("密码");
                //trace(url);
                srv.url = url;
                //srv.send();
                //以下这样写正常
                var params:URLVariables = new URLVariables();
                //这个user,psw就是传入后台的参数user,jsp就用 request.getParameter("user")来取
                params.user = httpEncoding("用户名");
                params.psw = httpEncoding("密码");
                srv.send(params);           
            }
            private function resultHandler(event:ResultEvent):void{
                Alert.show("与后台交互结束,前台开始取得的数据…","提示信息");
                btn_do.enabled=true;
            }
        ]]>
    </mx:Script>
    <mx:HTTPService id="srv" result="resultHandler(event);"/>
    <mx:Panel title="测试与jsp后台交互" layout="absolute" width="100%" height="90%">
        <mx:Button id="btn_do" label="取得数据" click="doRequest();"/>
        <mx:Spacer height="1"/>
        <mx:DataGrid dataProvider="{srv.lastResult.catalog.product}" width="100%" height="100%" y="28"/>   
    </mx:Panel>
</mx:Application>
方法2:采用,同时也演示了mx:State的用法,[来自网上]

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">
    <mx:states>
        <mx:State name="Logged In">
            <mx:SetProperty target="{panel1}" name="width" value="95%"/>
            <mx:SetProperty target="{panel1}" name="height" value="95%"/>
            <mx:RemoveChild target="{password}"/>
            <mx:RemoveChild target="{username}"/>
            <mx:RemoveChild target="{label1}"/>
            <mx:RemoveChild target="{Submit}"/>
            <mx:RemoveChild target="{label2}"/>
            <mx:SetProperty target="{panel1}" name="title" value="Members Section"/>
            <mx:AddChild relativeTo="{panel1}" position="lastChild">
                <mx:Label x="10" y="10" text="Welcome to the Members Section!"/>
            </mx:AddChild>
            <mx:AddChild relativeTo="{panel1}" position="lastChild">
                <mx:Label x="10" y="36" text="Here you can do great things, like join the forums @ Viper Creations!"/>
            </mx:AddChild>
            <mx:AddChild relativeTo="{panel1}" position="lastChild">
                <mx:Label x="10" y="62" text="Label"/>
            </mx:AddChild>
        </mx:State>
    </mx:states>
    <mx:Script>
        <![CDATA[
            import mx.rpc.events.ResultEvent;
           
        ]]>
    </mx:Script>
    <mx:Script>
   

<![CDATA[

private function checkLogin(evt:ResultEvent):void
{

    if(evt.result.loginsuccess == "yes")

    {

    currentState = "Logged In";

    }

    if(evt.result.loginsuccess == "no")

    {
       
        mx.controls.Alert.show('Invalid username/password');

    }       
}

]]>

</mx:Script>
    <mx:HTTPService id="login_user" result="checkLogin(event)" showBusyCursor="true" method="POST" url="http://www.vipercreations.com/site_admin/login.php" useProxy="false">
        <mx:request xmlns="">
            <username>
                {username.text}
            </username>
            <password>
                {password.text}
            </password>
        </mx:request>
    </mx:HTTPService>
   
    <mx:Panel resizeEffect="Resize" width="250" height="200" layout="absolute" title="Login System" horizontalCenter="0" verticalCenter="-2" id="panel1">
        <mx:Label x="10" y="10" text="Username:" id="label1"/>
        <mx:TextInput x="10" y="36" id="username"/>
        <mx:Label x="10" y="66" text="Password:" id="label2"/>
        <mx:TextInput x="10" y="92" id="password" displayAsPassword="true"/>
        <mx:Button x="10" y="122" label="Submit" id="Submit" click="login_user.send();"/>
    </mx:Panel>
   
</mx:Application>

校内网API平台开始邀请用户参与开发

http://www.022net.com/2008/6-4/44174614277494.html

—————————————————————

6月3日,校内网官方在部分技术性论坛与网站,公布了校内网API平台的网络入口,以及使用规则和指南,开始邀请广大应用程序开发爱好者以及第三方合作公司使用校内网API平台。

  校内网在邀请测试阶段公布的入口包括“添加Developer入口”、“我的应用程序管理入口”、“编辑APP菜单入口”。据校内网技术人员介绍,每个校内网应用都会和一个“开发许可证”对应,一个开发者可申请多个许可证,即开放多个应用;在邀请测试阶段,所有的应用虽然暂时不会对外发布,但是不影响开发者和自己的好友在小范围内使用。

  作为国内最大的SNS网站,校内网具备很强的用户基础,同时,用户与用户之间又通过彼此同学、同事、朋友等关系再进一步有着广泛联络,所以校内网认为自己能更便捷快速地把应用程序传播出去。“所以我们在测试阶段,希望更多的应用程序开发爱好者一起加入进来”校内网API平台开发技术人员表示:“同时校内网本身也拥有很多爱好应用程序开发的用户,他们更了解用户本身更需要什么样的应用,我们很期待他们的加入。”

  据校内网API平台开发技术人员介绍,整个邀请测试阶段会持续到6月中下旬,之后将会考虑将整个平台系统开放化。

海蓝校内下载相册工具失效通知

[color=#0000FF][size=4]校内下载相册工具失效,原因是校内网采取了缓存机制,也就是说,当你第一次访问校内网的时候,会下载图片,此时图片会缓存到你电脑本地,当你第二次访问改相册照片的时候,会直接从本地读取,这样加快了访问校内相册的速度,可这样也同时造成我的校内相册下载工具的失效,每次下载的内容都是如下的代码:[/size][/color][code]<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<HTML><HEAD><META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1">
<TITLE>ERROR: The requested URL could not be retrieved</TITLE>
<STYLE type="text/css"><!–BODY{background-color:#ffffff;font-family:verdana,sans-serif}PRE{font-family:sans-serif}–></STYLE>
</HEAD><BODY>
<H1>ERROR</H1>
<H2>The requested URL could not be retrieved</H2>
<HR noshade size="1px">
<P>
While trying to retrieve the URL:
<A HREF="http://fm491.img.xiaonei.com/pic001/20080523/22/21/large_9155a177.jpg">http://fm491.img.xiaonei.com/pic001/20080523/22/21/large_9155a177.jpg</A>
<P>
The following error was encountered:
<UL>
<LI>
<STRONG>
Access Denied.
</STRONG>
<P>
Access control configuration prevents your request from
being allowed at this time.  Please contact your service provider if
you feel this is incorrect.
</UL>
<P>Your cache administrator is <A HREF="mailto:root">root</A>.

<BR clear="all">
<HR noshade size="1px">
<ADDRESS>
Generated Sat, 31 May 2008 16:28:02 GMT by blcu.xiaonei.com (squid/2.5.STABLE14)
</ADDRESS>
</BODY></HTML>[/code]
[color=#0000FF][size=4]意思是说你无法访问这个地址。浏览器会自动从本地读取缓存的图片,可是我的代码还没有这么高级,做不到这一点,所以只能从服务器读,可是校内的服务器已经不允许你读取,所以下载的图片就是如上的代码了,只有1K左右大小,打开就是空白的,没有任何图像
如果仍想使用我的下载工具的朋友,提供的解决办法是,在下载你想要的相册之前,先清空浏览器的缓存,再下载,我试过,这个办法可行,可以下载到相册的图片[/size][/color]

jsp中文乱码终极解决方法

一 找出问题的根源
    乱码可能出现的地方:1 jsp页面中
                        2 jsp页面之间相互传参的参数
                        3 与数据库中数据的存取
    基本归纳为以上几种。

二 寻找解决方案
    1 出现在jsp页面中,是由于没有设置jsp页面的中文字符编码。
    2 出现在jsp页面之间相互传参,是由于参数没有设置正确的字符编码。
    3 以上2个问题解决了,那么存到数据库中,自然就不存在乱码。除非你对存入到数据库里的数据再次进行编码。
三解决方法:
1的解决方法
[code]<% @ page contentType = " text/html;charset=gb2312 " %> [/code]
加上这句解决jsp页面中的中文乱码显示,tomcat编译完后向客户端输出的html文件不是采

用中文编码,所以会导致乱码产生。

2的解决方法
2.1
[code]<% request.setCharacterEncoding( " gb2312 " ); %> [/code]
加上这句解决jsp页面中的中文参数传递乱码。
因为浏览器默认使用的编码是“UTF-8”发送请求参数。
我们把它改为”gb2312″就ok了。

2.2 [code]String(request.getParameter("name").getBytes("ISO8859_1"),"GB2312");[/code]
这句的意思是,把传来的参数全部编码转换成gb2312,这样做的缺点是每次传来一个参数

都要这样写,很麻烦。

同样可通过设置server.xml配置文件来实现。

[code]< Connector
port ="8080"                 maxHttpHeaderSize ="8192"
                maxThreads ="150" minSpareThreads ="25" maxSpareThreads ="75"
                enableLookups ="false" redirectPort ="8443" acceptCount ="100"
                connectionTimeout ="20000" disableUploadTimeout ="true"   URIEncoding ="gb2312" /> [/code]
但是这样就应用到整个webapp中去了。

另:
[code]<% @page pageEncoding = " gb2312 " %>[/code]
此句是为了让jsp编译器能正确地解码含有中文字符的jsp页面。

其它方法还可以修改web.xml文件,配置一个过滤器。其原理都一样,只是换种方式而已。
有的书上专门写了一个函数来解决乱码,实际上对比一下就知道那种解决方法的好与坏。
回过头来一看,解决乱码也不过如此。
ok,实际就加上这3句搞定问题。

[code]<% @page pageEncoding = " gb2312 " %>
<% @ page contentType = " text/html;charset=gb2312 " %>
<% request.setCharacterEncoding( " gb2312 " ); %> [/code]
请大家有什么想法,以及有什么不对的地方请各位说明,写在留言上,大家一起讨论。

补充:添加一个过滤器SetCharacterEncodingFilter.java
[code]import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

public class SetCharacterEncodingFilter implements Filter {
  protected String encoding = null;

  protected FilterConfig filterConfig = null;

  public void init(FilterConfig filterConfig) throws ServletException {
    this.filterConfig = filterConfig;
    this.encoding = filterConfig.getInitParameter("encoding");
  }

  public void doFilter(ServletRequest request, ServletResponse response,
      FilterChain chain) throws IOException, ServletException {
    request.setCharacterEncoding("UTF-8");
    chain.doFilter(request, response);
  }

  public void destroy() {
    this.encoding = null;
    this.filterConfig = null;
  }

  protected String selectEncoding(ServletRequest request) {
    return (this.encoding);
  }
}[/code]
在web.xml添加
  
[code]
    <!– 过滤器 –>
    <filter>
        <filter-name>Set Character Encoding</filter-name>
        <filter-class>cn.ldsea.base.SetCharacterEncodingFilter</filter-class>
        <init-param>
             <param-name>encoding</param-name>
             <param-value>UTF-8</param-value>
        </init-param>
     </filter>

     <filter-mapping>
        <filter-name>Set Character Encoding</filter-name>
         <url-pattern>/*</url-pattern>
     </filter-mapping>  
[/code]