• Struts 2(二)


      一,框架的扩展名问题:
                     1,struts2框架的默认扩展名:.action和空字符串。在框架的属性文件default.properties中进行默认配置:struts.action.extension=action,,
     
                    2,如何覆盖框架的默认扩展名:
                      a,在struts.xml文件中增加常量标签(推荐使用)
    <!--声明常量 -->
    <!--覆盖框架默认扩展名 -->
    <constantname="struts.action.extension"value="action,,do"></constant>
     
                      b,在自定义属性文件中struts.properties中设置(只要在默认的default.properties中设置,都可以通过这种方式覆盖)
    struts.action.extension=action,,do
    
                     c,在web.xml文件中进行设置:
    <!--配置框架的核心调度器,设置了初始化参数 -->
    <filter>
    <filter-name>struts2</filter-name>
    <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>                
    <init-param>
    <param-name>struts.action.extension</param-name>
    <param-value>action,,do</param-value>
    </init-param>
    </filter>
    <filter-mapping>
    <filter-name>struts2</filter-name>
    <url-pattern>/*</url-pattern>
    </filter-mapping>
     
                注意:如果以上三种情况同时存在,那么过滤器设置起作用。如果过滤器参数设置不存在,那么属性文件(struts.properties)设置起作用。这和我们源码初始化这些文件的先后顺序有关。而我们推荐是在struts.xml文件中进行设计的。所以下边类似的,我只是演示在struts.xml文件中的设计方式。
     
              二,框架的字符编码问题:
    
                     1,框架默认的字符编码是:UTF-8,也是在default.properties中设置的:struts.i18n.encoding=UTF-8
    
                     2,覆盖框架的默认字符编码:
                         在struts.xml文件中进行常量配置,当然在struts.properties文件中和过滤器设置初始化参数也可以,这里不再演示。
                             <!-- 覆盖框架的默认字符编码 -->
    <constantname="struts.i18n.encoding"value="GB18030"></constant>
     
             三,框架的开发模式:
                     在开发中xml文件我们会经常修改,但是我们又不想每次修改就进行服务器的重启部署等,所以我们可以在开发过程中将框架的默认设置为开发模式,有利于我们开发的效率的提高。当然注意在我们完成以后上线的时候还需要改回默认的。防止不必要的麻烦发生。
    
                    1,对于struts.xml文件的修改不需要进行服务器重启,可以在其内进行这样设置,覆盖默认的:
    <!--设置框架重新加载配置文件的标识 -->
    <constantname="struts.configuration.xml.reload"value="true"></constant>
     
                    2,当然我们想的还有属性文件等,这需要我们设置为开发模式(更常用):
    增加常量标签,进行开发模式设置,这里设置以后就会将上边的设置进行覆盖,所以设置这一个就够了:
    <!--设置开发模式 -->
    <constantname="struts.devMode" value="true"></constant>
     
            四,框架命名空间的问题:
    
                 1,简述:命名空间namespace其实是<package>标签的一个属性,用来对action请求的路径进行管理。所谓的包<package>表示对Action配置的管理。包名是应该具有唯一性的标识,不能存在相同的两个包名。命名空间正常来讲不应该存在相同的名称,如果两个命名空间名称相同,而且存在相同的action名称,那么后面配置的action会起作用。
    
                  2,访问action对象时,请求路径的格式为:命名空间 + "/" + Action的name属性值。
                         但是用户也可以在发送时,添加额外的路径:例如:命名空间 + "/"额外路径 + "/"+ Action的name属性值,这样框架任然可以访问到的,这和框架的解析路径方法有关,算是个缺陷吧,但是框架也进行相关补充,可以弥补。
    
                 3,如何限制用户的非法路径:
                          <!--限制请求的命名空间必须符合规则 -->
         <constantname="struts.mapper.alwaysSelectFullNamespace"value="true"></constant>
     
             五,框架的action问题:
    
                  1,根据解析请求路径,获取action的名称,到配置文件中查找到action的完整类名,反射创建。
    Action类设置要求:必须提供public的无参数的构造方法。Action对象是每次请求都创建一个新的实例,所以action是多例的,它解决的线程安全问题。(但是性能不高)这些都是基于框架的源码的设置。
     
           六,框架中方法的编写:
                  1,默认方法: 框架调用Action的方法,默认方法名称为execute
       默认方法execute的命名规则:
    必须是public
    必须返回类型是String
    必须名称叫做execute
    必须是无参数的
    
                 2,如果希望不使用默认的execute方法名称,那么也可以自定义方法名称,但是自定义方法名称的声明规则必需与execute方法声明规则一致。请求自定义方法的方法:
    
                     a,通过感叹号的方式指定被调用的方法名称。这种调用方法的方式叫做动态方法调用,例如:uri = /user/login!login.action.        对于动态方法调用可以动态的调用到Action中的任意方法,但是并不是一定有效,而且开发方式属于紧耦合开发。所以这种方式不推荐使用。 
              
                    b,如何禁止动态方法调用,禁止以后如何指定呢?
    <!--禁止感叹号的动态方法调用 -->
    <constantname="struts.enable.DynamicMethodInvocation"value="false"></constant>
     
    <!--设置method方法即可-->
    <action  name="login"class="com.bjpowernode.struts2.action.LoginAction"method="login">
                              <resultname="success">/success.jsp</result>
                              <resultname="login">/login.jsp</result>
                     </action>
                
                 c,如果一个类有好多方法,我们如何才能简化配置呢?通过通配符的方式进行简化配置:{1}表示匹配第一个*,只要我们传过来的是方法的名字即可。但是通配符的使用要慎重,不要弄出漏洞,防止不法分子的巧弄URI进行破解。
                    <action  name="*" class="com.bjpowernode.struts2.action.LoginAction"method="{1}">
                            <resultname="success">/success.jsp</result>
                           <resultname="login">/login.jsp</result>
                   </action>
     
     
               当然了,还有很多在struts.xml配置的属性,这里我仅仅是列出了一些常用的,经常需要我们配置的。我们只要抓住这个原理,知道原来框架在那配置的,指定的key是什么,如何解析的,就非常简单了。当然了很多一部分是在default.properties属性文件中进行的配置,我们需要重点掌握。
               
             其实框架都是人设计的,我们只要按照正常人的思维去思考问题,基本上和框架实现的是差不多的。例如,你设计框架肯定会有默认的编码设置,当然你不会写死,会给开发人员覆盖的机会。当然很多配置,我们都在固定的文件中,利用固定的方法进行修改,这是非常符合常规的。所以了解了框架的原理,还是非常简单的。总结中……
  • 相关阅读:
    [LeetCode] 952. Largest Component Size by Common Factor 按公因数计算最大部分大小
    [LeetCode] 951. Flip Equivalent Binary Trees 翻转等价二叉树
    [LeetCode] 950. Reveal Cards In Increasing Order 按递增顺序显示卡牌
    上周热点回顾(7.6-7.12)团队
    上周热点回顾(6.29-7.5)团队
    上周热点回顾(6.22-6.28)团队
    调用博客园 open api 的客户端示例代码团队
    【故障公告】阿里云 RDS 实例 CPU 100% 故障引发全站无法正常访问团队
    上周热点回顾(6.15-6.21)团队
    《证券投资顾问胜任能力考试》考试大纲
  • 原文地址:https://www.cnblogs.com/hhda/p/7728460.html
Copyright © 2020-2023  润新知