<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>Virgo_S</title>
    <description>开始Java,开始新的生活</description>
    <link>http://virgos.javaeye.com</link>
    <language>UTF-8</language>
    <copyright>Copyright 2003-2008, JavaEye.com</copyright>
    <docs>http://blogs.law.harvard.edu/tech/rss</docs>
    <generator>JavaEye - 做最棒的软件开发交流社区</generator>
      <item>
        <title>Web开发中的Listener和Filter </title>
        <author>Virgo_S</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://virgos.javaeye.com">Virgo_S</a>&nbsp;
          链接：<a href="http://virgos.javaeye.com/blog/234025" style="color:red;">http://virgos.javaeye.com/blog/234025</a>&nbsp;
          发表时间: 2008年08月28日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <a href="http://www.javadby.com/Web_Service/20080127/5103.html" target="_blank">http://www.javadby.com/Web_Service/20080127/5103.html</a><br /><br />jsp开发中的 监听器和过滤器，这两个东西要说起来，很大，很繁。今天我想用一个现实的例子，来说明这两个东东的作用。 <br />案例描述<br /><br />        假设你平时生活在北京，有天你去一个很边远很贫穷的山村体验生活，到了那个山村后，你想要什么东西，村长都会同意，然后安排村民送给你，但是有一点例外的是，一旦你问他们要钱，村长坚决不给，还会带领村民把你打回北京去。<br /><br />        你为了从村民那里带走尽量多的东西，所以你在出发前准备了一个大袋子，希望把村民给的东西都放到袋子里；然后你在回到城市后，这个袋子就没用了，你就把这个袋子给扔了。<br /><br />代码模拟<br /><br />         恩，我想用如下简单代码来模拟以上案例，大家可以想一下监听器扮演者什么角色？过滤器扮演什么角色？<br /><br />1. 新建一个java web project；<br /><br />2. 默认的index.jsp页面上加上两个链接，模拟要村民要红薯和要钱，如下：<br /><br /><pre name="code" class="java">&lt;html>
  &lt;body>
    &lt;h1>欢迎掉入无名村，哈哈&lt;/h1>&lt;br>
    &lt;a href="hongshu.jsp">给红薯&lt;/a>&lt;br/>
    &lt;a href="money.jsp">给钱&lt;/a>&lt;br/>
  &lt;/body>
&lt;/html></pre><br /><br />3. 新建一个大布袋类：BigBag.java，如下：<br /><br /><pre name="code" class="java">package chb.demo.web;

import java.util.HashMap;

public class BigBag ...{
    public static HashMap&lt;String, Integer> bag;//村民的东西就放在这个袋子里
}</pre><br /><br />4. 新建一个监听器：MyListener.java，如下：<br /><pre name="code" class="java">package chb.demo.web;

import java.util.HashMap;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

public class MyListener implements ServletContextListener...{

    public void contextDestroyed(ServletContextEvent arg0) ...{
        BigBag.bag = null;
        System.out.println("回城了，让掉烂袋子吧");
    }

    public void contextInitialized(ServletContextEvent arg0) ...{
        BigBag.bag = new HashMap&lt;String, Integer>();
        System.out.println("要进山了，准备好布袋子");
    }

}</pre><br /><br />5. 再新建一个过滤器：MyFilter.java，如下：<br /><br /><pre name="code" class="java">package chb.demo.web;

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;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class MyFilter implements Filter ...{

    public void destroy() ...{

    }

    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) throws IOException, ServletException ...{
        HttpServletRequest req = (HttpServletRequest)request;
        HttpServletResponse rsp = (HttpServletResponse)response;
        if(req.getRequestURI().toString().endsWith("money.jsp"))...{
            //什么时候有过钱啊？打回北京去
            rsp.sendRedirect("gohome.jsp");
            System.out.println("什么时候有过钱啊，滚回家去！");
            return;
        }else if(req.getRequestURI().toString().endsWith("hongshu.jsp"))...{
            if(BigBag.bag.containsKey("hongshu"))...{
                int num = BigBag.bag.get("hongshu")+1;
                BigBag.bag.put("hongshu", num);
                System.out.println("得到第"+num+"个红薯");
            }else...{
                BigBag.bag.put("hongshu", 1);
                System.out.println("得到第1个红薯");
            }
            //村长同意了，下面就是到村民家中拿了。。
            chain.doFilter(request, response);
        }else...{
            //只要不要钱就行，放行
            chain.doFilter(request, response);
        }
    }

    public void init(FilterConfig filterConfig) throws ServletException ...{

    }

}</pre><br /><br />6. 在web.xml中配置监听器和过滤器，如下所示：<br /><br />&lt;?xml version="1.0" encoding="UTF-8"?><br />&lt;web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"<br />    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"<br />    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee <br />    http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"><br /><br />    &lt;filter><br />        &lt;filter-name>myFilter&lt;/filter-name><br />        &lt;filter-class>chb.demo.web.MyFilter&lt;/filter-class><br />    &lt;/filter><br /><br />    &lt;filter-mapping><br />        &lt;filter-name>myFilter&lt;/filter-name><br />        &lt;url-pattern>/*&lt;/url-pattern><br />    &lt;/filter-mapping><br /><br />    &lt;listener><br />        &lt;listener-class>chb.demo.web.MyListener&lt;/listener-class><br />    &lt;/listener><br />    &lt;welcome-file-list><br />        &lt;welcome-file>index.jsp&lt;/welcome-file><br />    &lt;/welcome-file-list><br />&lt;/web-app><br /><br />好了，大功告成，部署运行，观察结果怎样？<br /><br />分析结果<br /><br />我们会观察到如下结果：<br /><br />当服务启动过程中，控制台输出“要进山了，准备好布袋子”<br />当点击一下“给红薯”的链接时，控制台会输出“得到第x个红薯”<br />当点击一下“给钱”的链接时，控制台输出“什么时候有过钱啊，滚回家去！”<br />怎么样？有点明白了？<br /><br />其实，监听器就是在服务启动之前做好保证服务正常运行的准备工作，服务结束的时候再善后一下；对应案例中的情况，就是在上路之前把袋子准备好，回来了把袋子扔掉；类似保姆的工作，照顾孩子起床，再照顾孩子睡下。<br /><br />过滤器就是针对服务器的请求，加以过滤限制；对应案例中的情况，就是村长了，掌握着生杀大权，什么事都得过我这关才行^_^
          <br/>
          <span style="color:red;">
            <a href="http://virgos.javaeye.com/blog/234025#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 28 Aug 2008 16:12:54 +0800</pubDate>
        <link>http://virgos.javaeye.com/blog/234025</link>
        <guid>http://virgos.javaeye.com/blog/234025</guid>
      </item>
      <item>
        <title>Flex Builder中创建简单BlazeDS信息程序</title>
        <author>Virgo_S</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://virgos.javaeye.com">Virgo_S</a>&nbsp;
          链接：<a href="http://virgos.javaeye.com/blog/232167" style="color:red;">http://virgos.javaeye.com/blog/232167</a>&nbsp;
          发表时间: 2008年08月25日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          这个实例教你怎么用BlazeDS信息服务创建一个简单的聊天程序。<br /><br /><span style="color: red">服务器端配置：</span><br />1. 在你拷贝过来的BlazeDS的web程序中，打开WEB-INF/flex/messaging-config.xml文件。<br />如果你用BlazeDS集成Tomcat服务器，BlazeDS的web程序可以在install_dir/tomcat/webapps中找到。messaging-config.xml文件包含了信息服务的设置。如果你打开同一目录下services-config.xml文件，你会看到the messaging-config.xml在这个文件中被引用。services-config.xml对BlazeDS是最好高级配置。通常，你为指定服务，像信息，引用配置文件。在这个文件，你也可以定义广泛的系统设置。<br />2. 在messaging-config.xml文件中，在&lt;/service>元素上面添加下面的元素：<br /><pre name="code" class="java">&lt;destination id="chat"/>
</pre><br />3. 服务器端的目标是把Flex客户端的信息发布，客户端描述了被发布的信息。值得注意的是有一个my-polling-amf 的默认通道在messaging-config.xml配置文件里。BlazeDS利用通道发送数据，并且在Flex客户端和服务器端相互交互。实际的通道被定义在services-config.xml，它仅在messaging-config.xml中被引用。这个特殊的通道利用the Action Message Format (AMF)，获取到达服务器端的信息。除了正在获取的通道，BlazeDS也提供了通道用来客户端，服务器，流数据之间的联系。<br />4. 开始或者重新启动你的程序服务。<br /><br /><span style="color: red">客户点部署</span>：<br /><br />1. 在Flex Builder 3中，像如下描述创建一个新的BlazeDS工程<br /><a href="http://learn.adobe.com/wiki/display/Flex/Using+Flex+Builder+with+your+J2EE+server" target="_blank">http://learn.adobe.com/wiki/display/Flex/Using+Flex+Builder+with+your+J2EE+server</a><br />2. 工程名称为chat1.<br />3. 在FlexBuilder中创建chat1.mxml，在该文件中你将创建一个Flex客户程序，程序可以发布信息到目标程序，并且在目标程序显示信息。<br />4. 在chat1.mxml文件下面的&lt;mx:Application>元素中添加一个空的&lt;mx:Script>元素。你可以在FlexBuilder输入下面的代码，或者复制下面的代码<br /><pre name="code" class="java">&lt;mx:Script>
	&lt;![CDATA[

	]]&gt;
&lt;/mx:Script></pre><br />5. 在&lt;/mx:Script>添加下面的MXML代码。<br />这个代码创建一个producer and consumer。The producer 发送信息到目的地，the consumer 显示从目的地取回的信息。在这个程序，我们在MXML创建a Producer and Consumer对象，也可以像大多数Flex对象，你可以有选择的在ActionScript中创建他们。<br /><pre name="code" class="java">&lt;mx:Consumer id="consumer" destination="chat" message="messageHandler(event.message)"/>
	&lt;mx:Producer id="producer" destination="chat"/></pre><br />6. 在&lt;mx:Consumer>中添加下面的MXML代码。<br />这部分代码创建用户接口，该接口被用来输入信息，发送信息，显示接收的信息。Panel容器组织它包含的对象。ControlBar也可以布局。TextArea用来显示终端数据。TextInput用来输入信息.你用Button去提交信息到终端。<br /><pre name="code" class="java">&lt;mx:Panel title="Chat" width="100%" height="100%">
	&lt;mx:TextArea id="log" width="100%" height="100%"/>
	&lt;mx:ControlBar>
		&lt;mx:TextInput id="msg" width="100%" enter="send()"/>
		&lt;mx:Button label="Send B" click="send()"/>
	&lt;/mx:ControlBar>
&lt;/mx:Panel></pre><br />7. 在&lt;mx:Script>的CDATA部分，添加如下代码：<br /><pre name="code" class="java">import mx.messaging.messages.AsyncMessage;
import mx.messaging.messages.IMessage;

private function send():void{
	var message:IMessage = new AsyncMessage();
	message.body.chatMessage = msg.text;
	producer.send(message);
	msg.text = "";
}
private function messageHandler(message:IMessage):void{
	log.text += message.body.chatMessage + "\n";
}
</pre><br />这部分代码可以做如下的事情：<br /> (1)导入AsyncMessage类和IMessage接口，他们被用在send()方法里。<br /> (2)创建send()方法，当按钮被点击调用该方法。<br /> (3)<br />This method creates a new AsyncMessage and assigns it to the variable message which is of type IMessage . It sets the value of the message.body.chatMessage property to the value of the msg.text - the TextInput control's text property. It callse the Producer's send() method to send the message, and then empties the msg.text property. <br />Creates the messageHandler() event handler method. This method handles "message" events when the Consumer object receives a message from the destination. This method displays message.body.chatMessage text in the log.text property - the text property of the TextArea control. Note that the Consumer element's message property is set to the messageHandler() method.<br />Note: Because the producer.send() method takes an IMessage as an argument in this example we explicitly cast AsyncMessage to the IMessage interface which it implements. If you don't do this and call producer.send() with an AsyncMessage, this conversion will happen automatically. <br />8. 添加MXML的属性，以便程序开始的时候Consumer<br /><br /><br /><br /><br />    Add the following MXML attribute the the mx:Application element so that the Consumer subscribes to the destination when the application starts: <br />creationComplete="consumer.subscribe()"<br />The mx:Application element should now look like this:<br /><br />&lt;mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"<br />creationComplete="consumer.subscribe()"><br />The MXML code is now complete.<br /><br />Make sure that your BlazeDS server is running. <br />Compile and run the client application in Flex Builder by selecting Run > Run from the menu bar. <br />Open the same URL in a second browser window. <br />Enter messages in one of the two windows, and they should appear in the other window.
          <br/>
          <span style="color:red;">
            <a href="http://virgos.javaeye.com/blog/232167#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 25 Aug 2008 00:22:32 +0800</pubDate>
        <link>http://virgos.javaeye.com/blog/232167</link>
        <guid>http://virgos.javaeye.com/blog/232167</guid>
      </item>
      <item>
        <title>Flex中数据交换</title>
        <author>Virgo_S</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://virgos.javaeye.com">Virgo_S</a>&nbsp;
          链接：<a href="http://virgos.javaeye.com/blog/232156" style="color:red;">http://virgos.javaeye.com/blog/232156</a>&nbsp;
          发表时间: 2008年08月24日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          在这部分，你将学习到怎么去创建几个程序，他们将取回基于给用户提供的信息的XML和纯文本运输数据。你将用FlexBuilder，预编译Flex组件，和FlexHTTP服务去创建这个程序。<br /><br /><span style="color: red">学习要点</span>:<br />学习怎么发送参数到服务器端程序，作为纯文本或者XML取回结果<br /><br />相关该例子的Flex信息<br />下面的列表概述了相关这个例子的Flex技术要点<br />1. Flex程序是SWF文件<br />2. Flex是以编程为主要方式去创建基于Flash的RIA<br />3. Flex程序用Flash Player9展现<br />4. 像所有的RIA一样，FlexSWF文件是在客户端处理的，而不是在服务器端处理的。<br />5. Flex连接像ColdFusion，PHP，ASP。NET和Java这样的服务器端程序。<br />6. 你可以通过HTTP取回纯文本或者XML数据<br />7. 你可以通过web服务取回SOAP信息<br />8. 你可以用LiveCycle数据服务和Java远程对象(POJOs, JavaBeans, EJBs and ColdFusion Components) 交互<br /><br /><span style="color: red">代码文件:</span><br />这部分为运输费用Flex程序提供了完整的代码。<br />Application overview<br /><img src="http://learn.adobe.com/wiki/download/attachments/5701669/dataRetrieval.png" /><br /><br />种类 1: HTTPService 返回纯文本<br /><pre name="code" class="java">&lt;?xml version="1.0" encoding="utf-8"?>
