当前位置: 首页 > 编程日记 > 正文

浅析Struts 体系结构与工作原理(图)

   Struts 体系结构是目前基于java的 web系统设计中广泛使用的mvc构架。
基本概念
  
  Struts是Apache 基金会Jakarta 项目组的一个Open Source 项目,它采用模型-视图-控制器(Model-View- Controller,简称MVC)模式,能够很好地帮助java 开发者利用J2EE开发Web应用。和其他的java架构一样,Struts 也是面向对象设计,将MVC模式"分离显示逻辑和业务逻辑"的能力发挥得淋漓尽致。Structs 框架的核心是一个弹性的控制层,基于如 Java Servlets,JavaBeans,ResourceBundles与XML等标准技术,以及 Jakarta Commons 的一些类库。Struts有一组相互协作的类(组件)、Serlvet以及jsp tag lib组成。基于struts构架的web应用程序基本上符合JSP Model2的设计标准,可以说是一个传统 MVC设计模式的一种变化类型。
  
  Struts有其自己的控制器(Controller),同时整合了其他的一些技术去实现模型层(Model)和视图层(View)。在模型层,Struts可以很容易的与数据访问技术相结合,如 JDBC / EJB ,以及其它第三方类库,如 Hibernate / iBATIS ,或者 Object Relational Bridge(对象关系桥)。在视图层,Struts能够与JSP,包括 JSTL 与 JSF,以及 Velocity 模板,XSLT 与其它表示层技术。
  
  Struts 为每个专业的 Web 应用程序做背后的支撑,帮助为你的应用创建一个扩展的开发环境。
Struts的体系结构与工作原理
  
  MVC即Model-View-Controller的缩写,是一种常用的设计模式。MVC 减弱了业务逻辑接口和数据接口之间的耦合,以及让视图层更富于变化。MVC的工作原理,如下图1所示:

图1


  Struts 是MVC的一种实现,它将 Servlet和 JSP 标记(属于 J2EE 规范)用作实现的一部分。Struts继承了MVC的各项特性,并根据J2EE的特点,做了相应的变化与扩展。Struts的体系结构与工作原理如下图2所示:

图2


  从图2中我们可以知道,Struts的体系结构包括模型(Model),视图(View)和控制器(Controller)三部分。
  
  下面让我们从MVC角度来看看struts的体系结构(Model 2)与工作原理:
  
  1)模型(Model)
  
  在Struts的体系结构中,模型分为两个部分:系统的内部状态和可以改变状态的操作(事务逻辑)。内部状态通常由一组Actinform Bean表示。根据设计或应用程序复杂度的不同,这些Bean可以是自包含的并具有持续的状态,或只在需要时才获得数据(从某个数据库)。大型应用程序通常在方法内部封装事务逻辑(操作),这些方法可以被拥有状态信息的bean调用。比如购物车bean,它拥有用户购买商品的信息,可能还有checkOut()方法用来检查用户的信用卡,并向仓库发定货信息。 小型程序中,操作可能会被内嵌在Action类,它是struts框架中控制器角色的一部分。当逻辑简单时这个方法很适合。 建议用户将事务逻辑(要做什么)与Action类所扮演的角色(决定做什么)分开。
  
  2)视图(View)
  
  视图主要由JSP建立,struts包含扩展自定义标签库(TagLib),可以简化创建完全国际化用户界面的过程。目前的标签库包括:Bean Tags、HTML tags、Logic Tags、Nested Tags 以及Template Tags等。
  
  3)控制器(Controller)
  
  在struts中,基本的控制器组件是ActionServlet类中的实例servelt,实际使用的servlet在配置文件中由一组映射(由ActionMapping类进行描述)进行定义。对于业务逻辑的操作则主要由Action、ActionMapping、ActionForward这几个组件协调完成的,其中Action扮演了真正的业务逻辑的实现者,ActionMapping与ActionForward则指定了不同业务逻辑或流程的运行方向。struts-config.xml 文件配置控制器。
  
  Struts体系结构中的组件

图3


  上图3显示了 ActionServlet (Controller)、Actionform (form State) 和 Action (Model Wrapper) 之间的最简关系。
  体系结构中所使用的组件如下表:
  ActionServlet  控制器
  ActionClass   包含事务逻辑
  Actionform   显示模块数据
  ActionMapping  帮助控制器将请求映射到操作
  ActionForward  用来指示操作转移的对象
  ActionError   用来存储和回收错误
  Struts标记库  可以减轻开发显示层次的工作
.NET中如何使用Struts的设想
1)模型(Model)
  
   这里写业务层。

  2)视图(View)
  
  视图当然指的是.apsx文件。
  
  3)控制器(Controller)
