【Struts1】Struts1的配置和原理详解

Action, ActionForm, ActionForward ,这三个对象构成了Struts 的核心。
Struts 最核心的控制器是ActionServlet ,该Servlet 拦截用户请求,井将用户请求转入到Struts 体系内。
一、配置ActionServlet
ActionServlet 是一个标准的Servlet ,在web.xml 文件中配置,该Servlet 用于拦所有的HTTP 请求。因此,应将该Servlet 配置成自启动Servlet ,即为该Servlet 配置load-on-startup 属性。

注意:在应用Struts 的很多场景下,为Servlet 配直load-on-startup 属性都是必需的。因此,笔者建议应为ServletAction 配直load-an-startup 属性,关于load-an-startup请详见load-an-startup的作用

在web.xml 文件中配置ActionServlet 应增加如下片段:

<!-- 将ActionServlet配置成自启动的Servlet -->
<servlet>
    <!-- 指定Servlet 的名字 -->
    <servlet-name>actionSevlet</servlet-name>
    <!-- 指定该Servlet 的实现类 -->
    <servlet-class>
        org.apache.struts.action.ActionServlet
    </servlet-class>
    <!-- 配置自启动的级别 -->
    <load-on-startup>2</load-on-startup>
</servlet>
<servlet-mapping>
    <!-- 配置ActionServlet的URL 映射 -->
    <servlet-name>actionSevlet</servlet-name>
    <!-- 所有以.do 结尾的请求由ActionServlet拦截 -->
    <url-pattern>*.do</url-pattern>
</servlet-mapping>

该ActionServlet作为一个标准Servlet,配置在Web 应用中,负责拦截用户请求。该Servlet 还有加载Struts 配置文件的责任。但这里并未告诉它如何加载Struts 的配置文

件,以及Struts 的配置文件放在哪里及文件名是什么。ActionServlet默认加载WEB-INF 下的struts-config.xml文件。如果需要Struts 的配置文件不在WEB-INF路径下,或者改变了文件名,则应采用如下方式配置

    <servlet>
        <servlet-name>actionSevlet</servlet-name>
        <servlet-class>
            org.apache.struts.action.ActionServlet
        </servlet-class>
        <init-param>
            <param-name>config</param-name>
            <param-value>/WEB-INF/struts-config-user.xml</param-value>
        </init-param>
        <load-on-startup>2</load-on-startup>
    </servlet>  

在上面的配置中,指定了ActionServlet 的配置文件: struts-config-user.xml文件,该文件作为init-param参数载入,载入时候指定了参数名:config ,config 是Struts 固定的参数名, struts负责解析该参数,并加载该参数的指定的配置文件。Struts 支持使用多个配置文件,当有多个配置文件时,应将不同的配置文件配置成不同的模块,并指定不同的URI。下面的片段配置了两个配置文件:

    <servlet>
        <!-- ActionServlet 的名 -->
        <servlet-name>actionSevlet</servlet-name>
        <!-- 配置Servlet 的实现类 -->
        <servlet-class>
            org.apache.struts.action.ActionServlet
        </servlet-class>
        <!-- 指定Struts 的第一个配置文件 -->
        <init-param>
            <!-- 指定配置文件的映射 -->
            <param-name>config</param-name>
            <param-value>/WEB-INF/struts-con工fgl.xml</param-value>
        </init-param>
        <!-- 指定Struts 的第二个配置文件 -->
        <init-param>
            <!-- 指定配置文件的映射 -->
            <param-name>config/wawa</param-name>
            <param-value>/WEB-INF/struts-config2.xml</param-value>
        </init-param>
        <!-- 将ActionServlet配置成自启动Servlet -->
        <load-on-startup>2</load-on-startup>
    </servlet>  

上面的配置片段中指定了两个配置文件:struts-config l.xml 和struts-config2.xml 文件。这两个配置文件分别被配置到config 和config/wawa 的路径下。表明将struts-config 1.xml 中的Action 映射到应用的根路径下,而struts-config2.xml 文件中的Action 则被映射到应用的wawa 子路径下。也就是说wawa 将作为系统的一个模块使用。

二、配置ActionForm
配置ActionForm ,必须包含ActionForm 类才行。Struts 要求ActionForm 必须继承Struts 的基类:
org.apache.struts.action.ActionForm,ActionForm
的实现非常简单,该类只是一个普通的JavaBean,只要为每个属性提供对应的setter 和getter 方法即可。根据前面的讲解,
ActionForm 用于封装用户的请求参数,而请求参数是通过JSP 页面的表单域传递过来的。因此应保证ActionForm
的参数与表单域的名字相同。