&lt;mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
    layout="absolute"
    backgroundColor="#FFFFFF"
    backgroundAlpha="0"
    backgroundImage="" >
	&lt;mx:Script>
		&lt;![CDATA[
		import mx.rpc.events.ResultEvent;
		import mx.rpc.events.FaultEvent;
		import mx.controls.Alert;

	        public function handlePlain(event:ResultEvent):void
	        {
	            shippingOptions.htmlText = event.result.toString();
	        }

	        public function handleFault(event:FaultEvent):void
	        {
	           Alert.show(event.fault.faultString, "Error");
	        }
		]]&gt;
	&lt;/mx:Script>

	&lt;mx:HTTPService result="handlePlain(event);" fault="handleFault(event);" id="plainRPC" resultFormat="text"
	    url="http://examples.adobe.com/flex3/exchangingdata/text/plainHttpService.php"
	    useProxy="false">
	    &lt;mx:request xmlns="">
	        &lt;zipcode>{zipcode.text}&lt;/zipcode>
	        &lt;pounds>{weight_lb.text}&lt;/pounds>
	    &lt;/mx:request>
	&lt;/mx:HTTPService>

	&lt;mx:Label x="56" y="32" text="Zip Code" width="55" height="18" textAlign="right" fontWeight="bold"/>
	&lt;mx:Label x="56" y="58" text="Weight" width="55" height="18" textAlign="right" fontWeight="bold"/>
	&lt;mx:TextInput x="130" y="32" id="zipcode" width="160" height="22"/>
	&lt;mx:TextInput x="130" y="58" id="weight_lb" width="160" height="22"/>
	&lt;mx:Button x="130" y="95" label="Get Shipping Options" click="plainRPC.send();" width="160" height="22"/>

	&lt;mx:Text x="56" y="150" id="shippingOptions" width="310" height="133" fontWeight="bold"/>

&lt;/mx:Application></pre><br /><br />种类 2: HTTPService 返回XML<br /><br /><pre name="code" class="java">&lt;?xml version="1.0" encoding="utf-8"?>
&lt;mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">

	&lt;mx:Script>
		&lt;![CDATA[
			import mx.rpc.events.ResultEvent;
			import mx.rpc.events.FaultEvent;
			import mx.controls.Alert;

                           [Bindable]
                           private var shippingInfo:XMLList;

	        public function handleXML(event:ResultEvent):void
            {
                shippingInfo = event.result.option as XMLList;
            }

	        public function handleFault(event:FaultEvent):void
	        {
	           Alert.show(event.fault.faultString, "Error");
	        }
		]]&gt;
	&lt;/mx:Script>

    &lt;mx:HTTPService result="handleXML(event);" fault="handleFault(event);" id="xmlRPC" resultFormat="e4x"
    	url="http://examples.adobe.com/flex3app/flex3samples/exchangingdata/xml/xmlHttpService.jsp" useProxy="false">
	    &lt;mx:request xmlns="">
	        &lt;zipcode>{zipcode.text}&lt;/zipcode>
	        &lt;pounds>{weight_lb.text}&lt;/pounds>
	    &lt;/mx:request>
	&lt;/mx:HTTPService>

	&lt;mx:Label x="56" y="32" text="Zip Code" width="55" height="18" textAlign="right" fontWeight="bold"/>
	&lt;mx:Label x="56" y="58" text="Weight" width="55" height="18" textAlign="right" fontWeight="bold"/>
	&lt;mx:TextInput x="130" y="32" id="zipcode" width="160" height="22"/>
	&lt;mx:TextInput x="130" y="58" id="weight_lb" width="160" height="22"/>
	&lt;mx:Button x="130" y="95" label="Get Shipping Options" click="xmlRPC.send();" width="160" height="22"/>
	&lt;mx:DataGrid
		dataProvider="{shippingInfo}"
		x="80" y="141" width="262" height="92" id="shippingOptionsList" editable="false" enabled="true">
	    &lt;mx:columns>
	        &lt;mx:DataGridColumn headerText="Service" dataField="service" />
	        &lt;mx:DataGridColumn headerText="Price" dataField="price" />
	    &lt;/mx:columns>
	&lt;/mx:DataGrid>

&lt;/mx:Application></pre><br /><br />JSP and JAVA files<br />Plain text example<br />PlainHttpService.jsp<br /><pre name="code" class="java">&lt;%@page import="quickstart.ShippingCalculator,
                quickstart.ShippingOption,
                java.util.List" %>
&lt;%
    ShippingCalculator calc = new ShippingCalculator();
    List    options;
    int     zipcode;
    double  pounds;

    zipcode = Integer.parseInt(request.getParameter("zipcode"));
    pounds = Double.parseDouble(request.getParameter("pounds"));

    options = calc.getShippingOptions(zipcode, pounds);

    for (int i = 0; i &lt; options.size(); i++) {
        ShippingOption option = (ShippingOption) options.get(i);
%>&lt;%= option.getService() %>: &lt;%= option.getPrice() %> USD
&lt;%
    }
%></pre><br /><br />XML example<br />xmlHttpService.jsp<br /><pre name="code" class="java">&lt;%@page import="quickstart.ShippingCalculator,
                quickstart.ShippingOption,
                java.util.List" %>

&lt;?xml version="1.0" encoding="utf-8"?>
&lt;options>
&lt;%
    ShippingCalculator calc = new ShippingCalculator();
    List    options;
    int     zipcode;
    double  pounds;

    zipcode = Integer.parseInt(request.getParameter("zipcode"));
    pounds = Double.parseDouble(request.getParameter("pounds"));

    options = calc.getShippingOptions(zipcode, pounds);

    for (int i = 0; i &lt; options.size(); i++) {
        ShippingOption option = (ShippingOption) options.get(i);
%>
    &lt;option>
        &lt;service>&lt;%= option.getService() %>&lt;/service>
        &lt;price>&lt;%= option.getPrice() %>&lt;/price>
    &lt;/option>
&lt;%
    }
%>
&lt;/options></pre><br /><br />ShippingCalculator.java<br /><br /><pre name="code" class="java">package quickstart;

import java.util.ArrayList;
import java.util.List;
import java.lang.Math;

public class ShippingCalculator {

    /*  Returns a list of made-up ShippingOptions.
    */
    public List getShippingOptions(int zipcode, double pounds) {

        List        options = new ArrayList();
        double      baseCost;

        baseCost = Math.round(zipcode / 10000) + (pounds * 5);

        options.add(new ShippingOption("Next Day", baseCost * 4));
        options.add(new ShippingOption("Two Day Air", baseCost * 2));
        options.add(new ShippingOption("Saver Ground", baseCost));

        return options;
    }
}</pre><br /><br />ShippingOption.java<br /><pre name="code" class="java">package quickstart;

public class ShippingOption {

    private String  service;
    private double  price;

    public ShippingOption() {
    }

    public ShippingOption(String aService, double aPrice) {
        this.service = aService;
        this.price = aPrice;
    }

    public void setService(String value) {
        this.service = value;
    }

    public void setPrice(double value) {
        this.price = value;
    }

    public String getService() { return this.service; }

    public double getPrice() { return this.price; }
}</pre>
          <br/>
          <span style="color:red;">
            <a href="http://virgos.javaeye.com/blog/232156#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 24 Aug 2008 22:55:10 +0800</pubDate>
        <link>http://virgos.javaeye.com/blog/232156</link>
        <guid>http://virgos.javaeye.com/blog/232156</guid>
      </item>
      <item>
        <title>Flex 创建简单的RIA</title>
        <author>Virgo_S</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://virgos.javaeye.com">Virgo_S</a>&nbsp;
          链接：<a href="http://virgos.javaeye.com/blog/232111" style="color:red;">http://virgos.javaeye.com/blog/232111</a>&nbsp;
          发表时间: 2008年08月24日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          在这部分里，你将学习到怎么创建一个简单的RIA，根据用户输入的关键字，从the Flickr提供给用户的API取回并且显示图片。创建这个程序你将会用到Flex Builder，Flex的组件，和Flex HTTP服务。<br />这部分的资源是按一下顺序组织的(from least detail to most detail，在最后的章节指导你添加的资源)。<br />内容包括：<br /><span style="color: red">学习要点</span>：对创建一个简单的RIA的信息和概念的概述<br /><span style="color: red">代码文件</span>：对Flickr的RIA的完整代码<br /><span style="color: red">代码剖析</span>：通过一个交互式方式，理解Flick的RIA（Rich International Application）代码<br /><span style="color: red">学习体验</span>：一步步的说明如何创建FlickrRIA的。<br /><br />下面的程序用FlexBuilder创建，是一个已经嵌入的SWF文件。输入一个搜索项，像Adobe，在文本框里，并且点击提交按钮，就可以从FlickrAPI获取并且显示数据。<br /><br /><span style="color: red">学习要点</span>：<br />一个简单的FlickrAPI程序的目的是让编程人员了解MXML和ActionScript的语法，和<br />Flex的开发过程。<br />与Flickr简单的RIA相关的信息<br />下面的列表概述了帮助你定位于AdobeFlex技术的要点<br />1. Flex程序是Flash程序<br />  1.1  Flex是以编程为核心方式去创建基于Flash的富网络程序。<br />  1.2  Flex程序用Flash Player 9展示<br />  1.3  像所有的Flash的RIA一样，FlexSWF文件也是在客户端进行的，而不是在服务器端。 <br />2. Flex框架包含了预定义类库，和创建Flex程序必要的程序服务。<br />  2.1  框架在免费的SDK和基于Eclipse以FlexBuilder命名的IDE中都有效<br />  2.2  框架包括一个编译器，他可以作为单独的工具或者FlexBuilder的一部分。<br />  2.3  类库和应用服务提供为了快捷程序开发给开发者标准的组件和工具。<br />       标准UI组件可以被扩展和自定义。<br />3. Flex程序是用MXML或者ActionScript写的。<br />  3.1  MXML是一种基于XML的标记语言，它主要是用于放置程序要显示的元素<br />  3.2  ActionScript是一种面向对象的编程语言，主要用于程序的逻辑。<br />  3.3  MXML和ActionScript被编译成二进制的SWF文件<br /><br /><br />你们在Flickr简单的RIA中学到什恶魔？<br />当你学习Flickr简单RIA代码的时候，你将学会怎样去：<br />1.  用MXML接受用户提供的关键字并且显示照片来创建用户接口<br />2.  用ActionScript写方法和事件处理<br />3.  用Flex HTTP服务请求和处理RSS来自Flickr数据<br />4.  创建一个绑定XML的变量，它用于罗列出列表数据<br />5.  为XML数据创建命名空间<br />6.  创建一个可以显示图片的位置和描述在组件中<br />7.  创建自定义组件<br />8.  自定义程序的显示<br /><br /><span style="color: red">代码文件</span>：<br />这部分将提供完成的FlickrRIA的代码<br /><br />Main Application (FlickrRIA.mxml)<br /><pre name="code" class="java">&lt;?xml version="1.0" encoding="utf-8"?>
&lt;mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
    backgroundGradientColors="[0xFFFFFF, 0xAAAAAA]"
    horizontalAlign="left"
    verticalGap="15"
    horizontalGap="15">

    &lt;mx:Script>
        &lt;![CDATA[
            import mx.collections.ArrayCollection;
            import mx.rpc.events.ResultEvent;

            [Bindable]
            private var photoFeed:ArrayCollection;

            private function requestPhotos():void {
                photoService.cancel();
                var params:Object = new Object();
                params.format = 'rss_200_enc';
                params.tags = searchTerms.text;
                photoService.send(params);
            }

            private function photoHandler(event:ResultEvent):void {
                 photoFeed = event.result.rss.channel.item as ArrayCollection;
            }
         ]]&gt;
    &lt;/mx:Script>

    &lt;mx:HTTPService id="photoService"
        url="http://api.flickr.com/services/feeds/photos_public.gne"
        result="photoHandler(event)" />

	&lt;mx:HBox>
		&lt;mx:Label text="Flickr tags or search terms:" />
		&lt;mx:TextInput id="searchTerms" />
		&lt;mx:Button label="Search"
			click="requestPhotos()" />
	&lt;/mx:HBox>

	&lt;mx:TileList width="100%" height="100%"
		dataProvider="{photoFeed}"
		itemRenderer="FlickrThumbnail">
	&lt;/mx:TileList>

&lt;/mx:Application></pre><br /><br /><br />Custom component item renderer (FlickrThumbnail.mxml)<br /><pre name="code" class="java">&lt;?xml version="1.0" encoding="utf-8"?>
&lt;mx:VBox xmlns:mx="http://www.adobe.com/2006/mxml"
	width="125" height="125"
	horizontalAlign="center"
	paddingBottom="5" paddingLeft="5" paddingRight="5" paddingTop="5">

	&lt;mx:Image
		width="75" height="75"
		source="{data.thumbnail.url}" />

	&lt;mx:Text width="100" text="{data.credit}" />

