Struts核心技术简介

摘要:
Struts核心技术简介1、Struts内部机制Struts是一种基于MVC经典设计模式的开发源代码的应用框架,它通过把Servlet、JSP、JavaBean、自定义标签和信息资源整合到一个统一的框架中,为Web开发提供具有高可配置性的MVC开发模式。Struts体系结构实现了MVC设计模式的概念,它将Model、View、和Controller分别映射到Web应用组件中。以下简要说明以下各自的作用:ActionServlet是Struts的核心控制器,一个系统中只需要一个。

Struts核心技术简介

1Struts内部机制

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核心技术简介第1张

图一:Struts的MVC结构图

2Struts工作流程

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核心技术简介第2张

图二:Struts工作流程图

3Struts配置文件详解

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>

4ActionForm 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文件中定义验证的插件,在改插件中定义具体功能的验证代码。

5Action组件开发技术

开发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核心技术简介》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇js、jq对象互转Python中的MySQL接口:PyMySQL &amp;amp; MySQLdb下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Java进程占用内存过高,排查解决方法

最近收到邮件报警,说内存使作率达到84%。如下图: 解决方法: A:可能是代码原因导致的问题: 1、使用命令:top 查看当前进程的状态 2、从上图可以看到PID:916的java进程占用内存较大。定位线程问题(通过命令查看PID 为25894 进程的线程情况),命令:# ps p 916 -L -o pcpu,pmem,pid,tid,time,t...

解决maven项目无法读取src/main/java目录下面的配置文件问题

我们在用Mybatis去操作底层数据库的时候,需要用到xml配置文件,一般我们是把配置文件和dao放置在同一层目录。 但是在用idea操作maven项目的时候,我们可能会遇到无法读取到dao对应的mapper.xml文件。 简单的解决方法如下: 第一种: 将xml文件移至src/main/resource下面,这样做最省事,但是面临一个问题,就是看起来项目...

Java操作XML文件 dom4j 篇

在项目中,我们很多都用到了xml文件,无论是参数配置还是与其它系统的数据交互。今天就来讲一下Java 中使用dom4j来操作XML文件。 我们需要引入的包: //文件包importjava.io.ByteArrayOutputStream;importjava.io.File;importjava.io.FileWriter;//工具包importjava...

SVN使用手册

如果开发过程中没有SVN? 软件研发过程中,任意一个项目都是由一个团队完成的,而不能依靠单一个体完成。 在团队开发过程中,资料数据的共享与同步将成为开发过程中比较突出的问题。 图一:原始开发管理模式(COPY模式) 缺点: 代码管理混乱 备份多个版本,占用磁盘空间大 解决代码冲突困难 容易引发BUG 难于追溯问题代码的修改人和修改时间 难于恢复至以...

JAVA生成Word文档(经过测试)

首先告诉大家这篇文章的原始出处:http://www.havenliu.com/java/514.html/comment-page-1#comment-756 我也是根据他所描述完成的,但是有一些地方有点模糊,不容易弄出来.所以,我另外写一篇,让大家少走一些弯路. 上图:是Word文档中的内容,也就是模板,为了下面步鄹做铺垫,所以在需要输入数据的地方改...

使用ApachePOI创建带图片的Excel

  最近一个项目中使用到了列表数据导出为Excel表格的功能,项目中是使用了Apache的POI来生成Excel文件。   由于使用到的技术有一定的复杂度,我在此特别列出一些实现上的细节作为记录和备忘。   首先我们要用到的jar包是POI,我使用的是项目框架中的,版本可能有一些老,不过功能还算完整。      我先把代码贴一些出来,并解释一下: 1 p...