使用 Felix 和 Struts2 开发 Web 应用

Felix 和 Struts2 开发 Web 应用 使用 Felix 和 Struts2 开发 Web 应用 采用了struts 构建web ,feilx 构建bundle 立即下载

引言

Open Service Gateway Initiative(OSGi) 是一个针对 Java 动态模块开发的规范。基于中间件的 OSGi 技术提供了一个面向服务,基于组件的开发环境,并提供标准化的方式来管理整个软件生命周期。OSGi 为那些需要长时间运行,动态更新并且对运行环境的影响尽可能小的系统提供了很好的支持。基于 OSGi 开发的系统具有复杂度低、可重用、动态部署、可持续运行、开发简单等特点。

OSGi 技术结合了上述特点的各方面来定义一个动态服务部署框架,可以进行远程管理。OSGi 技术起初只是关注于嵌入式领域,诸如机顶盒、服务网关、手机等应用环境。但是它完美地适用在任一模块化、面向组件、面向服务的项目。Eclipse V3.0 以后采用 OSGi 作为其模块化和动态化平台,设计了 Equinox 内核,使用 OSGi 技术帮助其进行类载入,大大提升了 Eclipse 的启动速度。在应用服务器上,WebSphere,Weblogic,JBOSS 等著名的服务器都支持或使用了 OSGi 技术。

Felix 是一个 Apache 旗下 OSGi 实现的开源框架,它的最终的目标是提供一个完全兼容的 OSGi 框架和标准服务的实现。Felix 当前实现了 OSGi 规范 4 的大部分内容,目前 Felix 提供的 OSGi 框架功能是非常稳定的。

采用 Spring DM 和 Jetty 等 Web 容器开发基于 OSGi 的 Web 应用的方法已经在很多书本或技术文章上提及。但是这种开发方法与传统的 Web 开发差别较大,开发人员很难转换到这种开发模式上,并且它的稳定性也没有得到充分的验证。

很多 Web 开发都采用 Struts 作为其控制层,很幸运的是,最新发布的 Struts2.1.8.1 中,加入了对 Felix OSGi 的支持,能够在传统的 Web 开发中集成 OSGi 的模块管理平台,而且开发方法没有太大的改变,开发后的应用程序仍像原先一样可以方便的部署在 Tomcat,JBoss 等容器上。

本文将通过下面的示例,详细讲述如何使用 Felix 和 Struts 开发 Web 应用。

使用 Felix 和 Struts 开发 Web 应用示例

下面讲解的示例是一个获取时间信息并在 Web 浏览器中显示的简单示例,该示例主要介绍了怎样使用 Felix 和 Struts 结合起来开发 Web 应用。该示例中有两个获取时间信息的 bundle,这两个 bundle 实现同一个接口服务,但是有不同的实现,这两个 bundle 可以在应用中动态部署。通过该示例,可以体现出基于 OSGi 开发的项目具有良好的模块化以及 OSGi 的 bundle 动态部署的能力,从而说明了 OSGi 适用于开发持续运行且需要动态更新的系统。

在这个示例中,一共包括五个工程,一个 Web Application 工程和四个 OSGi bundle 工程。Web Application 工程是用于 Web 部署。四个 OSGi bundle 中,包括一个 Web bundle,用于 Web 交互;一个 time service bundle,包含一个获取时间信息的接口服务;一个 local time service bundle,实现接口服务,用于获取本地时间信息;一个 utc time service bundle,用于获取世界标准时间(Universal Time Coordinated,UTC)信息。

本示例的结构原理如图 1 所示。在 Web Container 中注册了 Struts OSGi 的监听器,该监听器会去启动或停止 Apache Felix Host,Apache Felix Host 是 Struts OSGi Plugin 和 Felix Framework 的连接点。Felix Host 会去创建和初始化 Felix Framework,Felix Framework 负责管理系统中的其余的所有 bundle,Struts OSGi Plugin 会监听 bundle 的变化,如果发生变化的 bundle 是一个 Struts bundle, 则会去加载 Struts 的配置。


图 1. 示例结构原理图
01

建立 OSGi 的 Web 开发环境

