• Struts2之Action基础与配置


    Action基础

    Action是什么

      在Struts2中,一个Action类代表一次请求或调用,每个请求的动作都对应于一个相应的Action类,一个Action类是一个独立的工作单元。也就是,用户的每次请求,都会转到一个相应的Action类里面,由这个Action类来进行处理,因此一个Action类代表了用户的一次请求或调用。简单来说,Action就是用来处理一次用户请求的对象。

    Action能干什么

    public class HelloWorldAction implements Action {  
    
            private String account;  
            private String password;   
    
            public String execute() throws Exception {  
                System.out.println("用户输入的参数为===" + "account=" + account + ",password=" + password);  
                return "toWelcome";  
            }  
    
            public String getAccount() {  
                return account;  
            }  
    
            public void setAccount(String account) {  
                this.account = account;  
            }  
    
            public String getPassword() {  
                return password;  
            }  
    
            public void setPassword(String password) {  
                this.password = password;  
            }  
    
        }  

      根据上面的Action实现,在Struts2里面,Action充当着MVC中模型的角色,也就是Action既封装了业务数据,又要处理业务功能。在实际的JavaEE开发中,逻辑部分会放到逻辑层去实现,这就变成Action只是去调用逻辑层来进行业务逻辑的处理,并不是真的在Action里面去实现业务逻辑的处理。上面Action的属性和属性对应的getter/setter方法,就是用来接收用户请求的数据,并把这些数据封装在Action中,在后续处理中可以访问这些数据。上面Action的实现中的execute方法的实现,你会发现execute方法里面实现的功能,正是前面学习的MVC的控制器部分的功能。从另外一个角度说,Struts2的Action也充当着MVC中控制器的角色。

    那Struts2的Action相当于MVC中的控制器还是模型?

      虽然两种说法都过得去,但是目前大家的共识是把Struts2的Action作为MVC中的模型角色来看待。原因是在Struts2运行的时候,是由Struts2中的前端控制器FilterDispatcher分发并调用相应的Action,此时Action仅仅相当于一次请求的命令处理,层面比较小,再加上已经有FilterDispatcher来做控制器进行分发调度,因此,一般不把 Struts2的Action当作MVC的控制器来看,而是当作MVC的模型来看。

    Action的配置

      不管Action采用何种实现方式,要正确运行,都需要在struts.xml中进行配置,这是使用Action的基础。

    <package>的配置

      Action需要在struts.xml中配置才可以使用,而且Action应该配置成为<package>元素的子元素,那么<package>元素的功能是什么?

      <package>元素可以把逻辑上相关的一组Action、Result、Intercepter等元素封装形成一个独立的模块,package可以继承其他的package,也可以作为父包被其他的package继承,比如配置“<package name="helloworld"  extends="struts-default">”,helloworld这个包就继承了struts-default这个包。

           <package>元素有如下属性:

      name:包的名称。必须配置

      extends:要继承的包,后面配置的是被继承的包的名称。可选

      namespace:包的命名空间。可选

      abstract:定义包为抽象的,也就是不能包含Action的定义。可选

      namespace配置的是包的命名空间,同一个命名空间里面不能有同名的Action,当然不同的命名空间里面是可以有同名的Action的。类似于Java的包的功能,namespace可以有效的防止action重名的冲突,因为配置了namespace后,在访问action的时候就需要添加namespace来作为action的前缀。如果不配置namespace,表示是默认的namespace,那么访问的时候不需要添加namespace前缀。

      abstract用来定义包为抽象的,也就是不能包含Action的定义,但是抽象包可以被其他包继承,因此里面可以定义其他包需要的元素,比如ResultType、Interceptor等等。

    <action>的配置

    虽然Action在Struts2的开发中非常重要,但是其配置非常简单,基本的规则如下:

      <action>元素是<package>元素的子元素,应该配置在<package>元素里面

      <action>元素通常需要配置name和class属性,其中name是必须的

      <action>元素可以包含其他的子元素:比如<param>、<result>、<interceptor-ref>、<exception-mapping >

    通常也就是配置name和class属性,然后配置<result>子元素。

    为何可以不配置<action>的class属性?

       <package>元素的extends属性配置“struts-default”,说明了这个包继承了一个叫“struts- default”的包,这是Struts2默认配置好的各个<package>元素的公用配置。打开它,可以发现这个文件类似于我们熟悉的struts.xml。根元素也是<struts>,<struts>元素下面有一个子元素<package>,这个<package>的name属性的值正是“struts-default”。看最后的配置<default-class-ref class="com.opensymphony.xwork2.ActionSupport" />,这说明<action>元素不写class属性的时候,默认配置就是使用ActionSupport类。这种做法有什么用?大多数情况下都是需要配置<action>的class属性的值的,因为我们需要把自己写的,用来处理请求的Action类配置上去,而不是使用默认的配置。考虑一种情况,在实际开发中对安全性要求较高的web项目,往往把jsp放在WEB-INF文件夹中,这样可以防止外界直接通过URL来访问jsp页面,这时的jsp就一定要是Servlet或Action的后继页面,才可以被访问到。因此,如果我们有一个jsp页面在WEB-INF下,但在它之前不需要Action访问逻辑层,相当于需要直接访问这个jsp页面。就可以让这个jsp作为ActionSupport的后继页面,使用default-class-ref,可以减少重复配置。

     

     

     

  • 相关阅读:
    The differences between genetic distance values of Nei 1978 and Nei 1972
    【打油诗】无题
    EXCEL函数LookUp, VLOOKUP及HLOOKUP函数
    【菜鸟入门R语言】独立t检验
    【菜鸟入门R语言】利用R语言画箱线图
    【综述】植物防御假说——Out of the quagmire of plant defense hypotheses
    一个创造奇迹的上午——谈如何高效利用时间
    两篇波兰地区重金属污染地区土壤微生物多样性的研究
    【软件使用】利用image J测定叶面积
    利用Peakscanner软件对测序仪获取的分子标记数据进行初步识别
  • 原文地址:https://www.cnblogs.com/lyp3314/p/2876863.html
Copyright © 2020-2023  润新知