Struts核心技术简介
Struts核心技术简介
1、Struts内部机制
Struts是一种基于MVC经典设计模式的开发源代码的应用框架,它通过把Servlet、JSP、JavaBean、自定义标签和信息资源整合到一个统一的框架中,为Web开发提供具有高可配置性的MVC开发模式。
Struts体系结构实现了MVC设计模式的概念,它将Model、View、和Controller分别映射到Web应用组件中。Controller负责控制流程,由ActionServlet负责读取struts-config.xml,并使用ActionMapping来查找对应的Action;Model由系统状态Bean ActionForm和商业逻辑的JavaBean来构建;View是由JSP和Struts提供的自定义标签来实现的,具体如下图一所示:

图一:Struts的MVC结构图
2、Struts工作流程
Struts的工作流程主要涉及到以下七个类:ActionServlet、ActionMapping、RequestProcessor、Action、ActionForm、ActionForward、ActionErrors。以下简要说明以下各自的作用:
(1)ActionServlet是Struts的核心控制器,一个系统中只需要一个。我们可以通过继承该类来扩展一个新的Servlet,但通常我们直接使用默认的ActionServlet,只需要在web.xml文件中配置ActionServlet的相关属性即可;
(2)ActionMapping是struts-config.xml文件中配置元素的实例对象,该类与struts-config.xml文件中的元素和属性相匹配。由于struts-config.xml文件中的元素类型已经由Struts设计者定义完成了,因此类ActionMapping也是仅有的一个通用类,不再需要开发人员开发;
(3)RequestProcessor是ActionServlet的代处理类,与ActionServlet相似,通常我们只需要使用默认的类即可,如果要扩展新的功能,只需要实现一个继承该类的新的处理类即可;
(4)Action是struts-config.xml文件中<action>元素对应的处理类,该配置文件中可以配置指向多个Action处理类,不同的业务需要不同的Action类。因此Action是我们自己开发,新开发的类需要继承Action基类;
(5)ActionForm Bean是struts-config.xml文件中配置的<from-bean>元素对应的类,表示不同的出来表单。由于不同的HTML处理表单包含的表单元素不同,因此也需要开发多个ActionForm类;
(6)ActionForward用于根据struts-config.xml文件中action的配置进行页面转换,与ActionMapping类似,它是一个通用的类,也不需要开发;
(7)ActionErrors是对错误信息的包装,一旦在执行action或者form.validate中出现异常,即可产生一个ActionErrors并最终加入到ActionErrors。在Form验证的过程中,如果有Error发生,则会将页面重新导向至输入页,并提升错误。
下面请看Struts的工作流程图,如图二所示:

