Struts2工作原理及文件结构及其他

Myeclipse中创建Struts2的例子

先新建一个Web Project,取名为HelloWorld。如何添加Struts的东西呢?
HelloWorld->MyEclipse->Project Facets[Capabilities]->Install Apache Struts (2.x) Facet

web.xml文件中已经添加了一些东西,src中也添加了struts.xml

Struts2的工作原理及文件结构

工作原理
Struts2是在xml中配置一个过滤器,然后在外部项目启动的时候,过滤器就会生效。比如过滤器的name是struts2,然后路径是/*,代表所有路径,也就是说当所有的用户请求,都会经过这个过滤器。但是struts2会过滤一下自己相关的请求,比如说.action后缀的一个请求,它会进行过滤和处理,但是如果是.jsp或者是.xml结尾,就不会进行处理,直接放行。
配置的filter-class标签中的过滤器名称StrutsPrepareAndExecuteFilter,先把这个名称记住。

看一下这张图
这里写图片描述
首先用户通过HttpServletRequest将用户请求发送过来,经过一系列核心过滤器向下执行。ActionContextCleanUp是一个可选的过滤器,过滤器主要用于和其他的框架进行集成。
到达了FilterDiapatcher,这是Struts的一个核心过滤器,不过在web.xml中配置的并不是这个过滤器,而是StrutsPrepareAndExecuteFilter。这个FilterDiapatcher是Struts2的2.0到2.1.2版本的核心过滤器,最新的过滤器是StrutsPrepareAndExecuteFilter,从2.1.3就替代了前者。为什么FilterDiapatcher过滤器被替代了?
假如我们要写一个过滤器,我们往往会放在Struts2的顶端。假如我们需要在Struts拦截之后再去写过滤器,也就是说在执行Action之前写过滤器(在ActionProxy右边箭头的位置),FilterDiapatcher是做不到的。StrutsPrepareAndExecuteFilter可以做到在执行Action之前添加我们自己的过滤器。StrutsPrepareAndExecuteFilter分为两种,PrepareFilter和ExecuteFilter,可以在准备和执行之间,我们把自己的Filter添加完毕,这就是替换掉的用意。

用户请求经过一系列的过滤器会到达ActionMapper,只有.action后缀的才会到达这里去查找当前这个请求有没有一个指定的action,如果有,就会顺着箭头回到过滤器,走到ActionProxy。ActionProxy可以通过Configuration Manager去读struts.xml,来找到具体的action类。然后通过ActionProxy来创建一个action的反向实例。然后要经过一系列的拦截器(Interceptor),然后执行到Action,返回Result(一个字符串对象),其对应的就是我们的一个视图,包括JSP、FreeMarker、Velocity等,然后再经过一系列拦截器,然后通过HttpServletResponse返回到用户的实例,进行显示。

核心文件
1.web.xml
任何MVC框架都需要与Web应用整合,这就不得不借助于web.xml文件。在JSP+JavaBean+Servlei这种普通的Model2中,就要把Servlet在xml文件中进行配置。只有配置在web.xml文件中Servlet才会被应用加载。
通常,所有的MVC框架都需要Web应用加载一个核心控制器,对于Struts2框架而言,需要加载StrutsPrepareAndExecuteFilter,只要Web应用负责加载StrutsPrepareAndExecuteFilter,StrutsPrepareAndExecuteFilter将会加载Struts2框架。

2.struts.xml
struts2的核心配置文件,在开发过程中利用率最高。
该文件主要负责管理应用中的Action映射,以及该Action包含的Result定义等。

struts.xml中包含的内容:
全局属性
用户请求和响应Action之间的对应关系
Action可能用到的参数和返回结果
各种拦截器的配置

3.struts.properties
struts2框架的全局属性文件,自动加载。位置和struts.xml放在一个路径下。
该文件包含很多key-value对
该文件可以不要,可以将常量在struts.xml文件中进行配置,使用constant元素进行标识

然后看一下struts.xml文件的整体架构。

<!DOCTYPE struts PUBLIC "http://struts.apache.org/dads/struts-2.0.dtd" >
这是所有xml文件的一个文档描述,这个dtd文件是来约束xml文件里可以有哪些标签,不可以有哪些标签
<struts>//这是开始标签

    可以通过include来包含其他的文件,include节点是struts2组件化的方式,可以将每个功能模块独立到一个xml配置文件中,然后来引用。
    <include file="struts-default.xml"></include>

    package是一个核心的标签,提供了将多个Action组织为一个模块的方式
    配置文件中可以有多个包,但是包名是唯一的
    package可以扩展,当一个package扩展自另一个package是,该package会在本身配置的基础上加入扩展的package的配置,父package必须在子package之前配置
    然后是包中的一些属性:
        name:package名称
        extends:继承的父package名称
        abstract:设值package的属性为抽象的,抽象的package不能定义action,值true、false
        namespace:定义package的命名空间,该命名空间影响到url的地址,例如此命名空间为/test那么访问的地址为http://localhost:8080/struts2/test/XX.action
    <package name="com.kay.struts2" extends="struts-default" namespace="/test">
        <interceptors>
            定义拦截器
                name:拦截器名称
                class:拦截器类路径
            <interceptor name="timer" class="com.kay.timer"></interceptor>
            <interceptor name="logger" class="com.kay.logger"></interceptor>
            定义拦截器栈
            <interceptor-stack name="mystack">
                <interceptor-ref name="timer"></interceptor-ref>
                <interceptor-ref name="logger"></interceptor-ref>
            </interceptor-stack>
        </interceptors>

        定义默认的拦截器,每个Action都会自动引用,如果Action中引用了其他的拦截器,默认的拦截器无效
        <default-interceptor-ref name="mystack"></default-interceptor-ref>

        全局results配置,这里是全局的结果集,这里边定义好的内容,包里的action都可以引用
        <global-results>
            <result name="input">/error.jsp</result>
        </global-results>

        Action配置,每一个包里可以定义多个action
        一个action可以被多次映射(只有action配置中的name不同)
            name:action名称,想要访问它可以通过http://localhost:8080/ProjectName/test/hello.action
                test是命名空间,如果没有(namespace的值为/)则不写
            class:对应的类的路径
            method:调用Action中的方法名
        <action name="hello" class="com.kay.struts.Action.LoginAction">
            引用拦截器
                name:拦截器名称或拦截器栈的名称
            <interceptor-ref name="timer"></interceptor-ref>

            节点配置
                name:result名称,和Action中返回的值相同
                type:result类型,不写则选用superpackage的type,struts-default.xml中的默认为dispatcher
            <result name="success" type="dispatcher">/talk.jsp</result>

            参数设置
                name:对应Action中的get/set方法
            <param name="url">http://www.sina.com</param>
        </action>
    </package>

    前边讲到struts.properties文件,如果想把里边属性放到struts.xml文件中,可以这么写,在包外定义常量
    name和value对应key-value
    <constant name="struts.i18n.reload" value="true"></constant>

</struts>

struts.properties文件中的key是定义好的,我们不能随意取名。key有很多,有一些常用的
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值