STruts是开源软件。使用Struts的目的是为了帮助我们减少在运用MVC设计模型来开发Web应用的时间。如果我们想混合使用Servlets和JSP的优点来建立可扩展的应用,struts是一个不错的选择。
1 Struts框架应用模式
1)建立在MVC这种公认的好的模式上的,struts在M,V,C上都有涉及,但它主要是提供一个好的控制器和一套定制的标签库,也就是说它的着力点在C和V上,有mvc的一系列有点,如:结构层次分明,高可重用性,增加了程序的健壮性和可伸缩性,便于开发与设计分工,提供集中统一的权限控制、校验、国际化、日志等。
2)开源项目,并且经受了实战的检验,使其功能越来越强大,体系也日渐完善。
3)与其他技术和框架具有很好的融合性
4)提高了开发速度
Struts其实是一个MVC设计模式的J2EE表现。它通过把一组相互协作的类(组件)、Java Servlet以及JSP tag lib结合在一个统一的框架内(其中ActionServlet处理客户请求),利用配置的ActionMapping对象把请求映射到Action处理器对象进行处理。Action处理对象访问ActionForm中的数据,处理和响应客户请求,调用后台封装了具体业务逻辑的Bean组件。Action处理器对象根据处理结果通知Controller,由Controller进行下一步的处理。Struts的体系结构如图1 所示。
下面通过图1所示的体系结构图分析Struts框架的Web应用模式。
(1)模型部分。在Struts中,模型(Model)由一系列的JavaBean和EJB组件构成,用来设计和实现系统的业务逻辑。根据不同的请求从Action派生具体Action处理对象。使用“做什么”的任务来调用由Bean构成的业务组件。创建由ActionForm的派生类实现对客户端表单数据的封装。
(2)控制器部分。Struts中的Controller 主要是其自身提供的ActionServlet,而ActionServlet 的就是struts-config.xml配置文件,它包含了所有页面导航的定义。ActionServlet 接受请求并根据配置文件中的定义将控制转移到适当的Action 类。其余的控制逻辑以及对Model的访问由Action类负责完成。
(3)视图部分。Struts中的View主要由JSP技术实现,并利用自定义的标记库方便地和系统的Model部分交互。这些自定义标记创建的JSP表单,可以实现和Model部分中的ActionForm的映射,完成对用户数据的封装,同时这些自定义标记还提供了很多定制页面的功能。
2 STRUTS框架扩展Web服务模型
2.1 MVC模型特征的Web服务体系结构
通常有二种基于J2EE实现Web服务的方式:一种是把Servlet作为Web服务端点进行开发;另一种是公开无状态EJB组件作为Web服务端点进行开发。相比较而言,把EJB作为Web服务端点进行开发具有明显的优势。
通过无状态 EJB 组件把各种服务和业务流程公开为 Web 服务的SOA框架如图2所示。图中所示的Web服务的体系结构是一种典型的MVC model2的框架。
客户端(Client):用户通过 Web 浏览器与不同的应用程序交互。
应用程序控制器(Application controller):对应于Struts框架中的Controller部分,提供主控制器 servlet。它负责初始化、委派请求和响应请求处理程序。
请求处理程序(Request processor)、请求执行程序(Request handlers)和业务定位程序(Business locators):这三部分功能的组合对应于Struts框架中的Action部分。其中请求处理程序调用相应的请求执行程序完成要求的处理,对请求进行预处理。请求执行程序依靠业务定位程序发现相应的服务,完成具体的请求活动。业务定位程序负责隐藏查找服务的复杂性,并提供缓存逻辑。
会话 Facades(Session Facades)和EJB Web 服务(EJB Web services):对应于Struts框架中的ActionForm部分,通过聚合来自多个系统或服务的方法简化复杂对象的视图。会话 facades是EJB Web服务方法的包装器。根据 EJB 1.4规范,Web服务端点可以模型化为无状态的会话 Bean。
2.2 Struts框架扩展Web服务
Web服务(Web Service)是基于XML和HTTPS的一种服务,其通信协议主要基于SOAP,服务的描述通过WSDL,通过UDDI来发现和获得服务的元数据。研究一下当前的应用程序开发,你会发现一个的倾向:人们开始偏爱基于浏览器的瘦客户应用程序。这当然不是因为瘦客户能够提供更好的用户界面,而是因为它能够避免花在桌面应用程序发布上的高成本。发布桌面应用程序成本很高,一半是因为应用程序安装和配置的问题,另一半是因为客户和服务器之间通信的问题。
许多商用程序还面临另一个问题,那就是与其他程序的互操作性。如果所有的应用程序都是使用COM或.NET语言写的,并且都运行在Windows平台上,那就天下太平了。然而,事实上大多数商业数据仍然在大型主机上以非关系文件(VSAM)的形式存放,并由COBOL语言编写的大型机程序访问。而且,目前还有很多商用程序继续在使用C++、Java、Visual Basic和其他各种各样的语言编写。现在,除了简单的程序之外,所有的应用程序都需要与运行在其他异构平台上的应用程序集成并进行数据交换。这样的任务通常都是由特殊的方法,如文件传输和分析,消息队列,还有仅适用于某些情况的的API,如IBM的"程序到程序交流(APPC)"等来完成的。
在用扩展构建得比较好的Struts应用程序支持 Web服务的时候,可以利用Web服务体系结构的MVC模式特性在Struts框架的相应部分进行修改和扩充,从而在不改变原有应用架构和具体实现的基础上方便有效地使应用程序具有Web服务的功能。
本模型通过将Web服务的控制流程包装成相应的Action类——WSAction类,为企业应用提供Web服务和定购Web服务。在Struts框架中,根据不同的请求从Action派生具体Action处理对象,完成“做什么”的任务来调用由Bean构成的业务组件。在扩展Web服务的框架中,Servlet根据客户端的请求是Web服务的请求而调用相应的WSAction,派生具体的Action处理对象。完成“做什么”的任务调用模型服务部分,模型服务组件聚集相关的预定义数据访问对象,然后将它传回给 ActionServlet 或者 WSAction 类。所有的错误或者确认信息都会通知给 ActionServlet 或 WSAction。
Struts框架的Web服务结构如图3所示。
WSAction类主要包括以下功能函数调用:
(1)请求参数的预处理。请求所包含的参数形式有 Java 对象、Java原始参数、XML文档或者SOAP文档分片(例如SOAP Element对象)。这些类型必须转化成内部所支持的schema(例如预定义的Java数据访问对象)。
(2)身份验证和授权使用。为了保护公开的Web服务,需要对所有订购者执行身份验证。所有想使用Web服务的客户都要经过这样的身份验证逻辑。可以使用基本用户身份验证或者数字证书来实现此目的。
(3)错误处理。错误都是在WSAction类中处理的,减少了服务器端的开销。在向外提供Web服务时,WSAction抛出诸如SOAPFaultException这样的异常,检查新来的请求并且抛出诸如缺少强制字段的异常。在订阅Web服务时,WSAction捕捉到由服务供应者所抛出的所有SOAP异常并且将它们更改为WSAction所要求的格式。Trace类用来记录这些异常。
(4)Web服务缓存。当服务的请求信息主要是只读数据或者所请求信息比所要求的更新速率变化得还要慢时,WSAction调用缓存服务,这样可避免不必要的数据库访问。
下面的程序给出了一个简单的WSAction实现。
public WSActionForward perform(
ActionMapping mapping,
ActionForm form,
XmlServletRequest request,
XmlServletResponse response)
throws IOException,ServletException {
//对XML请求进行预处理
WSPreTreatment
Pretreat=new(WSPreTreatment);
Pretreat.treat(request);
//抽取所需的属性和参数
WsForm wsForm=(WsForm) form;
String parameter=wsForm.getParm( );
WSActionErrors
errors=new WSActionErrors( );
//进行服务
WSAuthentication
Auth=new WSAuthentication( );
If Auth.check(parameter)=″ok″
//调用model service..
try {
business.db.processaction(parameter);
//服务结果缓存
WSCaching
Caching=new WSCaching( );
Caching.Add( );
} catch (Exception e) {
//将错误回显给用户
errors.add(″Web services″,new WSActionError(″db error″));
}
//将控制权转交给Action.xml中指定的′Next′ URI
return(mapping.findForward(″Next″));
}
3 结束语
通过分析开源的MVC Model2开发框架Struts,把分布式应用的一种新的形式——Web服务引入现有的、构建得较好的Struts框架的Web应用中。通过对比Struts框架和Web服务在体系结构上共有的MVC模式发现:集成的关键是在控制层和模型层之间信息的传递和衔接。因此,添加了Struts中的Action类WsAciton,取得了较好的效果,方便地实现了扩展Web服务。
免责声明: 凡注明来源本网的所有作品,均为本网合法拥有版权或有权使用的作品,欢迎转载,注明出处。非本网作品均来自互联网,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。