&lt;/mx:VBox></pre><br /><br />今天先写到这里，明天继续
          <br/>
          <span style="color:red;">
            <a href="http://virgos.javaeye.com/blog/232111#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 24 Aug 2008 16:45:05 +0800</pubDate>
        <link>http://virgos.javaeye.com/blog/232111</link>
        <guid>http://virgos.javaeye.com/blog/232111</guid>
      </item>
      <item>
        <title>Flex 和 Java</title>
        <author>Virgo_S</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://virgos.javaeye.com">Virgo_S</a>&nbsp;
          链接：<a href="http://virgos.javaeye.com/blog/232080" style="color:red;">http://virgos.javaeye.com/blog/232080</a>&nbsp;
          发表时间: 2008年08月24日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          技术性比较<br />当我们和其他技术集成Flex的时候，最应该记住的两点是：<br />Flex是客户端的技术，它被Flash Player 9来呈现效果。<br />Flex在客户端和JavaScript一起工作。<br />Flex要求的服务器端的技术（像ColdFusion，LiveCycle数据服务，Java<br />，ASP。NET，或者PHP）去提供给它实时数据。<br /><br />下面是Flex和Java<br />Java技术用来创建客户端和服务器的程序。当服务器端被大量接受时，基于浏览器的客户端程序并没有成功，因为文件大小太大，安装也很麻烦。Flex对Java开发者来说是一个解决办法，因为它能在用某种完全部署到大多数浏览器上的技术创建的表达方式和交互接口使发挥Java服务器的功能<br /><img src="http://learn.adobe.com/wiki/download/attachments/5701661/FlexAndJava_sm.png" />
          <br/>
          <span style="color:red;">
            <a href="http://virgos.javaeye.com/blog/232080#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 24 Aug 2008 12:44:07 +0800</pubDate>
        <link>http://virgos.javaeye.com/blog/232080</link>
        <guid>http://virgos.javaeye.com/blog/232080</guid>
      </item>
      <item>
        <title>Flex 介绍</title>
        <author>Virgo_S</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://virgos.javaeye.com">Virgo_S</a>&nbsp;
          链接：<a href="http://virgos.javaeye.com/blog/232072" style="color:red;">http://virgos.javaeye.com/blog/232072</a>&nbsp;
          发表时间: 2008年08月24日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          简介<br />Adobe Flex 是什么?像Flash一样，Flex创建一个可以用Flash播放器展现的Flash文件。<br />然而，Flex主要是开发者的工具，并且你开发Flex应用程序的方式完全不同于你开发Flash的RIA的方式。全部的Flex开发基于框架，该框架提供你可复用和可扩展性UI组件，数据和服务器的交互，事件处理等更多的功能。你可以在在你熟悉的代码环境创建RIA，而且你还可以从Flash应用程序得到很多益处，其中包括：<br />设计和实现人性化的用户接口的能力，并且这种接口不用考虑浏览器的限制问题<br />可以百分之百的部署到所有的网络用户的运行环境上<br />强大的ActionScript编程语言<br />和像流视频和声音的丰富媒体的集成的能力<br />相对比之下，Adobe Flash的环境关注于时间轴和可视化组件。因为重点，无论Flash编程语言AS的发展，是面向对象的语言，Flash因为创建灵活被作为设计者的开发工具。在过去的几年里，很多的开发者了解到用Flash创建强大RIA的简单，但是一部分人很难找一个合适的IDE。<br />你应该注意的是Flash和Flex可以一起工作。事实，Flex可以和Adobe的其他产品一个工作。设计者和开发者可以很轻松的在他们自己的去创建，然后整合成一个全新的RIA。<br />谁在用Flex?<br />Flex定位于开发者，而不是设计者。主要的Flex开发语言，AS3，是一个面向对象的开发语言，所以你可以用面向对象编程的思想去实践。<br />我需要购买什么吗？<br />创建Flex程序是免费的。你所需要的全部都是免费的，开源的Flex的SDK，其中包括<br />Flex框架 - 预定义类库和程序服务<br />独立的编译器<br />The Adobe Flex技术需要花钱的是：<br />Flex Builder - 基于Eclipse 的集成开发环境 ，它包括Flex的SDK和其他的开发工具像debugger和可视化设计。<br />Flex 图表 - 内部图表组件的类库，他可以从你的Flex程序绑定数据<br />生命周期服务（前面的Flex数据服务） - 内置数据管理服务的整个技术，FlexAjax桥，Java信息服务适配器，和实时合作工具（real-time collaboration tools）。<br /><br />我应该怎样创建Flex程序<br />一旦你已经决定选择使用mianfeideFlexSDK或者FlexBuilder集成开发环境，你就可以开始你的RIA开发了。<br />你将使用以下两种语言：<br />MXML 是一种基于XML的标记性语言，它主要用于放置程序显示元素的位置。<br />ActionScript是一种面向对象的编程语言，它主要负责程序的逻辑。<br />如果你正在使用免费的SDK，你将使用独立的编译器把你的代码编译到SWF文件里。Flex Builder被设置自动编译你的代码，并且创建一个必要的浏览器检测和其他一些客户端的代码。<br />在编译过程中，你的MXML代码被转成ActionScript代码，然后全部的ActionScript代码编译成二进制SWF文件。SWF可以上传到web服务器上，在那里它根据用户的请求而服务。<br /> <br />下面是流程图<br /><img src="http://learn.adobe.com/wiki/download/attachments/5701642/MXMLandAStoSWF.png" />
          <br/>
          <span style="color:red;">
            <a href="http://virgos.javaeye.com/blog/232072#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 24 Aug 2008 12:10:38 +0800</pubDate>
        <link>http://virgos.javaeye.com/blog/232072</link>
        <guid>http://virgos.javaeye.com/blog/232072</guid>
      </item>
      <item>
        <title>各州邮编</title>
        <author>Virgo_S</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://virgos.javaeye.com">Virgo_S</a>&nbsp;
          链接：<a href="http://virgos.javaeye.com/blog/231198" style="color:red;">http://virgos.javaeye.com/blog/231198</a>&nbsp;
          发表时间: 2008年08月21日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          邮编　　 城市(city)　　　　　州（state) <br />12201　　Albany　　　　　　　NewYork(NY) <br />30301　　Atlanta　　　　　　 Georgia(GA) <br />21401　　Annapolis　　　　　 Maryland(MD) <br />21201　　Baltimore　　　　　 Maryland(MD) <br />35201　　Birmingham　　　　　Alabama(AL) <br />14201　　Buffalo　　　　　　 NewYork(NY) <br />60601　　CHICAGO　　　　　　 Illinois(IL) <br />45201　　Cincinnati　　　　　Ohio(OH) <br />44101　　Cleveland　　　　　 Ohio(OH) <br />43085　　Columbus　　　　　　Ohio(OH)　 <br />71953　　Dallas　　　　　　　Arkansas(AR) <br />80002　　Denver　　　　　　　Colorado(CO) <br />99701　　Fairbanks　　　　　 Alaska(AK) <br />19019　　Philidelphia　　　　pennsylvania(PA) <br />96801　　Honolulu　　　　　　Hawii(HI) <br />46201　　Indianapolis　　　　Indiana(IN) <br />32099　　Jacksonville　　　　FLORIDA(FL)　　　　　 <br />64101　　Kansas City　　　　 Missouri(MO) <br />90001　　Los Angeles　　　　 California(CA) <br />89101　　Las Vegas　　　　　 Navada(NV) <br />55199　　Minneapolis　　　　 Minnesota(MN) <br />10001　　New York　　　　　　NewYork(NY) <br />70112　　New orleaans　　　　Louisana(LA) <br />68046　　Omaha　　　　　　　 Nebraska(NE) <br />85001　　Phoenix　　　　　　 Arizona(AZ) <br />15122　　Pittsburgh　　　　　pennsylvania(PA) <br />84101　　Salt Lake City　　　Utah(UT) <br />94203　　Sacramento　　　　　California(CA) <br />92101　　San Diego　　　　　 California(CA) <br />94101　　San Francisco　　　 California(CA) <br />95101　　San Jose　　　　　　California(CA) <br />55101　　Saint Paul　　　　　Minnesota(MN) <br />63101　　Saint Louis　　　　 Missouri(MO) <br />98101　　Seattle　　　　　　 Washington(WA) <br />33601　　Tampa　　　　　　　 FLORIDA(FL)s
          <br/>
          <span style="color:red;">
            <a href="http://virgos.javaeye.com/blog/231198#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 21 Aug 2008 15:21:35 +0800</pubDate>
        <link>http://virgos.javaeye.com/blog/231198</link>
        <guid>http://virgos.javaeye.com/blog/231198</guid>
      </item>
      <item>
        <title>计算机安全级别</title>
        <author>Virgo_S</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://virgos.javaeye.com">Virgo_S</a>&nbsp;
          链接：<a href="http://virgos.javaeye.com/blog/231196" style="color:red;">http://virgos.javaeye.com/blog/231196</a>&nbsp;
          发表时间: 2008年08月21日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          依据我国计算机信息系统安全保护等级划分准则，计算机信息系统系统安全保护等级分为五个等级。计算机信息系统系统安全保护能力随着安全保护等级的增高而逐渐增强。<br />接安全程度从最低到最高的完全排序如下：<br /><span style="color: red">第一级</span>：用户自主保护级<br />本级的计算机防护系统能够把用户和数据隔开，使用户具备自主的安全防护的能力。用户以根据需要采用系统提供的访问控制措施来保护自己的数据，避免其它用户对数据的非法读写与破坏。<br /><span style="color: red">第二级</span>：系统审计保护级<br />与用户自主保护级相比，本级的计算机防护系统访问控制粒度更细，使得允许或拒绝任何用户访问单个文件成为可能，它通过登陆规则、审计安全性相关事件和隔离资源，使用户对自己的行为负责。<br /><span style="color: red">第三级</span>：安全标记保护级<br />本级计算机防护系统具有系统审计保护级的所有功能。此外，还提供有关安全策略模型、数据标记以及严格访问控制的非形式化描述。系统中的每个对象都有一个敏感性标签，而每个用户都有一个许可级别。许可级别定义了用户可处理的敏感性标签。系统中的每个文件都按内容分类并标有敏感性标签。任何对用户许可级别和成员分类的更改都受到严格控制。<br /><span style="color: red">第四级</span>：结构化保护级<br />本级计算机防护系统建立在一个明确的形式化安全策略模型上，它要求第三级系统中的自主和强制访问控制扩展到所有的主体（引起信息在客体上流动的人、进程或设备）和客体（信息的载体）。系统的设计和实现要经过彻底的测试和审查。系统应结构化为明确而独立的模块，实施最少特权原则。必须对所有目标和实体实施访问控制政策，要有专职人员负责实施。要进行隐蔽信道分析。系统必须维护一个保护域，保护系统的完整性，防止外部干扰。系统具有相当的抗渗透能力。<br /><span style="color: red">第五级</span>：访问验证保护级。 <br />本级的计算机防护系统满足访问监控器的需求。访问监控器仲裁主体对客体的全部访问。访问监控器本身是抗篡改的；必须足够小，能够分析和测试。为了满足访问监控器需求，计算机防护系统在其构造时，排除那些对实施安全策略来说并非必要的部件，在设计和实现时，从系统工程角度将其复杂性降到最小程度。支持安全管理员职能；扩充审计机制，当发生与安全相关的事件时发出信号；提供系统恢复机制。系统具有很高的抗渗透能力。<br />计算机安全级别(美国)美国国防部开发的计算机安全标准——橙皮书<br />?D级，最低的安全级别,Dos,Windows,Macintosh System 7.1 <br />?C级 C1级，选择性安全保护 C2级，访问控制权力<br />UNIX系统，XENIX，Novell 3.x或更高版本，Windows NT<br />?B级 B1 级，标志安全保护 B2级，结构保护 B3级，安全域级别<br />?A级，验证设计
          <br/>
          <span style="color:red;">
            <a href="http://virgos.javaeye.com/blog/231196#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 21 Aug 2008 15:19:23 +0800</pubDate>
        <link>http://virgos.javaeye.com/blog/231196</link>
        <guid>http://virgos.javaeye.com/blog/231196</guid>
      </item>
      <item>
        <title>Flex中的Bindable的用法</title>
        <author>Virgo_S</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://virgos.javaeye.com">Virgo_S</a>&nbsp;
          链接：<a href="http://virgos.javaeye.com/blog/230783" style="color:red;">http://virgos.javaeye.com/blog/230783</a>&nbsp;
          发表时间: 2008年08月20日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          虽然多数Flex开发者都使用过[Bindable]标签，但是很多人都不知道这个标签的作用甚至不知道该标签为何物。[Bindable]就是所谓的元数据标签。元数据标签是一种特殊的标签，它在代码中的作用就是向编译器提供如何编译程序的信息。实际上，这些标签并没有被编译到生成的SWF文件中，而只是告诉编译器如何生成SWF文件。文档中列出的元数据标签共有12个，本文将讲解这些元数据标签的定义并给出使用它们的示例，在看完这篇文章之后，你就会明白应该在何时何处在你的Flex 2应用程序中使用元数据标签了。<br /><br />[ArrayElementType]<br /><br />实际上，定义一个数组通常来说是一件很平常的事情，因为数组中的元素可以是任何类型的。不过，使用ArrayElementType元数据标签可以让你定义数组元素的数据类型。下面的例子展示了如何使用[ArrayElementType]：<br /><br /><br /> 程序代码<br />   [ArrayElementType("String")]<br />    public var arrayOfStrings:Array;<br /><br />    [ArrayElementType("Number")]<br />    public var arrayOfNumbers:Array;<br /><br />    [ArrayElementType("mx.core.UIComponent")]<br />    public var arrayOfUIComponents:Array; <br /><br /><br />[Bindable]<br /><br />Bindable元数据标签是最经常用到的一个元数据标签，因为它使程序组件之间的数据同步变得很容易。Bindable可以用来绑定简单数据类型、类、复杂数据类型以及函数。绑定数据的时候，你必须先使用元数据标签定义一下数据，正如Listing 1中所示的那样。图1是Listing 1的代码运行结果。<br /><br />图1：<br /><br /><br />Bindable也可以用来绑定到事件。Listing 2展示了如何使用getter和setter函数将一个属性绑定到一个事件上。这个例子中有一个叫做phoneNumber的私有变量，还有一个公有的setter和getter函数。使用Bindable标签将这个getter方法绑定到了一个叫做phoneNumberChanged的事件上，只要数据发生改变setter方法就会分派phoneNumberChanged事件。通过使用setter方法，可以在数据赋予私有变量之前对其进行操作。在这个例子中，数据只有在长度大于等于10的时候才会被格式化。当phoneNumberChanged事件被分派的时候，第二个TextInput组件会被更新，因为他的text属性绑定到了phoneNumber变量上。<br /><br />图2和图3显示了Listing 2代码的运行结果。<br /><br />图2：<br /><br /><br />图3：<br /><br /><br />[DefaultProperty]<br /><br />DefaultProperty元数据标签用来将一个单一属性设定为某个类的默认属性。它允许在一个容器标签内设定属性，而不用定义属性的名字。一个简单的例子就是一个自定义Button类。Listing 3展示了一个简单的Button类，它将label属性设定为了DefaultProperty。<br />46<br /><br />Listing 4展示了label属性是如何在自定义Button标签中作为一个字符串定义的。<br /><br />[Embed]<br /><br />Embed元数据标签用来导入图片到程序。可以通过两种方式使用Embed。你可以将图片嵌入到ActionScript中并将其指派给一个变量（如同下面代码中的第一个例子），或者你也可以将图片直接指派给组件的属性（使用下面代码中的第二个例子所示的语法规则）。<br /><br />例1：<br /><br /> 程序代码<br />[Embed(source="myIcon.gif")]<br />[Bindable]<br />public var myIcon:Class;<br /><br /> <br /><br /> <br /><br />例2：<br /><br /> 程序代码<br /><br /> <br /><br /> <br /><br />上面这两个例子产生的结果是一样的。创建myIcon类的好处是，它在一个类中只定义一次并可以绑定到程序中的多个组件。<br /><br />[Event]<br /><br />Event元数据标签用来声明那些被自定义类分派的事件。将这个元数据标签添加到类定义中之后，你就可以在MXML标签中添加事件处理函数来初始化该自定义类。Listing 5创建了一个自定义Button类，每当它的label属性改变的时候就会分派一个事件。Listing 6所显示的主程序文件初始化了这个自定义Button并创建了事件处理函数，该函数将新的labe属性值赋给了一个TextArea组件以显示当前发生的更改。<br /><br />图4显示了Listing 5 和 Listing 6中的代码运行结果。<br /><br />图4：<br /><br /><br />[Effect]<br /><br />Effect元数据标签用来定义一个自定义效果，当某个事件发生的时候该效果会被分派。这个示例可以基于前面Event的例子来创建，通过简单地更改ButtonLabel类(Listing 7)中的一行代码，就定义了一个效果，该效果可以在MXML标签中直接使用(Listing 8)。<br /><br />[IconFile]<br /><br />IconFile是用来定义一个jpg，gif或者png文件的文件名的，它在你的自定义类中作为图标来使用。[Embed]元数据标签可以用来嵌入图片、SWF文件、音乐文件以及视频文件等，而IconFile则只是用来嵌入用来作为自定义类图标的文件。下面是一个IconFile的例子：<br /><br /><br /> 程序代码<br />[IconFile("icon.png")]<br />public class CustomButton extends Button<br />{<br /><br />}<br /><br /><br />[Inspectable]<br /><br />在使用Flex Builder 2的时候，你可能会希望某些自定义组件的属性在代码提示和属性检查器（property inspector）中显示，Inspectable元数据标签就是用来定义那些属性的。Listing 9展示的例子定义了一个inspectable的ccType变量，它定义了Visa为默认值、Credit Card为类别并将取值范围定义为包含了Visa, Mastercard, Discover, 和 American Express的枚举。<br /><br />图5展示了当将组件添加到程序中的时候所显示的代码提示。<br /><br />图5：<br /><br /><br />图6与上面展示的是同样的代码，但是这次是设计视图，所以我们能看到属性检查器。你可以看到属性ccType的类别为Credit Card，它的所有可选的值都在下拉列表中。<br /><br />图6：<br /><br /><br />[InstanceType]<br /><br />当在一个模板对象中声明一个像IDeferredInstance这样的变量时，InstanceType元数据标签就用来声明对象的类型。下面是InstanceType的用法：<br /><br /><br /> 程序代码<br />[InstanceType("package.className")] <br /><br /><br />[NonCommittingChangeEvent]<br /><br />NonCommittingChangeEvent元数据标签在某个特定事件发生的时候可以防止变量在事件发生的过程中被更改。Listing 10展示了它是如何工作的。一个名为s的字符串类型的私有变量被绑定到了名为ti2的TextInput组件上。另外一个id为ti1的TextInput组件在它的text发生更改的时候就会将s的值设置为它的text属性的值。另外，当triggerBinding 事件被分派的时候，附加在s变量上的Binding元数据标签就会进行绑定。只有在Enter键在ti1 TextInput组件中被按下时才会分派triggerBinding事件。<br /><br />[RemoteClass]<br /><br />RemoteClass可以用来将一个ActionScript类绑定到一个Java类或一个ColdFusion CFC。这样做可以自动转换数据类型。下面的例子将包com.mydomain中的名为MyClass的ActionScript类绑定到了同一个包中名为MyClass的Java类：<br /> 程序代码<br />package com.mydomain {<br />   [Bindable]<br />   [RemoteClass(alias="com.mydomain.MyClass")]<br />   public class MyClass {<br />     public var id:int;<br /><br />     public var myText:String;<br /><br />   }<br />} <br /><br /><br />[Style]<br /><br />Style元数据标签用来为组件定义自定义样式属性的。只需要简单地将Sytle元数据标签添加到类的定义当然，然后就可以使用getSytle方法获取它的值了。Listing 11 和 12中的例子定义了两个样式，分别为borderColor 和fillColor，它们的数据类型都是uint。当类初始化的时候这两个样式就会在标签中被设定。代码中覆写了updateDisplayList函数，用自定义的样式画了一个圆形边框并将其填充。<br /><br />图7展示了Listing 11 和 Listing 12中代码运行的结果。<br /><br />图7：<br /><br /><br />现在你应该会有这样的感觉了：“喔，现在我知道在哪里可以使用它们了”或者“嗯，我想我会在新的项目中尝试使用这些元数据标签”。如果你没有，那么你可能需要回过头去再看一遍这篇文章。OK，我想说的是Adobe Flex小组提供给我们的元数据标签不只是非常的强大，可以让我们扩展或自定义我们要做的东西，而且它还非常易于使用。通过使用它们，仅仅几行代码就可以完成一大堆事情。如果不使用这些标签，你会发现在Flex 2中实现一些东西是很辛苦的。 <br />此信息来自〖闪无忧〗<br />查看原网址:http://www.5uflash.com/Html/flex/091053329_3.html
          <br/>
          <span style="color:red;">
            <a href="http://virgos.javaeye.com/blog/230783#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 20 Aug 2008 17:42:20 +0800</pubDate>
        <link>http://virgos.javaeye.com/blog/230783</link>
        <guid>http://virgos.javaeye.com/blog/230783</guid>
      </item>
      <item>
        <title>多选图片一次上传</title>
        <author>Virgo_S</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://virgos.javaeye.com">Virgo_S</a>&nbsp;
          链接：<a href="http://virgos.javaeye.com/blog/229453" style="color:red;">http://virgos.javaeye.com/blog/229453</a>&nbsp;
          发表时间: 2008年08月18日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          做上传图片功能的时候，经常会遇到这样一个问题，有时候可能需要一次上传多张图片，而用html中默认的上控件，却只能选定一个文件，且不能对文件的后缀进行筛选。需要一次上传多个文件的需求，往往可以通过添加多个上传控件来予以满足，比如百度空间的相册上传功能就是这样来实现的。不过，要实现对上传文件后缀的过滤，却始终无法通过常规的方法予以实现。<br />这两个功能真的这么难以实现吗？非也，看看flickr的上传功能即可获得明确的答复。<br />为什么能实现这样的功能呢？google了一下，谜底就揭晓了。原来，这是利用了flash的若干功能，通过javascript和actionscript的交互得以实现的。js和as的通讯以前有研究过，所以要实现起来非常简单。再到flash里边f1一下，关于上传方面的相关只是也差不多了解了，因此，接下来的事情的就只是顺水推舟的事情了。<br />最重要的还是flash代码的完善，最后的成果如下：<br /><br /><pre name="code" class="java">// MultiUploader.fla
import flash.net.FileReferenceList;
import flash.net.FileReference;
import flash.external.ExternalInterface;

// 设置as中函数和js调用时的映射关系
ExternalInterface.addCallback("fu_open_dialog", null, openDialog);
ExternalInterface.addCallback("fu_begin_upload", null, beginUpload);

// 可以通过html页面里边设置FlashVars里边的upload_url来更改上传文件的路径
var uploadUrl:String = typeof(_root.upload_url) == "undefined" ? "FlashUpload.ashx" : _root.upload_url;
var listener:Object = new Object();
// 选择文件后，会视图调用js函数onUploaderSelect，并将文件列表传入进去，便于js进一步做一些逻辑控制
listener.onSelect = function(fileRefList:FileReferenceList) {
    ExternalInterface.call("onUploaderSelect", fileRefList.fileList); 
};

var fileRefList:FileReferenceList = null;
var imageTypes:Object = new Object();
imageTypes.description = "Images (*.jpg, *.jpeg, *.gif, *.png)"; // 上传文件类型说明
imageTypes.extension = "*.jpg; *.jpeg; *.gif; *.png"; // 控制上传文件类型

// 显示文件打开窗口
function openDialog():Void {
    if (fileRefList == null) {
        fileRefList = new FileReferenceList();
        fileRefList.addListener(listener);
    }
    fileRefList.browse([imageTypes]);
}
// 开始上传
function beginUpload():Void {
    var lis = new Object();
    // 每上传完一个文件后调用js函数onUploaderComplete
    lis.onComplete = function(file:FileReference):Void {
        ExternalInterface.call("onUploaderComplete", file.name); 
    };
    // 处理上传地址的http状态错误。比如404等。
    lis.onHTTPError = function(file:FileReference, httpError: Number):Void {
        ExternalInterface.call("onUploaderHTTPError", httpError, file.name);
    }
    
    var list:Array = fileRefList.fileList;
    var item:FileReference;
    // 最终还是将文件分单次传到指定上传页面进行处理
    for(var i:Number = 0; i &lt; list.length; i++) {
        item = list[i];
        item.addListener(lis);
        item.upload(uploadUrl);
    }
}</pre><br />至于客户端的处理，只需要将as中自动调用的几个js函数实现即可。最后的页面代码如下：<br /><pre name="code" class="java">&lt;!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
&lt;html>
&lt;head>
&lt;meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
&lt;title>Insert title here&lt;/title>
&lt;/head>
&lt;body>
&lt;input type="button" value="open" onclick="openUploadDialog();"/>
&lt;input type="button" value="upload" onclick="uploadFiles();"/>

&lt;div id="flashPanel">&lt;/div>

&lt;/body>
&lt;script type="text/javascript">
var flash = createUploadFlash(document.getElementById('flashPanel'), 'upload.swf', 'FlashUpload.ashx')
// 打开文件对话框
function openUploadDialog() {
    flash.fu_open_dialog();
}
// 上传文件
function uploadFiles() {
    flash.fu_begin_upload();
}

// 选择文件以后
function onUploaderSelect(list) {
    alert(list);
}

// 上传完一个文件以后
function onUploaderComplete(name) {
    alert(name);    
}

// 上传文件出错时
function onUploaderHTTPError(number, name) {
    switch (number) {
        case 413:
            alert("文件" + name + "大于10K，不能上传");
            break;    
    }
}
/**
* 创建一个flash。主要是在ie7里边需要用鼠标点击才能激活flash，通过动态生成flash的方式可以绕过这一点。
* @param panel 用来放置flash的div
* @param flashUrl flash的地址
* @param uploadUrl 用来出来上传文件的地址
*/
function createUploadFlash(panel, flashUrl, uploadUrl){
    var code = '&lt;object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=8,0,0,0" width="0" height="0" id="flashObject" align="middle">\
        &lt;param name="allowScriptAccess" value="sameDomain" />\
        &lt;param name="movie" value="' + flashUrl + '" />\
        &lt;param name="quality" value="high" />\
        &lt;param name="bgcolor" value="#ffffff" />\
        &lt;param name="FlashVars" value="upload_url=' + uploadUrl + '" />\
        &lt;embed src="' + flashUrl + '" quality="high" bgcolor="#ffffff" width="0" height="0" name="flashObject" FlashVars="upload_url=' + uploadUrl + '" align="middle" allowScriptAccess="sameDomain" id="flashObject" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" />\
    &lt;/object>';
    panel.innerHTML = code;
    return window.document.flashObject;
}

&lt;/script>
&lt;/html></pre><br />这次功能的实现上，在其他方面都还很顺利得以实现，反而是在createUploadFlash这个函数的实现上遇到了一些麻烦。因为最后返回flash对象的时候经常不被正常地识别。如果这段代码不用js生成，那么用document.flashObject和dobument.getElementById('flashObject')都可以正常识别flashObject，但动态生成以后，用后者就不能正常被访问到了，可能的原因是加载需要一定的延时，有待研究。<br /><br />通过这样的方式实现文件上传，一则能解决掉多选问题和文件类型过滤问题，另外也能实现文件的无刷新上传，可以在图片上传的同时去进行别的工作。
          <br/>
          <span style="color:red;">
            <a href="http://virgos.javaeye.com/blog/229453#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 18 Aug 2008 16:34:23 +0800</pubDate>
        <link>http://virgos.javaeye.com/blog/229453</link>
        <guid>http://virgos.javaeye.com/blog/229453</guid>
      </item>
      <item>
        <title>使用external实现javscript调用flash的function</title>
        <author>Virgo_S</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://virgos.javaeye.com">Virgo_S</a>&nbsp;
          链接：<a href="http://virgos.javaeye.com/blog/229229" style="color:red;">http://virgos.javaeye.com/blog/229229</a>&nbsp;
          发表时间: 2008年08月18日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          先看Flash帮助的对于addCallback相关说明:<br /><br />public static addCallback(methodName:String, instance:Object, method:Function) : Boolean<br /><br />methodName:String - 从 JavaScript 调用 ActionScript 函数时可使用的名称。此名称不必与 ActionScript 方法的实际名称匹配。<br />instance:Object - this 在该方法中被解析成的对象。此对象不一定是在其上可找到该方法的对象，您可以指定任何对象（或 null）。<br />method:Function - 要从 JavaScript 调用的 ActionScript 方法。<br /><br />Flash第一帧代码如下:<br />import flash.external.*;<br />var methodName:String = "doit";<br />var instance:Object = null;<br />var method:Function = test;<br />ExternalInterface.addCallback(methodName, instance, method);<br />var a = 0;<br />function test() {<br /> a++;<br />}<br /><br />html中部分代码如下:<br />&lt;object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="830" height="411" id="externalSample" align="middle"><br />&lt;param name="allowScriptAccess" value="sameDomain" /><br />&lt;param name="movie" value="external.swf" /><br />&lt;param name="quality" value="high" /><br />&lt;param name="bgcolor" value="#ffffff" /><br />&lt;embed src="external.swf" quality="high" bgcolor="#ffffff" width="830" height="411" name="externalSample" align="middle" allowScriptAccess="sameDomain" type="application/x-shockwave-flash" swLiveConnect="true"/><br />&lt;/object><br />&lt;script><br />function callExternalInterface() {<br />    thisMovie("externalSample").doit();//对应Flash中的methodName的值,并注意externalSample与Object id要相同<br />}<br /><br />function thisMovie(movieName) {//保证浏览器兼容<br />    if (navigator.appName.indexOf("Microsoft") != -1) {<br />        return window[movieName]<br />    }<br />    else {<br />        return document[movieName]<br />    }<br />}<br />&lt;/script><br />&lt;form><br />    &lt;input type="button" onclick="callExternalInterface()" value="Call ExternalInterface" /><br />&lt;/form>
          <br/>
          <span style="color:red;">
            <a href="http://virgos.javaeye.com/blog/229229#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 18 Aug 2008 15:22:44 +0800</pubDate>
        <link>http://virgos.javaeye.com/blog/229229</link>
        <guid>http://virgos.javaeye.com/blog/229229</guid>
      </item>
      <item>
        <title>Javascript与flash交互通信控制的方法</title>
        <author>Virgo_S</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://virgos.javaeye.com">Virgo_S</a>&nbsp;
          链接：<a href="http://virgos.javaeye.com/blog/229207" style="color:red;">http://virgos.javaeye.com/blog/229207</a>&nbsp;
          发表时间: 2008年08月18日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          原文地址: www.macromedia.com/support/flash/ts/documents/java_script_comm.htm<br />说明: 略作修改,主要是一些很初级的操作; 又很多相似的文章,不过这个很权威<br /><br />下面是一些在Flash和使用Javascript的HTML文件直接通信的示例,每个示例都有简略的步骤<br /><br />本文讨论了3种基本的Flash/Javascript通信方式:<br />Javascript 到 Flash的通信----使用Flash播放器的javascript方法<br />Flash 到 Javascript的通信----使用Flash的fscommand<br />Flash 到 Flash的通信----------使用本地连接对象或综合上2种技术<br /><br />并不是所有的浏览器都很重视脚本.为了和Flash播放器通信,浏览器必须有内置的钩子以便Flash播放器可以'监听'.浏览器必须是下列的几种:<br />Netscape Navigator 3.0-4.7x, 和 Netscape 6.2或更高<br />(Windows 95/98/NT/2000/XP 或 MacOS; 允许Java和LiveConnect)<br />Internet Explorer 3.0 或更高<br />(仅Windows 95/98/NT/2000/XP; 允许ActiveX)<br /><br /><br />Javascript到Flash的通信<br /><br />这个例子演示了如何使用Flash的method把变量从HTML的input text 发送到该页面中的Flash文件中.HTML input的数据通过Flash的SetVariable方法传送到Flash文件中.<br /><br />查看示例:示例 <br />下载源文件: javascript_to_flash.zip(17k)<br /><br />步骤:<br /><br />Flash中<br />1.新建一个文件,保存为javascript_to_flash.fla<br />2.用文字工具在舞台上创建一个文本域<br />3.选择这个文本域,在属性面板中,从下拉列表中选择动态文本(Dynamic Text),在变量(variable)栏填上"myVar"<br />注意:最好的习惯是使用Instance,用myVar.text更改myVar的值.为了简单起见和兼容Flash4和Flash5,我们使用的是变量名的形式.<br />4.保存文件<br />5.发布HTML文件和SWF文件<br /><br />Dreamweaver中<br />下一步的工作转移到Dreamweaver中了,当然也可以是其他的HTML编辑器<br />1.打开上一步发布的HTML文件<br />2.插入生成的SWF文件和OBJECT/EMBED标签<br />(1) Insert>Media>Flash,并选择这个Flash<br />(2) 切换到代码视图,我们需要修改被选中的&lt;OBJECT>和&lt;EMBED>标签<br />(3) 在OBJECT标签中,插入id="myFlash"<br /><br />&lt;object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"<br />codebase="http://download.macromedia.com/pub/shockwave/cabs/<br />flash/swflash.cab#version=5,0,0,0"<br />width=366 height=142 id="myFlash"><br />注意:如果你是粘贴复制代码的话,确保删除不必要的换行.否则可能会引起错误; id也可以在属性面板里直接输入<br />(4) 在EMBED标签中,插入name="myFlash"和swLiveConnect="true",确保没有使用id属性!代码应当是这样子的:<br /><br />&lt;embed src="javascript_to_flash.swf" quality=high width=366 height=142<br />type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/shockwave/download/index.cgi?<br />P1_Prod_Version=ShockwaveFlash" <br />name="myFlash" swLiveConnect="true"><br />&lt;/embed> <br /><br />3.创建表单域<br />(1) 回到设计视图<br />(2) 插入文本域(Insert> Form Object> Text Field),如果询问是否添加表单域,选择是<br />(3) 把文本域的HTML标签修改成这样:<br /><br />&lt;input type="text" name="sendText" maxlength="45" onChange="doPassVar(this)"> <br />每当文本域内容发生变化时,onChange就被触发,doPassVar()函数就被调用<br /><br />4.创建传递变量值的Javascript函数<br />复制下面的Javascript到&lt;head>&lt;/head>标签内<br /><br />&lt;SCRIPT LANGUAGE=JavaScript><br />&lt;!--<br />function doPassVar(args){<br />var sendText = args.value;<br />window.document.myFlash.SetVariable("myVar", sendText);<br />}<br />//--><br />&lt;/SCRIPT><br />5.保存文件,测试一下(F12)<br /><br /><br />Flash到Javascript的通信<br />从HTML可以发送数据到Flash,反过来也可以. 这个例子演示了如何应用Flash的Fscommand来发送数据到Javascript.<br /><br />查看示例:示例2 <br />下载源文件: flash_to_javascript.zip(10K)<br /><br />简要步骤:<br />Flash中<br />新建一个文件,保存为flash_to_javascript.fla<br />创建一个文本域,设置成输入文本(Input Text),选择"border"以便我们能看到他,指定他的变量为inputVar<br />创建一个按钮,在按钮上添加如下的as:<br /><br />on (release) {<br />fscommand ("send_var", inputVar);<br />}<br />保存文件,导出HTML和SWF<br /><br />Dreamweaver中<br />1.打开导出HTML文件,修改&lt;OBJECT>和&lt;EMBED>标签,结果同上:<br />&lt;object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"<br />codebase="http://download.macromedia.com/pub/shockwave/cabs/<br />flash/swflash.cab#version=5,0,0,0"<br />width=366 height=142 id="myFlash"><br /><br />&lt;embed src="javascript_to_flash.swf" quality=high<br />width=366 height=142<br />type="application/x-shockwave-flash" <br /><br />pluginspage="http://www.macromedia.com/shockwave/download/index.cgi?<br />P1_Prod_Version=ShockwaveFlash" name="myFlash" swLiveConnect="true"><br />&lt;/embed><br />2. 插入如下的Javascript到&lt;Body>标签内:<br />&lt;SCRIPT LANGUAGE=JavaScript><br />&lt;!--<br />var InternetExplorer = navigator.appName.indexOf("Microsoft") != -1;<br />function myFlash_DoFSCommand(command, args) {<br />var myFlashObj = InternetExplorer ? myFlash : document.myFlash;<br />alert (args);<br />}<br />if (navigator.appName && navigator.appName.indexOf("Microsoft") != -1 && <br />navigator.userAgent.indexOf("Windows") != -1 && navigator.userAgent.indexOf("Windows 3.1") == -1) {<br />document.write('&lt;SCRIPT LANGUAGE=VBScript\> \n');<br />document.write('on error resume next \n');<br />document.write('Sub myFlash_FSCommand(ByVal command, ByVal args)\n');<br />document.write(' call myFlash_DoFSCommand(command, args)\n');<br />document.write('end sub\n');<br />document.write('&lt;/SCRIPT\> \n');<br />} <br />//--><br />&lt;/SCRIPT><br /><br /><br />Flash和Flash的通信<br />通过上面两种方法的混和使用,同一HTML中两个或者更多的Flash直接可以相互传送消息. 从一个flash使用fscommand传送消息给Javascript,使用Flash的Javascript methods把消息传给另外一个flash<br /><br />详细的看这里:Flash影片之间的通信示例<br /><br />从Flash MX开始,local connection对象可以用来在flash之间传送消息. 这使得同一HTML中的或者位于两个浏览器窗口中的两个flash影片可以相互发送消息,而不必使用Javascript或者fscommand<br />详细的看这里:在Flash MX中使用local connection对象(英文）<br /><br />本站的localConnection教程：http://www.blueidea.com/tech/multimedia/2003/739.asp<br /><br />附可控制Flash Player的Javascript方法一览表:<br /><br />Play() ---------------------------------------- 播放动画 <br />StopPlay()------------------------------------停止动画 <br />IsPlaying()----------------------------------- 动画是否正在播放<br />GotoFrame(frame_number)---------------- 跳转到某帧 <br />TotalFrames()------------------------------- 获取动画总帧数 <br />CurrentFrame()------------------------------回传当前动画所在帧数-1 <br />Rewind()-------------------------------------使动画返回第一帧 <br />SetZoomRect(left,top,right,buttom)-------放大指定区域 <br />Zoom(percent)------------------------------改变动画大小 <br />Pan(x_position,y_position,unit)------------使动画在x,y方向上平移 <br />PercentLoaded()----------------------------返回动画被载入的百分比 <br />LoadMovie(level_number,path)----------- 加载动画 <br />TGotoFrame(movie_clip,frame_number)- movie_clip跳转到指定帧数 <br />TGotoLabel(movie_clip,label_name)------ movie_clip跳转到指定标签 <br />TCurrentFrame(movie_clip)--------------- 回传movie_clip当前帧-1 <br />TCurrentLabel(movie_clip)-----------------回传movie_clip当前标签 <br />TPlay(movie_clip)---------------------------播放movie_clip <br />TStopPlay(movie_clip)----------------------停止movie_clip的播放 <br />GetVariable(variable_name)-----------------获取变量 <br />SetVariable(variable_name,value)-----------变量赋值 <br />TCallFrame(movie_clip,frame_number)---call指定帧上的action <br />TCallLabel(movie_clip,label)----------------call指定标签上的action <br />TGetProperty(movie_clip,property)--------获取movie_clip的指定属性 <br />TSetProperty(movie_clip,property,number)-设置movie_clip的指定属性<br /><br />flash与javascript交互演示：http://www.v-ec.com/dh20156/code/jsflash/fj.htm<br /><br />javascript与flash交互演示：http://www.v-ec.com/dh20156/code/jsflash/jf.htm
          <br/>
          <span style="color:red;">
            <a href="http://virgos.javaeye.com/blog/229207#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 18 Aug 2008 14:55:07 +0800</pubDate>
        <link>http://virgos.javaeye.com/blog/229207</link>
        <guid>http://virgos.javaeye.com/blog/229207</guid>
      </item>
      <item>
        <title>控制 Flash Player 的 JavaScript 方法一览表</title>
        <author>Virgo_S</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://virgos.javaeye.com">Virgo_S</a>&nbsp;
          链接：<a href="http://virgos.javaeye.com/blog/229143" style="color:red;">http://virgos.javaeye.com/blog/229143</a>&nbsp;
          发表时间: 2008年08月18日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          播放动画：Play()<br />　　例：(网页中的 Flash id).Play();<br />停止动画：StopPlay()<br />动画是否正在播放：IsPlaying()<br />跳转到某帧：GotoFrame(frame_number)<br />获取动画总帧数：TotalFrames()<br />回传当前动画所在帧数：CurrentFrame()<br />使动画返回第一帧：Rewind()<br />放大指定区域：SetZoomRect(left,top,right,buttom)<br />改变动画大小：Zoom(percent)<br />使动画在 x,y 方向上平移：Pan(x_position,y_position,unit)<br />返回动画被载入的百分比：PercentLoaded()<br />加载动画：LoadMovie(level_number,path)<br />　　例：(网页中的 Flash id).LoadMovie(0, "***/***.swf");<br />movie_clip 跳转到指定帧数：TGotoFrame(movie_clip,frame_number)<br />　　例：(网页中的 Flash id).TGotoFrame("_root.实例名.次实例名",帧数);<br />movie_clip 跳转到指定标签：TGotoLabel(movie_clip,label_name)<br />　　例：(网页中的 Flash id).TGotoLabel("_root.实例名.次实例名","标签名");<br />回传 movie_clip 当前帧：TCurrentFrame(movie_clip)<br />回传 movie_clip 当前标签：TCurrentLabel(movie_clip)<br />播放 movie_clip：TPlay(movie_clip)<br />停止 movie_clip 的播放：TStopPlay(movie_clip)<br />获取变量：GetVariable(variable_name)<br />变量赋值：SetVariable(variable_name,value)<br />call 指定帧上的 action：TCallFrame(movie_clip,frame_number)<br />call 指定标签上的 action：TCallLabel(movie_clip,label)<br />获取 movie_clip 的指定属性：TGetProperty(movie_clip,property)<br />设置 movie_clip 的指定属性：TSetProperty(movie_clip,property,number)<br /><br /><br /><span style="font-size: x-large"><span style="color: darkred">flash调用js中的方法，让js传递变量给flash (兼容 IE & FF)</span> </span><br />前几天发表了 将FlashVars写在JS函数中，实现与后台的实时变量更新，但是仅支持 IE，随后与 Luckyer 进行了交流，发现用 SetVariable 可以很方便的实现多浏览器兼容。举例如下。<br /><br />html 页中的 JavaScript 函数：<br />function GetSwfUrl()<br />{<br />var pics1 = parseInt(Math.random()*5)+1;<br />var pics2 = parseInt(Math.random()*5)+1;<br />document.my_swfId.SetVariable("pic01Num", pics1);<br />document.my_swfId.SetVariable("pic02Num", pics2);<br />}<br /><br />说明：pic01Num 和 pic02Num 为 Flash 中定义的变量，以上函数将 JS 变量 pics1 和 pics1 分别赋值予 Flash 变量 pic01Num 和 pic02Num 。my_swfId 为 html 页中 swf 的 id .<br /><br />***************<br /><br />在 Flash 中与 JS 的通信可以用传统的 getURL，Flash8 以后，可以用 ExternalInterface 。ExternalInterface 在功能上与 fscommand()、CallFrame() 和 CallLabel() 方法相似，但它更灵活、更通用。推荐对 JavaScript 和 ActionScript 之间的通讯使用 ExternalInterface 。<br /><br />getURL调用JS：<br />getURL("javascript:GetSwfUrl()"); <br /><br />ExternalInterface调用JS：<br />import flash.external.ExternalInterface;//导入 ExternalInterface 类<br />ExternalInterface.call("GetSwfUrl()");<br /><br />注意：如果要使用 ExternalInterface，当前帧必需要有 import flash.external.ExternalInterface; 或者 import flash.external.*;<br /> <br /><br /><span style="font-size: x-large"> <span style="color: darkred">js调用flash中的方法，让flash传递变量给js</span></span><br />本文为 ExternalInterface 的综合应用实例，重点为“将flash变量传递给js”。此方法兼容 IE & FF .<br /><br />以下为JS：<br /><br />//输出测试，通过v传递flash变量<br />function jsAlert(v) {<br />alert(v);<br />}<br />//调用flash中的方法，"my_mv"为html页中swf的id<br />function callExternal() {<br />thisMovie("my_mv").flAlert();<br />}<br />//搭建js与flash互通的环境<br />function thisMovie(movieName) {<br />if (navigator.appName.indexOf("Microsoft") != -1) {<br />return window[movieName]<br />}else{<br />return document[movieName]<br />}<br />}<br /><br />以下为AS：<br /><br />//导入ExternalInterface类<br />import flash.external.ExternalInterface;<br />//下面这个赋值一定要注意，如果是字符串，写法应该是在双引内再加单引，此前我郁闷了一天<br />var i:String = "’js调用flash中的方法，传递flash变量给js’";<br />//var i:Number = 1234;<br />function showAlert(){<br />//调用js方法jsAlert()，并将flash变量赋值给js<br />ExternalInterface.call("jsAlert("+i+")");<br />}<br />//允许js中的flAlert()调用flash中的showAlert()<br />ExternalInterface.addCallback("flAlert",null,showAlert);
          <br/>
          <span style="color:red;">
            <a href="http://virgos.javaeye.com/blog/229143#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 18 Aug 2008 12:14:03 +0800</pubDate>
        <link>http://virgos.javaeye.com/blog/229143</link>
        <guid>http://virgos.javaeye.com/blog/229143</guid>
      </item>
      <item>
        <title>利用数组提高IE拼接字符串效率</title>
        <author>Virgo_S</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://virgos.javaeye.com">Virgo_S</a>&nbsp;
          链接：<a href="http://virgos.javaeye.com/blog/228978" style="color:red;">http://virgos.javaeye.com/blog/228978</a>&nbsp;
          发表时间: 2008年08月17日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          今天终于静下心来研究程序的效率问题，竟然发现一个普通的循环拼接字符串在IE下竟然执行了3秒钟时间<br />搜索发现早就有人<a href="http://www.51leifeng.net/viewthread.php?tid=4850" target="_blank">对此进行了研究</a>，于是又学到了一招，就是利用数组的join方法<br />以后得注意着这个问题，当需要拼接的字符串比较多的时候使用如下方法：<br /><pre name="code" class="java">function StringBuffer(){ 
    this._strings = new Array(); 
} 
  
StringBuffer.prototype.append = function(str){ 
    this._strings.push(str); 
}; 
StringBuffer.prototype.toString = function(){ 
    var str = arguments.length == 0 ? '' : arguments[0]; 
    return this._strings.join(str); 
}; 
  
//示例 
var buffer = new StringBuffer(); 
buffer.append('This is '); 
buffer.append('an '); 
buffer.append('example!'); 
alert(buffer.toString());</pre><br />在我的代码上实际使用时，原来需要执行3秒多的代码只要600多毫秒就搞定了，一举解决了速度问题<br />另外arguments对象可以在某些场合派上用场
          <br/>
          <span style="color:red;">
            <a href="http://virgos.javaeye.com/blog/228978#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 17 Aug 2008 15:54:27 +0800</pubDate>
        <link>http://virgos.javaeye.com/blog/228978</link>
        <guid>http://virgos.javaeye.com/blog/228978</guid>
      </item>
      <item>
        <title>多文件上传组件SWFUpload java环境小例子</title>
        <author>Virgo_S</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://virgos.javaeye.com">Virgo_S</a>&nbsp;
          链接：<a href="http://virgos.javaeye.com/blog/228799" style="color:red;">http://virgos.javaeye.com/blog/228799</a>&nbsp;
          发表时间: 2008年08月16日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          前几周做一个web企业项目，用户一定要求要有批量上传功能,而且指明了要和他们的老系统上传文件功能一样(老系统是c/s结构，vb做的)。然后没办法，想来想去只有flash能做到，于是上网找有没有这方面的东西，就找到了这个东东——SWFUpload. <br /><br />官网地址是：http://swfupload.mammon.se/ <br /><br />由于在官网的里例子示范里面只有php,C#,VB.net和ROR的,然后我上javaeye搜了下，好象也不多，只有一篇，而且也是比较高级的，于是只能自己搞了。 <br /><br />完了之后觉得这个东西的确相当不错，使用感觉很好，我估计我以后做项目可能都要用这玩意了。 <br /><br />代码我自己做了个war包，很简单的一个例子，我在tomcat5.5和java5.0环境下测试通过。 <br /><br />包结构如下： <br /><pre name="code" class="java">index.jsp   
upload.jsp   
js   
+-----example_callbacks.js   
+-----SWFUpload.js   
+-----SWFUpload.swf  </pre><br />以上index.jsp就是文件上传显示页面，upload.jsp做上传功能。js里面的两个一个是与swf通信的回调函数，一个是本身使用的js文件。 <br />比较重要的一段内容是在index.jsp里面，如下 <br /><pre name="code" class="java">var swfu;
	window.onload = function() {
	swfu = new SWFUpload({
		upload_script : "../upload.jsp",  //调用的上传功能
		target : "SWFUploadTarget",
		flash_path : "js/SWFUpload.swf",  //flash所在位置
		allowed_filesize : 30720,	// 30 MB
		allowed_filetypes : "*.*",
		allowed_filetypes_description : "All files...",
		browse_link_innerhtml : "选择",
		upload_link_innerhtml : "开始上传",
		browse_link_class : "swfuploadbtn browsebtn",
		upload_link_class : "swfuploadbtn uploadbtn",
		flash_loaded_callback : 'swfu.flashLoaded',
		upload_file_queued_callback : "fileQueued",
		upload_file_start_callback : 'uploadFileStart',
		upload_progress_callback : 'uploadProgress',
		upload_file_complete_callback : 'uploadFileComplete',
		upload_file_cancel_callback : 'uploadFileCancelled',
		upload_queue_complete_callback : 'uploadQueueComplete',
		upload_error_callback : 'uploadError',
		upload_cancel_callback : 'uploadCancel',
		auto_upload : false
	})
}</pre><br />有一点要提醒，要当心这个upload_script属性，这个值是一个相对地址，是swf文件相对于上传功能文件的路径。这个很容易搞错我这个包里upload.jsp就是上传功能，看代码就知道了，很原始的一个文件上传。 <br /><br />再就是如果上传过程中是404错误，一般是就是这个upload_script属性设置错误，如果是500错误就是上传文件（upload.jsp）出错。 <br /><br /><br />具体的配置等等就看官网的论坛吧，常见问题基本都在那里了。
          <br/>
          <span style="color:red;">
            <a href="http://virgos.javaeye.com/blog/228799#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 16 Aug 2008 23:32:38 +0800</pubDate>
        <link>http://virgos.javaeye.com/blog/228799</link>
        <guid>http://virgos.javaeye.com/blog/228799</guid>
      </item>
      <item>
        <title>关于struts2无法加载struts.properties的问题</title>
        <author>Virgo_S</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://virgos.javaeye.com">Virgo_S</a>&nbsp;
          链接：<a href="http://virgos.javaeye.com/blog/228398" style="color:red;">http://virgos.javaeye.com/blog/228398</a>&nbsp;
          发表时间: 2008年08月15日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          最近整合了struts2和spring的问题，其中看到一个struts2的文档中写得使用struts2的ioc时要在项目下加载struts.properties.它的内容是:<br /><br />        struts.objectFactory = spring<br /><br />但是我加入了该文件之后发现了下面得错误<br /><br /><br /><br /><br /><br />严重: Exception starting filter struts2<br />Cannot locate the chosen ObjectFactory implementation: spring - [unknown location]<br /><br />出现这个错误的原因是项目中少了struts2-spring-plugin-2.0.6.jar包，加上该包就没问题了。
          <br/>
          <span style="color:red;">
            <a href="http://virgos.javaeye.com/blog/228398#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 15 Aug 2008 15:17:35 +0800</pubDate>
        <link>http://virgos.javaeye.com/blog/228398</link>
        <guid>http://virgos.javaeye.com/blog/228398</guid>
      </item>
      <item>
        <title>开源的盈利模式</title>
        <author>Virgo_S</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://virgos.javaeye.com">Virgo_S</a>&nbsp;
          链接：<a href="http://virgos.javaeye.com/blog/228219" style="color:red;">http://virgos.javaeye.com/blog/228219</a>&nbsp;
          发表时间: 2008年08月15日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          目前在中国，对于开源软件的商业运作问题存在两个严重问题，一是依然按照传统商业软件的模式来运作开源软件，从国际开源社区那里免费地获取源代码，稍微修改后变成自己的产品，然后出售软件许可。二是紧抱“自由软件”的陈旧概念，认为软件产品就应该“自由”地使用，低估了软件产品和服务的价值，与全球正在积极推进的知识产权保护做法背道而驰。 <br />         到底开源软件能否赚钱，又如何用其赚钱？希望本专题对开源有志之士能够有所帮助。 <br /><br />分析篇<br /><br />● 揭密:开源软件七大盈利模式 <br /><br />开源软件在发展历程中，已经不仅仅是开放源代码的免费软件。开源软件与商业并不冲突，它是一种新兴的商业模式。与传统的商业软件相比，开源软件采用了开放源代码、免费分发等形式，减少了营销与销售成本，更易于广泛传播。<br /><br />在开源软件领域中，常见的盈利模式一共有7种。下面让我们来逐一列举和分析。<br />● 盈利模式之一：多种产品线 <br />如 MySQL 产品就同时推出面向个人和企业的两种版本，即开源版本和专业版本，分别采用不同的授权方式。开源版本完全免费以便更好的推广，而从专业版的许可销售和支持服务获得收入。<br />● 盈利模式之二：技术服务型 <br />JBoss就是这种模式的典型代表。JBoss 应用服务器完全免费，而通过提供技术文档、培训、二次开发支持等技术服务而获得收入。<br />● 盈利模式之三：应用服务托管（ASP）<br />例如，PHP Live！ 就是一种构架于 PHP、MySQL 之上的开源软件，它可为企业用户提供实时交谈服务。目前已经有数十家公开提供 PHP Live！ 托管服务的应用服务提供商。<br />● 盈利模式之四：软、硬件一体化 <br />比如 IBM HP 等服务器供应商巨头，通过捆绑免费的 Linux 操作系统销售硬件服务器。SUN 公司近期将其 Solaris 操作系统开放源码，以确保服务器硬件的销售收入，也是这种模式的体现。<br />● 盈利模式之五：附属品<br />O'Reilly集团是销售开源软件附加产品公司的典型案例，他出版了很多优秀的开放源代码软件的参考资料。<br />● 盈利模式之六：品牌战略、服务至上<br />康比尔公司的 Compiere ERP & CRM 软件是这种模式的典型案例。<br />● 盈利模式之七：市场策略<br />比如，微软宣称部分的公开 Office 的源代码，就是执行这种策略。 <br /><br />事实上，一家公司可能混合采用其中的几种盈利模式，比如康比尔公司不仅采用了第六种品牌策略，同时也采用了第二种提供技术服务的方式。 在开源软件大潮的冲击之下，包括微软在内的商业软件公司，也开始认可开源软件"软件成为服务"的本质。<br /><br />正如 Navica 公司 CEO 本纳德·高登所说，"短短两三年间，任何人在选择任何企业软件之时，都开始考虑一个问题：是否有开源软件可作替代？" <br /><br />● 开源软件的商业化问题探讨 <br /><br />下面所列的开源软件的商业模式与上篇文章所列虽然在细节上有所不同，但其本质却是相通的，现在就让我们看看其具体内容吧：<br /> 1、免费软件+收费硬件<br />比如IBM、SUN、HP等公司，在开源软件领域投入巨大，但这一切并非是做善事，它们可以从配置了开源软件的硬件中获得巨额回报。<br /> 2、免费知识+收费书籍（培训）<br />比如著名的开源软件出版商O'Reilly公司，就不遗余力地联系各开源软件权威人士，组织各种开源软件的会议，虽然知识是免费的，但承载知识的书籍却是收费的。<br /> 3、免费程序+收费实施<br />像中间件、ERP和SCM等企业级信息系统，免费提供这种系统的程序代码，以提供收费的技术服务来赚钱。JBoss就是这种模式的典型代表。<br /> 4、免费社区版+收费企业版<br />Redhat自Redhat Linux 9.0后将原桌面操作系统转为Fedora项目，借Fedora Core Linux在开源社区的声望而促进Redhat Enterprise Linux AS/ES/WS服务器产品线的销售。<br /> 5、开源软件+商业软件<br />比如Novell就将自己原来丰富的中间软件和应用软件迁移到Linux平台上，通过与Linux的捆绑为客户提供高价值的综合解决方案。红旗和Turbolinux也在积极加强与应用软件厂商的联系或自己开发商业软件，通过附加更多的商业软件来增加收入。 <br /> 6、免费软件+收费专业服务<br />典型代表是SourceLabs公司和SpikeSource公司。这些公司并不主推自己的产品品牌，而是与多方开源软件厂商或社区合作。 <br /><br />现在，IBM在开源，SUN在开源，Oracle在开源，微软也在开源——虽然是极不情愿的。等到某一天，微软完全开源了，国内的这些“开源软件”企业还有什么卖点可以向政府和媒体鼓吹呢？ <br /><br />● 剖析：开源软件能够赚到钱吗？ <br /><br />中科红旗的总裁赵晓亮曾经用一个关于饮水的比喻来解释开源软件企业是如何赚钱的，大意是人每天都要喝大量的水，但饮水是在不同的环境下、不同的条件下进行的。虽然原料都是水，但性质已经发生了改变。而且水的加工程序越多，大家喝起来就越放心。<br /><br />Linux厂商也是同样的价值，大家的源头都是水，但水经过加工、处理，已经与原生态发生了很多变化，而且让喝水的人产生了很多安全感。安全感来自对生产瓶装水的厂商的品牌、技术实力的信任度，来自于对正规大厂的服务能力、可持续发展的信任度等。因此，开源基础上的商业模式，应该就是服务的模式，通过增值服务来收取费用。 <br /><br /> <br />案例篇<br />● MySQL公司CEO采访 MySQL如何从开源中获利 <br />Mickos喜欢将MySQL比作家具厂商Ikea。这两者都具有可靠的、经济实用的产品，同时也都具有有效的销售渠道。而Oracles和 IBM，则更像是古典家具厂商。“而Ikea是不会担心古典家具厂商的。” Mickos说。 <br />        谈到软件专利问题，Mickos认为“软件专利非常不利于创新，它们价格昂贵，并且具有不少负面作用。它的最大受益者是律师。”他所说的负面影响，包括降低企业的竞争意识，以及很多小企业为了应付侵权诉讼而最终被赶出市场。 <br />● 国外厂商纷纷投入开源界 自述其中原因 <br />频繁出镜的企业家，风险投资的热钱，甚至“范式转移”（Paradigm Shift），这些迹象正预示着开源盛世的到来？ <br />今天，在开源软件世界存在着一个巨大的鸿沟。有些软件已经运行在一些最尖端、高要求的IT运营领域，比如Linux操作系统和Apache Web服务器，而另外就是一些开源小公司，比如Pentaho公司、SugarCRM公司和Alfresco软件公司等，他们大多服务于20个小型企业用户。他们能取得实质性突破，并与现有的专有软件竞争吗？
          <br/>
          <span style="color:red;">
            <a href="http://virgos.javaeye.com/blog/228219#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 15 Aug 2008 09:31:09 +0800</pubDate>
        <link>http://virgos.javaeye.com/blog/228219</link>
        <guid>http://virgos.javaeye.com/blog/228219</guid>
      </item>
      <item>
        <title>JS三种编解码方式</title>
        <author>Virgo_S</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://virgos.javaeye.com">Virgo_S</a>&nbsp;
          链接：<a href="http://virgos.javaeye.com/blog/227970" style="color:red;">http://virgos.javaeye.com/blog/227970</a>&nbsp;
          发表时间: 2008年08月14日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          js对文字进行编码涉及3个函数：escape,encodeURI,encodeURIComponent，相应3个解码函数：unescape,decodeURI,decodeURIComponent<br /><br />1、   传递参数时需要使用encodeURIComponent，这样组合的url才不会被#等特殊字符截断。                           <br /><br />例如：&lt;script language="javascript">document.write('&lt;a href="http://passport.baidu.com/?logout&aid=7&u='+encodeURIComponent("http://cang.baidu.com/bruce42")+'">退出&lt;/a>');&lt;/script><br /><br />2、   进行url跳转时可以整体使用encodeURI<br /><br />例如：Location.href=encodeURI("http://cang.baidu.com/do/s?word=百度&ct=21");<br /><br />3、   js使用数据时可以使用escape[Huoho.Com编辑]<br /><br />例如：搜藏中history纪录。<br /><br />4、   escape对0-255以外的unicode值进行编码时输出%u****格式，其它情况下escape，encodeURI，encodeURIComponent编码结果相同。<br /><br />最多使用的应为encodeURIComponent，它是将中文、韩文等特殊字符转换成utf-8格式的url编码，所以如果给后台传递参数需要使用encodeURIComponent时需要后台解码对utf-8支持（form中的编码方式和当前页面编码方式相同）<br /><br />escape不编码字符有69个：*，+，-，.，/，@，_，0-9，a-z，A-Z<br /><br />encodeURI不编码字符有82个：!，#，$，&，'，(，)，*，+，,，-，.，/，:，;，=，?，@，_，~，0-9，a-z，A-Z<br /><br />encodeURIComponent不编码字符有71个：!， '，(，)，*，-，.，_，~，0-9，a-z，A-Z<br /><br />========================================================<br /><br />unescape 方法 <br /><br />从用 escape 方法编码的 String 对象中返回已解码的字符串。<br /><br />function unescape(charString : String) : String<br /><br /><br />    参数<br /><br />charString <br /><br />必选。要解码的 String 对象或文本。<br /><br />备注<br /><br />unescape 方法返回一个包含 charstring 内容的字符串值。所有以 %xx 十六进制形式编码的字符都用 ASCII 字符集当中等效的字符代替。以 %uxxxx 格式（Unicode 字符）编码的字符用十六进制编码 xxxx 的 Unicode 字符代替。注意 unescape 方法不应用于解码“统一资源标识符”(URI)。请改用 decodeURI 和 decodeURIComponent 方法。<br /><br /> <br /><br />decodeURI 方法 <br /><br />返回一个已编码的统一资源标识符 (URI) 的非编码形式。<br /><br />function decodeURI(URIstring : String) : String<br /><br />参数<br /><br />URIstring <br /><br />必选。表示编码 URI 的字符串。<br /><br />备注<br /><br />使用 decodeURI 方法代替已经过时的 unescape 方法。<br /><br />decodeURI 方法返回一个字符串值。<br /><br />如果 URIString 无效，将发生 URIError。<br /><br /> <br /><br />decodeURIComponent 方法 <br /><br />返回统一资源标识符 (URI) 的一个已编码组件的非编码形式。<br /><br />function decodeURIComponent(encodedURIString : String) : String<br /><br />必选的 encodedURIString 参数是一个表示已编码的 URI 组件的值。<br /><br />备注<br /><br />URIComponent 是一个完整的 URI 的一部分
          <br/>
          <span style="color:red;">
            <a href="http://virgos.javaeye.com/blog/227970#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 14 Aug 2008 12:28:26 +0800</pubDate>
        <link>http://virgos.javaeye.com/blog/227970</link>
        <guid>http://virgos.javaeye.com/blog/227970</guid>
      </item>
      <item>
        <title>实现JSP数据和JavaScript数据交互使用</title>
        <author>Virgo_S</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://virgos.javaeye.com">Virgo_S</a>&nbsp;
          链接：<a href="http://virgos.javaeye.com/blog/227893" style="color:red;">http://virgos.javaeye.com/blog/227893</a>&nbsp;
          发表时间: 2008年08月14日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          对于WEB程序来说，前端（JavaScript）和后端（JSP/Servlet）是没法共用数据的，只能是后端程序（JSP）把数据输出，生成页面到前端，这时候生成的页面中的JavaScript代码才有可能得到所谓jsp的数据。同样的，只有把JavaScript里的数据提交给后端JSP代码，JSP程序中才能得到JavaScript的数据。 <br /><br />那如何实现在页面的JavaScript中使用jsp中的数据或是在JSP中使用页面的JavaScript数据呢？ <br /><br />一、页面中的JavaScript的数据如何提交给后台的JSP程序 <br /><br />① 可以将JavaScript的数据以xxx.JSP?var1=aaa&var2=bbb的形式作为URL的参数传给JSP程序，此时在jsp中用 <br /><br /><br />&lt;%String strVar1=request.getParameter("var1");%><br /> <br /><br />就可以获取到JavaScript脚本传递过来的数据； <br /><br />② 使用JavaScript通过在表单里加入隐藏域信息，然后用表单提交的方式把数据传递给JSP程序。 <br /><br />参考下面的脚本： <br /><br /><br />&lt;script language="JavaScript"> <br />&lt;!-- <br />/*************************************************************** <br />* JavaScript脚本，放置在页面中的任何位置都可以 <br />* insertclick()函数获取JSP传递到页面中的变量varMC， <br />* 然后就可以在JavaScript中修改这个变量的值，再通过 <br />* post的方式提交给JSP程序来使用。 <br />***************************************************************/ <br />function insertclick(){ <br />var1 = document.all.mc.value; //获取页面form中的变量值 <br />var1 = var1 + "名称"; <br />document.insertForm.submit(); <br />} <br />//--> <br />&lt;/script> <br /><br />&lt;!-- html页面form表单，放置在html页面中的位置不限 --> <br /><pre name="code" class="java">&lt;form name="insertForm" method="post" action="yourJSP"> 
&lt;!-- 下面这一句是获取JSP程序中传递过来的变量值 --> 
&lt;input type="hidden" name="mc" value="&lt;%=varMC%>"> 
&lt;input type="button" value="提交" onclick="insertclick()"> 
&lt;/form></pre><br /> <br /><br />二、页面中的JavaScript的数据如何使用后台的JSP程序的数据 <br /><br />这个比较简单，直接在JavaScript脚本中用就可以把jsp程序中的数据传递给JavaScript脚本使用了。 <br /><br /><br />参考下面的脚本： <br /><br /><br />&lt;!-- html页面form表单，放置在html页面中的位置不限 --> <br /><pre name="code" class="java">&lt;form name="insertForm" method="post" action="yourJSP"> 
&lt;input type="hidden" name="mc" value=""> 
&lt;/form> 

&lt;script language="JavaScript"> 
&lt;!-- 
/*************************************************************** 
* JavaScript脚本，放置在页面中form以后的任何位置都可以 
* 使用JavaScirpt获取JSP传递到页面中的变量varMC， 
* 然后就可以在JavaScript中使用这个变量的值，通过 
* JavaScript脚本赋值给form中的隐藏域。 
***************************************************************/ 
var1 = "&lt;%=varMC%>"; //获取JSP中的变量值 
document.all.mc.value = var1; 
//--> 
&lt;/script></pre>
          <br/>
          <span style="color:red;">
            <a href="http://virgos.javaeye.com/blog/227893#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 14 Aug 2008 09:26:48 +0800</pubDate>
        <link>http://virgos.javaeye.com/blog/227893</link>
        <guid>http://virgos.javaeye.com/blog/227893</guid>
      </item>
      <item>
        <title>Hibernate配置详解</title>
        <author>Virgo_S</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://virgos.javaeye.com">Virgo_S</a>&nbsp;
          链接：<a href="http://virgos.javaeye.com/blog/223479" style="color:red;">http://virgos.javaeye.com/blog/223479</a>&nbsp;
          发表时间: 2008年08月02日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          表 3.3.  Hibernate配置属性 <br /><br />属性名  用途  <br />hibernate.dialect  一个Hibernate Dialect类名允许Hibernate针对特定的关系数据库生成优化的SQL. <br />取值 full.classname.of.Dialect <br /> <br />hibernate.show_sql  输出所有SQL语句到控制台. 有一个另外的选择是把org.hibernate.SQL这个log category设为debug。 <br />eg. true | false <br /> <br />hibernate.format_sql  在log和console中打印出更漂亮的SQL。 <br />取值 true | false <br /> <br />hibernate.default_schema  在生成的SQL中, 将给定的schema/tablespace附加于非全限定名的表名上. <br />取值 SCHEMA_NAME <br /> <br />hibernate.default_catalog  在生成的SQL中, 将给定的catalog附加于非全限定名的表名上. <br />取值 CATALOG_NAME <br /> <br />hibernate.session_factory_name  SessionFactory创建后，将自动使用这个名字绑定到JNDI中. <br />取值 jndi/composite/name <br /> <br />hibernate.max_fetch_depth  为单向关联(一对一, 多对一)的外连接抓取（outer join fetch）树设置最大深度. 值为0意味着将关闭默认的外连接抓取. <br />取值 建议在0到3之间取值 <br /> <br />hibernate.default_batch_fetch_size  为Hibernate关联的批量抓取设置默认数量. <br />取值 建议的取值为4, 8, 和16 <br /> <br />hibernate.default_entity_mode  为由这个SessionFactory打开的所有Session指定默认的实体表现模式. <br />取值 dynamic-map, dom4j, pojo <br /> <br />hibernate.order_updates  强制Hibernate按照被更新数据的主键，为SQL更新排序。这么做将减少在高并发系统中事务的死锁。 <br />取值 true | false <br /> <br />hibernate.generate_statistics  如果开启, Hibernate将收集有助于性能调节的统计数据. <br />取值 true | false <br /> <br />hibernate.use_identifer_rollback  如果开启, 在对象被删除时生成的标识属性将被重设为默认值. <br />取值 true | false <br /> <br />hibernate.use_sql_comments  如果开启, Hibernate将在SQL中生成有助于调试的注释信息, 默认值为false. <br />取值 true | false <br /> <br /><br /><br /><br /><br />表 3.4.  Hibernate JDBC和连接(connection)属性 <br /><br />属性名  用途  <br />hibernate.jdbc.fetch_size  非零值，指定JDBC抓取数量的大小 (调用Statement.setFetchSize()).  <br />hibernate.jdbc.batch_size  非零值，允许Hibernate使用JDBC2的批量更新. <br />取值 建议取5到30之间的值 <br /> <br />hibernate.jdbc.batch_versioned_data  如果你想让你的JDBC驱动从executeBatch()返回正确的行计数 , 那么将此属性设为true(开启这个选项通常是安全的). 同时，Hibernate将为自动版本化的数据使用批量DML. 默认值为false. <br />eg. true | false <br /> <br />hibernate.jdbc.factory_class  选择一个自定义的Batcher. 多数应用程序不需要这个配置属性. <br />eg. classname.of.Batcher <br /> <br />hibernate.jdbc.use_scrollable_resultset  允许Hibernate使用JDBC2的可滚动结果集. 只有在使用用户提供的JDBC连接时，这个选项才是必要的, 否则Hibernate会使用连接的元数据. <br />取值 true | false <br /> <br />hibernate.jdbc.use_streams_for_binary  在JDBC读写binary (二进制)或serializable (可序列化) 的类型时使用流(stream)(系统级属性). <br />取值 true | false <br /> <br />hibernate.jdbc.use_get_generated_keys  在数据插入数据库之后，允许使用JDBC3 PreparedStatement.getGeneratedKeys() 来获取数据库生成的key(键)。需要JDBC3+驱动和JRE1.4+, 如果你的数据库驱动在使用Hibernate的标 识生成器时遇到问题，请将此值设为false. 默认情况下将使用连接的元数据来判定驱动的能力. <br />取值 true|false <br /> <br />hibernate.connection.provider_class  自定义ConnectionProvider的类名, 此类用来向Hibernate提供JDBC连接. <br />取值 classname.of.ConnectionProvider <br /> <br />hibernate.connection.isolation  设置JDBC事务隔离级别. 查看java.sql.Connection来了解各个值的具体意义, 但请注意多数数据库都不支持所有的隔离级别. <br />取值 1, 2, 4, 8 <br /> <br />hibernate.connection.autocommit  允许被缓存的JDBC连接开启自动提交(autocommit) (不建议). <br />取值 true | false <br /> <br />hibernate.connection.release_mode  指定Hibernate在何时释放JDBC连接. 默认情况下,直到Session被显式关闭或被断开连接时,才会释放JDBC连接. 对于应用程序服务器的JTA数据源, 你应当使用after_statement, 这样在每次JDBC调用后，都会主动的释放连接. 对于非JTA的连接, 使用after_transaction在每个事务结束时释放连接是合理的. auto将为JTA和CMT事务策略选择after_statement, 为JDBC事务策略选择after_transaction. <br />取值 auto (默认) | on_close | after_transaction | after_statement <br /><br />注意,这些设置仅对通过SessionFactory.openSession得到的Session起作用。对于通过SessionFactory.getCurrentSession得到的Session，所配置的CurrentSessionContext实现控制这些Session的连接释放模式。请参阅第 2.5 节 “上下文相关的（Contextual）Session”。 <br /> <br />hibernate.connection.&lt;propertyName>  将JDBC属性propertyName传递到DriverManager.getConnection()中去.  <br />hibernate.jndi.&lt;propertyName>  将属性propertyName传递到JNDI InitialContextFactory中去.  <br /><br /><br /><br /><br />表 3.5.  Hibernate缓存属性 <br /><br />属性名  用途  <br />hibernate.cache.provider_class  自定义的CacheProvider的类名. <br />取值 classname.of.CacheProvider <br /> <br />hibernate.cache.use_minimal_puts  以频繁的读操作为代价, 优化二级缓存来最小化写操作. 在Hibernate3中，这个设置对的集群缓存非常有用, 对集群缓存的实现而言，默认是开启的. <br />取值 true|false <br /> <br />hibernate.cache.use_query_cache  允许查询缓存, 个别查询仍然需要被设置为可缓存的. <br />取值 true|false <br /> <br />hibernate.cache.use_second_level_cache  能用来完全禁止使用二级缓存. 对那些在类的映射定义中指定&lt;cache>的类，会默认开启二级缓存. <br />取值 true|false <br /> <br />hibernate.cache.query_cache_factory  自定义实现QueryCache接口的类名, 默认为内建的StandardQueryCache. <br />取值 classname.of.QueryCache <br /> <br />hibernate.cache.region_prefix  二级缓存区域名的前缀. <br />取值 prefix <br /> <br />hibernate.cache.use_structured_entries  强制Hibernate以更人性化的格式将数据存入二级缓存. <br />取值 true|false <br /> <br /><br /><br /><br /><br />表 3.6.  Hibernate事务属性 <br /><br />属性名  用途  <br />hibernate.transaction.factory_class  一个TransactionFactory的类名, 用于Hibernate Transaction API (默认为JDBCTransactionFactory). <br />取值 classname.of.TransactionFactory <br /> <br />jta.UserTransaction  一个JNDI名字，被JTATransactionFactory用来从应用服务器获取JTA UserTransaction. <br />取值 jndi/composite/name <br /> <br />hibernate.transaction.manager_lookup_class  一个TransactionManagerLookup的类名 - 当使用JVM级缓存，或在JTA环境中使用hilo生成器的时候需要该类. <br />取值 classname.of.TransactionManagerLookup <br /> <br />hibernate.transaction.flush_before_completion  如果开启, session在事务完成后将被自动清洗(flush)。 现在更好的方法是使用自动session上下文管理。请参见第 2.5 节 “上下文相关的（Contextual）Session”。 <br />取值 true | false <br /> <br />hibernate.transaction.auto_close_session  如果开启, session在事务完成后将被自动关闭。 现在更好的方法是使用自动session上下文管理。请参见第 2.5 节 “上下文相关的（Contextual）Session”。 <br />取值 true | false <br /> <br /><br /><br /><br /><br />表 3.7.  其他属性 <br /><br />属性名  用途  <br />hibernate.current_session_context_class  为"当前" Session指定一个(自定义的)策略。关于内置策略的详情，请参见第 2.5 节 “上下文相关的（Contextual）Session” 。 <br />eg. jta | thread | managed | custom.Class <br /> <br />hibernate.query.factory_class  选择HQL解析器的实现. <br />取值 org.hibernate.hql.ast.ASTQueryTranslatorFactory or org.hibernate.hql.classic.ClassicQueryTranslatorFactory <br /> <br />hibernate.query.substitutions  将Hibernate查询中的符号映射到SQL查询中的符号 (符号可能是函数名或常量名字). <br />取值 hqlLiteral=SQL_LITERAL, hqlFunction=SQLFUNC <br /> <br />hibernate.hbm2ddl.auto  在SessionFactory创建时，自动检查数据库结构，或者将数据库schema的DDL导出到数据库. 使用 create-drop时,在显式关闭SessionFactory时，将drop掉数据库schema. <br />取值 validate | update | create | create-drop <br /> <br />hibernate.cglib.use_reflection_optimizer  开启CGLIB来替代运行时反射机制(系统级属性). 反射机制有时在除错时比较有用. 注意即使关闭这个优化, Hibernate还是需要CGLIB. 你不能在hibernate.cfg.xml中设置此属性. <br />取值 true | false <br /> <br /><br /><br /><br /><br />3.4.1.  SQL方言 <br />你应当总是为你的数据库将hibernate.dialect属性设置成正确的 org.hibernate.dialect.Dialect子类. 如果你指定一种方言, Hibernate将为上面列出的一些属性使用合理的默认值, 为你省去了手工指定它们的功夫. <br /><br />表 3.8.  Hibernate SQL方言 (hibernate.dialect) <br /><br />RDBMS 方言  <br />DB2 org.hibernate.dialect.DB2Dialect <br />DB2 AS/400 org.hibernate.dialect.DB2400Dialect <br />DB2 OS390 org.hibernate.dialect.DB2390Dialect <br />PostgreSQL org.hibernate.dialect.PostgreSQLDialect <br />MySQL org.hibernate.dialect.MySQLDialect <br />MySQL with InnoDB org.hibernate.dialect.MySQLInnoDBDialect <br />MySQL with MyISAM org.hibernate.dialect.MySQLMyISAMDialect <br />Oracle (any version) org.hibernate.dialect.OracleDialect <br />Oracle 9i/10g org.hibernate.dialect.Oracle9Dialect <br />Sybase org.hibernate.dialect.SybaseDialect <br />Sybase Anywhere org.hibernate.dialect.SybaseAnywhereDialect <br />Microsoft SQL Server org.hibernate.dialect.SQLServerDialect <br />SAP DB org.hibernate.dialect.SAPDBDialect <br />Informix org.hibernate.dialect.InformixDialect <br />HypersonicSQL org.hibernate.dialect.HSQLDialect <br />Ingres org.hibernate.dialect.IngresDialect <br />Progress org.hibernate.dialect.ProgressDialect <br />Mckoi SQL org.hibernate.dialect.MckoiDialect <br />Interbase org.hibernate.dialect.InterbaseDialect <br />Pointbase org.hibernate.dialect.PointbaseDialect <br />FrontBase org.hibernate.dialect.FrontbaseDialect <br />Firebird org.hibernate.dialect.FirebirdDialect
          <br/>
          <span style="color:red;">
            <a href="http://virgos.javaeye.com/blog/223479#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 02 Aug 2008 23:19:12 +0800</pubDate>
        <link>http://virgos.javaeye.com/blog/223479</link>
        <guid>http://virgos.javaeye.com/blog/223479</guid>
      </item>
      <item>
        <title>Tomcat启动脚本浅析</title>
        <author>Virgo_S</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://virgos.javaeye.com">Virgo_S</a>&nbsp;
          链接：<a href="http://virgos.javaeye.com/blog/222585" style="color:red;">http://virgos.javaeye.com/blog/222585</a>&nbsp;
          发表时间: 2008年08月01日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          Tomcat是应用颇广的Servlet和JSP的容器，可以说几乎每个学习JSP的人都 接触过它。在实际开发环境中，它还可以作为轻巧灵便的应用服务器用来调试和部署。在Tomcat上开发的Servlet和JSP程序，可以非常方便地部署 到Weblogic及Websphere等生产服务器上去。有些情况下，它还可以和Apache Web Server配合使用，作为小型企业的Web Application Server。本文以Tomcat5.0.28为例，讨论一下Tomcat的启动过程及常见问题。大家都知道，Tomcat最普遍的启动方法就是在DOS 命令行窗口中执行Tomcat的bin目录下的startup.bat文件（双击该文件即可启动)。 <br /><br />1. startup.bat脚本解析 <br /><br /><br />下 面我们首先来看看startup.bat脚本是如何启动Tomcat的。Startup脚本非常明了，它的主要任务就是先设置CATALINA_HOME 的环境变量，让该环境变量指向Tomcat的安装目录；然后在安装目录的bin子目录下找catalina.bat文件，如果找不到，就打印出错误信息并 退出，如果在bin目录下找到catalina.bat文件，就准备执行该文件。不过，在执行该文件之前，startup脚本还做了一件工作，那就是寻找 参数。startup脚本可以带多个参数，在Java主类中，第一个参数为args[0]，而在MS-DOS脚本中，第一个参数可以通过”%1”得到，如 果您想要得到DOS脚本中得到第二个参数，调用”%2”。但是，在脚本参数数目未知的情况下，我们就只能通过goto循环调用shift命令来获得脚本的 所有参数，下面这个简单的实验脚本有助于我们理解如何使用shift命令。 <br /><br />@echo off <br />echo Print parameters by %%1 and shift loop <br />:loopStart <br />if ""%1""=="""" goto loopEnd <br />echo Paramter is %1 <br />shift <br />goto loopStart <br />:loopEnd <br /><br /><br />如果把上面的脚本保存成test.bat并在DOS中执行该脚本，执行结果如下。 <br /><br /><br /><br /><br />下面就是Startup.bat脚本的详细注释，如果想要在DOS脚本中注释一行，前面加上rem即可，这相当于Java的双斜杠(//)注释，下面程序中，凡是以REM开头然后接着中文的行，都是笔者加上的注释，以帮助读者理解该脚本。 <br /><br />@echo off <br />if "%OS%" == "Windows_NT" setlocal <br />rem --------------------------------------------------------------------------- <br />rem Start script for the CATALINA Server <br />rem <br />rem $Id: startup.bat,v 1.6 2004/05/27 18:25:11 yoavs Exp $ <br />rem --------------------------------------------------------------------------- <br /><br />rem 首先定义一个变量 CURRENT_DIR，然后把当前目录作为一个字符串赋给它 <br />rem Guess CATALINA_HOME if not defined <br />set CURRENT_DIR=%cd% <br /><br />rem 如果CATALINA_HOME变量已经赋值，程序转到gotHome行继续 <br />if not "%CATALINA_HOME%" == "" goto gotHome <br />