zoukankan      html  css  js  c++  java
  • struts1

     Struts就是一个MVC框架,下面Struts1 是如何实现MVC 的。参考图如下:

    M主要是ActionForm和JavaBean。负责程序的数据收集和业务处理,ActionForm属于Struts的框架的,这里的JavaBean是应用本身的业务逻辑。

    V层主要是Jsp。主要用于动态页面的显示,Struts本身是没有V层的,作为一个框架只是一个大体结构。这个V层是由开发人员补全的

    C层是Struts的主要部分,包含了Struts框架本身的很多大部分内容,有:

                     struts-config.xml      Struts框架自身的配置文件,包含了很多配置信息。

                     ActionServlet            Struts框架核心控制类(替代servlet实现的抽象物)。

                     RequestProcessor    配合ActionServlet完成截取URL功能。

    Struts通过内部对象及配置文件的协同工作,完成了对页面和Action灵活控制。从而实现Model和View的分离,降低他们之间的耦合程度。

     

    一、配置ActionServlet (web.xml)
    Struts 最核心的控制器,ActionServlet 是一个标准的Servlet ,在web.xml 文件中配置,该Servlet 用于拦所有的HTTP 请求,井将用户请求转入到Struts 体系内。因此,应将该Servlet 配置成自启动Servlet ,即为该Servlet 配置load-on-startup 属性。
    注意:在应用Struts 的很多场景下,为Servlet 配直load-on-startup 属性都是必需的。因此,笔者建议应为ServletAction 配直load-an-startup 属性,关于load-an-startup请详见load-an-startup的作用。 

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

    下面的配置片段中指定了两个配置文件:struts-config1.xml 和struts-config2.xml 文件。这两个配置文件分别被配置到config 和config/wawa 的路径下。

    表明将struts-config1.xml 中的Action 映射到应用的根路径下,而struts-config2.xml 文件中的Action 则被映射到应用的wawa 子路径下。也就是说wawa 将作为系统的一个模块使用。

    <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-configl.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类 (JavaBean)
    配置ActionForm ,必须包含ActionForm 类才行。Struts 要求ActionForm 必须继承Struts 的基类: org.apache.struts.action.ActionForm,ActionForm 的实现非常简单,该类只是一个普通的JavaBean,只要为每个属性提供对应的setter 和getter 方法即可。根据前面的讲解, ActionForm 用于封装用户的请求参数,而请求参数是通过JSP 页面的表单域传递过来的。因此应保证ActionForm 的参数与表单域的名字相同。 
    注意: JavaB ean 的参数是根据getter 、setter 方法确定的。如果希望有一个A 的属性,则应该提供getA 和setA 的方法。 

    所有的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="com.entity.User" />  
    </form-beans> 

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

    三、配置Action 
    Action 的配置比ActionForm 相对复杂一点,因为Action 负责管理与之关联的ActionForm. 它不仅需要配置实现类,还需要配置Action 的path 属性,该属性用于被用 
    户请求。对于只需在本Action 内有效的Forward. 还应在Action 元素内配置局部Forward。 
    (1)Action 的实现 

    package com.struts.action;
    /**
     * @struts.action path="/login" name="loginForm" input="/login.jsp"
     *                scope="request" validate="true"
     */
    public class LoginAction extends Action {
        /*
         * 登录界面的Action
         */
      // 必须重写该核心方法,该方法actionForm 将表单的请求参数封装成值对象 
        public ActionForward execute(ActionMapping mapping, ActionForm form,
                HttpServletRequest request, HttpServletResponse response) {
    
            //将ActionForm强制类型转换为LoginForm  
            User loginForm = (User) form;
    
            UserDAO userdao = new UserDAO();
            User user = userdao.login(loginForm.getUser_name(),
                    loginForm.getUser_password());
    
            if (user != null) {
                System.out.println("用户存在 登入成功,跳转至pro.do");
                return mapping.findForward("success");
            } else {
                System.out.println("用户不存在 登入失败,跳转至login.jsp");
                return mapping.findForward("error");
            }
        }
    }                

    实际的过程是: 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(javabean)。因此该name 属性必须是前面存在的ActionForm 名。 
    • Action 的type: 该属性用于指定Action 的实现类,也就是负责处理用户请求的业务控制器。
    • 局部Forward: Action 的转发并没有转发到实际的JSP 资源,而是转发到逻辑名,即Forward 名。在Action 内配置的Forward 都是局部Forward (该Forward 只在该Action 内有效)。  
    <action-mappings >
        <action name="loginForm" path="/login" scope="request"
                  attribute="loginForm" input="/login.jsp"
                  type="com.struts.action.LoginAction">
          <set-property property="cancellable" value="false" />
          <forward name="error" path="/login.jsp" redirect="true" />
          <forward name="success" path="/pro.do?func=select" redirect="true" />
        </action>
        
        <action name="pro" parameter="func" path="/pro" 
                type="com.struts.action.ProAction">
          <forward name="success" path="/success.jsp" redirect="false" />
        </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。 

    下面提供了web.xml文件的全部源代码(参考): 

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0">
      <display-name>user-pro-bills</display-name>
      
      <servlet>
        <servlet-name>action</servlet-name>
        <servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
        <init-param>
          <param-name>config</param-name>
          <param-value>/WEB-INF/struts-config.xml</param-value>
        </init-param>
        <init-param>
          <param-name>debug</param-name>
          <param-value>3</param-value>
        </init-param>
        <init-param>
          <param-name>detail</param-name>
          <param-value>3</param-value>
        </init-param>
        <load-on-startup>0</load-on-startup>
      </servlet>
      
      <servlet-mapping>
        <servlet-name>action</servlet-name>
        <url-pattern>*.do</url-pattern>
      </servlet-mapping>
      
      
      <welcome-file-list>
        <welcome-file>login.jsp</welcome-file>
      </welcome-file-list>
      
    </web-app>
    web.xml

    下面提供了struts-config.xml文件的全部源代码(参考): 

    <?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>
    struts-config.xml
  • 相关阅读:
    Python深浅拷贝&垃圾回收&with语句
    面向对象
    三器(装饰器,生成器,迭代器)
    Redis数据类型&优缺点&持久化方式
    localStroge和sessionStorge
    redis哨兵&codis
    Redis分布式锁
    技术点剖析
    【牛客网】牛客练习赛4 A Laptop【树状数组+离散化】
    组合数有关的公式及常用求和【数学--排列组合】
  • 原文地址:https://www.cnblogs.com/scmath/p/9557934.html
Copyright © 2011-2022 走看看