比较OpenDDR和WURFL
WURFL和OpenDDR项目都提供了访问DDR的API,以简化并促进适应其交付上下文的Web内容的开发。
WURFL最近将其许可证更改为AGPL(Affero GPL)v3 。 这就意味着它不再是免费的商业用途。 因此,最近开始出现了一些免费的开源替代方案。 OpenDDR就是其中之一。
在本文中,我将分享有关OpenDDR Java API与WURFL相比的发现。
向项目添加依赖项
本节介绍如何将WURFL和OpenDDR添加到Maven项目。 伍尔夫
WURFL非常简单,因为它在Maven中央存储库中可用。 您要做的就是将对项目的依赖包括在内:
<dependency><groupId>net.sourceforge.wurfl</groupId><artifactId>wurfl</artifactId><version>1.2.2</version><!-- the last free version -->
</dependency>
开放DDR
另一方面,OpenDDR很难配置。 请按照以下步骤在您的项目中包括OpenDDR:
- 下载OpenDDR-Simple-API zip 。
- 解压缩它,并根据结果文件夹在Eclipse上创建一个新的Java项目。
- 使用Eclipse
File >> Export...
导出OpenDDR-Simple-API JAR,仅包括src
文件夹中的内容,不包括oddr.properties
文件。 - 将
lib
文件夹中的结果JAR和DDR-Simple-API.jar
安装到本地Maven存储库中mvn install:install-file -DgroupId=org.w3c.ddr.simple -DartifactId=DDR-Simple-API -Dversion=2008-03-30 -Dpackaging=jar -Dfile=DDR-Simple-API.jar -DgeneratePom=true -DcreateChecksum=true mvn install:install-file -DgroupId=org.openddr.simpleapi.oddr -DartifactId=OpenDDR -Dversion=1.0.0.6 -Dpackaging=jar -Dfile=OpenDDR-1.0.0.6.jar -DgeneratePom=true -DcreateChecksum=true
- 将依赖项添加到您的项目
pom.xml
文件中:<dependency><groupId>org.w3c.ddr.simple</groupId><artifactId>DDR-Simple-API</artifactId><version>2008-03-30</version> </dependency> <dependency><groupId>org.openddr.simpleapi.oddr</groupId><artifactId>OpenDDR</artifactId><version>1.0.0.6</version> </dependency> <dependency><groupId>org.apache.commons</groupId><artifactId>commons-jexl</artifactId><version>2.1.1</version> </dependency> <dependency><groupId>commons-lang</groupId><artifactId>commons-lang</artifactId><version>2.6</version> </dependency>
加载存储库/功能文件
本节介绍如何加载WURFL和OpenDDR存储库文件并将其导入项目中。 伍尔夫
将wurfl-2.1.1.xml.gz
文件(最后一个免费版本)复制到您的项目src/main/resources
文件夹中,然后使用以下命令导入:
WURFLHolder wurflHolder = new CustomWURFLHolder(getClass().getResource("/wurfl-2.1.1.xml.gz").toString());
开放DDR
将oddr.properties
-Simple-API src
文件夹中的oddr.properties和OpenDDR-Simple-API resources
文件夹中的所有文件复制到项目src/main/resources
文件夹中。 使用以下命令导入它们:
Service identificationService = null;
try {Properties initializationProperties = new Properties();initializationProperties.load(getClass().getResourceAsStream("/oddr.properties"));identificationService = ServiceFactory.newService("org.openddr.simpleapi.oddr.ODDRService",initializationProperties.getProperty(ODDRService.ODDR_VOCABULARY_IRI),initializationProperties);
} catch (IOException e) {LOGGER.error(e.getMessage(), e);
} catch (InitializationException e) {LOGGER.error(e.getMessage(), e);
} catch (NameException e) {LOGGER.error(e.getMessage(), e);
}
使用API
本节介绍如何使用WURFL和OpenDDR Java API访问设备功能。 伍尔夫
WURFL API非常易于使用,并且具有一个后备层次结构,可为尚未在其存储库文件中的设备提供推断功能,这是其一大优势。
Device device = wurflHolder.getWURFLManager().getDeviceForRequest(getContext().getRequest());
int resolutionWidth = Integer.valueOf(device.getCapability("resolution_width"));
int resolutionHeight = Integer.valueOf(device.getCapability("resolution_height"));
当没有可用数据时,无需针对null
值验证device.getCapability("resolution_width")
。
开放DDR
OpenDDR恰恰相反。 非常麻烦并且没有回退层次结构,这迫使开发人员验证每个属性值。
PropertyRef displayWidthRef;
PropertyRef displayHeightRef;try {displayWidthRef = identificationService.newPropertyRef("displayWidth");displayHeightRef = identificationService.newPropertyRef("displayHeight");
} catch (NameException ex) {throw new RuntimeException(ex);
}PropertyRef[] propertyRefs = new PropertyRef[] { displayWidthRef, displayHeightRef };
Evidence e = new ODDRHTTPEvidence();
e.put("User-Agent", getContext().getRequest().getHeader("User-Agent"));int maxImageWidth = 320; // A default value
int maxImageHeight = 480; // A default value
try {PropertyValues propertyValues = identificationService.getPropertyValues(e, propertyRefs);PropertyValue displayWidth = propertyValues.getValue(displayWidthRef);PropertyValue displayHeight = propertyValues.getValue(displayHeightRef);if (displayWidth.exists()) {maxImageWidth = displayWidth.getInteger();}if (displayHeight.exists()) {maxImageHeight = displayHeight.getInteger();}
} catch (Exception ex) {throw new RuntimeException(ex);
}
结果
下表显示了针对使用WURFL和OpenDDR进行服务器端图像适配的应用程序运行的测试结果。
这些测试是在真实设备上执行的,页面用作XHTML BASIC(与XHTML MP相同)。
平台 | 设备 | 属性 |
WURFL max_image_width (1) / max_image_height
|
WURFL resolution_width / resolution_height
|
OpenDDR显示displayWidth /显示displayHeight
|
---|---|---|---|---|---|
不适用 | Firefox桌面 | 宽度 | 650 | 640 | 不支持 |
高度 | 600 | 480 | 不支持 | ||
的iOS | iPhone 4S | 宽度 | 320 | 320 | 320 |
高度 | 480 | 480 | 480 | ||
安卓系统 | HTC One V | 宽度 | 320 | 540 | 不支持 |
高度 | 400 | 960 | 不支持 | ||
HTC英雄 | 宽度 | 300 | 320 | 320 | |
高度 | 460 | 480 | 480 | ||
Windows Phone 7.5 | 诺基亚Lumia 710 | 宽度 | 600 | 640 | 480 |
高度 | 600 | 480 | 800 | ||
黑莓 | 黑莓Bold 9900 | 宽度 | 228 | 480 | 640 |
高度 | 280 | 640 | 480 | ||
塞班S60 | 诺基亚E52(Webkit) | 宽度 | 234 | 240 | 240 |
高度 | 280 | 320 | 320 | ||
诺基亚E52(Opera Mobile) | 宽度 | 240 | 240 | 不支持 | |
高度 | 280 | 320 | 不支持 | ||
Windows Mobile 6.1 | HTC Touch HD T8282 | 宽度 | 440 | 480 | 480 |
高度 | 700 | 800 | 800 |
(1) max_image_width
功能非常方便:
可见(可用)图像的宽度,以像素为单位。 此功能指的是在“移动模式”下使用的图像,即当页面用作XHTML MP时,或者使用诸如“视口”,“手持式”,“移动优化”之类的元标记来禁用“网页渲染”和强制移动用户体验。
注意:颜色#9f9突出显示了效果更好的结果。 利弊
优点 | 缺点 | |
---|---|---|
伍尔夫 |
|
|
开放DDR |
|
|
相关文章
- Eclipse RCP到手机
- Java EE 6测试第二部分– Arquillian和ShrinkWrap简介
- Java EE 6测试第I部分– EJB 3.1可嵌入API
- 条带框架XSS拦截器
- Maven 2 Cobertura插件–更新
- 上一篇文章:Java EE 6测试第二部分– Arquillian和ShrinkWrap简介
参考: 比较我们的JCG合作伙伴 Samuel Santos的设备描述存储库 ,位于Samaxes博客上。
翻译自: https://www.javacodegeeks.com/2012/06/comparing-openddr-to-wurfl.html
比较OpenDDR和WURFL相关推荐
- wurfl_比较OpenDDR与WURFL
wurfl 量身定制的Web内容通常受益于定制,以考虑多种因素,例如屏幕大小,标记语言支持和图像格式支持. 此类信息存储在"设备描述存储库"(DDR)中. WURFL和OpenDD ...
- shrinkwrap_Java EE 6测试第二部分– Arquillian和ShrinkWrap简介
shrinkwrap 在Java EE 6测试的第一部分中,我简要介绍了使用Glassfish嵌入式容器的EJB 3.1 Embeddable API,以演示如何启动该容器,如何在项目类路径中查找be ...
- Java EE 6测试第二部分– Arquillian和ShrinkWrap简介
在Java EE 6测试的第一部分中,我简要介绍了使用Glassfish嵌入式容器的EJB 3.1 Embeddable API,以演示如何启动该容器,如何在项目类路径中查找bean以及运行非常简单的 ...
- 用户体验改善案例_如何检测用户的设备,以便改善他们的用户体验
用户体验改善案例 A few months ago I watched a great talk from the Chrome Dev Summit about performance in slo ...
- 我开源的软件只能我拿来赚钱
文 | 一君 出品 | OSC开源社区(ID:oschina2013) 贵司为 MySQL 掏过钱吗?或者说,你使用的是 MySQL Enterprise Edition 类的产品还是 MySQL C ...
- 【ICCV2019】完整论文列表
ICCV2019完整论文清单,共1075篇. FaceForensics++: Learning to Detect Manipulated Facial Images Authors:Andreas ...
- 探索移动Web网页编码设计
如果你正准备为你的网站制作一个移动设备版本,那这篇文章将会对你相当有用,在本文中,将探索移动Web网页编码设计的各种技巧和注意事项: 为了移动设备上的用户体验可以被接受,代码得怎么设计. Mobile ...
- HTML5开发手机项目总结
http://blog.csdn.net/yual365/article/details/12612789 让网页的宽度自适应屏幕<meta name="viewport" ...
- 手机网站开发的经验总结
手机版网站起码要实现一些基本的功能吧: 1.页面的适用性问题.对于移动终端,有不一样的分辨率与屏幕尺寸,如果还像电脑端的设计还限制网页的宽度为1003px或其他像素值,字体大小还用12px或14px ...
最新文章
- App Store兼容性问题
- sourcetree 回滚
- 二叉搜索树的第k个节点java_剑指Offer62:二叉搜索树的第k个结点(Java)
- 2020年二级计算机考试真题,2020年3月计算机等级考试《二级MS Office高级应用》历年真题-试题答案...
- Python菜鸟之路:原生Ajax/Jquery Ajax/IFrame Ajax的选用
- 关于变量声明的var,let,const
- windows电脑快捷键大全 - 高手总是很酷的
- qt编写网易云界面(1)----标题框的实现
- MySql根据字段名查询重复记录并删除!只保留一条
- 微信存储空间占用问题
- linux系统有线网卡,Thinkpad E430+CentOS 6.4+ linux-3.10.12内核网卡驱动(无线+有线)配置...
- Develop -- Training(十五) -- 显示高效位图
- 如何修复老照片,Bringing-Old-Photos-Back-to-Life机器学习开源项目安装使用 | 机器学习
- 机器学习——支持向量机support vector machine
- 一步步使用SpringBoot结合Vue实现登录和用户管理功能
- 数据结构与算法——6. 抽象数据类型:无序表与有序表及其链表实现
- 云呐|什么是动环监控?动环监控系统的监控对象有哪些?
- 一、Spark内核之运行机制
- C++中如何判断两个字符串数组是否相等
- 细粒度图像分类 fine-grained classification
热门文章
- linux-basic(11)认识和学习bash
- 程序员面试算法_程序员的前20个搜索和排序算法面试问题
- raid重构原理_5个重构原理示例
- inmemory_通过Spring Boot了解H2 InMemory数据库
- java 集成开发工具_最好的Java开发人员测试和集成工具
- java分布式系统开发_从微服务到分布式系统-Java开发人员生存指南
- java 多线程变量可见性_Java多线程:易变变量,事前关联和内存一致性
- 对象空指针_可选和对象:空指针救星!
- AWS上的应用程序自动扩展–选项及其对性能的影响
- 穹顶灯打不出阴暗面_Java 8星期五:Java 8的阴暗面