千里马

天马行空

Struts1 原理及配置讲解附源码

    最近要看公司网站源码,源码都是用struts1写的,我们平时用的都是struts2,所以的对struts1不是很熟悉。我也就是刚开始接触struts的时候对struts1有个简单的学习(搭建一个简单的项目,然后连接数据库做一些增删改查的操作还可以,但是具体的原理让我说我也说不上来),因此今天抽一部分时间把struts1的概念了解下和自己动手搭建一个项目使用struts1(就是一个简单的用户登录,居然可以跑起来,瞬间感觉对用struts1做一些简单功能还是可以做成的)。废话不说了....

   首先介绍下struts1工作原理:

  1.初始化:struts框架的总控制器ActionServlet是一个Servlet,它在web.xml中配置成自动启动的

 Servlet,在启动时总控制器会读取配置文件(struts-config.xml)的配置信息,为struts

 中不同的模块初始化相应的对象。(面向对象思想)

 2.发送请求:用户提交表单或通过URL向WEB服务器提交请求,请求的数据用HTTP协议传给web服务器。

 3.form填充:struts的总控制器ActionServlet在用户提交请求时将数据放到对应的form对象中的成员

 变量中。

 4.派发请求:控制器根据配置信息对象ActionConfig将请求派发到具体的Action,对应的formBean一并

 传给这个Action中的excute()方法。

 5.处理业务:Action一般只包含一个excute()方法,它负责执行相应的业务逻辑(调用其它的业务模块)

 完毕后返回一个ActionForward对象。服务器通过ActionForward对象进行转发工作。

 6.返回响应:Action将业务处理的不同结果返回一个目标响应对象给总控制器。

 7.查找响应:总控制器根据Action处理业务返回的目标响应对象,找到对应的资源对象,一般情况下

 为jsp页面。

 8.响应用户:目标响应对象将结果传递给资源对象,将结果展现给用户。

下面具体介绍一下struts1配置并配合简单的例子简单易懂:

    Action, ActionForm, ActionForward ,这三个对象构成了Struts 的核心。 


  Struts 最核心的控制器是ActionServlet ,该Servlet 拦截用户请求,井将用户请求转入到Struts 体系内。

一、配置ActionServlet 


ActionServlet 是一个标准的Servlet ,在web.xml 文件中配置,该Servlet 用于拦所有的HTTP 请求。 


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

 <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>

二、配置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;
    }

}

(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>

三、配置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配置大致过程,如果你还不是很明白,可以下载我上传的一个源码(就是按照上面的步骤配置的,一个简单的登陆)。

 源码下载地址:http://download.csdn.net/detail/lizi22/6796111

posted on 2014-01-01 17:26 Mr Lee 阅读(6450) 评论(2)  编辑  收藏 所属分类: java技术

Feedback

# re: Struts1 原理及配置讲解附源码 2014-01-02 09:06 鹏达锁业

不打算写年终总结,实在是没什么好总结的。无论是苦逼了一年,还是逗逼了一年,这一年还是过去了  回复  更多评论   

# re: Struts1 原理及配置讲解附源码 2014-01-03 09:07 鹏达锁业

赞一个,欢迎回访  回复  更多评论   



只有注册用户登录后才能发表评论。


网站导航:
 

My Links

Blog Stats

常用链接

留言簿

随笔分类

随笔档案

文章档案

(hibernate)http://www.blogjava.net/dyllove98/archive/2012/05/12/377959.html

搜索

最新评论

阅读排行榜

评论排行榜