利用felix和struts2实现osgi web

利用felix和struts2实现osgi web
利用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 过滤器和监听器配置

struts2-prepare

org.apache.struts2.dispatcher.ng.filter.StrutsPrepareFilter

struts2-execute

org.apache.struts2.dispatcher.ng.filter.StrutsExecuteFilter

struts2-prepare

/*

struts2-execute

/*

org.apache.struts2.osgi.StrutsOsgiListener

org.apache.struts2.dispatcher.ng.listener.StrutsListener

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 定义

time.ftl

打包部署

将开发好的四个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 ,然后输入start 即可。如$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;输入命令stop 停止bundle。如$ start 2 , $ stop 1

卸载bundle

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

回页首

常见问题

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

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

清单9. 启动级别配置

struts.osgi.runLevel

5

解决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

Configuration 2.0//EN"

"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.web.context.ContextLoaderListener

contextClass

org.springframework.osgi.web.context.support.OsgiBundleXmlWebApplicationContext

contextConfigLocation

osgibundle:/META-INF/spring/*.xml,/spring/*.xml

parentContextKey

parent-context-bean

在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.

/strict.dtd">

2.

3.

4.

5. Untitled Document

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./time/time.ftl

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.struts2-prepare

3.org.apache.struts2.dispatcher.ng.filter.StrutsPrepareFilter

4.

5.

6.struts2-execute

7.org.apache.struts2.dispatcher.ng.filter.StrutsExecuteFilter

8.

9.

10.

11.struts2-prepare

12./*

13.

14.

15.struts2-execute

16./*

17.

18.

19.org.apache.struts2.osgi.StrutsOsgiListener

20.

21.

22.

23.org.apache.struts2.dispatcher.ng.listener.StrutsListener

>

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./a.html

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) B) C) D) 7.以文字过滤拦截器为例,简述拦截器的使用步骤。 答:1-用户提交自己的请求; 2-由web.xml拦截,转发到action进行处理; 3- Struts.xml根据相应的action配置,调用相应的方法来处理,并根据结果转发到不同的页面; 8.在同一个系统中配置多个拦截器,试说明它们的执行顺序。 答:一般来说:先配置的拦截器,会先获得执行的机会,但是实际情况不是这样。execute()方法执行之前,配置在前面的拦截器,会先对用户的请求起作用。execute()方法执行之后,配置在后面的拦截器,会先对用户的请求起作用。(两头向中间靠拢的执行)。 9.请简述struts2中输入校验的几种方式。

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 一、标签 Action标签,顾名思义,是用来调用Action的标签,在JSP中页面中,可以指向具体指定某一命名空间中的某一Action。而标签的主体用于显示及渲染Actionr的处理结果。 1.WebRoot\pages\dataTagssuccess.jsp处理页面 <%@ page contentType="text/htm l; charset=GBK" %> <%@ taglib prefix="s" uri="/struts-tags" %> Action Tag 示例

Action Tag 示例

s:action标签用于在页面显示结果.
这里使用标签进行页面跳转,并用于显示处理的结果。 2.先来看st ruts.xml中的配置: /pages/dataTags/success.jsp

Struts2的工作机制原理分析及实例

Struts2的工作机制分析及实例 一、概述 本章讲述Struts2的工作原理。 读者如果曾经学习过Struts1.x或者有过Struts1.x的开发经验,那么千万不要想当然地以为这一章可以跳过。实际上Struts1.x 与Struts2并无我们想象的血缘关系。虽然Struts2的开发小组极力保留Struts1.x的习惯,但因为Struts2的核心设计完全改变,从思想到设计到工作流程,都有了很大的不同。 Struts2是Struts社区和WebWork社区的共同成果,我们甚至可以说,Struts2是WebWork的升级版,他采用的正是WebWork 的核心,所以,Struts2并不是一个不成熟的产品,相反,构建在WebWork基础之上的Struts2是一个运行稳定、性能优异、设计成熟的WEB框架。 本章主要对Struts的源代码进行分析,因为Struts2与WebWork的关系如此密不可分,因此,读者需要下载xwork的源代码,访问https://www.360docs.net/doc/bf8984656.html,/xwork/download.action即可自行下载。 下载的Struts2源代码文件是一个名叫struts-2.1.0-src.zip的压缩包,里面的目录和文件非常多,读者可以定位到 struts-2.1.0-src\struts-2.0.10\src\core\src\main\java目录下查看Struts2的源文件,如图14所示。 (图14) 二、主要的包和类 Struts2框架的正常运行,除了占核心地位的xwork的支持以外,Struts2本身也提供了许多类,这些类被分门别类组织到不同的包中。从源代码中发现,基本上每一个Struts2类都访问了WebWork提供的功能,从而也可以看出Struts2与WebWork千丝万缕的联系。但无论如何,Struts2的核心功能比如将请求委托给哪个Action处理都是由xwork完成的,Struts2只是在WebWork 的基础上做了适当的简化、加强和封装,并少量保留Struts1.x中的习惯。

Liferay Struts2 完整实例 修正

目录 一.Liferay,ext开发环境的搭建 (1) 二.集成struts2 (3) 1.依赖包: (3) 2.使用Struts2 (3) 三.使用Hibernate. Spring (4) 1.建立bean (4) 2.建立事务层: (5) 3 .建立持久层 (8) 4. Action 中调用事务层 (10) 三.将portlet注册到portal (11) 四.加入国际化 (13) 五.加入处理页面 (13) 2010年12月20日,修改在页面上的标签找不到国际化信息。 一.Liferay,ext开发环境的搭建 1.进入myeclipse,修改liferay-portal-src-5. 2.3文件名为portal。导入portal到eclipse. 2.展开portal工程目录,我们可看到一个release.properties文件, 新建一个它的扩展配置文件, 文件名为release.${username}.properties。 ${username}是计算机当前用户名 我文件名是release.Administrator.properties,文件内容只一行:lp.ext.dir=D:\myspace\ext 即扩展工程放置路径。 3.打开myeclipse里面ant视图(window--> show view --> ant) , 在ant视图中,点击添加, 选择:\portalspace\portal\目录下build.xml 顺序执行clean ,start ,build-ext

4.将liferay-portal-tomcat-6.0- 5.2.3.zip解压到D:\portalspace\目录下,并更名为servers。 在D:\portalspace\ext目录下我们可以看到app.server.properties文件, 同样我们也要建立一个扩展配置文件app.server.${username}.properties,文件内容两行:lp.ext.dir=D:/myspace/ext app.server.type=tomcat app.server.tomcat.dir=D:/ myspace /servers/tomcat-6.0.18 5.将myspace/ext 工程导入到eclipse中。 6.打开window --> preference --> myeclipse --> application servers 将其他应用服务器 disabble掉, 找到tomcat6,将tomcat home diretory 指向D:\myspace\servers\tomcat-6.0.18, 展开tomcat6,JDK选择我们配置好的JDK1.5+, JDK选项下面optional java vm argument输入如下内容: -Xms128m -Xmx256m -XX:MaxPermSize=128m 7.建立数据库lportal 。在D:\myspace\ext\ext-impl\src\portal-ext.properties文件中添加数据 库连接信息 # MySQL jdbc.default.driverClassName=com.mysql.jdbc.Driver jdbc.default.url=jdbc:mysql://localhost:3306/lportal https://www.360docs.net/doc/bf8984656.html,ername=root jdbc.default.password=root hibernate.dialect=org.hibernate.dialect.MySQLDialect 若不添加以上内容liferay就会使用自带默认数据库. 8.选择 :\myspace\ext\目录下build.xml 顺序执行clean,deploy 将ext项目部署到 tomcat-6.0.18. 然后选择eclipse中的tomcat6.0启动即可 9.在浏览器里输入http://localhost:8080/可以看到portal系统了。输入emal: test@https://www.360docs.net/doc/bf8984656.html, password: test登录

struts2教程(完全版)

Yaio 4 一、准备工作及实例 4 1.解压struts- 2.1.6-all.zip 4 2.六个基本包 4 3.初识struts2配置文件 4 (1).web.xml文件 4 (2).struts.xml文件 4 (3).struts.properties(参default.properties) 4 (4)struts-default.xml 5 (5)其它配置文件 5 4.让MyEclipse提示xml信息 5 5.如何使用alt+/提示 5 6.实例 5 7.开启struts2自带的开发模式常量 7 8.vo传参模式 8 9.ModerDriven传参模式(不建议采用) 8 10.为什么要使用struts2代替struts1.x 9

二、struts.xml配置及例程 9 1.配置文件的优先级 9 2.配置形式 9 3.package配置相关 10 4.分工合作include:指定多个配置文件 12 5.tomcat认证访问 12 6.初识拦截器 13 7.Action中的method属性 15 8.使用ForwardAction实现页面屏蔽。 17 8.使用default-Action配置统一访问 17 小结Action 18 9.使用通配符 18 10.使用0配置:ZERO Annotation 19 11.Result配置详解 19 12.异常处理 24 三、在Action获取Scope对象 25 方式一、与Servlet解耦合的非IOC方式 25

方式二、与Servlet解耦合的IOC方式 27 方式三、与Servlet耦合的非IOC方式 27 方式四、与Servlet耦合的IOC方式 28 四、OGNL与ValueStack(VS) 29 1.值栈入门 29 2.OGNL入门 31 3.普通方法访问 31 4.静态方法访问 31 5.默认类Math的访问 32 6.调用普通类的构造方法 32 7.集合对象初步 32 8.集合对象进阶 33 9.N语法top语法 34 10.获取Stack Context中的信息 35 11.总结$ # %的区别 35 12.总结OGNL[重点] 35 五、拦截器 36

Struts2配置详解2 配置Action

配置Action Struts2的核心功能是action,对于开发人员来说,使用Struts2主要就是编写action,action类通常都要实现com.opensymphony.xwork2.Action接口,并实现该接口中的execute()方法。 该方法如下: public String execute() throws Exception Struts2并不是要求所有编写的action类都要实现Action接口,也可以直接编写一个普通的Java类作为action,只要实现一个返回类型为String的无参的public方法即可:public String xxx() 在实际开发中,action类很少直接实现Action接口,通常都是从 com.opensymphony.xwork2.ActionSupport类继承,ActionSupport实现了Action接口和其他一些可选的接口,提供了输入验证,错误信息存取,以及国际化的支持,选择从ActionSupport继承,可以简化action的定义。 开发好action之后,好需要对action进行配置,以告诉Struts2框架,针对某个URL的请求应该交由哪个action进行处理。 1.Action映射: action映射是Struts2框架中的基本”工作单元”,action映射就是将一个请求 URL(即action的名字)映射到一个action类,当一个请求匹配某个action的名字 时,框架就使用这个映射来确定如何处理请求。 action元素的完整属性表 例如: /user.jsp 2. 使用method属性 在配置action时,我们可以通过action元素的method属性来指定action调用的方法,所指定的方法,必须遵循与execute方法相同的格式。 在Struts2.xml文件中,我们可以为同一个action类配置不同的别名,并使用 method属性。 在Struts.xml文件中为同一个Action类配置不同的别名 /Methods/list.jsp

Struts2简单示例

Struts2增删改查例子 UserBean //要添加set,get public class UserBean{ private Long id; private String name; private String password; private int age; private Date birthday; private Long sex; private Set likes; private String des;//描述 } public class LikeBean{ private Long id; private String name; } FormAction public class FormAction{ //属性要生成get,set //标记(添加,修改) private String tip; private UserBean userBean; private List likeList; private List userList; //到列表页面 public String list(){ userList =new ArrayList(); userList.add(new UserBean("abc",19,new Date())); userList.add(new UserBean("def",70,new Date())); userList.add(new UserBean("ghi",40,new Date())); return"list"; } //到添加页面 public String toAdd(){ likeList =new ArrayList(); likeList.add(new LikeBean(new Long(1),"上网")); likeList.add(new LikeBean(new Long(2),"读书")); likeList.add(new LikeBean(new Long(3),"游戏")); tip ="add"; return"info";

Struts2+Hibernate架构技术教程课后参考答案

第1章Struts2框架技术入门 1.5 习题 1.5.1 选择题 1.D 2.A 3.C 4.B 5.B 1.5.2 填空题 1.MVC 2.Struts1和WebWork 3.IBM 4. FilterDispatcher 5.JSP、Struts2标签 1.5.3 简答题 1.简述MVC设计模式的工作流程。 答:MVC设计模式工作流程是: (1)用户的请求(V)提交给控制器(C); (2)控制器接受到用户请求后根据用户的具体需求,调用相应的JavaBean或者EJB(M部分)来进行处理用户的请求; (3)控制器调用M处理完数据后,根据处理结果进行下一步的调转,如跳转到另外一个页面或者其他Servlet。 2.简述Struts2的工作原理。 答:Struts2中使用拦截器来处理用户请求,从而允许用户的业务控制器Action与Servlet分离。用户请求提交后经过多个拦截器拦截后交给核心控制器FilterDispatcher处理,核心控制器读取配置文件struts.xml,根据配置文件的信息指定某一个业务控制器Action(POJO类)来处理用户数据,业务控制器调用某个业务组件进行处理,在处理的过程中可以调用其他模型组件共同完成数据的处理。Action处理完后会返回给核心控制器FilterDispatcher一个处理结果,核心控制器根据返回的处理结果读取配置文件struts.xml,根据配置文件中的配置,决定下一步跳转到哪一个页面。 一个客户请求在Struts2框架中处理的过程大概有以下几个步骤: (1)客户提交请求到服务器; (2)请求被提交到一系列的过滤器过滤后最后到FilterDispatcher; FilterDispatcher是核心控制器,是基于Struts2中MVC模式的控制器部分; (3)FilterDispatcher读取配置文件struts.xml,根据配置信息调用某个Action来处理客户请求; (4)Action执行完毕,返回执行结果,根据struts.xml的配置找到对应的返回结果。

尚学堂-马士兵Struts2教学视频之Struts2 学习笔记

Struts2 学习笔记 ---wjt276 [二○一○年一月五日完]

目录 01 Struts2-Action (5) 一、Struts作用: (5) 二、搭建Struts2的运行环境: (5) 三、Namespace (6) 四、标签 (6) 五、Action (6) 六、路径问题的说明 (8) 七、Action的动态调用方法 (8) 八、Action通配符(wildcard)的配置 (9) 九、Action的属性接收参数 (10) 1、在Action添加成员属性接受参数 (10) 2、域模型(Domain Model) (10) 3、ModelDriven接收参数 (11) 十、Action属性接收参数中文问题 (12) 十一、简单数据验证 (12) 十二、访问Web元素 (14) 一、方法一:ActionContext方式 (15) 二、方式二:Ioc(控制反转)—推荐使用 (15) 三、方式三:获取原类型 (16) 四、方式四:获取原类型-控制反转 (17) 十三、Struts2配置文件模块化包含(include) (17) 十四、默认的Action (18) 十五、Action总结 (18) 02 Struts2-Result (19) 一、Result类型 (type) (19) 二、全局结果集(Globle Result) (20) 三、动态的结果集(dynamic result) (21) 四、带参数的结果集 (21) 五、Result总结 (22) 六、项目经理: (22) 03 OGNL表达式语言 (23) 04 Struts2-Tags (28) Struts2标签目录 (28) 一、property标签 (28) 二、set标签 (29) 三、bean标签 (29) 四、标签-少使用 (29) 五、If elseif else (30) 六、Iterator标签 (31) 七、Theme (31) 05设计约定(编码规定) (32) 06 项目开发顺序 (32) 07 声明式异常处理 (33) 08 国际化 (35) 一、国际化资源文件 (35) 二、Java国际化 (35)

Struts2详细实例教程

Struts2(上) 一、经典的MVC模式 二、Struts1.x对MVC的实现 三、Struts1.x的主要组件和作用 组件作用 ActionServlet 中央控制器 Action 分控制器,调用JavaBean实现业务逻辑, Action可以分为Action、DispatchAction等不 同类型

ActionForm 封装参数,实现服务器验证,文件上传等Forward 转发到目的地,可以是JSP,也可以是另一个 Action Struts-config.xml 配置文件,配置有ActionForm,Action,Forward 等,通过XML解析,然后使用反射技术使用 该文件 Struts标签库和JSTL类似,和Struts-config.xml、 ActionForm、Action等对象可以紧密集成 四、Struts1.x 开发实例-登录程序 见案例。 五、Struts2(WebWork)的MVC Struts2的MVC架构 六、Struts2的主要组件 组件作用 FilterDispatcher 起中央控制器作用的过滤器 Action 处于Model层的Action,调用JavaBean实现 业务逻辑 struts.xml 核心配置文件,配置有Action、Result等result 和forward类似,转发的目的地,支持多种视 图技术。

七、Struts2的实例-登录 在MyEclipse环境中建立一个新的web工程,名称“Struts2Login”,存放路径“f:\Struts2Login”。 在Struts2.0.11版本中找到war包struts2-blank-2.0.11.war,解开该war包,在WEB-INF/lib 目录下复制出所有的jar包,这些jar包就是一个Struts2程序所需要的基础jar包,把它们复制到新建的web工程的WEB-INF/lib目录中。 在src目录下建立一个类,包名mypack,类名UserAction,其代码如下: package mypack; import com.opensymphony.xwork2.ActionSupport; public class UserAction extends ActionSupport { private String username; private String userpass; public String getUsername() { return username; } public void setUsername(String username) { https://www.360docs.net/doc/bf8984656.html,ername = username; } public String getUserpass() { return userpass; } public void setUserpass(String userpass) { https://www.360docs.net/doc/bf8984656.html,erpass = userpass; } @Override public String execute() throws Exception { if ("Mike".equals(username) && "123".equals(userpass) || "张三".equals(username) && "abc".equals(userpass)) return "success"; else return "error"; } } 在src目录下建立Struts2的配置文件struts.xml,内容如下:

struts2流程以及源码解析

1.1 Struts2请求处理 1. 一个请求在Struts2框架中的处理步骤: a) 客户端初始化一个指向Servlet容器的请求; b) 根据Web.xml配置,请求首先经过ActionContextCleanUp过滤器,其为可选过滤器,这个过滤器对于Struts2和其他框架的集成很有帮助(SiteMesh Plugin),主要清理当前线程的ActionContext和Dispatcher; c) 请求经过插件过滤器,如:SiteMesh、etc等过滤器; d) 请求经过核心过滤器FilterDispatcher,执行doFilter方法,在该方法中,询问ActionMapper来决定这个请求是否需要调用某个Action; e) 如果ActionMapper决定需要调用某个Action,则ActionMapper会返回一个ActionMapping实例(存储Action的配置信息),并创建ActionProxy (Action代理)对象,将请求交给代理对象继续处理; f) ActionProxy对象根据ActionMapping和Configuration Manager询问框架的配置文件,找到需要调用的Action类; g) ActionProxy对象创建时,会同时创建一个ActionInvocation的实例; h) ActionInvocation实例使用命名模式来调用,在调用Action的过程前后,涉及到相关拦截器(Intercepter)的调用;

i) 一旦Action执行完毕,ActionInvocation实例负责根据struts.xml中的配置创建并返回Result。Result通常是一个需要被表示的JSP或者FreeMarker 的模版,也可能是另外的一个Action链; j) 如果要在返回Result之前做些什么,可以实现PreResultListener接口,PreResultListener可以在Interceptor中实现,也可以在Action中实现; k) 根据Result对象信息,生成用户响应信息response,在生成响应过程中可以使用Struts2 框架中继承的标签,在此过程中仍会再次涉及到ActionMapper; 2. Struts2请求处理示意图: 1.2 Struts2请求处理源码分析

使用struts2实现登录的简单示例

使用struts2实现登录的简单示例(包括配置及数据库连接) 1.使用struts2框架前的配置: (1)新建webproject工程。如下选择。 (2)导入struts包。 在项目名下单击右键→Build Path→Add Liberaries→User Liberary→next→Add JARs(找到包的位置引入),本文取名为struts00。也可以直接将需要的包放在practise→WebRoot→WEB-INF→lib下,Myeclipse会自动生成一个Referenced Libraries。(注意:若要连接数据库一定要引入连接数据库的包) 在工程practise下新建struts.xml(从其他struts2工程中拷贝过来即可)。

所写的action要在struts2.xml中进行配置。如下配置(将以下标签放入标签中): 2.连接数据库 (1)引入连接数据库的包。位置如下: (2) DB.java封装了数据库连接的方法,以后需要连接数据库可以直接调用其方法。 3.登录 (1)登录界面first.jsp.访问此jsp地址栏中输入http://localhost:8080/practiose/first.jsp (3)LoginAction,用于业务逻辑处理。 由first.jsp中可知,表单提交到LoginAction中。 注意:1)excute()方法返回一个字符串,与struts2中标签中的name相对应,跳转到相应的jsp中。 2)validate()用于执行excute前对表单内容的验证。 用到文件abc.properties。 右键建立new file,命名要以.properties结束。 图例:

一个简单的struts2实例讲解

一个简单的struts 2实例讲解 初学SSH框架,最好的办法就是多动手,在实践中去理解框架。下面用struts 2的框架搭建一个简单的登录示例,首先是框架的搭建,然后是代码的实现及配置,虽然例子简单,但是对于理解Struts 2有很好的作用。 一.准备工作,搭建Struts 2的框架 1.新建一个Web Project,工程名为Struts2_EXA。 2.导入Struts 2框架,如果是比较新的IDE,通常有两种方法,一种通过IDE导入Struts 2框架,另一种可以到网上下载struts2的最新版本: https://www.360docs.net/doc/bf8984656.html,/download.cgi#struts20111。 下载struts2自少要保证有六个基本包: struts2-core-2.1.6.jar :开发的核心类库 freemarker-2.3.13.jar :struts2的UI标签的模板使用freemarker编写commons-logging-1.0.4.jar :日志包 ognl-2.6.11.jar :对象图导航语言,通过它来读写对象属性 xwork-2.1.2.jar :xwork类库,struts2在其上进行构建 commons-fileupload-1.2.1.jar:文件上传组件,2.1.6版本后必须加入此jar 包 这些包的文件名在后面的版本号上可能会有出入。我的IDE是 MyEclipse2014,自带有Struts 2, 可以通过右键点击新建的Web项目,“MyEclipse->Project Facets[Capabilities]->Install Apache Struts 2.x Facet”来导入struts2框架 这个例子是通过MyEclipse自动导入的,喜欢自动动手的同学可以网上下载最新的Struts 2框架,将这六个组件包复制到W eb工程下的WEB-INF/lib 目录中,这些组件其实就是编译好的类文件。 3、接下来就是配置struts.xml文件。这个文件就好像起着一个过滤器的作用,用户发来的请求要经过该文件的过滤,根据用户请求

struts2源代码分析(个人觉得非常经典)

本章讲述Struts2的工作原理。 读者如果曾经学习过Struts1.x或者有过Struts1.x的开发经验,那么千万不要想当然地以为这一章可以跳过。实际上Struts1.x与Struts2并无我们想象的血缘关系。虽然Struts2的开发小组极力保留S truts1.x的习惯,但因为Struts2的核心设计完全改变,从思想到设计到工作流程,都有了很大的不同。 Struts2是Struts社区和WebWork社区的共同成果,我们甚至可以说,Struts2是WebWork的升级版,他采用的正是WebWork的核心,所以,Struts2并不是一个不成熟的产品,相反,构建在We bWork基础之上的Struts2是一个运行稳定、性能优异、设计成熟的WEB框架。 本章主要对Struts的源代码进行分析,因为Struts2与WebWork的关系如此密不可分,因此,读者需要下载xwork的源代码,访问https://www.360docs.net/doc/bf8984656.html,/xwork/download.action即可自行下载。 下载的Struts2源代码文件是一个名叫struts-2.1.0-src.zip的压缩包,里面的目录和文件非常多,读者可以定位到struts-2.1.0-src"struts-2.0.10"src"core"src"main"java目录下查看Struts2的源文件,如图14所示。 (图14) 主要的包和类 Struts2框架的正常运行,除了占核心地位的xwork的支持以外,Struts2本身也提供了许多类,这些类被分门别类组织到不同的包中。从源代码中发现,基本上每一个Struts2类都访问了WebWork提供的功能,从而也可以看出Struts2与WebWork千丝万缕的联系。但无论如何,Struts2的核心功能比如将请求委托给哪个Action处理都是由xwork完成的,Struts2只是在WebWork的基础上做了适当的简化、加强和封装,并少量保留Struts1.x中的习惯。 以下是对各包的简要说明: 包名说明

struts2工作流程详解

工作流程 一个请求在Struts2框架中的处理大概分为以下几个步骤: 1 客户端初始化一个指向Servlet容器(例如Tomcat)的请求; 2 这个请求经过一系列的过滤器(Filter)(这些过滤器中有一个叫做ActionContextCleanUp的可选过滤器,这个过滤器对于Struts2和其他框架的集成很有帮助,例如:SiteMesh Plugin) 3 接着FilterDispatcher被调用,FilterDispatcher询问ActionMapper来决定这个请是否需要调用某个Action 4 如果ActionMapper决定需要调用某个Action,FilterDispatcher把请求的处理交给ActionProxy 5 ActionProxy通过Configuration Manager询问框架的配置文件,找到需要调用的Action类 6 ActionProxy创建一个ActionInvocation的实例。 和"struts2工作流程" 有关的java编程小帖士: strong>Locale.setNegativeNumberMode方法的参数。 字段 7 ActionInvocation实例使用命名模式来调用,在调用Action的过程前后,涉及到相关拦截器(Intercepter)的调用。 8 一旦Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果。返回结果通常是(但不总是,也可能是另外的一个Action 链)一个需要被表示的JSP或者FreeMarker的模版。在表示的过程中可以使用Struts2 框架中继承的标签。在这个过程中需要涉及到ActionMapper 在上述过程中所有的对象(Action,Results,Interceptors,等)都是通过ObjectFactory来创建的。 Struts2的目标很简单--使Web开发变得更加容易。为了达成这一目标,Struts2 中提供了很多新特性,比如智能的默认设置、annotation的使用以及"惯例重于配置"原则的应用,而这一切都大大减少了XML配置。Struts2中的Action都是POJO,这一方面增强了Action本身的可测试性,另一方面也减小了框架内部的耦合度,而HTML表单中的输入项都被转换成了恰当的类型以供action使用。开发人员还可以通过拦截器(可以自定义拦截器或者使用Struts2提供的拦截器)来对请求进行预处理和后处理,这样一来,处理请求就变得更加模块化,从而进一步减小耦合度。模块化是一个通用的主题--可以通过插件机制来对框架进行扩展;开发人员可以使用自定义的实现来替换掉框架的关键类,从而获得框架本身所不具备的功能;可以用标签来渲染多种主题(包括自定义的主题);Action执行完毕以后,可以有多种结果类型--包括渲染JSP页面,Velocity和Freemarker 模板,但并不仅限于这些。最后,依赖注入也成了Struts2王国中的一等公民,这项功能是通过Spring框架的插件和Plexus共同提供的,与PicoContainer的结合工作还正在进行中

相关主题
相关文档
最新文档