图二:Struts工作流程图
3、Struts配置文件详解
Struts配置文件——struts-config.xml文件是一个简单的框架,<struts-config>是struts的根元素,其主要有8个子元素:
(1)配置数据源:<data-sources>元素
(2)配置ActionForm:<form-beans>元素
(3)配置全局异常处理:<global-exceptions>元素
(4)配置全局跳转:<global-fowards>元素
(5)配置映射关系:<action-mappings>元素
(6)配置RequestProcessor插件:<controller>元素
(7)配置国际化资源文件:<message-resources>元素
(8)配置Plug-in插件:<plug-in>元素
下面请看一个struts-config.xml文件示例代码:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN" "http://struts.apache.org/dtds/struts-config_1_2.dtd"> <struts-config>
<!-- 配置数据源 -->
<data-sources>
<data-source type="org.apache.commons.dbcp.BasicDataSource">
<set-property property="driverClassName"
value="com.mysql.jdbc.Driver" />
<set-property property="url"
value="jdbc:mysql://localhost:3306/demo" />
<set-property property="username" value="root" />
<set-property property="password" value="" />
<set-property property="maxActive" value="10" />
<set-property property="maxWait" value="5000" />
<set-property property="defaultAutoCommit" value="false" />
<set-property property="defaultReadOnly" value="false" />
<set-property property="validationQuery"
value="SELECT COUNT(*) FROM user" />
</data-source>
</data-sources> <!-- 配置ActionForm -->
<form-beans>
<form-bean name="loginForm"
type="com.demo.struts.forms.LoginForm">
</form-bean>
<form-bean name="registerForm"
type="com.demo.struts.forms.RegisterForm">
</form-bean>
</form-beans> <!-- 配置全局异常处理 -->
<global-exceptions />
<global-forwards>
<forward name="welcome" path="/welcome.do" />
<forward name="login" path="/login.do" />
</global-forwards> <!-- 配置映射关系 -->
<action-mappings>
<action path="/index" forward="/login.jsp" />
<action path="/welcome" forward="/welcome.jsp" />
<action path="/menu1" forward="/menu1.jsp" />
<action path="/menu2" forward="/menu2.jsp" />
<action path="/menu3" forward="/menu3.jsp" />
<action path="/menu4" forward="/menu4.jsp" />
<action path="/menu5" forward="/menu5.jsp" />
<action path="/menu6" forward="/menu6.jsp" />
<action path="/menu7" forward="/menu7.jsp" />
<action path="/menu8" forward="/menu8.jsp" /> <action path="/login" name="loginForm" scope="request"
type="com.demo.struts.actions.LoginAction" input="/login.jsp">
<forward name="success" path="/welcome.jsp" />
<forward name="failure" path="/login.jsp" />
</action> <action path="/logout"
type="com.demo.struts.actions.LogoutAction">
<forward name="logout" path="/login.jsp" />
</action> <action path="/register" parameter="method" name="registerForm"
scope="request" type="com.demo.struts.actions.RegisterAction"
input="/register.jsp"> <!-- 配置局部跳转 -->
<forward name="success" path="/login.jsp" />
<forward name="failure" path="/register.jsp" />
</action> </action-mappings> <!-- 配置国际化资源文件 -->
<message-resources parameter="com.demo.struts.resources.ApplicationResources" /> </struts-config>
4、ActionForm Bean的开发技术
ActionForm可以继承三个类:org.apache.struts.action.ActionForm类、org.apache.struts.action.DynaActionForm类、org.apache.struts.action.DynaValidatorForm类。下面分别简要说明一下这三种类似ActionForm的开发:
(1)使用默认表单ActionForm
ActionForm表示HTTP窗体中的数据,可以将其看做是模型和视图的中介,它负责保存视图中的数据,供模型或者视图使用。Struts文档中把它比作HTTP和Action之间的防火墙,这体现了ActionForm所具有的过滤与保护的作用,只有通过ActionForm验证的数据才能够发送到Action处理。
(2) 使用动态表单DynaActionForm
当多个模块共用一个ActionForm时,这样重复使用会造成复用性很差,而且难以维护。针对这个问题,在Struts中提出了DynaActionForm的概念。
DynaActionForm的目的就是减少ActionForm的数目,利用它可以不用创建一个个具体的ActionForm类,而是在配置文件中配置出所需的虚拟ActionForm。
(3)使用自动校检表单DynaValidatorForm
DynaValidatorForm能够提供动态的ActionForm和自动表单输入验证的功能。但是,使用DynaValidatorForm需要在配置文件中进行配置,也需要在struts-config.xml文件中定义验证的插件,在改插件中定义具体功能的验证代码。
5、Action组件开发技术
开发Action组件,需要继承默认的Action类。Struts提供了6个内置的Action类,这些类继承自普通Action类,并有各自的功能实现,具体如下:
org.apache.struts.actions.Action;
org.apache.struts.actions.ForwardAction;
org.apache.struts.actions.IncludeAction;
org.apache.struts.actions.DispatchAction;
org.apache.struts.actions.LookupDispatchAction;
org.apache.struts.actions.SwitchAction。
(1)使用默认的Action
通过继承Action类来实现具体的执行类,具体Action类的功能一般都在execute()方法中完成。
(2)可直接转发的ForwardAction
有时我们想要从一个页面或资源转换到另一个资源,通常我们会使用JSP页面的直接转换来进行处理,但这样处理会使得控制器没有机会处理该转换请求。因此,我们可以通过使用ForwardAction来完成转换这个任务。
(3)可包含文件的IncludeAction
有时我们会需要引入一个页面或者资源,在这样的情况下就可以使用IncludeAction。
(4)可自动分发的DispatchAction
通常,如果继承默认的Action类,只能完成一种业务操作。如果要完成一组业务操作,例如对用户进行更新、删除、插入操作,则需要建立多个操作类,分别来接受相应。通过使用DispatchAction可以将这些类合并,并把相同的部分提出来,然后在该类中每一个实现的功能对应不同的方法,即可完成目的。
(5)可进行多个提交的LookupDispatchAction
LookupDispatchAction最大的特点是可以在一个表单中轻松实现多个Submit按钮,通常LookupDispatchAction主要应用在一个表单中有多个“提交”按钮,而这些按钮又有一个共同的名字的场合,这些按钮的名字和具体的ActionMapping的parameter属性相对应。这样情况下,可以根据JSP文件中设置的标签名,在Action类中设置与相应标签名对应的函数来编写相应的功能代码。
(6)可实现交换的SwitchAction
SwitchAction用于从一个模块转换至另一个模块。
Struts核心技术简介的更多相关文章
- Struts2核心技术简介
Struts2核心技术简介 使用Struts2框架,只要注重以下三大元素:配置文件.映射文件和Action: 全局属性文件struts.properties:保存系统运行的一些参数变量,整个系统只有一 ...
- Hibernate核心技术简介
Hibernate核心技术简介 1.Hibernate映射文件开发 Hibernate映射文件就是项目中*.hbm.xml文件,其主要是完成各元素的配置,包括根元素.类元素.定义主键.设置主键 ...
- Struts 2简介
Struts 2简介 Struts 2 编辑 同义词 Struts2一般指Struts 2 Struts2是一个基于MVC设计模式的Web应用框架,它本质上相当于一个servlet,在MVC设计模式中 ...
- 关于Struts框架简介
一,什么是框架? 所谓框架就是提供了一组统一的接口和编程方式的可以重用组件,同时我们可以在框架中扩充我们自己的特定逻辑. 二,MVC设计模式 将应用程序分为3个部分:模型 Model,视图View,控 ...
- 【docker】docker基础原理,核心技术简介
关于docker的核心技术,就是以下的三大技术: 1.namespaces [命名空间] 使用linux的命名空间实现的进程间隔离.Docker 容器内部的任意进程都对宿主机器的进程一无所知. 除了进 ...
- Spring+Struts+Hibernate 简介(转)
http://blog.csdn.net/slnqnd/article/details/1772910/ Struts2.0 +Hibernate 3.2 +Spring 2.0 一. ...
- Struts 2 Learning
目录 . J2EE简介 . JAVA EE应用的分层模型 . 搭建Struts2 Demo应用 . struts2流程 . struts2的常规配置 . 实现Action . 配置Action . 配 ...
- Struts(十三):通用标签
Struts标签简介: Struts2标签库提供了主题.模板支持,极大地简化了视图页面的编写,而且,struts2的主题.模板都提供了很好的扩展性,实现了更好的代码复用.Struts2允许在页面中使用 ...
- 【JAVA EE企业级开发四步走完全攻略】
本文是J2EE企业级开发四步走完全攻略索引,因内容比较广泛,涉及整个JAVA EE开发相关知识,这是一个长期的计划,单个发blog比较零散,所以整理此索引,决定以后每发一季JAVA EE blog后会 ...
随机推荐
- Spring 3.0 AOP (一)AOP 术语
关于AOP.之前我已写过一个系列的随笔: <自己实现简单的AOP>,它的关注点在于实现.实现语言是C#,实现方式为 自定义实现 RealProxy 抽象类.重写Invoke方法,以便进行方 ...
- # ASP.NET Core依赖注入解读&使用Autofac替代实现
标签: 依赖注入 Autofac ASPNETCore ASP.NET Core依赖注入解读&使用Autofac替代实现 1. 前言 2. ASP.NET Core 中的DI方式 3. Aut ...
- jquery easyui菜单树显示
目前做了一个easyui项目需要显示多级菜单,菜单配置到数据库中,因此每级菜单都需要到数据库中取,用了jQuery EasyUI方便多了. 效果体验:http://hovertree.com/texi ...
- PetaPoco4.0 实体某个字段不赋值会更新成null解决方案
最新用PetaPoco4.0做项目发现有个需求,就是比如说:在mvc表单中,只显示部分字段,一个表单还有其他状态等字段,没有显示到mvc页面上 但是当MVC收集表单提交更新的时候,会发现会把数据库中的 ...
- ReSharper.8.0.14.856注册码
ReSharper.8.0.14.856注册码 用户名:ronle 注册码:ZoJzmeVBoAv9Sskw76emgksMMFiLn4NM 网络转载
- c# asp.net4.0尚未在web服务器上注册
辗转无数论坛,感谢http://bbs.csdn.net/topics/390992746 microsoft官方文档: https://blogs.msdn.microsoft.com/webdev ...
- 简要分析webpack打包后代码
开门见山 1.打包单一模块 webpack.config.js module.exports = { entry:"./chunk1.js", output: { path: __ ...
- 3D Banner(jQuery)
1.这是用面向对象的思想去动态生成banner的简易流程,用到一个javaScript框架jQuer: 2.将代码黏贴成html文件,直接用浏览器打开即可: 3.layer属于弹窗提示类插件,可能需要 ...
- SharePoint 2013 状态机工作流之扩展自定义状态
当我们使用SharePoint 2013的状态机工作流时,发现一个非常不爽的事情,就是SharePoint 所有的工作流状态,都是固定的那些,没办法显示我们自定义的状态,后来经过Google发现,原来 ...
- 【转】自定义UITableViewCell(registerNib: 与 registerClass: 的区别)
自定义UITableViewCell大致有两类方法: 使用nib 1.xib中指定cell的Class为自定义cell类型(注意不是设置File's Owner的class) 2.调用 tableVi ...