这里是一个转向控制器,由xml配置完成,就像真正的struts一样。

这里提的是一个简化的,精炼struts思想的.net版本使用方法。

例子如下:

一个用户注册系统,用户通过网页输入相关信息:注册ID号,密码,EMAIL,若注册成功,则返回成功提示信息,反之出现注册失败提示信息。

注册页面:reguser.aspx

配置文件:  Struts-config.xml:
  <Struts-config>
  
  <forward name="failure" path="/ messageFailure.aspx"/>
  
  <forward name="success" path="/ messageSuccess.aspx"/>

</Struts-config>

核心代码:

如果,注册成功,转向“success”,而“success”是什么页面由配置文件决定;这样就分离了view(界面层)和Controller(控制层),有业务层(Model)由控制层来访问,这样界面层就可以专心于其美工设计。也许你会说这只不过是个页面导航。

关于页面导航,我认为那将是今后的一个发展方向,事实上,这样做,使系统的脉络更加清晰。通过一个配置文件,即可把握整个系统各部分之间的联系,这对于后期的维护有着莫大的好处。尤其是当另一批开发者接手这个项目时,这种优势体现得更加明显。


转载于:https://www.cnblogs.com/hainange/archive/2007/06/18/6153386.html

相关文章:

2015第22周一Web性能测试工具及IE扩展区别

在高性能web测试工具推荐http://www.jb51.net/article/23034.htm中发现了dynaTrace 感觉很不错&#xff0c;不但可以检测资源加载瀑布图&#xff0c;而且还能监控页面呈现时间&#xff0c;CPU花销&#xff0c;JS分析和执行时间&#xff0c;CSS解析时间的等。http://www.ibm.com…

一种注册表沙箱的思路、实现——研究Reactos中注册表函数的实现1

因为我们沙箱注入了一个DLL到了目标进程&#xff0c;并且Hook了一系列NtXX(NtOpenKey)函数&#xff0c;所以我们在注入的代码中是不能使用RegXX(RegOpenKey等)这类函数的。因为RegXX系列函数在底层使用了NtXX系列函数&#xff0c;如果在注入DLL执行Hook后的逻辑中使用了RegXX系…

面试大厂背怼!这都搞不定,你只能做“搬运工”!

每一个面试过大厂的程序员似乎总会有种种困境&#xff1a;毕业季参加大厂校招面试&#xff0c;我本以为做过一些真实项目就不错了&#xff0c;没想到根本没问什么项目&#xff0c;都是基础知识&#xff0c;数学、算法&#xff0c;然而平时只喜欢学程序设计。小公司工作3年&…

net程序架构开发

< DOCTYPE html PUBLIC -WCDTD XHTML StrictEN httpwwwworgTRxhtmlDTDxhtml-strictdtd> 程序架构,功能的划分: 数据库(包括存储过程) 数据访问(包括Microsoft Application Blocks for .NET的2.0版) 数据结构(等价于强类型DataSet) 业务逻辑层 业务表现层 数据库:不用说…

Java面向对象学习笔记 -- 6(内部类、Timer)

1. 内部类内部类就是在一个类的内部定义的类&#xff0c;有&#xff1a;静态内部类、成员内部类&#xff0c;局部内部类、匿名内部类。-1) 静态内部类&#xff1a;使用static修饰&#xff0c;声明在类体中&#xff0c; 静态内部类中可以访问外部类的静态成员&#xff0c;开发很…

30年间,软件开发行业为何Bug纷飞?

作者 | Chris Fox译者 | 弯月&#xff0c;责编 | 屠敏出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09;【导语】在时间的推移历程中&#xff0c;软件行业早已发生了天翻地覆的变化。和曾经大家习以为常的编码日常相比&#xff0c;越多越多的开发者发现&#xff0c;如…

去掉字符串两端的全角空格和半角空格(含源代码)

昨天&#xff0c;遇到了一个技术问题。本来我在程序中用的trim()方法来处理从JSP页面传来的值,后来在测试时&#xff0c;发现当我输入的是全角空格时&#xff0c;trim()方法失效。需求是这样的&#xff0c;只是去掉字符串两端的空格&#xff08;不论是全角空格还是半角空格&…

一种注册表沙箱的思路、实现——研究Reactos中注册表函数的实现2

上一篇博文中主要介绍了Reactos中大部分函数的思路和HKEY和HANDLE之间的关系&#xff0c;本文将介绍一些Reactos中有意思的函数和存在bug的函数。&#xff08;转载请指明出处&#xff09;CreateNestedKey是一个辅助创建键的函数&#xff0c;比如我们要创建\Regsitry\User\3\2\1…

云计算安全解决方案白皮书(一)

