SOAP webserivce 和 RESTful webservice 对比及区别

2013-04-25 REST Web

简单对象访问协议(Simple Object Access Protocol,SOAP)是一种基于 XML 的协议,可以和现存的许多因特网协议和格式结合使用,包括超文本传输协议(HTTP),简单邮件传输协议(SMTP),多用途网际邮件扩充协议(MIME),基于“通用”传输协议是 SOAP的一个优点。它还支持从消息系统到远程过程调用(Remote Procedure Call,RPC)等大量的应用程序。SOAP提供了一系列的标准,如WSRM(WS-Reliable Messaging)形式化契约确保可靠性与安全性,确保异步处理与调用;WS-Security、WS-Transactions和WS-Coordination等标准提供了上下文信息与对话状态管理。

</wbr>

相对而言,SOAP协议属于复杂的、重量级的协议,当前随着Web2.0的兴起,表述性状态转移(Representational State Transfer,REST)逐步成为一个流行的架构风格。REST是一种轻量级的Web Service架构风格,其实现和操作比SOAP和XML-RPC更为简洁,可以完全通过HTTP协议实现,还可以利用缓存Cache来提高响应速度,性能、效率和易用性上都优于SOAP协议。REST架构对资源的操作包括获取、创建、修改和删除资源的操作正好对应HTTP协议提供的GET、POST、PUT和DELETE方法,这种针对网络应用的设计和开发方式,可以降低开发的复杂性,提高系统的可伸缩性。REST架构尤其适用于完全无状态的CRUD(Create、Read、Update、Delete,创建、读取、更新、删除)操作。

基于REST的软件体系结构风格(Software Architecture Style)称之为面向资源体系架构(Resource-oriented Architecture,ROA)。按照REST原则设计的软件、体系结构,通常被称为“REST式的”(RESTful),在本文中以下称之为RESTful Web服务,以便于和基于SOAP的Web服务区别。 </wbr>

服务器端采用J2EE,客户端采用JSP、Flex、JavaFX、AIR等可以直接调用Servlet,其他的实现技术基本上不能直接调用,但是无论是那种客户端,对于基于SOAP的Web服务或者基于RESTful Web服务务都是支持的,如AJAX的 XMLHttpRequest、Flex的HTTPService等。如下图所示:

客户端和服务器端的通讯方式

 

