• Struts2 学习(二)


    一、Struts2 配置文件

    1、配置多个配置文件

      在大部分应用里,随着应用规模的增加,系统中Action的数量也会大量增加,导致struts.xml配置文件变得非常臃肿。

      为了避免struts.xml文件过于庞大、臃肿,提高struts.xml文件的可读性,我们可以将一个struts.xml配置文件分解成多个配置文件,然后在struts.xml文件中包含其他配置文件。

      下面的struts.xml通过<include>元素指定多个配置文件:

    <struts>
           <include file="struts-part1.xml"/>
           <include file="struts-part2.xml"/>
    </struts>

    2、Struts2中的6大配置文件

    Struts2框架按照如下顺序加载struts2配置:

    1、default.properties 该文件保存在 struts2-core-2.3.7.jar 中 org.apache.struts2包里面:包含了Struts2的默认常量配置。

    2、struts-default.xml 该文件保存在 struts2-core-2.3.7.jar 包含了框架依赖的对象配置和结果类型,拦截器等配置。

    3、struts-plugin.xml 该文件保存在Struts2框架的插件中:struts-Xxx-plugins-2.3.7.jar 由插件提供。

    注意:上述三个文件是框架自带的,我们不能修改,只能使用。

    4、struts.xml  该文件是web应用默认的struts配置文件。重点:配置自定义的Action和其他信息

    5、struts.properties 该文件是Struts的默认配置文件,可以修改default.properties 的常量配置。

    6、web.xml 该文件是Web应用的配置文件。

    注意:上述三个文件是我们可以修改操作的。

    如果多个文件配置了同一个struts2 常量,则后一个文件中配置的常量值会覆盖前面文件配置的常量值。

    一般我们只在struts.xml中做常量配置。

    <constant name="struts.action.extension" value="action,itsource,do,,"/>

     3、常见的常量配置

    1、指定默认编码集,作用相当于 HttpServletRequest 的 setCharacterEncoding方法 和 freemarker 、velocity 的输出:

    <constant name="struts.i18n.encoding" value="UTF-8"/>

    2、该属性指定需要Struts 2处理的请求后缀,该属性的默认值是action,即所有匹配*.action的请求都由Struts2处理。如果用户需要指定多个请求后缀,则多个后缀之间以英文逗号(,)隔开。

    <constant name="struts.action.extension" value="action,,"/>

    3、设置浏览器是否缓存静态内容,默认值为true(生产环境下使用),开发阶段最好关闭。

    <constant name="struts.serve.static.browserCache" value="false"/>

    4、当struts的配置文件修改后,系统是否自动重新加载该文件,默认值为false(生产环境下使用),开发阶段最好打开

    <constant name="struts.configuration.xml.reload" value="true"/>

    5、开发模式下使用,这样可以打印出更详细的错误信息。

    <constant name="struts.devMode" value="true" />

      修改struts.xml之后,不用重启Tomcat。

    6、默认的视图主题。

    <constant name="struts.ui.theme" value="simple" />

    7、是否支持动态方法调用。

    <constant name="struts.enable.DynamicMethodInvocation" value="false"/>

    4、package,action,result 配置

    1、<package>元素:

      是<struts>根元素的子元素.。

    <package name="" extends="" namespace="" abstract=""></package>

      用来对多个<action>元素分类管理,和Java中的package没有关系

    常见的属性:

    name:表示<package>的名字,但是要保证不同的<package>元素的name不同。 可以通过该名字被其他的包所指代。

    extends:表示当前<package>继承哪一个<package>,一般都是:struts-default。而struts-default其实就是struts-default.xml中<package>元素的名字。继承struts-default之后,就拥有了该<package>定义的所有资源。(结果返回类型,拦截器..)

    namespace:表示命名空间,一般的以"/"打头,命名一般以模块名,如: /hello, /oa. 和<action>的name决定了一个Action类的访问路径。

    abstract:抽象的,缺省值是false。 若一个<package>的abstract="true",那么该<package>中就不能再定义<action>元素,只能用来被继承

    在应用中可以有多个模块。而多个模块之间有共同的基础配置

    <package name="basePkg" extends="struts-default" namespace="/" abstract="true">
            <!-- 公共的基础配置信息 -->
    </package>
    <package name="oa" extends="basePkg" namespace="/oa">
            <!-- OA相关的配置 -->
    </package>
    <package name="station" extends="basePkg" namespace="/station">
            <!-- CRM相关的配置 -->
    </package>

    2、<action>元素:

      是<package>元素的子元素。专门用来配置Action对象的。

    <action name="" class="" method=""/>

    常见的属性:

    name:action的名称,在同一个<package>中,action的名字必须唯一,和<package>的namespace共同决定了一个Action类的访问路径

    注意:action的name值不能以"/"打头。

    class:一个Action类的全限定名。缺省值:ActionSupport类。

    method:当前Action动作访问的方法, 缺省值:execute。

    <action name="hello" class="com.struts2.action.HelloAction" method="execute">
                <!--结果集,即action中成功返回的视图-->
                <result name="success">/HelloWorld.jsp</result>
                <result name="error">/AccessDenied.jsp</result>
    </action>

    3、<result>元素:

      配置结果视图。

    <result name="" type="">路径</result>

    局部结果视图:<result> 定义在 <action> 中。

    全局结果视图:<result> 定义在 <global-results> 中,而 <global-results> 在 <package> 中。

    <package name="oa" extends="basePkg" namespace="/oa">
        <global-results>
            <result></result>
        </global-results>
    </package>

    常见的属性:

    name:Action方法返回的逻辑视图名称,缺省值:success

    type:结果的跳转类型。该类型的值在struts-default.xml中已经预定义好了。缺省值:dispatcher。

    常见的type值(结果类型):

    dispatcher:表示从Action请求转发到页面(JSP)。

    redirect:表示从Action重定向到页面(JSP)。

    chain:表示从Action请求转发到另一个Action。

    redirectAction:表示从Action重定向到另一个Action。

    stream:表示返回流。文件下载时使用。

    <param name="">表示参数:name缺省值:location(地址)。

    5、Action类的三种编写方式

    1、第一种,使用公共的POJO类作为Action。提供公共的无参数的Action方法。(不推荐)

    缺点:

    1、没有一种方式约束Action方法必须是公共的无参数的。

    2、Action方法的返回逻辑视图名可以自定指定。有时起名不规范。比如:"ooxx"。

    1 public class ConfigAction {
    2   public String list(){
    3     return "success";
    4   }
    5 }

    2、第二种,定义一个类,实现于com.opensymphony.xwork2.Action接口。并覆写execute方法即可。(不推荐)

    Action接口中,不仅提供了Action方法的声明,也提供了常用的逻辑视图名称:

    public static final String SUCCESS = "success";

    public static final String NONE = "none";

    public static final String ERROR = "error";

    public static final String INPUT = "input";

    public static final String LOGIN = "login";

    缺点:

    1、不支持国际化,数据校验,消息机制。

    1 public class ConfigAction implements com.opensymphony.xwork2.Action {
    2   public String list(){
    3     return SUCCESS;
    4   }
    5 }

    3、第三种,定义一个类,继承于com.opensymphony.xwork2.ActionSupport类。(推荐)

    public class ActionSupport implements Action, Validateable, ValidationAware, TextProvider, LocaleProvider, Serializable {}

    1 public class ConfigAction extends com.opensymphony.xwork2.ActionSupport {
    2   public String list(){
    3      return SUCCESS;
    4    }
    5 }

    4、真实开发中,我们却往往再提供一个BaseAction类。

    ActionSupport。
    ---BaseAction(自定义Action的基类)
    -----AAction
    -----BAction

    6、Action 中多方法调用

      Action 中多个Action方法会造成 <action> 配置的臃肿。

    1、DMI:动态方法调用 :官方不推荐。

    格式:action名!方法名

    比如:emp!edit    emp!list

    在Struts2新的版本中,默认的关闭了DMI,若我们需要使用DMI,就需要配置常量,启用动态方法调用。

    此时:<action/> 元素不需要指定 method 属性值。

    <constant name="struts.enable.DynamicMethodInvocation" value="true"/>

    2、使用通配符的方式类配置:  通配符:*

    <action name="emp_*" class="cn.itsource.manymethod.EmployeeAction" method="{1}">

    Action的名字:emp_Action方法:比如:emp_list,那么{1}的值就是list。

    emp_edit,那么{1}的值就是edit。

    两个通配符:

    <action name="*_*" class="cn.itsource.manymethod.{1}Action" method="{2}">

    Action名字:Action类名_Action方法.。比如:Employee_list,表示调用的 EmployeeAction 中的 list 方法。

    比如:Department_edit,表示调用 DepartmentAction 中的 edit 方法。

  • 相关阅读:
    linux python2.6升级2.7
    Kafka介绍及安装部署
    kafka搭建
    Zookeeper 集群的安装及高可用性验证已完成!
    grafana初体验
    mac 密码重置
    制作 macOS High Sierra U盘
    运维监控篇Zabbix简单的性能调优
    zabbix主动模式设置
    OpenCV入门:(六:基础画图函数)
  • 原文地址:https://www.cnblogs.com/zt19994/p/8529775.html
Copyright © 2020-2023  润新知