利用felix和struts2实现osgi web
利用felix和struts2实现osgi web——实例讲解
文章分类:Java编程
系列文章请参看文章列表:
https://www.360docs.net/doc/bf8984656.html,/category/128853
系列文章一:
使用Felix 和Struts2 开发Web 应用
原文地址:
https://www.360docs.net/doc/bf8984656.html,/developerworks/cn/web/1007_shaobing_flexosgi/index.html?ca=drs
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 应用。
下面讲解的示例是一个获取时间信息并在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. 示例结构原理图
建立 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 过滤器和监听器配置
Web Application 工程的目录结构如图2 所示:
图 2. Web Application 工程的目录结构
将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 工程向导图
在该项目中开发一个用于获取时间信息的接口,通过该接口可以获取字符串形式的时间信息。
清单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(https://www.360docs.net/doc/bf8984656.html,LISECOND, -(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 定义
打包部署
将开发好的四个bundle 导出成plugin 的包,并将它们放在Web App 工程中,bundles 的目录结构如图4 所示。
图4. Web Application 中的bundles 目录结构
运行演示
启动Tomcat,在浏览器地址栏输入http://localhost:8080/webapp/osgi/admin/bundles.do, 可以看到所系统中所有的bundle 的列表。
图5. 部署的bundles 列表
在浏览器地址栏输入http://localhost:8080/webapp/time/time.do,可以获得时间信息,此时的时间信息为本地时间信息,当前TimeService 这个服务有local time service 和UTC time service 两个实现,调用的是local time service 这个实现。
图6. 获取本地时间页面显示
此时,在浏览器地址栏输入http://localhost:8080/webapp/osgi/admin/shell.do,然后输入命令stop 1, 将Local time service 这个bundle 停止掉,输入命令ps, 可以看到local time service 这个bundle 的state 已经变为Resolved.
图7. OSGi Shell 管理页面
在浏览器地址栏再次输入http://localhost:8080/webapp/time/time.do 得到的结果如图7 所示。
图8. 获取UTC 时间显示页面
通过上面的演示,我们可以看到OSGi bundle 的动态部署能力。
回页首
bundle 的管理
通过Felix 可以方便的管理项目中的bundle,并且实现bundle 的热部署,即插即用,即删即无的特性,特别适用于可持续运行的系统。
添加bundle
输入命令install
file:/k:/plugins/com.example.time.local_1.0.0.qualifier.jar , $start 7
更新bundle
输入命令update
$ update 1 file:/k:/plugins/com.example.time.local_1.0.0.qualifier.jar
启动和停止bundle
输入命令start
卸载bundle
若bundle 处于Installed 或Resolve 状态,则直接输入命令uninstall
回页首
常见问题
如何修改bundle 的最大启动级别
在上面的示例中,bundle 中最大的启动级别只能为3。如果在bundles 下面增加一个目录4,即bundles/4,则目录4 中的bundle 是无法启动的,而在很多时候,特别是在大型的项目中,最大启动级别为3 是不能满足要求,此时可以web.xml 中添加启动级别的参数。如下面把最大启动级别设置为5。
清单9. 启动级别配置
解决Bundle 中的struts.xml 的Struts Configuration DTD 无法定位的问题
Struts.xml 的头部有Struts Configuration DTD 的引用定义,一般DTD 文档的URL 为https://www.360docs.net/doc/bf8984656.html,/dtds/XXX.dtd ,示例如下所示:
清单10. struts.xml 头部dtd
"https://www.360docs.net/doc/bf8984656.html,/dtds/struts-2.0.dtd">
如果无法连接上https://www.360docs.net/doc/bf8984656.html,/,那么在加载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 依赖包示例
https://www.360docs.net/doc/bf8984656.html,.aopalliance-1.0.0.jar,
https://www.360docs.net/doc/bf8984656.html,mons.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. 配置对象工厂
在Web Application 的web.xml 加入Spring 的监听器, 配置如下:
清单13. 配置Spring 监听器
org.springframework.osgi.web.context.support.OsgiBundleXmlWebApplicationContext
在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 联盟和技术规范:了解更多和OSGi 相关的内容和动向。
?查看Apache Felix 官方网站:在这里您可以下载到最新版本的Felix 库,并找到相关的开发文档。
?查看Equinox 项目官方网站:您可以从这里了解到Equinox 项目的一些详情,例如实现方法、文档等。
?下载Struts2 2.1.8.1,获得最新的Structs 2 的代码包。
?查看Spring DM,获得最新的Spring Dynamic Modules for OSGi 代码包。
?developerWorks Web development 专区:通过专门关于Web 技术的文章和教程,扩展您在网站开发方面的技能。
?developerWorks Ajax 资源中心:这是有关Ajax 编程模型信息的一站式中心,包括很多文档、教程、论坛、blog、wiki 和新闻。任何Ajax 的新信息都能在这里找到。
?developerWorks Web 2.0 资源中心,这是有关Web 2.0 相关信息的一站式中心,包括大量Web 2.0 技术文章、教程、下载和相关技术资源。您还可以通过Web 2.0 新手入门栏目,迅速了解Web 2.0 的相关概念。
系列文章二:
Felix+Struts2完整应用开发过程梳理
OSGI(Open Service Gateway Initiative)在java世界中,提供了一种从机制上进行模块划分的理念和实践,对于java的模块化生产将会产生不可估量的推动作用。
由于OSGI是从嵌入式开发中发展起来的,在Eclipse3.0以后的Equinox实现了OSGI的标准后,OSGI开发模式在java世界中开始流行起来。但是对于企业级的应用,特别是多层的企业级应用,现在流行的OSGi实现Equinox、Felix都提供了实现的方式,在Application Server
中嵌入OSGI的运行环境,从而实现Server端的OSGI。在OSGI框架中,推荐的方式是利用应用服务器的OSGI实现,在统一的OSGI模式下,进行WEB应用的部署,但是,任何的技术应用都不是孤立存在和从零开始的,大量的传统应用的融合和继承,注定了第一种模式的生命力。
文章《使用Felix 和Struts2 开发Web 应用》中详细的介绍了利用Felix框架,开发Struts2应用的过程,美中不足的是,原文没有提供真正的实现工程,在依照这一过程实现中,出现了很多意想不到的情况。
下面把我实现一个完整的应用的过程进行梳理:
1、建立接口插件工程:利用Eclipse的标准过程进行,只是在生成工程的过程中,选用OSGI的Standard模式,填入工程名为:com.example.time,在其中生成一个将来用于交互的接口。
发布出来的接口的代码如下,只是一个示例性的例子,获得一个时间字符串。
Java代码
1.package com.example.time.service;
2.
3.public interface TimeService{
4. public String getTime();
5. }
在MANIFEST.MF文件中,把包com.example.time.service发布出去,供其他插件应用。
2、生成提供local和utc时间服务的插件。
时间服务提供插件生成插件的过程和生成接口插件过程相同,插件分别命名为com.example.time.local和com.example.time.utc,在其中实现的过程如下:
2.1 插件向外提供服务的方式
OSGI的插件有两种向外部提供服务的方式,一是通过导出包,如上面的接口插件工程,就是导出了一个包。二是通过提供服务的方式,在插件中发布出提供的服务,供其它插件消费。在OSGI中,第二种方式是被鼓励应用的,因为这样对于实现系统热插拔具有很大的帮助。在本实验中,时间服务就是利用第二种方式提供的。
2.2 com.example.time.local
在插件中导入com.example.time.service包,然后TimeService的代码如下:
Java代码
1.package com.example.time.local.service;
2.
3.import java.text.SimpleDateFormat;
4.import java.util.Calendar;
5.import java.util.Date;
6.import com.example.time.service.TimeService;
7.
8.public class LocalTimeService implements TimeService {
9. @Override
10. public String getTime() {
11. Calendar calendar = Calendar.getInstance();
12. Date date = calendar.getTime();
13. SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
14. return "The local time:" + formatter.format(date);
15. }
16.}
获得了本地的时间,并转换为String的格式,向外提供。
在插件中,发布服务的方式有多种,可以再代码中发布,也可以通过声明发布,还可以通过springdm管理发布,由于本例中非常简单,就选有了,利用代码发布的方式,在activator 的Start方法中,发布服务:
Java代码
1.public void start(BundleContext context) throws Exception {
2. context.registerService(TimeService.class.getName(), new LocalTimeService(), null);
3.}
2.3 com.example.time.utc
utc服务发布插件的实现过程和local服务发布的插件实现过程相同,utc时间的服务类为:
Java代码
1.package com.example.time.utc.service;
2.
3.import java.text.SimpleDateFormat;
4.import java.util.Calendar;
5.import java.util.Date;
6.
7.import com.example.time.service.TimeService;
8.
9.public class UTCTimeService implements TimeService {
10. @Override
11. public String getTime() {
12. Calendar calendar = Calendar.getInstance();
13. int zoneOffset = calendar.get(Calendar.ZONE_OFFSET);
14. int dstOffset = calendar.get(Calendar.DST_OFFSET);
15. calendar.add(https://www.360docs.net/doc/bf8984656.html,LISECOND, -(zoneOffset + dstOffset));
16. Date date = calendar.getTime();
17. SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm s");
18. return "The UTC time:" + formatter.format(date);
19. }
20.}
3、web bundle
通过上面的三个bundle,实现了对于local和utc时间服务的发布,下面就要在web bundle 中,对上面服务的服务进行应用了,为了在web bundle中支持struts2,需要在web bundle 的MANIFEST.MF文件中,进行以下的设置:
Manifest代码
1.Manifest-Version: 1.0
2.Bundle-ManifestVersion: 2
3.Bundle-Name: Web
4.Bundle-SymbolicName: com.example.time.web
5.Bundle-Version: 1.0.0.qualifier
6.Bundle-Vendor: EXAMPLE
7.Bundle-RequiredExecutionEnvironment: JavaSE-1.6
8.Private-Package: time,.
9.Struts2-Enabled: true
10.Import-Package: com.example.time.service,
11. com.opensymphony.xwork2,
12. org.apache.struts2.osgi.interceptor,
13. org.osgi.framework;version="1.3.0"
14.Export-Package: com.example.time.web.action
其中Struts2-Enable设置为true,Private-Package设置web中页面的放置位置。
在bundle中,实现一个Action,从ActionSupport继承,实现BundleContextAware接口。
BunndleContextAware中定义了一个函数:setBundleContext,在其中Action可以获得bundle 的Context,从而访问其他bundle服务出来的服务:
Java代码
1.package com.example.time.web.action;
2.
3.import org.apache.struts2.osgi.interceptor.BundleContextAware;
4.import org.osgi.framework.BundleContext;
5.import org.osgi.framework.ServiceReference;
6.
7.import com.example.time.service.TimeService;
8.import com.opensymphony.xwork2.ActionSupport;
9.
10.
11.public class TimeAction extends ActionSupport implements BundleContextAware{
12.
13.
14. private String jsonText = "json text";
15. private BundleContext bundleContext;
16. private String timeMessage;
17.
18. public String execute(){
19. ServiceReference ref = bundleContext.getServiceReference(
20. TimeService.class.getName());
21. TimeService timeService = (TimeService) bundleContext.getService(ref);
22. timeMessage = timeService.getTime();
23. return SUCCESS;
24.
25. }
26. public String getJsonText() {
27. return jsonText;
28. }
29. public void setJsonText(String jsonText) {
30. this.jsonText = jsonText;
31. }
32.
33. public String getTimeMessage() {
34. return timeMessage;
35. }
36. public void setTimeMessage(String timeMessage) {
37. this.timeMessage = timeMessage;
38. }
39. public void setBundleContext(BundleContext arg0) {
40. // TODO Auto-generated method stub
41. this.bundleContext = arg0;
42. }
43.
44.}
为了应用ActionSupport和BundleContextAware,需要导入相应的包,在Eclipse默认的OSGi 环境中,是没有plugin提供这两个包的,需要在OSGi的Target Platform中,设置这些bundle。在Target Platform中加入OSGI需要的包,在windows->Preferrences出现对话框,选择Plugin development中的Target Platform,默认情况下只有${eclipse-home}目录,为了应用struts2,在其中加入Struts2的lib目录,则Struts2自带的bundle就可以在工程中应用了。
在time目录下定义freemarker文件time.ftl:
Freemarker代码
1.
2.
3.
4.
5.
6.
7.
8.
Hello world,Bundle test.${timeMessage}
9.
10.
最后进行struts文件的定义:
Xml代码
1.
2.
3.
4. "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
5. "file:D:/software/struts-2.2.1/src/core/src/main/resources/struts-2.0.dtd">
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
就完成web bundle了。
系列文章三
普遍的web工程的实现过程
在前一篇文章中,详细的描述了几个应用bundle的实现过程和其中的配置要点。下面描述一下真正的web工程,也就是将要部署到tomcat中的普遍的web工程的实现过程。
创建一个普通的web工程:webapp,配置web.xml文件支持Struts2和OSGi,Struts2中
实现了一个Struts2-osgi-plugin,其中OSGi容器用的是felix,这也是为什么在这个工程中osgi 实现选用felix的原因。
Xml代码
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
>
24.
实现web工程的struts.xml配置文件,其中最关键的是两个常量的设置,否则,在系统启动是,会报找不到bundle中struts.xml配置文件的错:
Xml代码
1.
2.
3.
4. "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
5. "file:D:/software/struts-2.2.1/src/core/src/main/resources/struts-2.0.dtd">
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
然后建立系列文章一中的bundle文件结构,把文章二中生成的四个bundle,放到相应的目录下,进行部署,即可。
Struts2框架工作原理及应用体会
2012年第11卷第6期 产业与科技论坛2012.(11).6 Industrial &Science Tribune Struts2框架工作原理及应用体会 □宋 君 张家爱 【摘要】通过针对特定用户的分析,搭建以Struts2为技术核心的旅行社管理系统。本文简单的介绍了MVC 、 Struts2的工作原理,同时总结了在项目制作过程中所得到的心得。 【关键词】 Struts2;MVC ;FilterDispatcher ;Action 【基金项目】本文为大学生科技创新院级基金项目(编号:2011070)成果 【作者单位】宋君,吉林农业科技学院信息工程学院;张家爱,吉林农业科技学院信息工程学院教师 本着锻炼自我与积极参与到实用性技术的目标,以发掘自身创新意识为前提。利用空闲时间,在老师的指导下,进行了一次大学生创新项目的实践性活动。本着实用原则,以某中小旅行社为客户(根据用户需求,匿名),以Struts2框架为基点,进行了一次旅行社管理系统的开发。在项目结束之余, 特将在项目过程中经历的种种认识进行了简单的总结,希望让阅读本文的朋友们,更多的参与到此类活动中。 一、基础思想— ——MVC 简述作为时下经典框架之一, MVC 具有其独特的价值。MVC 框架简单的说,就是将数据模型与用户视图进行分离。通过控制器进行协调处理的一种结构是框架。同时,也是本文中要讨论的Sturts2框架的基础思想。 M 是指模型层(Model ),V 是指用户视图(View ),C 则是指控制器 (Controller )。这种划分方式是以将模型层与视图层进行代码分离,从而降低两者之间的耦合性,使同一程序可以使用不同形式进行表现。不同层之间的修改不会或尽量少的印象到其他层功能的史前为前提。有效的提高的代码的维护性和设计难度。 图1 二、 Struts2工作原理(一)Struts2框架组成。Struts2框架由三个主要部分组成:核心控制器、业务控制器,以及由用户实现的业务逻辑组件。这里我们将侧重于核心控制器与业务控制器的理解与说明。 (二)核心控制器:FilterDispatcher 。FilterDispatcher 是Struts2框架的核心控制器,在此,我们可以将FilterDispatcher 看作一个类似于过滤网的过滤器。当用户发出请求,并到达Web 硬哟那种时,该过滤器会过滤用户请求。如果用户请求的结尾为action ,则将该请求转入Struts2框架进行处理。当Struts2框架获得了*.actio 请求后,会根据请求前面“*”的那部分内容,决定调用哪个业务逻辑组件作为响应单位。这里需要说明的是Struts2用来处理用户请求的Action 实例并不是业务控制器,而是作为Action 的代理———正因为Struts2的一大特点,与Servlet API 的非耦合性,使得用户实现的业务控制器无法直接处理用户请求。有效的提高了后期调试维护的效率。而Struts2框架再次提供了了一系列的拦截器。这些拦截器负责将HttpServletRequest 请求的参数解析出来,传入Action 中,并毁掉Action 的Execute 方法来处理用户请求。用户实现的Action 类仅作为Struts2的Action 代理的代理目标。用户实现的业务控制器则包含了对用户请求的处理。用户的请求数据包含在HttpServletRequest 对象中,而用户的Action 类无需访问HttpServletRequest 对象。拦截器负责将HttpServletRequest 里的请求数据解析出来,并传给业务逻辑组件Action 实例。 (三)业务控制器。业务控制器就是前文提到的用来实现用户Action 的实力,这里的每个Action 类通常包含有一个execute 方法,当业务控制器处理完用户的请求后,该方法将会针对此次处理返回一个字符串— ——该字符串就是一个逻辑树图名。当程序开发人员开发出系统所需要的业务控制器后,还需要针对性的配置Struts2的Action ,即需要配置Ac- tion 的以下三个部分:(1)Action 所处理的URl 。(2)Action 组件所对应的实现类。(3)Action 里包含的逻辑试图和物理资源之间的对应关系。每个Action 都要处理一个用户请求,而用户请求则总是包含有指定的URL 。当核心控制器过滤用户请求,并调用后,根据请求的URL 和Action 处理URL 之间的对应关系来处理转发。 · 342·
Struts2练习题说课讲解
Struts 2作业 1.简述什么是MVC? 答:MVC 的全称为model-view-controller(模型-视图-控制器)。MVC 是一种开发应用程序的模式,这个模式已经具有了很好的框架架构,并且十分容易维护。使用MVC 开发出来的应用程序一般包括以下几块内容:·控制器(Controller):控制器类处理客户端向Web 应用程序发出的请求,获取数据,并指定返回给客户端,用来显示处理结果的视图。·模型(Model):模型类代表了应用程序的数据,这些数据通常具有一个数据验证逻辑,用来使得这些数据必须符合业务逻辑。·视图(View):视图类是Web 应用程序中用来生成并显示HTML 格式的服务器端对客户端请求的响应结果的模板文件 2.Struts 2以(WebWork)为核心,采用(拦截器)的机制来处理用户的 请求。 3.简述一个请求在Struts 2框架中的处理流程,请按自己对框架的理解叙述。答:1-用户提交自己的请求;2-由web.xml拦截,转发到action进行处理;3- Struts.xml根据相应的action配置,调用相应的方法来处理,并根据结果转发到不同的页面。 4.不属于Action接口中定义的字符串常量是( B )? A)SUCCESS B)FAILURE C)ERROR D)INPUT 5.资源文件的后缀名为(D)? A)txt B)doc C)property D)properties 6.在JSP页面中可以通过Struts 2提供的(D)标签来输出国际化信息。 A)
struts2标签使用实例
Struts2中数据标签使用示例 S truts2提供了大量丰富的标签供使用,它不再像S truts1中一样,将种类标签进行分门列别,但可以根据其使用的用途用以区别。本文通过对S truts2中数据标签的学习,来对S truts2中标签的学习起到一个抛砖引玉的作用。 文中将介绍Action标签、Bean标签、Data标签、Include标签、P aram标签、Set标签、T ext标签、P roperty 标签等标签。 代码下载:https://www.360docs.net/doc/bf8984656.html,/y1ps2Mjpc3NiLKuetMOpCsZOOypD6KSdo8-46Zy2wpoMcABeo4vOC NJXtWDEO93-TXgZogwAF YxSOni5BEG2EoN65OFwHdG71v-/St ruts2DataTags.rar?download 一、