云计算安全解决方案白皮书Jack zhai研究云的安全有两三年了&#xff0c;但形成完整的安全思路&#xff0c;还是去年的事&#xff0c;这也是“流安全”思路形成的主要阶段。云计算的安全问题之所以突出&#xff0c;是因为虚拟机的动态迁移&#xff0c;以及多业务系统交织在一起&…

一种注册表沙箱的思路、实现——研究Reactos中注册表函数的实现3

这篇我们看一个”容错“”节省“的实例。一下是一个Win32API的声明&#xff08;转载请指明出处&#xff09; LONG WINAPI RegEnumKeyEx(__in HKEY hKey,__in DWORD dwIndex,__out LPTSTR lpName,__inout LPDWORD lpcName,__reserved LPDWORD lp…

腾讯Angel升级:加入图算法,支持十亿节点、千亿边规模!中国首个毕业于Linux AI基金会的开源项目...

出品 | AI科技大本营&#xff08;ID&#xff1a;rgznai100&#xff09;【导语】Angel 是腾讯的首个AI开源项目&#xff0c;于 2016 年底推出、2017年开源。近日&#xff0c;快速发展的 Angel 完成了从 2.0 版本到 3.0 版本的跨越&#xff0c;从一个单纯的模型训练系统进化成包…

如何在JSP页面中获取当前系统时间转

出自&#xff1a;http://hi.baidu.com/itfuck_/item/803662469cdf7baa61d7b945 1: import java.util.*; int y,m,d,h,mm; Calendar c Calendar.getInstance(); y c.get(Calendar.YEAR); //年 m c.get(Calendar.MONTH) 1; //月 d c.get(Calendar.DAY_OF_MONTH); //日 …

如何用Python实现超级玛丽的界面和状态机?

作者 | marble_xu编辑 | 郭芮来源 | CSDN博客小时候的经典游戏&#xff0c;代码参考了github上的项目Mario-Level-1&#xff08;https://github.com/justinmeister/Mario-Level-1&#xff09;&#xff0c;使用pygame来实现&#xff0c;从中学习到了横版过关游戏实现中的一些处理…

一种注册表沙箱的思路、实现——研究Reactos中注册表函数的实现4

今天为了KPI&#xff0c;搞了一天的PPT&#xff0c;搞得恶心想吐。最后还是回到这儿&#xff0c;这儿才是我的净土&#xff0c;可以写写我的研究。 这儿讲一些Reactos中一些明显的错误。&#xff08;转载请指明出处&#xff09; 在Reactos的RegQueryInfoKeyW中有段这样的实现 i…

Netscaler 认证,访问报http 5000 内部错误

在VDI项目中&#xff0c;Netscaler经常与AD不在同一网络&#xff0c;有时在icaprofile中写的SF或WI的FQDN&#xff0c;访问VDI&#xff0c;会报http 5000 内部错误&#xff1b;解决办法如下&#xff1a;1.NS无法解析Storefont或WI的主机名&#xff0c;需要修改icaprofile 中SF或…

解读 | 2019年10篇计算机视觉精选论文(中)

导读&#xff1a;2019 年转眼已经接近尾声&#xff0c;我们看到&#xff0c;这一年计算机视觉&#xff08;CV&#xff09;领域又诞生了大量出色的论文&#xff0c;提出了许多新颖的架构和方法&#xff0c;进一步提高了视觉系统的感知和生成能力。因此&#xff0c;我们精选了 20…

PE文件和COFF文件格式分析--概述

刚工作的时候&#xff0c;我听说某某大牛在做病毒分析时&#xff0c;只是用notepad打开病毒文件&#xff0c;就能大致猜到病毒的工作原理。当时我是佩服的很啊&#xff0c;同时我也在心中埋下了一个种子&#xff1a;我也得有这天。随着后来的工作进行&#xff0c;一些任务的和这…

2015第22周六Java反射、泛型、容器简介

Java的反射非常强大&#xff0c;传递class&#xff0c; 可以动态的生成该类、取得这个类的所有信息&#xff0c;包括里面的属性、方法以及构造函数等&#xff0c;甚至可以取得其父类或父接口里面的内容。 obj.getClass().getDeclaredMethods();//取得obj类中自己定义的方法&…

中服公司企业信息化的ERP系统选择

中服公司企业信息化的ERP系统选择一、 中服公司概况 1. 组织概况 中服公司创建于1950年9月&#xff0c;是国家120家企业集团试点单位之一&#xff0c;主要经营各类纺织原料、半成品、服装、针棉毛织品以及其他商品的进出口业务&#xff0c;同时通过合资、联营等方…

PE文件和COFF文件格式分析--MS-DOS 2.0兼容Exe文件段