注意: JavaB ean 的参数是根据getter 、setter 方法确定的。如果希望有一个A 的属性,则应该提供getA 和setA 的方法。
(1)ActionForm的实现
ActionForm 的属性必须与JSP 页面的表单域相同。本示例的表单包含如下两个表单域:
• usemame
• password
因此, ActionForm 必须继承org.apache.struts.action.ActionForm,并为这两个域提供对应的setter 和getter 方法,下面是ActionForm 的源代码:

    import org.apache.struts.action.ActionForm;
    public class LoginForm extends ActionForm {
        private String username;
        private String password;  

        // 表单域username对应的setter 方法
        /**
         * @return the username
         */
        public String getUsername() {
            return username;
        }  

        /**
         * @param username
         *            the username to set
         */
        public void setUsername(String username) {
            this.username = username;
        }  

        /**
         * @return the password
         */
        public String getPassword() {
            return password;
        }  

        /**
         * @param password
         *            the password to set
         */
        public void setPassword(String password) {
            this.password = password;
        }  

    }  

另外,该ActionForm 的两个属性名可以不是usemame 和password。只要提供了usemame 和password 的setter 和getter 方法即可。

注意: FormBean 类应尽量声明成public。
(2)ActionForm 的配置
所有的ActionForm 都被配置在struts-config.xml 文件中,该文件包括了一个form-beans 的元素,该元素内定义了所有的ActionForm,每个ActionForm 对应一个form-bean 元素。

为了定义LoginForm. 必须在struts-config.xml文件中增加如下代码:

<!-- 用于定义所有的ActionForm -->
<form-beans>
    <!-- 定义ActionForm,至少指定两个属性: name , type-->
    <form-bean name="loginForm" type="lee.LoginForm" />
</form-beans> 

配置ActionForm非常简单,只需指定ActionForm 的name 属性即可。该属性定义了ActionForm的id. 用于标识该Form; 另外还需要一个type 属性,该属性定义了ActionForm的实现类。

下面将介绍Action 如何使用该ActionForm. 以及Action 如何与该ActionForm关联。

三、配置Action
Action 的配置比ActionForm 相对复杂一点,因为Action 负责管理与之关联的ActionForm. 它不仅需要配置实现类,还需要配置Action 的path 属性,该属性用于被用

户请求。对于只需在本Action 内有效的Forward. 还应在Action 元素内配置局部Forward。
(1)Action 的实现
通过ActionForm. 可使Action 无须从HTTP 请求中解析参数。因为所有的参数都被封装在ActionForm中,下面是Action 从AcitionForm 取得请求参数的源代码:

    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import org.apache.struts.action.Action;
    import org.apache.struts.action.ActionForm;
    import org.apache.struts.action.ActionForward;
    import org.apache.struts.action.ActionMapping;
    public class LoginAction extends Action {
        // 必须重写该核心方法,该方法actionForm 将表单的请求参数封装成值对象
        public ActionForward execute(ActionMapping mapping, ActionForm form,
                HttpServletRequest request, HttpServletResponse response)
                throws Exception {
            //将ActionForm强制类型转换为LoginForm
            LoginForm loginForm = (LoginForm) form;
            // 从ActionForm中解析出请求参数: username
            String username = loginForm.getUsername();
            // 从ActionForm中解析出请求参数: password
            String pass = loginForm.getUsername();
            //后面的处理与前一个示例的Action 相同。
            ...
        }
    }  

该Action 从转发过来的ActionForm 中解析请求参数,对应的ActionForm 则由ActionServlet 在接收到用户请求时,负责实例化。
实际的过程是: ActionServlet 拦截到用户请求后,根据用户的请求,在配置文件中查找对应的Action , Action 的name
属性指定了用于封装请求参数的ActionForm; 然后ActionServlet 将创建默认的ActionForm
实例,并调用对应的setter 方法完成ActionForm的初始化。

ActionServlet 在分发用户请求时,也将对应ActionForm 的实例一同分发过来。
(2)Action 的配置
Action 需要配置如下几个方面。
• Action 的path: ActionServlet 根据该属性来转发用户的请求,即将用户请求转发与之同名的Action 。同名的意思是:将请求的.do 后缀去掉,匹配Action 的path属性值。

