比较OpenDDR和WURFL

量身定制的Web内容通常受益于定制,以考虑多种因素,例如屏幕大小,标记语言支持和图像格式支持。 此类信息存储在“设备描述存储库”(DDR)中。

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:

  1. 下载OpenDDR-Simple-API zip 。
  2. 解压缩它,并根据结果文件夹在Eclipse上创建一个新的Java项目。
  3. 使用Eclipse File >> Export...导出OpenDDR-Simple-API JAR,仅包括src文件夹中的内容,不包括oddr.properties文件。
  4. 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
  5. 将依赖项添加到您的项目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突出显示了效果更好的结果。 利弊

优点 缺点
伍尔夫
  • 设备层次结构很可能会正确推断出功能的值,即使尚未识别该设备也是如此。
  • 很多很多的功能 。
  • 易于配置。
  • 清洁器API。
  • 定价与许可 。
开放DDR
  • 免费使用,甚至用于商业用途。
  • 不断增长的社区。
  • 功能有限。 OpenDDR似乎仅限于W3C 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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/372258.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

逻辑表达式——黑纸白纸

一、问题描述 有A、B、C、D、E五个人&#xff0c;每人额头上都贴了一张黑色或白色的纸条。五人对坐&#xff0c;每人都可以看到其他人额头上的纸的颜色&#xff0c;但都不知道自己额头上的纸的颜色。五人互相观察后&#xff0c; A说&#xff1a;“我看见有三个人额头上贴的是白…

java 1.6u29 下载_jdk1.6 64位下载|JDK 6(Java SE Development Kit)下载6u43 64位官方版_java运行环境 IT猫扑网...

jdk1.6 64位适用于x64的系统安装的java运行环境&#xff0c;Java SE Development Kit6是java开发人员必备的产品&#xff0c;也叫做jdk6&#xff0c;欢迎下载使用。官方介绍适用于您的计算机(windows)的 Java 软件&#xff0c;即 Java Runtime Environment&#xff0c;也称为 J…

ZK 6中的MVVM初探

MVVM与MVC 在上一篇文章中&#xff0c;我们已经看到Ajax框架ZK如何采用CSS选择器启发的Controller来在View中连接UI组件并监听它们的事件。 在此ZK MVC模式下&#xff0c; View中的UI组件无需绑定到任何Controller方法或数据对象。 使用选择器模式作为将View状态和事件映射到Co…

消失循环的2023?你都做了什么? | 2023 年度总结

2023年度总结 -- 今年都做了什么事&#xff1f; 前言心态关键词感悟 记录申请软著独立游戏技术成长 共勉 前言 又到了一年一次年度总结的时候了。我们常常感叹时间飞逝&#xff0c;却又没办法让它放慢的脚步。那就将2023写下来&#xff0c;让它在时间的长河中留下一丝记忆。 心…

由于SSH配置文件的不匹配,导致的Permission denied (publickey)及其解决方法

读者如要转载&#xff0c;请标明出处和作者名&#xff0c;谢谢。 地址01&#xff1a;http://space.itpub.net/25851087 地址02&#xff1a;http://www.cnblogs.com/zjrodger/ 作者名&#xff1a;zjrodger 【问题发生环境和相关参数】(1)OS&#xff1a;Win7 32Bit. (2)Git&#…

java语言基本语法_Java语言基本语法

Java语言基本语法一、标识符和关键字标识符在java语言中&#xff0c;用来标志类名、对象名、变量名、方法名、类型名、数组名、包名的有效字符序列&#xff0c;称为“标识符”&#xff1b;标识符由字母、数字、下划线、美元符号组成&#xff0c;且第一个字符不能是数字&#xf…

Maven的鸟瞰图

我们每天要做的一件事是使用Maven通过发出诸如mvn install之类的构建命令来构建我们的项目。 然后&#xff0c;Maven查看我们项目的配置文件&#xff08;亲切地称为POM&#xff09;&#xff0c;神奇地找出要执行的操作&#xff0c;并且&#xff0c;嘿&#xff0c;您的构建已完成…

node源码详解(五)

本作品采用知识共享署名 4.0 国际许可协议进行许可。转载保留声明头部与原文链接https://luzeshu.com/blog/nodesource5 本博客同步在https://cnodejs.org/topic/56ed6735b705742136388fa6 本博客同步在http://www.cnblogs.com/papertree/p/5295344.html 在上一篇博客&#xff…

分层图+最短路算法 BZOJ 2763: [JLOI2011]飞行路线

2763: [JLOI2011]飞行路线 Time Limit: 10 Sec Memory Limit: 128 MBDescription Alice和Bob现在要乘飞机旅行&#xff0c;他们选择了一家相对便宜的航空公司。该航空公司一共在n个城市设有业务&#xff0c;设这些城市分别标记为0到n-1&#xff0c;一共有m种航线&#xff0c;每…

java web 保护_java web项目请求控制及简单漏洞防范

背景&#xff1a;当时项目没用什么框架&#xff0c;过滤器&#xff0c;请求限制等都需要自己手写。1、请求加时间戳在后台过滤器中可以加判断&#xff0c;如果请求时间戳与服务器时间相差太大&#xff0c;可以返回异常&#xff0c;具体情况可以具体使用。请求中加时间戳的示例如…

Maven最佳实践

尽管Maven提供了“配置之上的约定”解决方案&#xff0c;但是仍然有足够多的必要配置引起严重的头痛。 在这篇文章中&#xff0c;我将与您分享一些最佳实践&#xff0c;以简化对POM文件的维护。 请勿使用已弃用的引用&#xff0c;例如$ {artifactId}或$ {pom.artifactId}。 使用…

51Nod - 1381 硬币游戏

51Nod - 1381 硬币游戏 有一个简单但是很有趣的游戏。在这个游戏中有一个硬币还有一张桌子&#xff0c;这张桌子上有很多平行线&#xff08;如下图所示&#xff09;。两条相邻平行线之间的距离是1&#xff0c;硬币的半径是R&#xff0c;然后我们来抛硬币到桌子上&#xff0c;抛…

Android中Activity和Fragment之间的通信

Android中Activity和Fragment之间的通信 Fragment启动Activity传数据到Fragment 举例&#xff1a;城市选择列表。一个Fragment启动Activity&#xff0c;Activity再把城市选择数据回传到Fragment中。Fragment中方法iv_city.setOnClickListener(new View.OnClickListener() {Ove…

NoSQLUnit 0.3.0发布

介绍 单元测试是一种验证应用程序中可测试的最小部分的方法。 单元测试必须遵循FIRST规则&#xff1b; 这些是快速&#xff0c;隔离&#xff0c;可重复&#xff0c;自我验证和及时的。 考虑到没有持久层&#xff08;典型的关系数据库或新的NoSQL数据库&#xff09;的JEE应用程…

proftpd java_Proftpd:编译安装

下载 proftpd# wget ftp://ftp.proftpd.org/distrib/source/proftpd-1.3.5a.tar.gz# wget https://github.com/proftpd/proftpd/archive/v1.3.5a.tar.gz# yum -y install gcc openssl-devel# ./configure --prefix/usr/local/proftpd/ \--sysconfdir/usr/local/proftpd/ \--ena…

javascript 相关小的知识点集合

本文主要是列出一些javascript 相关的&#xff0c;不限于javascript的&#xff0c;容易记错或者遗忘的小知识&#xff0c;小技巧。 1、javascript中的false 在 JavaScript&#xff0c;常见的 false 值&#xff1a; 0, 0, 0, -0, false, ,null,undefined,NaN 要注意空数组([])和…

AOS – 另外一个独特的页面滚动动画库(CSS3)

AOS 是一个用于在页面滚动的时候呈现元素动画的工具库&#xff0c;你可能会觉得它和 WOWJS 一样&#xff0c;的确他们效果是类似的。但是AOS是 CSS3 动画驱动的库&#xff0c;当你滚动页面的时候能让元素动起来&#xff0c;当页面滚回顶部的时候&#xff0c;元素能够回到前一个…

关于Java包

我希望我们都同意&#xff0c;方法和类应该很小&#xff0c;并且只有很少的依赖关系。 这种观点被广泛接受&#xff0c;而对“小”的解释则各不相同。 关于这一点有很多文献。 但是包裹呢&#xff1f; 有些人将包视为名称空间。 因此&#xff0c;包只是允许您为类重用名称的东西…

python中打开文件时只允许写入的模式是_详解python中各种文件打开模式

在python中&#xff0c;总的来说有三种大的模式打开文件,分别是:a, w, r当以a模式打开时&#xff0c;只能写文件&#xff0c;而且是在文件末尾添加内容。当以a模式打开时&#xff0c;可以写文件&#xff0c;也可读文件&#xff0c;可是在读文件的时候&#xff0c;会发现读出来的…

KVM 基本硬件容量扩容

在工作当中如果虚拟机的容量不够使用 如何添加呢&#xff1f; CPU添加 cpu添加有两种方式&#xff1a; 1 创建虚拟机的时候可以添加 # virt-install --help | grep cpu--vcpusVCPUS Number of vcpus to configure for your guest. Ex:--vcpus 5--vcpus 5,maxcpus10--vcpu…