本文示例使用的 Web 开发环境包括如下组件,部分框架可以 参考资料中下载。

  • Eclipse 3.5 for Java EE Developers
  • Sun JDK 1.6.0
  • Tomcat 6.0.24
  • Struts 2.1.8.1 (Essential Dependencies Only)
  • spring-osgi-1.1.2-with-dependencies (Only Need when adding Spring Support)

Web Application 工程的创建方式与通常的 Web 工程类似,但是需要加入 Felix 的支持和 Struts2 OSGi Plugin. Felix 是 OSGi 的平台,用于管理整个系统中的所有的 bundle,而 Struts2 OSGi Plugin 是 Struts2 和 OSGi 连接的桥梁,通过 Struts2 OSGi Plugin 将 Felix 融入到 Struts2 框架中。另外,还需要加入 Struts2 OSGi Admin bundle,这个 bundle 向管理人员提供基于 Web 的管理 OSGi 平台中的 bundle 的操作入口。同时在 web.xml 中需要加入 Struts OSGi 监听器,这样 OSGi 平台中的 bundle 发生变化时,会触发该监听器去做一些与 Struts 相关测操作,例如增加 Action 或使 Action 失效。

web.xml 中过滤器和监听器部分的配置内容如清单 1:


清单 1. web.xml 过滤器和监听器配置
				 
 <filter> 
   <filter-name>struts2-prepare</filter-name> 
 <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareFilter</filter-class> 
 </filter> 
 <filter> 
 <filter-name>struts2-execute</filter-name> 
   <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsExecuteFilter 
   </filter-class> 
 </filter> 

 <filter-mapping> 
   <filter-name>struts2-prepare</filter-name> 
   <url-pattern>/*</url-pattern> 
 </filter-mapping> 
 <filter-mapping> 
   <filter-name>struts2-execute</filter-name> 
   <url-pattern>/*</url-pattern> 
 </filter-mapping> 
 <listener> 
    <listener-class>org.apache.struts2.osgi.StrutsOsgiListener</listener-class> 
 </listener> 
 <listener> 
   <listener-class>org.apache.struts2.dispatcher.ng.listener.StrutsListener 
   </listener-class> 
 </listener> 

Web Application 工程的目录结构如图 2 所示:


图 2. Web Application 工程的目录结构
02

将 Web Application 部署到 Tomcat 上并启动 Tomcat,然后在浏览器中输入 http://localhost:8080/webapp/osgi/admin/bundles.action, (webapp 是项目部署到 Tomcat 中的名字 ) 如果看到了类似于 图 5的 bundles 列表,说明 OSGi 环境配置成功。

开发获取时间消息接口服务 bundle

消息接口服务 bundle 是提供消息服务的接口,该接口将被 Web bundle 所使用,其他 bundle 可以不同的形式实现该接口。在这里利用 eclipse 新建插件工程的功能来创建 OSGi bundle。需要特别设置 an OSGI framework 为 standard 方式,这种方式允许部署项目到标准的 OSGI 容器中。新建 OSGi 工程的向导如图 3 所示。


图 3. 新建 OSGi 工程向导图
03

在该项目中开发一个用于获取时间信息的接口,通过该接口可以获取字符串形式的时间信息。


清单 2. 获取时间服务接口代码
				 
 package com.example.time.service; 

 public interface TimeService{ 
 public String getTime(); 
 } 

需要将该 bundle中的服务包的类和接口就暴露给了其他的 bundle,其他的 bundle可以通过 import这个包来使用其中的类和接口。

开发获取本地时间消息实现服务 bundle

获取本地时间消息服务 bundle 实现了时间消息接口服务。在该 bundle 种返回的时间消息是当前时区的时间信息。因为用到了接口服务包,所以需要在 Import-Package 中加入接口服务包。


清单 3. 获取本地时间实现代码
				 
 package com.example.time.local.service; 
 import java.text.SimpleDateFormat; 
 import java.util.Calendar; 
 import java.util.Date; 
 import com.example.time.service.TimeService; 
 public class LocalTimeService implements TimeService{ 
 @Override 
 public String getTime(){ 
 Calendar calendar = Calendar.getInstance(); 
 Date date = calendar.getTime(); 
 SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
 return "The local time:" + formatter.format(date); 
    } 
 } 

OSGi bundle 中的服务要能够被其他 bundle 使用,使用将服务发布出来。在该 bundle 的 Activator 的 start() 方法中注册该服务,可以发布这个服务。当这个 bundle 启动时,将获取本地时间发布为一个服务。服务发布的代码如清单 4 所示。


清单 4. 服务发布
				 
 public void start(BundleContext context) throws Exception{ 
    context.registerService(TimeService.class.getName(), new LocalTimeService(), null); 
 } 

开发获取 UTC 时间消息实现服务 bundle

获取 UTC 时间消息实现服务同样实现了时间消息接口服务,该 bundle 主要是用于和上一个 bundle 即获取本地时间消息服务进行动态的替换,用于表现 OSGi 的动态部署的能力。


清单 5. 获取 UTC 时间服务实现
				 
 public class UTCTimeService implements TimeService { 
    @Override 
    public String getTime() { 
        Calendar calendar = Calendar.getInstance(); 
 int zoneOffset = calendar.get(Calendar.ZONE_OFFSET); 
 int dstOffset = calendar.get(Calendar.DST_OFFSET); 
 calendar.add(Calendar.MILLISECOND, -(zoneOffset + dstOffset)); 
 Date date = calendar.getTime(); 
 SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm s"); 
 return "The UTC time:" + formatter.format(date); 
    } 
 } 

开发 Web bundle

Web bundle 是系统 Web 交互的入口。在该 bundle 中需要使用时间消息接口服务 bundle 中的接口,所有需要在 MANIFEST.MF 的 Import-Package 加入时间消息接口服务包,另外,为了能够识别出该 bundle 是一个 Struts bundle, 需要将该 bundle 设置为可被 Struts2 支持 , 即在 MANIFEST.MF 中加入 Struts2-Enabled: true, 这样该 bundle 中的 struts.xml 就会被加载。最终的 MANIFEST.MF 的配置如清单 6。


清单 6. Web Bundle 的 MANIFEST.MF 配置
				 
 Manifest-Version: 1.0 
 Bundle-ManifestVersion: 2 
 Bundle-Name: com-example-time-web 
 Bundle-SymbolicName: com.example.time.web 
 Bundle-Version: 1.0.0.qualifier 
 Bundle-Vendor: keki 
 Bundle-RequiredExecutionEnvironment: JavaSE-1.6 
 Struts2-Enabled: true 
 Import-Package: com.example.time.service, 
 com.opensymphony.xwork2, 
 org.apache.struts2.osgi.interceptor, 
 org.osgi.framework;version="1.3.0"

为了实现用户交互,还需要创建一个获取时间消息响应的 action。该 Action 的 execute() 方法代码如清单 7 所示。


清单 7. Action 实现方法
				 
 public String execute(){ 
    ServiceReference ref = bundleContext.getServiceReference( 
    TimeService.class.getName()); 
    TimeService timeService = (TimeService) bundleContext.getService(ref); 
    timeMessage = timeService.getTime(); 
    return SUCCESS; 
 } 

这个 Web bundle 中独立的建立一个 struts.xml,这个 struts.xml 将会为单独加载,需要注意的是 Struts 的 pacakge 继承 osgi-default 这个包,osgi-default 已在 struts2-osgi-plugin 这个 jar 包里面定义。


清单 8. Web Bundle struts.xml 的 action 定义
				 
 <struts> 
    <package name="time-example" namespace="/time" extends="osgi-default"> 
        <action name="time" class="com.example.time.web.action.TimeAction"> 
            <result type="freemarker">time.ftl</result> 
        </action> 
    </package> 
 </struts> 

打包部署

将开发好的四个 bundle 导出成 plugin 的包,并将它们放在 Web App 工程中 ,bundles 的目录结构如图 4 所示。


图 4. Web Application 中的 bundles 目录结构
04

运行演示

启动 Tomcat,在浏览器地址栏输入 http://localhost:8080/webapp/osgi/admin/bundles.do, 可以看到所系统中所有的 bundle 的列表。


图 5. 部署的 bundles 列表
05

在浏览器地址栏输入 http://localhost:8080/webapp/time/time.do,可以获得时间信息,此时的时间信息为本地时间信息,当前 TimeService 这个服务有 local time service 和 UTC time service 两个实现,调用的是 local time service 这个实现。


图 6. 获取本地时间页面显示
06

此时,在浏览器地址栏输入 http://localhost:8080/webapp/osgi/admin/shell.do,然后输入命令 stop 1, 将 Local time service 这个 bundle 停止掉,输入命令 ps, 可以看到 local time service 这个 bundle 的 state 已经变为 Resolved.


图 7. OSGi Shell 管理页面
07

在浏览器地址栏再次输入 http://localhost:8080/webapp/time/time.do 得到的结果如图 7 所示。


图 8. 获取 UTC 时间显示页面
08

通过上面的演示,我们可以看到 OSGi bundle 的动态部署能力。

bundle 的管理

通过 Felix 可以方便的管理项目中的 bundle,并且实现 bundle 的热部署,即插即用,即删即无的特性,特别适用于可持续运行的系统。

添加 bundle

输入命令 install <bundle-url>,然后输入 start <bundle-id> 即可。如 $install file:/k:/plugins/com.example.time.local_1.0.0.qualifier.jar , $start 7

更新 bundle

输入命令 update <bundle-id> <bundle-url> 即可。如

$ update 1 file:/k:/plugins/com.example.time.local_1.0.0.qualifier.jar

启动和停止 bundle

输入命令 start <bundle-id> 启动 bundle;输入命令 stop <bundle-id> 停止 bundle。如

$ start 2 , $ stop 1

卸载 bundle

若 bundle 处于 Installed 或 Resolve 状态,则直接输入命令 uninstall <bundle-id>。若 bundle 处于 Actived 状态,则先输入命令 stop <bundle-id> 停止 bundle, 再输入命令 uninstall <bundle-id>。如 $ uninstall 1

常见问题

如何修改 bundle 的最大启动级别

在上面的示例中,bundle 中最大的启动级别只能为 3。如果在 bundles 下面增加一个目录 4,即 bundles/4,则目录 4 中的 bundle 是无法启动的,而在很多时候,特别是在大型的项目中,最大启动级别为 3 是不能满足要求,此时可以 web.xml 中添加启动级别的参数。如下面把最大启动级别设置为 5。


清单 9. 启动级别配置
				 
 <context-param> 
    <param-name>struts.osgi.runLevel</param-name> 
    <param-value>5</param-value> 
 </context-param> 

解决 Bundle 中的 struts.xml 的 Struts Configuration DTD 无法定位的问题

Struts.xml 的头部有 Struts Configuration DTD 的引用定义,一般 DTD 文档的 URL 为 http://struts.apache.org/dtds/XXX.dtd ,示例如下所示:


清单 10. struts.xml 头部 dtd
				 
 <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts 
 Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd"> 

如果无法连接上 http://struts.apache.org/,那么在加载 Struts 的 bundle 时也将会出错,因为 bundle 与 Web Application 的 lib 的加载路径不一致,无法从 Web Application 的 lib 下面找到 XXX.dtd 文件。此时可以通过修改 dtd 文件的 URL 来解决,可以改成一个本地文件系统的 URI,如 file:/c:/webapp/dtds/struts-2.0.dtd,也可以改为本地的 Web 服务器或一个可以连接上的服务器的 URL,如 http://localhost/dtds/struts-2.0.dtd。

如何使用 Spring 进行对象管理

Spring DM 使得 Spring 和 OSGi 成为可能,在本文的开发环境中,也可以加入 Spring DM 来管理系统中的对象。首先加入 Spring DM 必要的 jar 包,如


清单 11. Spring 依赖包示例
				 
 com.springsource.org.aopalliance-1.0.0.jar, 
 com.springsource.org.apache.commons.logging-1.1.1.jar, 
 spring-aop-2.5.5.jar, 
 spring-beans-2.5.5.jar, 
 spring-context-support-2.5.5.jar, 
 spring-core-2.5.5.jar, 
 spring-osgi-core-1.1.2.jar, 
 spring-osgi-extender-1.1.2.jar, 
 spring-osgi-is-1.1.2.jar, 
 spring-osgi-web-1.1.2.jar, 
 spring-osgi-web-extender-1.1.2.jar, 
 spring-web-2.5.5.jar 

然后需要在 Web Application 的 struts.xml 中加入对象工厂的配置,配置如下:


清单 12. 配置对象工厂
				 
 <constant name="struts.objectFactory" value="osgi" /> 
 <constant name="struts.objectFactory.delegate" value="springOsgi" /> 

在 Web Application 的 web.xml 加入 Spring 的监听器 , 配置如下:


清单 13. 配置 Spring 监听器
				 
 <listener> 
    <listener-class>org.springframework.web.context.ContextLoaderListener 
    </listener-class> 
 </listener> 
 <context-param> 
    <param-name>contextClass</param-name> 
    <param-value> 
  org.springframework.osgi.web.context.support.OsgiBundleXmlWebApplicationContext 
  </param-value> 
 </context-param> 
 <context-param> 
    <param-name>contextConfigLocation</param-name> 
    <param-value>osgibundle:/META-INF/spring/*.xml,/spring/*.xml </param-value> 
 </context-param> 
 <context-param> 
    <param-name>parentContextKey</param-name> 
    <param-value>parent-context-bean</param-value> 
 </context-param> 

在 OSGi bundle 中,如果需要用 Spring 来管理对象,则把 Spring 对象的配置文件放在 /META-INF/spring/ 目录下面,并以 xml 为扩展名即可。Spring 对象配置文件的写法在很多 Spring DM 的书籍或文章中都有讲解,这里不再重复。最后需要在 MANIFEST.MF 中加入如下声明用来配置 Spring 上下文和对象创建机制,create-asynchronously 的值为 true 表示可以允许异步创建对象。


清单 14. 配置 Spring 对象创建方式
				 
 Spring-Context: *;create-asynchronously:=true 

小结

本文首先对 OSGi 和 Felix 进行了简要的介绍,然后通过一个示例详细介绍了使用 Felix 和 Struts 开发 Web 应用,演示了 OSGi 的动态部署特性。随后,讲解了 OSGi bundles 管理常用的命令操作,以及在开发过程中的几个常见的问题的解决方法。


参考资料

学习

开发一个简单的 OSGi Web 应用实例 开发一个简单的 OSGi Web 应用实例,如何进行OSGI开发的 实例有利于入门着进行使用 立即下载

相关推荐

Struts2 Felix1.4搭建OSGI web infrastructure Source

Struts2 Felix1.4搭建OSGI web work infrastructure Srouces

Struts2+Flex开发

<br />首先你可以用XML来实现,这个应该来说比较普遍。 不用XML的话,也可以返回数据给FLEX。但是不用action的跳转 public String execute()throws Exception { if(action.checkUser(getName(), getPassword())) { response.getWriter().write("success"); }else { response.getWriter().

zhll3377的专栏 1676

自己开发的OSGi Web Console

1、自己开发的OSGi Web Console,适用于实现了OSGi规范的Equinox、Felix等开源框架,可在web界面上启动、停止OSGi Framework,启动、停止、装载、卸载bundles。当切换成其他OSGi开源框架时,只需在把lib下面的jar文件替换掉。 2、展示了如何把OSGi框架作为一个组件嵌入到现有的未基于OSGi开发的Web应用当中,在Web应用中可获取OSGi中的Service以增加应用的灵活性。

利用felix和struts2实现osgi web(一)

这是一篇引用的文章,原网址为:http://www.ibm.com/developerworks/cn/web/1007_shaobing_flexosgi/index.html?ca=drs-   引言 Open Service Gateway Initiative(OSGi) 是一个针对 Java 动态模块开发的规范。基于中间件的 OSGi 技术提供了一个面向服务,基于组件的开发环境,并...

沧海一粟 374

OSGI + Webservice 例子

OSGI + Webservice 例子 新手入门的例子

用InVEST做碳中和规划?手把手教你计算城市碳储量与热岛效应

本文详细介绍了如何利用InVEST模型进行城市碳中和规划的科学评估。通过手把手教学,演示了如何使用该模型的碳存储与城市热岛缓解模块,从数据准备、模型运行到结果解读,量化评估不同规划方案下的碳储量变化与热岛效应缓解潜力,为城市规划者提供科学的决策依据。

weixin_29201313的博客 822

基于felix框架的struts+springDm的web开发

struts最新本身已经支持felix1.4,但felix1.4版本本身不支持fragment,本文通过struts2.2.1和springDM1.2搭建了基于felix的OSGI的web开发。具体步骤如下: 1、建立基于struts2.2.1,springDm1.2,支持felix的osgi的web工程:    配置web.xml内容如下: &lt;?xml version="1.0" ...

gaojie1190的专栏 317

别再死记硬背了!用Wireshark抓包实战,5分钟搞懂GRE、L2TP、IPsec的区别

本文通过Wireshark抓包实战,详细解析GRE、L2TP和IPsec三大隧道协议的核心差异与应用场景。从报文结构到配置示例,帮助网络工程师快速掌握这些协议的本质,提升VPN部署与故障排查能力。特别适合准备HCIP认证的工程师深化理解。

weixin_30352645的博客 439

Flex+Struts2结合实现文件下载

前阵子由于工作的需要,在项目里写了一个用Flex+Struts2实现的文件下载功能。现在有空整理下~ 一.首先是Flex部分的代码(解释下:在点击“下载”按钮后就可以进行下载) protected function button1_clickHandler(event:MouseEvent):void { var p:URLVariables = new URLVaria

ssjjy的专栏 842

ArcMap 10.7/10.8启动加载界面后闪退?可能是这个隐藏的Normal.mxt模板文件在搞鬼

本文深入分析了ArcMap 10.7/10.8启动加载界面后闪退的问题,指出Normal.mxt模板文件损坏是常见原因。提供了从定位、删除模板文件到系统级修复的完整解决方案,帮助GIS工程师快速恢复工作流程。

weixin_28523493的博客 330

【AutoDL + Langchain-Chatchat】从零构建高效本地 RAG 知识库问答系统:实战保姆级教程(含避坑指南)

本文详细阐述如何在AutoDL云平台,如何利用Langchain-Chatchat构建高效的本地RAG知识库问答系统,并深入解析RAG架构。从环境搭建到实战部署,从问题排查到性能优化,提供一份全面实用的指南,助力开发者快速构建智能问答应用。

拾光夕拾的博客 1803

OSGI企业应用开发(十二)OSGI Web应用开发(一)

前面文章中介绍了如何在OSGI应用中整合Spring和Mybatis框架,本篇文章开始介绍如何使用OSGI技术开发Web应用。对于传统的Java EE应用,应用中涉及到的Web元素无非就是Servlet、JSP、静态资源等,其中静态资源包括HTML页面、CSS、图片等等。当然还有Portlet、Filter、Listener等,由于不太常用,本文就不涉及这方面的内容了。 ...

weixin_33755847的博客 287

python基于语音识别的智能垃圾分类系统

大家好我是蓝天,混迹在java圈的辛苦码农。今天要和大家聊的是一款《python基于语音识别的智能垃圾分类系统》毕业设计项目。项目源码以及部署相关请联系蓝天,文末附上联系信息。🎈作者:蓝天🎈🎈个人简介:精通 Java、Python、C#、C、C++ 等编程语言,同时对微信小程序、Php 和 Android 等技术也能熟练掌握,可为大家提供全面的技术支持与交流。我拥有丰富的成品 Java、Python、C# 毕业设计项目经验,能够为学生提供各类个性化的开题框架及实际运作方案。🎈。

Chujun123528的博客 660

使用 Felix 和 Struts2 开发 Web 应用(转)

转载自http://www.ibm.com/developerworks/cn/web/1007_shaobing_flexosgi/index.html?ca=drs-   这篇文章的项目会有两个问题: 1. 报错velocity......的异常,因为缺少了velocity-tools-1.3.jar  包。 2. 如果无法上网时解析struts.xml会报错,请修改src下的stru...

iteye_15412的博客 167

Tessent ATPG Flow 流程 (代码和注释)

**摘要:Tessent ATPG流程分为五个阶段:1) 环境初始化(加载设计文件、库和扫描链配置);2) DRC规则检查(验证设计可测试性并修复违例);3) ATPG向量生成(设置故障模型并运行引擎优化覆盖率);4) 向量验证与后处理(仿真验证并生成ATE格式文件);5) 进阶操作(多电压域和存储器测试)。流程输出包括测试向量、覆盖率报告和验证日志,支持stuck-at和transition故障模型,使用Tcl脚本控制。关键步骤包含扫描链配置、EDT压缩和覆盖率优化。

QQ_778132974的博客 931

在 MATLAB/Simulink 中构建一个固定地面站天线指向控制系统的完整仿真模型

在卫星通信系统中,地面站天线负责与在轨卫星建立高增益、高稳定性的通信链路。对于固定地面站(如卫星测控站、深空站、VSAT主站),天线必须具备高精度指向能力,以确保波束始终对准卫星。然而,卫星(尤其是低轨卫星)在天空中快速移动,地面站天线必须实时跟踪其轨迹。此外,环境扰动(风载、热变形、机械误差)也会导致指向偏差。因此,设计一个高精度、高鲁棒性的天线指向控制系统(Antenna Pointing Control System)至关重要。本文将手把手教你如何在中构建一个固定地面站天线指向控制系统。

amy_mhd的博客 133

利用felix和struts2实现osgi web(二)

    OSGI(Open Service Gateway Initiative)在java世界中,提供了一种从机制上进行模块划分的理念和实践,对于java的模块化生产将会产生不可估量的推动作用。     由于OSGI是从嵌入式开发中发展起来的,在Eclipse3.0以后的Equinox实现了OSGI的标准后,OSGI开发模式在java世界中开始流行起来。但是对于企业级的应用,特别是多层的企业级...

沧海一粟 203

概念解析 | 事件相机的原理 (含仿真代码)

在我们熟悉的世界里,传统相机就像一个勤勉的绘画师,每隔固定的时间就为我们勾勒出一幅完整的画面。但是,大自然中有太多瞬息万变的精彩场景,这种"定时绘画"的方式往往难以捕捉。于是,一种全新的"观察者"应运而生 -事件相机(Event Camera)。事件相机,就像是一群极其敏感的"像素哨兵",它们不再按部就班地等待指令,而是主动感知周围的变化,只有在光线强度发生显著变化时才会发出信号。这种革命性的设计,让事件相机拥有了传统相机难以企及的优势:超高的时间分辨率、极低的延迟、宽广的动态范围,以及出色的能效比。

NLOS的博客 1422

利用felix和struts2实现osgi web(三)

    在前一篇文章中,详细的描述了几个应用bundle的实现过程和其中的配置要点。下面描述一下真正的web工程,也就是将要部署到tomcat中的普遍的web工程的实现过程。     创建一个普通的web工程:webapp,配置web.xml文件支持Struts2和OSGi,Struts2中实现了一个Struts2-osgi-plugin,其中OSGi容器用的是felix,这也是为什么在这个工程...

沧海一粟 196

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

利用struts2 springdm felix实现一个web应用

  springdm是spring和osgi之间的桥梁,利用这个桥梁在osgi的bundle中,可以方便的利用spring的IOC、AOP、配置等特征来管理bundle中的对象,在Struts2的发布包中,自带了一个struts2-osgi-demo-plugin的例子工程,其中就是一个利用springdm管理osgi struts2 bundle的实现。    这个例子配置运行的步骤如下: ...

沧海一粟 145

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

Felix+Struts2搭建OSGI Web开发框架(一)

前一段时间,一直在研究OSGI,以及OSGI在Web中的运用。当提及SpringDM,需要导入的jar包太多,觉得反而复杂化了!看了一下一片文章: http://www.ibm.com/developerworks/cn/web/1007_shaobing_flexosgi/index.html?ca=drs 觉得可行,但是没有源码,根本没有tomcat、OSGI、Felix的集成概念,官方文

Bing's Home 6188

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

上一篇: 手工搭建SSH框架
下一篇: maven环境搭建
豆芽菜瓜
博客等级 码龄22年 11粉丝 1原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值