SOAP
HTTP 的 GET、HEAD 请求本质上应该是安全的调用,即:GET、HEAD 调用不会有任何的副作用,不会造成服务器端状态的改变。对于服务器来说,客户端对某一 URI 做 n 次的 GET、HAED 调用,其状态与没有做调用是一样的,不会发生任何的改变。 HTTP 的 PUT、DELTE 调用,具有幂指相等特性 , 即:客户端对某一 URI 做 n 次的 PUT、DELTE 调用,其效果与做一次的调用是一样的。HTTP 的 GET、HEAD 方法也具有幂指相等特性。 HTTP 这些标准方法在原则上保证你的分布式系统具有这些特性,以帮助构建更加健壮的分布式系统。 安全控制 为了说明问题,基于上面的在线用户管理系统,我们给定以下场景: 参考一开始我们给出的用例图,对于客户端 Client2,我们只希望它能以只读的方式访问 User 和 User List 资源,而 Client1 具有访问所有资源的所有权限。 如何做这样的安全控制? 通行的做法是:所有从客户端 Client2 发出的 HTTP 请求都经过代理服务器 (Proxy Server)。代理服务器制定安全策略:所有经过该代理的访问 User 和 User List 资源的请求只具有读取权限,即:允许 GET/HEAD 操作,而像具有写权限的 PUT/DELTE 是不被允许的。 如果对于 REST,我们看看这样的安全策略是如何部署的。如下图所示: 图 4. REST 与代理服务器 (Proxy Servers) REST 一般代理服务器的实现根据 (URI, HTTP Method) 两元组来决定 HTTP 请求的安全合法性。 当发现类似于(http://localhost:8182/v1/users/{username},DELETE)这样的请求时,予以拒绝。 对于 SOAP,如果我们想借助于既有的代理服务器进行安全控制,会比较尴尬,如下图: 图 5. SOAP 与代理服务器 (Proxy Servers) REST 所有的 SOAP 消息经过代理服务器,只能看到( http://localhost:8182/v1/soap/servlet/messagerouter , HTTP POST)这样的信息,如果代理服务器想知道当前的 HTTP 请求具体做的是什么,必须对 SOAP 的消息体解码,这样的话,意味着要求第三方的代理服务器需要理解当前的 SOAP 消息语义,而这种 SOAP 应用与代理服务器之间的紧耦合关系是不合理的。 关于缓存 众所周知,对于基于网络的分布式应用,网络传输是一个影响应用性能的重要因素。如何使用缓存来节省网络传输带来的开销,这是每一个构建分布式网络应用的开发人员必须考虑的问题。 HTTP 协议带条件的 HTTP GET 请求 (Conditional GET) 被设计用来节省客户端与服务器之间网络传输带来的开销,这也给客户端实现 Cache 机制 ( 包括在客户端与服务器之间的任何代理 ) 提供了可能。HTTP 协议通过 HTTP HEADER 域:If-Modified-Since/Last- Modified,If-None-Match/ETag 实现带条件的 GET 请求。 REST 的应用可以充分地挖掘 HTTP 协议对缓存支持的能力。当客户端第一次发送 HTTP GET 请求给服务器获得内容后,该内容可能被缓存服务器 (Cache Server) 缓存。当下一次客户端请求同样的资源时,缓存可以直接给出响应,而不需要请求远程的服务器获得。而这一切对客户端来说都是透明的。 图 6. REST 与缓存服务器 (Cache Server) REST 而对于 SOAP,情况又是怎样的呢? 使用 HTTP 协议的 SOAP,由于其设计原则上并不像 REST 那样强调与 Web 的工作方式相一致,所以,基于 SOAP 应用很难充分发挥 HTTP 本身的缓存能力,图 7. SOAP 与缓存服务器 (Cache Server) REST 两个因素决定了基于 SOAP 应用的缓存机制要远比 REST 复杂: 其一、所有经过缓存服务器的 SOAP 消息总是 HTTP POST,缓存服务器如果不解码 SOAP 消息体,没法知道该 HTTP 请求是否是想从服务器获得数据。 其二、SOAP 消息所使用的 URI 总是指向 SOAP 的服务器,如本文例子中的 http://localhost:8182/v1/soap/servlet/messagerouter ,这并没有表达真实的资源 URI,其结果是缓存服务器根本不知道那个资源正在被请求,更不用谈进行缓存处理。 关于连接性 在一个纯的 SOAP 应用中,URI 本质上除了用来指示 SOAP 服务器外,本身没有任何意义。与 REST 的不同的是,无法通过 URI 驱动 SOAP 方法调用。例如在我们的例子中,当我们通过 getUserList SOAP 消息获得所有的用户列表后,仍然无法通过既有的信息得到某个具体的用户信息。唯一的方法只有通过 WSDL 的指示,通过调用 getUserByName 获得,getUserList 与 getUserByName 是彼此孤立的。 而对于 REST,情况是完全不同的:通过 http://localhost:8182/v1/users URI 获得用户列表,然后再通过用户列表中所提供的 LINK 属性,例如 <link>http://localhost:8182/v1/users/tester</link> 获得 tester 用户的用户信息。这样的工作方式,非常类似于你在浏览器的某个页面上点击某个 hyperlink, 浏览器帮你自动定向到你想访问的页面,并不依赖任何第三方的信息 REST 构建的系统其系统的扩展能力要强于 SOAP,这可以体现在它的统一接口抽象、代理服务器支持、缓存服务器支持等诸多方面, 而SOAP的成熟性可以给需要提供给多开发语言的,多传输方式的,对于安全性要求较高的接口设计带来便利。   原文载自:http://luckykapok918.blog.163.com/blog/static/20586504320123238260833/

自行车骑行装备的选择

2013-04-24 Outdoor

一、骑行人员装备 从上至下,依次为: 1、骑行头盔:为轻质头盔,以高强度泡沫压制而成,用于头部防护; 2、骑行头巾:多种用途,主要用于排汗遮阳阻隔灰尘; 3、骑行眼镜:按照佩带时间段,镜片可分为多种颜色,一般为深灰色、黄色、白色。深灰色-适合于中午阳光照射充足的时间佩带,以阻隔刺眼的眼光;黄色-适合清晨、黄昏阳光照射相对较暗的时候佩带;白色,适合天气阴暗或晚上佩带。其主要功能在于,阻隔阳光、阻隔风尘; 4、骑行服:骑行人员专用衣服,由多种面料制作而成,可按需选用。其功能主要功能为保暖、速干、透气; 5、骑行袖套:又称为臂套,主要和短袖骑行服搭配穿着,方便拆解,其主要功能为保暖、防晒; 6、骑行手套:为骑行人员专用手套,有半指与全指之分,手掌部位做加厚处理,高档骑行手套均垫有硅胶层,主要用于摔车时,减少伤害,防止擦破手; 7、骑行背包或腰包:骑行背包并没有做特殊规定,主要用于盛装骑行过程所需之物,满足需求即可,并不做特殊要求; 8、骑行裤:为骑行者专用裤子,有长短之分并在臀部配有坐垫,其功能主要为高弹减少腿部于自行车之间的摩擦,同时配备的坐垫减少长时间骑行屁股会疼的状况,提高骑行的舒适性; 9、骑行腿套:如直筒一般,与骑行短裤搭配使用,方便拆解,主要功能为保暖、防晒; 10、骑行袜:为骑行者专用袜子,按照COOLMAX含量可分为多种,骑行者可按照骑行时间的长短和骑行活动的强度来选用适合穿着的骑行袜; 11、绑腿:又名束带主要用于扎结裤腿角,防止裤腿绞进链条,以保障骑行的安全; 12、骑行鞋:为骑行者专用鞋子,同样可分为多种,有山地骑行鞋与公路骑行鞋之分,可按照所骑自行车款式进行选择,如自行车配备专用脚蹬,则骑行鞋必须选用锁鞋; 13、骑行鞋套:骑行鞋套用于骑行锁鞋的搭配,有减少风阻,防污保暖等用途。

 

二、车载装备 从自行车前头往后依次有: 1、打气桶:一般为便携装,安置于前叉部位; 2、车首包:又名车把包、车前包常见于山地车装备中。适合长途骑行装载物品之用; 3、车灯\尾灯:常见于夜间骑行的自行车中,照明警示用; 4、喇叭:有气喇叭与电喇叭之分,可按需取用,功能并无太大差别,只是发声装置不同; 5、三角包:隶属于包裹类,作用同于车首包,只是安装部位不同,另还有尾包-安装于自行车座立管部位,驮包安装于自行车后坐部位;车架包,位于车头与车管部位 6、水壶:有多种可选,无需专门配备,主要用于盛装在骑行过程中所需要饮用的水。 7. 水壶架:放置水壶 8. 码表:显示里程,测速 9. 扶把(副把):减少手部疲劳 10.货架(后车架):用于长途骑行装载驮包用 11.挡泥板:雨天必备 12.硅胶坐垫:保护小DD,长途适用 13.护链贴:防止链条脱落与车架激烈摩擦 14.车锁:不多说 15.修补工具:翘胎棒、摩擦片、胶水、补胎片、内六角、一字十字螺丝刀、扳手。。太多了,见下图

 

 


DOM4J介绍与代码示例

2013-04-18 Java

原文摘自:http://zhangjunhd.blog.51cto.com/113473/126310

DOM4J是dom4j.org出品的一个开源XML解析包。Dom4j是一个易用的、开源的库,用于XML,XPath和XSLT。它应用于Java平台,采用了Java集合框架并完全支持DOM,SAX和JAXP。

DOM4J下载jar包:http://downloads.sourceforge.net/dom4j/dom4j-1.6.1.jar
JAXEN(对XPath的支持):http://dist.codehaus.org/jaxen/distributions/jaxen-1.1.1.zip
1.DOM4J主要接口
DOM4J主要接口都在org.dom4j这个包里定义。
-Node为所有的dom4j中XML节点定义了多态行为;
-Branch为能够包含子节点的节点如XML元素(Element)和文档(Docuemnts)定义了一个公共的行为;
|-Element 定义XML 元素;
|-Document定义了XML文档;
-DocumentType 定义XML DOCTYPE声明;
-Entity定义 XML entity;
-Attribute定义了XML的属性;
-ProcessingInstruction 定义 XML 处理指令;
-CharacterData是一个标识借口,标识基于字符的节点。如CDATA,Comment, Text;
|- CDATA 定义了XML CDATA 区域;
|-Text 定义XML 文本节点;
|- Comment 定义了XML注释的行为;
2.创建XML文档
示例xml:students.xml
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="students.xsl"?>
<students>
<!--A Student Catalog-->
<student sn="01">
<name>sam</name>
<age>18</age>
</student>
<student sn="02">
<name>lin</name>
<age>20</age>
</student>
</students>
下面是用dom4j创建上述文档,通过两种方式创建,一种是调用dom4j提供的方法,一种是通过字符串转换。
XmlGen.java
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.XMLWriter;
public class XmlGen {
public Document generateDocumentByMethod() {
Document document = DocumentHelper.createDocument();
// ProcessingInstruction
Map<String, String> inMap = new HashMap<String, String>();
inMap.put("type", "text/xsl");
inMap.put("href", "students.xsl");
document.addProcessingInstruction("xml-stylesheet", inMap);
// root element
Element studentsElement = document.addElement("students");
studentsElement.addComment("An Student Catalog");
// son element
Element stuElement = studentsElement.addElement("student");
stuElement.addAttribute("sn", "01");
Element nameElement = stuElement.addElement("name");
nameElement.setText("sam");
Element ageElement = stuElement.addElement("age");
ageElement.setText("18");
// son element
Element anotherStuElement = studentsElement.addElement("student");
anotherStuElement.addAttribute("sn", "02");
Element anotherNameElement = anotherStuElement.addElement("name");
anotherNameElement.setText("lin");
Element anotherAgeElement = anotherStuElement.addElement("age");
anotherAgeElement.setText("20");
return document;
}
public Document generateDocumentByString() {
String text = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" +
"<?xml-stylesheet type=\"text/xsl\" href=\"students.xsl\"?>" +
"<students><!--An Student Catalog--> <student sn=\"01\">" +
"<name>sam</name><age>18</age></student><student sn=\"02\">" +
"<name>lin</name><age>20</age></student></students>";
Document document = null;
try {
document = DocumentHelper.parseText(text);
} catch (DocumentException e) {
e.printStackTrace();
}
return document;
}
public void saveDocument(Document document, File outputXml) {
try {
// 美化格式
OutputFormat format = OutputFormat.createPrettyPrint();
/*// 缩减格式
OutputFormat format = OutputFormat.createCompactFormat();*/
/*// 指定XML编码
format.setEncoding("GBK");*/
XMLWriter output = new XMLWriter(new FileWriter(outputXml), format);
output.write(document);
output.close();
} catch (IOException e) {
System.out.println(e.getMessage());
}
}
public static void main(String[] argv) {
XmlGen dom4j = new XmlGen();
Document document = null;
// document=dom4j.generateDocumentByMethod();
document = dom4j.generateDocumentByString();
dom4j.saveDocument(document, new File("output.xml"));
}
}
方法generateDocumentByMethod()通过调用方法构建xml文档:
1.使用DocumentHelper得到Document实例
Document document = DocumentHelper.createDocument();
2.创建Processing Instruction
document.addProcessingInstruction("xml-stylesheet", inMap);
3.创建元素Element
Element studentsElement = document.addElement("students");
4.为元素添加注释Comment
studentsElement.addComment("An Student Catalog");
5.为元素添加属性
studentsElement.addComment("An Student Catalog");
6.为元素添加文本值Text
ageElement.setText("18");
方法generateDocumentByString()通过字符串转换直接构建xml文档,使用DocumentHelper.parseText()来实现.
document = DocumentHelper.parseText(text);
方法saveDocument(Document document, File outputXml)将文档输出到文件保存,可指定字符编码,可指定格式化输出。
3.修改XML文档
这里使用xpath来定位待修改的元素和属性,需要jaxen的支持。
示例中将students-gen.xml的第一个student元素的sn属性改为001,其子元素name内容改为jeff。
XmlMod.java
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Iterator;
import java.util.List;
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
public class XmlMod {
public void modifyDocument(File inputXml) {
try {
SAXReader saxReader = new SAXReader();
Document document = saxReader.read(inputXml);
List list = document.selectNodes("[email protected]");
Iterator iter = list.iterator();
while (iter.hasNext()) {
Attribute attribute = (Attribute) iter.next();
if (attribute.getValue().equals("01"))
attribute.setValue("001");
}
list = document.selectNodes("//students/student");
iter = list.iterator();
while (iter.hasNext()) {
Element element = (Element) iter.next();
Iterator iterator = element.elementIterator("name");
while (iterator.hasNext()) {
Element nameElement = (Element) iterator.next();
if (nameElement.getText().equals("sam"))
nameElement.setText("jeff");
}
}
XMLWriter output = new XMLWriter(new FileWriter(new File(
"students-modified.xml")));
output.write(document);
output.close();
}
catch (DocumentException e) {
System.out.println(e.getMessage());
} catch (IOException e) {
System.out.println(e.getMessage());
}
}
public static void main(String[] argv) {
XmlMod dom4jParser = new XmlMod();
dom4jParser.modifyDocument(new File("students-gen.xml"));
}
}
1.使用File定位文件资源,并基于此获得Document实例
SAXReader saxReader = new SAXReader();
Document document = saxReader.read(inputXml);
2.Document实例的selectNodes方法可以传入xpath,并返回一个List实例,基于此使用迭代器,完成特定的应用
List list = document.selectNodes("[email protected]");
4.遍历XML文档
这里提供两种遍历方法,一种是基于迭代的遍历,一种是基于Visitor模式的遍历。
XmlTra.java
import java.io.File;
import java.util.Iterator;
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.ProcessingInstruction;
import org.dom4j.VisitorSupport;
import org.dom4j.io.SAXReader;
public class XmlTra {
private File inputXml;
public XmlTra(File inputXml) {
this.inputXml = inputXml;
}
public Document getDocument() {
SAXReader saxReader = new SAXReader();
Document document = null;
try {
document = saxReader.read(inputXml);
} catch (DocumentException e) {
e.printStackTrace();
}
return document;
}
public Element getRootElement() {
return getDocument().getRootElement();
}
public void traversalDocumentByIterator() {
Element root = getRootElement();
// 枚举根节点下所有子节点
for (Iterator ie = root.elementIterator(); ie.hasNext();) {
System.out.println("======");
Element element = (Element) ie.next();
System.out.println(element.getName());
// 枚举属性
for (Iterator ia = element.attributeIterator(); ia.hasNext();) {
Attribute attribute = (Attribute) ia.next();
System.out.println(attribute.getName() + ":"
+ attribute.getData());
}
// 枚举当前节点下所有子节点
for (Iterator ieson = element.elementIterator(); ieson.hasNext();) {
Element elementSon = (Element) ieson.next();
System.out.println(elementSon.getName() + ":"
+ elementSon.getText());
}
}
}
public void traversalDocumentByVisitor() {
getDocument().accept(new MyVisitor());
}
/**
* 定义自己的访问者类
*/
private static class MyVisitor extends VisitorSupport {
/**
* 对于属性节点,打印属性的名字和值
*/
public void visit(Attribute node) {
System.out.println("attribute : " + node.getName() + " = "
+ node.getValue());
}
/**
* 对于处理指令节点,打印处理指令目标和数据
*/
public void visit(ProcessingInstruction node) {
System.out.println("PI : " + node.getTarget() + " "
+ node.getText());
}
/**
* 对于元素节点,判断是否只包含文本内容,如是,则打印标记的名字和 元素的内容。如果不是,则只打印标记的名字
*/
public void visit(Element node) {
if (node.isTextOnly())
System.out.println("element : " + node.getName() + " = "
+ node.getText());
else
System.out.println("--------" + node.getName() + "--------");
}
}
public static void main(String[] argv) {
XmlTra dom4jParser = new XmlTra(new File("students-gen.xml"));
// dom4jParser.traversalDocumentByIterator();
dom4jParser.traversalDocumentByVisitor();
}
}
方法traversalDocumentByIterator()提供一种基于迭代的遍历实现,每个Element通过elementIterator()和attributeIterator()取代其子元素和属性的迭代器。
Visitor是GOF设计模式之一。其主要原理就是两种类互相保有对方的引用,并且一种作为Visitor去访问许多Visitable。DOM4J中的Visitor模式只需要自定一个类实现Visitor接口即可。
public class MyVisitor extends VisitorSupport {
public void visit(Element element) {
System.out.println(element.getName());
}
public void visit(Attribute attr) {
System.out.println(attr.getName());
}
}
调用: root.accept(new MyVisitor())
Visitor接口提供多种Visit()的重载,根据XML不同的对象,将采用不同的方式来访问。上面是给出的Element和Attribute的简单实现,一般比较常用的就是这两个。VisitorSupport是DOM4J提供的默认适配器,Visitor接口的Default Adapter模式,这个模式给出了各种visit(*)的空实现,以便简化代码。
注意,这个Visitor是自动遍历所有子节点的。如果是root.accept(MyVisitor),将遍历子节点。我第一次用的时候,认为是需要自己遍历,便在递归中调用Visitor,结果可想而知。
5.使用ElementHandler
XmlHandler.java
import java.io.File;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.ElementHandler;
import org.dom4j.ElementPath;
import org.dom4j.io.SAXReader;
public class XmlHandler {
public static void main(String[] args) {
SAXReader saxReader = new SAXReader();
File file = new File("students.xml");
try {
// 添加一个ElementHandler实例。
saxReader.addHandler("/students/student", newStudentHandler());
saxReader.read(file);
} catch (DocumentException e) {
System.out.println(e.getMessage());
}
}
/**
* 定义StudentHandler处理器类,对<student>元素进行处理。
*/
private static class StudentHandler implements ElementHandler {
public void .Start(ElementPath path) {
Element elt = path.getCurrent();
System.out.println("Found student: " + elt.attribut.ue("sn"));
// 添加对子元素<name>的处理器。
path.addHandler("name", new NameHandler());
}
public void .End(ElementPath path) {
// 移除对子元素<name>的处理器。
path.removeHandler("name");
}
}
/**
* 定义NameHandler处理器类,对<student>的<name>子元素进行处理。
*/
private static class NameHandler implements ElementHandler {
public void .Start(ElementPath path) {
System.out.println("path : " + path.getPath());
}
public void .End(ElementPath path) {
Element elt = path.getCurrent();
// 输出<name>元素的名字和它的文本内容。
System.out.println(elt.getName() + " : " + elt.getText());
}
}
}
6.使用XSLT转换XML
这里必须使用JAXP的支持。
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import org.dom4j.Document;
import org.dom4j.io.DocumentResult;
import org.dom4j.io.DocumentSource;
……
public Document styleDocument(Document document, String stylesheet)
throws Exception {
// load the transformer using JAXP
TransformerFactory factory = TransformerFactory.newInstance();
Transformer transformer = factory.newTransformer(newStreamSource(stylesheet));
// now lets style the given document
DocumentSource source = new DocumentSource(document);
DocumentResult result = new DocumentResult();
transformer.transform(source, result);
// return the transformed document
Document transformedDoc = result.getDocument();
return transformedDoc;
}
……
 

SecurityError Error 2148 SWF 不能访问本地资源

2013-04-13 Flash

##错误提示:

SWF 文件不能被本地访问 不能访问本地 只有仅限于文件系统的 SWF 文件和可信的本地 SWF 文件可以访问本地资源

##错误信息:

SecurityError: Error #2148: SWF 文件 D:\demo\demo.swf 不能访问本地资源 D:\demo\demo\bin-debug\textLayout_4.0.0.10485.swf。只有仅限于文件系统的 SWF 文件和可信的本地 SWF 文件可以访问本地资源。

##解决方法:

###第一种办法

在Flash插件上右键->全局设置->高级->开发人员工具->受信任的位置设置->添加 ,然后添加你的文件或者文件夹即可。

说明:在本地测试期间,Flash Player 可以显示阻止应用程序正常运行的安全警告。您可以使用“受信任位置设置”面板将您自己的 SWF 或 FLV 内容指定为可信内容,从而解决这一问题。您可以将个别文件的路径指定为可信路径,或者指定文件夹为可信文件夹。可信文件夹中的所有文件及其任何子文件夹也会受信任。使用此选项卡可指定您计算机上包含您信任的 SWF 或 FLV 内容的位置。可信内容不遵循阻止内容访问 Internet 和本地计算机文件系统的安全规则。

###第二种方法:

在C:\WINDOWS\system32\Macromed\Flash\FlashPlayerTrust目录下添加一个文件,比如:1.txt(文件名可任意起),文件内容为项目的路径,当然也可以设置为“D:\” 说明: 为了让你的Flash在用户硬盘中拥有同时访问网络和本地的能力,你必须在用户计算机的FlashPlayerTrust目录中为你的Flash添加权限. FlashPlayerTrust 配置文件。 这些是列出受信任路径的简单文本文件。这些文件由可执行的安装程序创建。当安装程序将 SWF 安装到用户的计算机时, 它能够安装信任的配置文件并指定 SWF 是受信任的。


Flex4.6 用Lable自定义LinkButton

2013-04-08 Flex

很简单,先是继承Lable ,而后 设置相关属性,比如 小手鼠标、下划线等

package com.waylau.eagleos.components
{
	import spark.components.Label;

	public class LinkButton extends Label
	{
		public function LinkButton()
		{
			super();

			this.useHandCursor = true ;
			this.buttonMode = true ;
			this.mouseChildren = false ;

			this.setStyle("textDecoration","underline");
		}
	}
}

Golang strings.Split获取字符串中的url/域名的简易方法

2013-04-07 Golang

package main

import (
	"fmt"
	"strings"
)

func main() {
	fmt.Println("Hello World!")

	a := "golang strings.Split获取字符串中的url/域名的简易方法http://www.waylau.com/golang-strings-split-get-url/"
	a1 := strings.Split(a, "//")[1]
	a2 := strings.Split(a1, "/")[0]

	fmt.Println(a1) //输出为:www.waylau.com/golang-strings-split-get-url/
	fmt.Println(a2) //输出为:www.waylau.com
}

惠州——平海古城、海滨温泉、巽寮湾-旅游攻略

2013-04-06 Outdoor

1.在惠州汽车站。乘坐惠州——惠东汽车到达惠东汽车站(18元),转乘惠东——港口专线巴士(18元),至平海镇下车,下车向巷子里走约200米 ,见 城墙,即是古城

其实,平海镇方圆不大,东南西北四个门都见完了也就 几十分钟的事情。城内有几个庙。 恰逢清明节,百姓插旗烧香祭祖,院门大开,也算是领略了风俗民情。 城内无吃饭的地方,吃饭在下车的大路边。 在沙县吃了一碗鸡腿饭13元。

2.平海古城转车去海滨温泉就有所不便,没有的士,也没有班车,上了摩托35元,也只能认了,自己走的话大概要十几公里。 一路狂飙,披头散发,直接送到海滨温泉旅游区门口。

海滨温泉门票是团购的100+,因为是过节临时加多了10元,不限时,貌似营业到晚上12点 去到那里 大概是下午1点半左右,里面大大小小温泉40多个,各种药池,花池,酒池 ,不过里面的温水是不是地热的水就不好说了~ 提供免费的花生小吃还有饮料,橙汁兑水的吧,淡出鸟来 还有花生都不脆,感觉过气的。 另外有小番薯提供,这个不错。 吃了串鱼丸,三颗10元。

泡了一圈,发觉才2点多,休息了一下又去平泡了一圈。其实不能泡太久。 熬到四点过,有歌舞看,走了,不看了。 出门,发现搭车又不便了。决定走到巽寮镇。距离也就是十几公里。(其实是有去惠东的巴士可以搭的) 走了一半路程,天已经暗了。有哥们停车顺了一段路,都是来泡泉的,有亲切感。还是有车好,一脚油门,几分钟就到了酒店。 我是团购的海景山庄,100+标双,到店需要观海的房间的又要对加钱。 酒店内的设施一般,晚上定点放热水。 位置不错,基本上躺床上就能见到海 附近没有吃货,全是酒店。走约两三公里就到镇上。淡季,海鲜还是这么贵~

3.第二天起来,约了隔壁的几个家伙一起去巽寮湾出海打鱼。 一出门就下雨了,我汗。 酒店附近不能直接下海,要走一两公里到滨海度假村有入口可以进海滩。 也没捡贝壳,光避雨去了。附近都是待建的工地。一片荒凉。 天晴上了渔船打鱼,80元包船,打到都是自己的。 结果一趟来回就是几个濑尿虾,不够吃啊。又买了条鱼,叫渔家帮忙煮了。 坐渔家的快艇还是有快感,擦,一条鱼带加工费要了120元

4.附近还有天后宫岭南民俗文化商业街, 酒吧一条街还在招商,人影木有。 商业街有妈祖庙。 天又下雨,走出街到大路,坐车回惠东17元 总结: 路费 100+ 打鱼 80 吃饭 200+ 交通不是很方便。 2013-4-5


Golang 实现的一个小游戏--猜数字

2013-04-06 Golang Game

随机生成一个数字,输入一个数字看是否匹对,匹配则结速,反之提示是大了还是小了,

代码如下: package main

import (
	"bufio"
	"fmt"
	"math/rand"
	"os"
	"strconv"
	"time"
)
var (
	endNum int //设置生成数的范围
)
func main() {
	i := createRandomNumber(endNum)
	//fmt.Println("生成规定范围内的整数:", i)    //本句调试用

	fmt.Println("请输入整数,范围为:0-", endNum)

	flag := true
	reader := bufio.NewReader(os.Stdin)

	for flag {
		data, _, _ := reader.ReadLine()

		command, err := strconv.Atoi(string(data)) //string to int,并作输入格式判断
		if err != nil {
			fmt.Println("格式不对,请输入数字")
		} else {

			fmt.Println("你输入的数字:", command)

			if command == i {
				flag = false
				fmt.Println("恭喜你,答对了~")
			} else if command &lt; i {
				fmt.Println("你输入的数字小于生成的数字,别灰心!再来一次~")
			} else if command &gt; i {
				fmt.Println("你输入的数字大于生成的数字,别灰心!再来一次~")
			}
		}
	}
}
func init() {
	endNum = 10
}

//生成规定范围内的整数
//设置起始数字范围,0开始,endNum截止
func createRandomNumber(endNum int) int {
	r := rand.New(rand.NewSource(time.Now().UnixNano()))
	return r.Intn(endNum)
}