zoukankan      html  css  js  c++  java
  • Struts2第二篇【开发步骤、执行流程、struts.xml讲解、defalut-struts讲解】

    前言

    我们现在学习的是Struts2,其实Struts1和Struts2在技术上是没有很大的关联的Struts2其实基于Web Work框架的,只不过它的推广没有Struts1好,因此就拿着Struts这个名气推出了Struts2框架。

    因此,学习Struts2的时候,不了解Struts1是没有任何关系的。

    在开山篇的时候,已经说明了为什么要引入Struts框架,其实就是为了提高开发效率…

    Struts2框架预先实现了一些功能:

    • 请求数据自动封装
    • 文件上传的功能
    • 对国际化功能的简化
    • 数据效验功能…….等等

    Struts2开发步骤

    我们就直接来讲解Struts2的开发步骤是什么吧….在了解它的细节之前,先要把配置环境搭好!

    引入jar文件

    完整的struts中的jar包有80多个,我们日常开发是不需要那么多个的。一般我们导入的jar包有8个:

    • commons-fileupload-1.2.2.jar 【文件上传相关包】
    • commons-io-2.0.1.jar【文件上传相关包】
    • struts2-core-2.3.4.1.jar 【struts2核心功能包】
    • xwork-core-2.3.4.1.jar 【Xwork核心包】
    • ognl-3.0.5.jar 【Ognl表达式功能支持表】
    • commons-lang3-3.1.jar 【struts对java.lang包的扩展】
    • freemarker-2.3.19.jar 【struts的标签模板库jar文件】
    • javassist-3.11.0.GA.jar 【struts对字节码的处理相关jar】

    这里写图片描述


    配置web.xml

    在web.xml中配置的过滤器,其实就是在为struts进行初始化工作

    值得注意的是:如果该web.xml配置了多个fileter,那么struts的filter需要在最后面!

    
    <!-- 引入struts核心过滤器 -->
        <filter>
            <filter-name>struts2</filter-name>
            <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
        </filter>
        <filter-mapping>
            <filter-name>struts2</filter-name>
            <url-pattern>/*</url-pattern>
        </filter-mapping>
    

    开发Action

    开山篇我们已经说了,Servlet的业务代码,我们都使用Action来代替…Action类一般继承着ActionSupport

    Action类也叫动作类,处理请求的类。

    
    public class HelloAction extends ActionSupport {
    
        @Override
        public String execute() throws Exception {
    
            System.out.println("helloworld");
    
            return "success";
        }
    }
    

    至于execute()方法是什么,我们先不要去管它,为啥要返回一个String,我们也不要去管它….只要记住开发步骤,并且,我们的Action类是要继承ActionSupport类的

    配置struts.xml

    至于配置struts.xml,我们可以在文件中找到相对应的模版代码的…最终修改成下面这个样子就行了:

    
    <?xml version="1.0" encoding="UTF-8" ?>
            <!DOCTYPE struts PUBLIC
                    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
                    "http://struts.apache.org/dtds/struts-2.0.dtd">
    <struts>
    <package name="hello" extends="struts-default">
        <action name="hello" class="action.HelloAction" method="execute">
            <result name="success">/index.jsp</result>
    
        </action>
    </package>
    </struts>
    

    看完上面的配置文件,是非常像我们开山篇写的struts框架的配置文件的….

    效果:

    在地址栏中直接输入hello,就跳转到index.jsp页面了。并且,execute()中的语句被执行了…

    这里写图片描述


    Struts2执行流程

    我们来简单地了解一下Struts的执行流程,然后再慢慢对上面的开发步骤的部分进行讲解….

    服务器启动

    下边我说的都是struts流程的重点:

    • 加载web.xml文件
    • 找到我们配置的filter中的StrutsPrepareAndExecuteFilter
    • StrutsPrepareAndExecuteFilter在里边执行init()方法
    • 一直到Dispatcher dispatcher = init.initDispatcher(config);,初始化dispatcher
    • 在初始化dispatcher的时候加载struts-default.xml和我们配置的struts.xml

    下面用GIF图来看看它的执行过程:

    这里写图片描述

    细心的朋友可能会发现,我们在struts.xml的package节点下,extends了struts-default….那struts-default究竟是什么东西呢?

    我们找到它的源码:

    这里写图片描述

    我们发现了一大堆的Bean,interceptor,result-type,interceptor-stack…下边我来讲解一下它们是干嘛用的…

    • bean指定了struts在运行的时候需要创建的对象类型
      • 在运行struts的时候,可能需要创建一些对象,那么就通过Bean来指定
    • interceptor是struts定义的拦截器,一共有32个
      • 前边已经说了,Struts为我们实现了一些功能,就是通过拦截器来实现的
    • result-type是跳转结果的类型
      • Action业务方法中的返回值,我们发现几个实用的:redirect【重定向】、dispatcher【转发】、redirectAction【重定向到Action资源】、stream【文件下载的时候用】…跳转结果的类型也在这里定义了
    • interceptor-stack是拦截器的栈
      • 拦截器有32个,我们可能会使用很多的拦截器,不可能一个一个来调用,于是提供了拦截器栈…其实可以简单看成文件夹和文件之间的关系
    • default-interceptor-ref是默认执行的拦截器栈
    • default-class-ref class是默认的执行Action类

    还要补充的就是:默认的拦截器栈有18个拦截器….


    拦截器和过滤器

    拦截器和过滤器都是拦截资源的

    拦截器只拦截Action请求,是struts的概念…

    过滤器拦截web的所有资源,是Servlet的概念…


    小总结

    服务器启动的时候,其实就是加载了web.xml文件,然后调用init()方法去加载struts.xml和struts-default.xml之类的文件…..

    注意:此时的拦截器是还没有被调用的


    访问阶段

    服务器启动的阶段,仅仅是加载了各种的xml文件…那么当我们访问Action的时候,它的执行流程是怎么的呢?

    • 首先,它会创建我们在struts.xml中配置的Action对象
    • 接着,它会按照默认的顺序执行18个拦截器【也就是调用默认拦截器栈】
    • 最后,它会执行Action的业务方法【也就是execute(),我们在struts.xml文件中配置了什么,就执行什么业务方法】

    值得注意的是:每访问Action一次,它就会创建一个对象…它并不是和Servlet一样只有一个对象…因此它是线程安全的.


    深入讲解struts.xml

    这是我们的struts.xml的内容,相信现在对它也不会太陌生了…

    
    <struts>
    <package name="hello" extends="struts-default">
        <action name="hello" class="action.HelloAction" method="execute">
            <result name="success">/index.jsp</result>
        </action>
    </package>
    </struts>
    
    

    package

    package其实就是包,那包用来干什么?包就是用来管理Action

    通常来说,我们都是一个业务模版对应一个package

    name

    name是包的名字,值得注意的是,包的名称是不能重复的。


    extends

    extends代表的是当前包继承着哪个包。在struts中,包一定要继承着struts-default


    abstract

    在package中还有abstract这个属性,使用该属性时:表明当前包被其他的包继承…并且,在package下不能有action,否则会出错!


    namespace

    在package中还有namespace这个属性—名称空间….它是作为路径的一部分的,默认是”/”


    actoin

    action:配置请求路径与Action类的映射关系


    name

    name是请求路径的名字


    class

    class是处理action类的全名


    method

    method是调用的方法名称


    result

    result代表的是Action中业务方法返回的值


    name

    name是action处理返回的值


    type

    type是跳转的类型


    文本值

    文本值是跳转的路径


    细节

    前边已经说了,一个package应该对应一个业务模块..目的就是把职能细分出来

    struts为了让我们更好地管理xml文件,它还可以这样做:在不同的模块中用不同的xml文件进行描述

    这里写图片描述

    最后在struts.xml文件中将其引入即可..

    
    <!--struts在运行的时候总会加载这个文件-->
    <!--总配置文件总引入其他的文件-->
    <struts>
        <include file="privilegeaction/privilege.xml"/>
        <include file="useraction/hello.xml"/>
    </struts>
    

    如果您觉得这篇文章帮助到了您,可以给作者一点鼓励



  • 相关阅读:
    进入黑马day4Serlet与Tomcat
    进入黑马day3HTTP协议与tomcat协议
    进入黑马day1XML简单学习
    进入黑马day2解析xml三种方法(2)sax解析器解析
    进入黑马day3xml三种解析方法比较
    进入黑马day2解析xml三种方法(1)jaxp解析
    进入黑马day2解析xml三种方法(3)dom4j解析器
    进入黑马day1JunitTest测试
    进入黑马day1关于云计算
    系统分析入门
  • 原文地址:https://www.cnblogs.com/zhong-fucheng/p/7202992.html
Copyright © 2011-2022 走看看