目前大多数的 JS框架都有跨浏览器到功能,他们会根据不同的浏览器来执行不同的代码,从而达到一致的功能。
GWT也有这种兼容所有浏览器到功能,他是如何实现的呢。
GWT中每一个模块都有一个gwt.xml配置文件,
如: com.google.gwt.dom.DOM.gwt.xml这个配置文件
<module>
<inherits name="com.google.gwt.core.Core"/>
<inherits name="com.google.gwt.user.UserAgent"/>
<replace-with class="com.google.gwt.dom.client.DOMImplOpera">
<when-type-is class="com.google.gwt.dom.client.DOMImpl"/>
<when-property-is name="user.agent" value="opera"/>
</replace-with>
<replace-with class="com.google.gwt.dom.client.DOMImplSafari">
<when-type-is class="com.google.gwt.dom.client.DOMImpl"/>
<when-property-is name="user.agent" value="safari"/>
</replace-with>
<replace-with class="com.google.gwt.dom.client.DOMImplIE8">
<when-type-is class="com.google.gwt.dom.client.DOMImpl"/>
<when-property-is name="user.agent" value="ie8"/>
</replace-with>
<replace-with class="com.google.gwt.dom.client.DOMImplIE6">
<when-type-is class="com.google.gwt.dom.client.DOMImpl"/>
<when-property-is name="user.agent" value="ie6"/>
</replace-with>
<replace-with class="com.google.gwt.dom.client.DOMImplMozilla">
<when-type-is class="com.google.gwt.dom.client.DOMImpl"/>
<when-property-is name="user.agent" value="gecko1_8"/>
</replace-with>
<replace-with class="com.google.gwt.dom.client.DOMImplMozillaOld">
<when-type-is class="com.google.gwt.dom.client.DOMImpl"/>
<when-property-is name="user.agent" value="gecko"/>
</replace-with>
</module>
这里有很多replace-with的标签,仔细想一下应该可以猜到他的功能。
当属性user.agent的值为ie6时,用com.google.gwt.dom.client.DOMImplIE6这个类来实现com.google.gwt.dom.client.DOMImpl这个抽象类。
也就是说GWT通过判断user.agent来判断用户使用的是什么浏览器,然后用相应的实现类来执行,从而达到不同浏览器到兼容性。
那么这个user.agent属性是哪来的呢,观察这个xml的开头可以看到此模块继承了<inherits name="com.google.gwt.user.UserAgent"/>
应该可以在这个UserAgent模块里看出端倪来。
看一下UserAgent模块的xml文件
<module>
<!-- Browser-sensitive code should use the 'user.agent' property -->
<define-property name="user.agent" values="ie6,ie8,gecko,gecko1_8,safari,opera"/>
<property-provider name="user.agent"><![CDATA[
var ua = navigator.userAgent.toLowerCase();
var makeVersion = function(result) {
return (parseInt(result[1]) * 1000) + parseInt(result[2]);
};
if (ua.indexOf("opera") != -1) {
return "opera";
} else if (ua.indexOf("webkit") != -1) {
return "safari";
} else if (ua.indexOf("msie") != -1) {
if (document.documentMode >= 8) {
return "ie8";
} else {
var result = /msie ([0-9]+)\.([0-9]+)/.exec(ua);
if (result && result.length == 3) {
var v = makeVersion(result);
if (v >= 6000) {
return "ie6";
}
}
}
} else if (ua.indexOf("gecko") != -1) {
var result = /rv:([0-9]+)\.([0-9]+)/.exec(ua);
if (result && result.length == 3) {
if (makeVersion(result) >= 1008)
return "gecko1_8";
}
return "gecko";
}
return "unknown";
]]></property-provider>
<!-- Deferred binding to optimize JRE classes based on user agent. -->
<inherits name="com.google.gwt.emul.EmulationWithUserAgent"/>
</module>
这里有一个property-provider标签,这就是提供user.agent属性的标签,
CDATA里面的代码就是js代码,通过这个js代码来判断浏览器类型
仔细看一下这段js代码:
var ua = navigator.userAgent.toLowerCase();
var makeVersion = function(result) {
return (parseInt(result[1]) * 1000) + parseInt(result[2]);
};
if (ua.indexOf("opera") != -1) {
return "opera";
} else if (ua.indexOf("webkit") != -1) {
return "safari";
} else if (ua.indexOf("msie") != -1) {
if (document.documentMode >= 8) {
return "ie8";
} else {
var result = /msie ([0-9]+)\.([0-9]+)/.exec(ua);
if (result && result.length == 3) {
var v = makeVersion(result);
if (v >= 6000) {
return "ie6";
}
}
}
} else if (ua.indexOf("gecko") != -1) {
var result = /rv:([0-9]+)\.([0-9]+)/.exec(ua);
if (result && result.length == 3) {
if (makeVersion(result) >= 1008)
return "gecko1_8";
}
return "gecko";
}
return "unknown";
navigator.userAgent.toLowerCase();
这句话就能拿到浏览器的相关信息,并把它们变成小写字母。
不同浏览器提供的内容不同,分别如下、
IE
Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0)
Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.2)
Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)
Mozilla/4.0 (compatible; MSIE 5.0; Windows NT)
其中,版本号是MSIE之后的数字。
Firefox
Mozilla/5.0 (Windows; U; Windows NT 5.2) Gecko/2008070208 Firefox/3.0.1
Mozilla/5.0 (Windows; U; Windows NT 5.1) Gecko/20070309 Firefox/2.0.0.3
Mozilla/5.0 (Windows; U; Windows NT 5.1) Gecko/20070803 Firefox/1.5.0.12
其中,版本号是Firefox之后的数字。
Opera
Opera/9.27 (Windows NT 5.2; U; zh-cn)
Opera/8.0 (Macintosh; PPC Mac OS X; U; en)
Mozilla/5.0 (Macintosh; PPC Mac OS X; U; en) Opera 8.0
其中,版本号是靠近Opera的数字。
Safari
Mozilla/5.0 (Windows; U; Windows NT 5.2) AppleWebKit/525.13 (KHTML, like Gecko) Version/3.1 Safari/525.13
Mozilla/5.0 (iPhone; U; CPU like Mac OS X) AppleWebKit/420.1 (KHTML, like Gecko) Version/3.0 Mobile/4A93 Safari/419.3
其版本号是Version之后的数字。
Chrome
Mozilla/5.0 (Windows; U; Windows NT 5.2) AppleWebKit/525.13 (KHTML, like Gecko) Chrome/0.2.149.27 Safari/525.13
其中,版本号在Chrome只后的数字。
就是对这个字符串进行判断,来得知浏览器类型,然后设置属性user.agent来告知gwt程序
分享到:
相关推荐
- **跨浏览器兼容性**:GWT生成的JavaScript代码经过精心优化,能够在主流浏览器中良好运行。 - **强大的开发工具**:GWT提供了丰富的开发工具,如开发服务器、编译器、测试工具等,简化开发流程。 - **可维护性...
GWT利用Java的强类型和丰富的库来简化Web应用的开发,同时克服了Ajax开发中的挑战,如浏览器兼容性和调试难题。 【GWT 的优势】 GWT的主要优点在于它为Java开发者提供了一个熟悉的开发环境,避免了直接编写...
- **跨平台兼容性**: GWT编译器能够将Java代码转换为浏览器兼容的JavaScript和HTML代码。 - **高性能**: 通过高效的编译器优化,GWT可以生成高性能的前端代码。 - **易于开发**: 开发者可以直接使用熟悉的Java...
1. **Java编程**:GWT允许开发者使用Java语言进行前端开发,利用Java的强大特性和丰富的库,同时避免了JavaScript的语法差异和兼容性问题。 2. **自动编译**:GWT将Java代码编译为优化过的JavaScript,这使得应用...
- **"google"**:GWT是由Google开发并维护的开源项目,与Google的其他Web服务和技术(如App Engine)有很好的兼容性。 - **"calculator"**:计算器是编程中常见的示例应用,用于演示基本的用户交互和业务逻辑实现...
GWT通过Java语言进行开发,并将Java代码编译成高效的JavaScript,使得开发者可以利用Java的强大特性和丰富的库来创建复杂的Web应用,同时避免了直接编写JavaScript的繁琐和兼容性问题。 **GWT 的核心概念** 1. **...
2. **跨浏览器支持**:GWT设计了一个架构,能够在单一代码基础上支持多种浏览器,减少了处理浏览器兼容性问题的困扰。 3. **模块系统(Module)**:GWT允许定义模块,方便组织和管理项目。 二、语言特性的支持与...
- **跨浏览器兼容性**:GWT能够自动生成针对不同浏览器优化的JavaScript代码,确保应用在各种浏览器环境下都能正常工作。 - **强大的用户界面组件库**:提供了丰富的UI组件,如Button、Label等,方便快速构建用户...
3. **跨浏览器兼容**:GWT支持多种主流浏览器,确保应用在不同平台上的一致性。 4. **开发工具**:GWT提供了一套集成开发环境(IDE)插件,如Eclipse和IntelliJ IDEA,便于调试和开发。 5. **异步通信**:GWT提供了...
4. **跨浏览器兼容**: GWT支持多种主流浏览器,包括Chrome、Firefox、Safari、Internet Explorer等,确保应用在不同平台上的一致性。 5. **异步通信**: GWT 提供了RPC (Remote Procedure Call)机制,使得客户端和...
通过GWT反射,开发者可以在客户端代码中实现类似于服务器端Java反射的功能,但需注意性能和兼容性问题。 【知识点详解】: 1. **GWT的编译过程**:GWT将Java代码转换为优化过的JavaScript,这一过程称为“交叉编译...
1. **跨浏览器兼容**:GWT编译后的代码可以在主流浏览器上运行,包括Chrome、Firefox、Safari、Internet Explorer等,无需为每个浏览器编写特定的代码。 2. **丰富的UI组件**:GWT提供了大量的UI控件,如按钮、...
9. **兼容性和性能优化**:GWT致力于跨浏览器兼容性,支持主流浏览器,同时也提供多种性能优化策略,如代码分割、延迟加载和本地化缓存等。 10. **社区和生态**:GWT拥有活跃的社区,提供了许多开源项目和插件,如...
- **跨浏览器兼容**:GWT支持多种主流浏览器,包括Chrome、Firefox、Safari和Internet Explorer。 - **自动编译和优化**:GWT的编译器会进行死代码消除、代码分割和优化,生成高效的JavaScript代码。 - **丰富的...
SmartGWT 12.0 应该保持了对旧版本的向后兼容性,同时也可能引入了对新浏览器特性的支持,如HTML5特性。此外,升级到新版本通常意味着修复了已知问题,并且增加了新的功能。 8. **开发工具支持** SmartGWT 可以与...
此外,由于GWT生成的是JavaScript代码,因此需要考虑对不同浏览器的兼容性问题。还有,Struts2的XML配置文件和GWT的代码生成方式可能会增加项目的复杂性。 在实际开发中,理解这两种框架的工作原理和交互方式至关...
8. 在基于GWT的基金管理系统中,客户端使用GWT开发,服务端采用GWT-RPC实现业务逻辑,并通过DAO层对数据库进行操作。 9.整个系统架构采用MVC模式,实现了高内聚、低耦合的特点,提高了系统的性能和可维护性。 10. ...
书中还强调了GWT在处理浏览器兼容性方面的优势。由于GWT自动生成JavaScript代码,并能智能地处理不同浏览器的差异,因此开发者无需为每个浏览器编写特定的代码,大大简化了多浏览器支持的工作量。同时,GWT还提供了...