MS 2.0节是PE文件格式中第一个“节”。其大致结构如下&#xff1a;&#xff08;转载请指明来源于breaksoftware的csdn博客&#xff09; 在VC\PlatformSDK\Include\WinNT.h文件中有对MS-DOS 2.0兼容EXE文件头的完整定义 typedef struct _IMAGE_DOS_HEADER { // DOS .EXE h…

时间可以是二维的?基于二维时间图的视频内容片段检测 | AAAI 2020

作者 | 彭厚文、傅建龙来源 | 微软研究院AI头条&#xff08;ID: MSRAsia&#xff09;编者按&#xff1a;当时间从一维走向二维&#xff0c;时序信息处理问题中一种全新的建模思路由此产生。根据这种新思路及其产生的二维时间图概念&#xff0c;微软亚洲研究院提出一种新的解决时…

《燃烧的岁月》

温含着优美的文句中&#xff0c;字里行间&#xff0c;透过一层薄薄的纸&#xff0c;牵挂起往事如烟&#xff0c;曾经的努力和成长&#xff0c;透过那以视频同时走过的路&#xff0c;默默无闻&#xff0c;牵挂着的是一句句唯美的文笔&#xff0c;留下情感的诗句文笔&#xff0c;…

PE文件和COFF文件格式分析——签名、COFF文件头和可选文件头1

本文将讨论PE文件中非常重要的一部分信息。&#xff08;转载请指明来源于breakSoftware的CSDN博客&#xff09; 首先说一下VC中对应的数据结构。“签名、COFF文件头和可选文件头”这三部分信息组合在一起是一个叫IMAGE_NT_HEADERS的结构体。 typedef struct _IMAGE_NT_HEADERS6…

遇到bug心寒了?用Enter键即可解决!

本文图片来自网络做程序员难不难&#xff1f;很难&#xff01;做个程序员压力大不大&#xff1f;超级大&#xff01;&#xff01;测试bug时&#xff08;图片来自网络&#xff09;当找到Bug&#xff0c;开始修改的你……&#xff08;图片来自网络&#xff09;那怎么办&#xff1…

8月第1周安全回顾 0Day漏洞成企业最大威胁 应重视网络监听

文章同时发表在&#xff1a;[url]http://netsecurity.51cto.com/art/200708/52822.htm[/url]本周&#xff08;0730至0805&#xff09;安全方面值得关注的新闻集中在安全管理、安全威胁和安全产品方面。安全管理&#xff1a;0Day漏洞***成为企业信息安全的最大威胁新闻&#xff…

最大匹配、最小顶点覆盖、最大独立集、最小路径覆盖(转)

在讲述这两个算法之前&#xff0c;首先有几个概念需要明白&#xff1a; 二分图: 二分图又称二部图&#xff0c;是图论中的一种特殊模型。设G(V,E)是一个无向图&#xff0c;如果顶点V可以分割为两个互不相交的子集(A,B),并且图中的每条边(i,j)所关联的两个顶点i和j分别属于这两个…

一种在注入进程中使用WTL创建无焦点不在任务栏出现“吸附”窗口的方法和思路

最近一直在做沙箱项目&#xff0c;在项目快接近结尾的时候&#xff0c;我想给在我们沙箱中运行的程序界面打上一个标记——标识其在我们沙箱中运行的。我大致想法是&#xff1a;在被注入程序的顶层窗口上方显示一个“标题性”窗口&#xff0c;顶层窗口外框外显示一个“异形”的…

转:ASP.NET状态保存方法

ASP.NET状态保存分为客户端保存和服务器端保存两种&#xff1a;使用客户端选项存储页信息而不使用服务器资源的这些选项往往具有最低的安全性但具有最快 的服务器性能&#xff0c;因为对服务器资源的要求是适度的。但是&#xff0c;由于必须将信息发送到客户端来进行存储&#…

时至今日,NLP怎么还这么难!

作者 | 刘知远在微博和知乎上关注自然语言处理&#xff08;NLP&#xff09;技术的朋友&#xff0c;应该都对#NLP太难了#、#自然语言理解太难了#两个话题标签不陌生&#xff0c;其下汇集了各种不仅难煞计算机、甚至让人也发懵的费解句子或歧义引起的笑话。然而&#xff0c;这些例…

Quartz定时任务学习(四)调度器

org.quartz.Scheduler 类层次 作为一个 Quartz 用户&#xff0c;你要与实现了 org.quartz.Scheduler 接口的类交互。在你调用它的任何 API 之前&#xff0c;你需要知道如何创建一个 Scheduler 的实例。取而代之的是用了某个工厂方法来确保了构造出 Sheduler 实例并正确的得到初…