• Action 的name: 此处的name 属性并不是Action 本身的名字,而是与Action 关联的ActionForm。因此该name 属性必须是前面存在的ActionForm 名。

• Action 的type: 该属性用于指定Action 的实现类,也就是负责处理用户请求的业
务控制器。
• 局部Forward: Action 的转发并没有转发到实际的JSP 资源,而是转发到逻辑名,即Forward 名。在Action 内配置的Forward 都是局部Forward (该Forward 只在该Action 内有效)。

下面是该Action 的配置代码:

    <!-- 该元素里配置所有的Action -->
    <action-mappings>
        <!-- 配置Action. 指定了path , name , type 等属性 -->
        <action path="/login" type="lee.LoginAction" name="loginForm">
            <!-- 配置局部Forward -->
            <forward name="welcome" path="/WEB-INF/jsp/welcome.jsp" />
            <forward name="input" path="/login.jsp" />
        </action>
    </action-mappings>  

四、配置Forward
正如前面所讲, Forward 分局部Forward 和全局Forward 两种。前者在Action 里配置,仅对该Action 有效:后者单独配置,对所有的Action 都有效。

配置Forward 非常简单,主要需要指定以下三个属性。
• name: 该Forward 的逻辑名。
• path: 该Forward 映射到的JSP 资源。
• redirect: 是否使用重定向。
局部Forward 作为Action 的子元素配置;全局Forward 配置在global-forwards 元素里。
下面是配置全局Forward 的代码:

    <!-- 配置全局Forward -->
    <global-forwards>
        <!-- 配置Forward对象的name 和path 属性 -->
        <forward name="error" path="/WEB-INF/jsp/error.jsp" />
    </global-forwards>  

上面的配置代码中,配置了一个全局Forward,该Forward 可以被所有的Action
访问。通常,只将全局资源配置成全局Forward。当每个Action 在转发时,首先在局部Forward
中查找与之对应的Forward,如果在局部Forward 中找不到对应的Forward 对象,才会到全局Forward
中查找。因此,局部Forward 可以覆盖全局Forward。

下面提供了该应用的struts-config.xm1文件的全部源代码:

    <?xml version="1.0" encoding="UTF-8"?>
    <!-- Struts 配置文件的文件头,包含DTD 等信息 -->
    <!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN" "http://struts.apache.org/dtds/struts-config_1_2.dtd">
    <!--Struts 配置文件的根元素 -->
    <struts-config>
        <!--配置所有的ActionForm -->
        <form-beans>
            <!--配置第一个ActionForm,指定ActionForm的name 和type 属性 -->
            <form-bean name="loginForm" type="lee.LoginForm" />
        </form-beans>
        <!--配置全局Forward对象 -->
        <global-forwards>
            <!--该Forward对象的name 属性为error. 映射资源为/WEB-INF/jsp/error.jsp -->
            <forward name="error" path="/WEB-INF/jsp/error.jsp" />
        </global-forwards>
        <!--此处配置所有的Action 映射-->
        <action-mappings>
            <!--配置Action 的path. type 属性name 属性配置Action 对应的ActionForm-->
            <action path="/login" type="lee.LoginAction" name="loginForm">
                <!--还配置了两个局部Forward. 这两个局部Forward仅对该Action有效-->
                <forward name="welcome" path="/WEB-INF/jsp/welcome.jsp" />
                <forward name="input" path="/login.jsp" />
            </action>
        </action-mappings>
    </struts-config>  

五,这是一个关于Struts1的流程图

六,原文链接

Struts1——MVC框架工作原理

Struts1 - 配置 - 说明详细且配合例子,简单易懂

时间: 2024-11-11 13:37:59

【Struts1】Struts1的配置和原理详解的相关文章

java环境配置及原理详解

java环境配置及原理详解 1.java跨平台的本质 我们谈到java,总是提到跨平台这个词.那么java语言是怎么实现跨平台的呢? 我们编写的java代码不是直接让windows系统读取解析,而是在windows系统中装上java虚拟机(JVM)来读取编写的java软件所以跨平台的实现原理就是在对应平台上装上相应平台能够识别的java虚拟机,用这JVM来读取解析编写的java软件所以java程序是跨平台的,但是JVM不是跨平台的 2.jre和jdk的区别 jre: java的运行环境(包括JV

Tomcat 端口配置,及原理详解

Tomcat 端口配置,及原理详解 作者:Ezitai 如果想深入了解tomcat的各个端口及配置,建议通读文章,对初学者十分有利,整理自网络. 1 tomcat 文件配置详细说明 tomcat服务器需配置三个端口才能启动,安装时默认启用了这三个端口,当要运行多个tomcat服务时需要修改这三个端口,不能相同.端口配置路径为tomcat\ conf\service.xml 修改Shutdown端口(默认为8005端口) <Server port="8005" shutdown=&

Java虚拟机工作原理详解

原文地址:http://blog.csdn.net/bingduanlbd/article/details/8363734 一.类加载器 首先来看一下java程序的执行过程. 从这个框图很容易大体上了解java程序工作原理.首先,你写好java代码,保存到硬盘当中.然后你在命令行中输入 [java] view plaincopy javac YourClassName.java 此时,你的java代码就被编译成字节码(.class).如果你是在Eclipse IDE或者其他开发工具中,你保存代码

kickstart安装系统原理详解

前言 作为中小公司的运维,经常会遇到一些机械式的重复工作,例如:有时公司同时上线几十甚至上百台服务器,而且需要我们在短时间内完成系统安装. 常规的办法有什么? 光盘安装系统===>一个服务器DVD内置光驱百千块,百台服务器都配光驱就浪费了,因为一台服务器也就开始装系统能用的上,以后用的机会屈指可数.用USB外置光驱,插来插去也醉了. U盘安装系统===>还是同样的问题,要一台一台服务器插U盘. 网络安装系统(ftp,http,nfs) ===>这个方法不错,只要服务器能联网就可以装系统了

Storm概念、原理详解及其应用(一)BaseStorm

本文借鉴官文,添加了一些解释和看法,其中有些理解,写的比较粗糙,有问题的地方希望大家指出.写这篇文章,是想把一些官文和资料中基础.重点拿出来,能总结出便于大家理解的话语.与大多数"wordcount"代码不同的是,并不会有如何运行第一storm代码等内容,只有在运行完代码后,发现需要明白:"知其然,并知其所以然". Storm是什么?为什么要用Storm?为什么不用Spark? 第一个问题,以下概念足以解释: Storm是基于数据流的实时处理系统,提供了大吞吐量的实

Linux下FFMPEG--H264--编码&&解码的C实现与相关原理详解

FFMPEG是很强大的一套视频音频处理库,不过,强大的功能一般免不了复杂的实现,或者更加现实地说,"麻烦"的部署和使用流程 关于"FFMPEG怎么部署"这事就放在另一篇文章啦,下面入正题.. 编码encoder模块和解码decoder模块都有init初始化方法和资源free方法 init初始化方法主要是进行ffmpeg所必需的编解码器的初始化和部分功能方法的参数配置,而free资源释放方法则是相应地进行必要的回收 Encoder模块的实现和细节分析 #include

Influxdb原理详解

本文属于<InfluxDB系列教程>文章系列,该系列共包括以下 15 部分: InfluxDB学习之InfluxDB的安装和简介 InfluxDB学习之InfluxDB的基本概念 InfluxDB学习之InfluxDB的基本操作 InfluxDB学习之InfluxDB的HTTP API写入操作 InfluxDB学习之InfluxDB数据保留策略(Retention Policies) InfluxDB学习之InfluxDB连续查询(Continuous Queries) InfluxDB学习之

[转] VLAN原理详解

VLAN原理详解 标签: VLANAccess-LinkTrunk-Link802.1QISL 2013-07-26 18:05 27901人阅读 评论(15) 收藏 举报  分类: 网络通信/流媒体(30)  目录(?)[+] 1.为什么需要VLAN 1.1 什么是VLAN? VLAN(Virtual LAN),翻译成中文是“虚拟局域网”.LAN可以是由少数几台家用计算机构成的网络,也可以是数以百计的计算机构成的企业网络.VLAN所指的LAN特指使用路由器分割的网络——也就是广播域. 在此让我

LAMP平台搭建及其原理详解

LAMP平台搭建及其原理详解 LAMP平台搭建基础概念 LAMP:提到LAMP很多人会认为LAMP是Linux ,Apache,Mysql,PHP.但是随着技术的不断发展,当今的Lamp,已经不仅仅是这么简单了,这里我们的P除了PHP其实还包括:phython,perl    .而M也不仅仅指的是mysql,也包括mariadb. LAMP平台顾名思义就是Linux,apache,mysql(mariadb),php(phython,perl)的结合.按照他们的结合方式不同,大致可以分成三类: