• Struts2 注解零配置方法(convention插件使用)


    最近接触到一个新的项目,是做一个使用S2SH的电子商务商城的二次开发。之前使用过S2SH,在此之前的项目中,Struts2 使用的是XML配置而这个项目是使用注解。在这个项目中,注解还不需要使用Action注解,struts会自动识别了指定包下的所有action文件,我只需要配置result和过滤器就可以了。刚开始接触的时候,有点不习惯,但却觉得这样蛮好用的,后来了解了一下,这个是使用了Struts 2的convertion配置,主要的是要实现“约定优于配置”这个说法,这样做,只需要在配置文件进行少量的配置,然后接下来的开发过程中,开发人员可以不再需要去配置xml,需要的是进行编码,一切的规则按照前期配置和convertion制定来执行。

    关于

    首先说明一下convention插件,它是Struts 2中进行注解的时候必须导入的包,提供的是注解功能,同时在Struts2的官方文档中说了,它还提供了实现开发零配置的功能,可以使开发者专注于编码,不用一边编写java一边编写xml。

    当Struts 2启动的时候,convention插件会进行一次Action的查找,然后按照指定的规则,生成namespaces和Action 的名字,当用户访问的时候,只需要根据对应的规则进行访问,就能访问到指定的Action了。

    生成规则

    在此说明一下convention插件对Action的查找规则和URL的生成规则

    Convention 插件默认扫描继承了action类的子类和文件名以Action结尾的文件

    默认找的包是struts, struts2, action or action的包

    如:

    com.example.actions.MainAction

    com.example.actions.products.Display (implements com.opensymphony.xwork2.Action)

    com.example.struts.company.details.ShowCompanyDetailsAction

    找到对应的类后,Convention 插件会根据包名生成namespaces地址

    com.example.actions.MainAction -> /

    com.example.actions.products.Display -> /products

    com.example.struts.company.details.ShowCompanyDetailsAction -> /company/details

    然后根据类名,去除Action后缀,然后取其余部分小写,若有大小写混合,以-进行连接生成最终访问地址

    com.example.actions.MainAction -> /main

    com.example.actions.products.Display -> /products/display

    com.example.struts.company.details.ShowCompanyDetailsAction -> /company/details/show-company-details

    对于返回值,Convention 插件会根据Action的名字+分隔符+返回值.jsp 的结果去指定目录下查找对应的结果文件。

    配置

    配置convention插件的主要方式,是在Struts.xml文件中添加相应的配置。说是零配置,实际上是一次配置便不再需要做其他的配置了。

    要实现如我所说的这种方式,需要添加配置如下

     1 <!-- 不进行扫描的包,用,分割,被包含的包,将不会被扫描成为action -->
     2     <constant name="struts.convention.exclude.packages" value="com.sean.service" />
     3     <!-- 进行扫描的根包,该包会被扫描成action -->
     4     <constant name="struts.convention.action.packages" value="com.sean.action" />
     5     <!-- 返回页面地址 -->
     6     <constant name="struts.convention.result.path" value="/WEB-INF/content/" />
     7     <!-- 用于进行action查找的后缀 -->
     8     <constant name="struts.convention.action.suffix" value="Action" />
     9     <!--用于生成action名字时的分隔符,比如DemoCustAction会被映射成为demo_cust,同时用于形成返回文件,比如访问DemoAction,return的值为input,插件会去指定不睦下,查找demo_input.jsp文件 -->
    10     <constant name="struts.convention.action.name.separator" value="_" />
    11     <!-- 指定的包会被进行扫描 -->
    12     <constant name="struts.convention.package.locators" value="action,actions,struts,struts2" />
    13     <!-- 返回页面类型 -->
    14     <constant name="struts.convention.relative.result.types" value="dispatcher,velocity,freemarker" />
    15     <!-- 开启动态调用函数,这个方法在struts2里面不推荐,可是在这里却可以实现动态方法的调用,不用自写action了 -->
    16     <constant name="struts.enable.DynamicMethodInvocation" value="true" />
    17     <!-- 开发模式 -->
    18     <constant name="struts.devMode" value="true" />

    实例

    按照上述的配置配置,创建好项目后,我们进行创建两个Action进行测试,这两个Action除了继承了ActionSupport外,其他什么都不添加。

     1 package com.sean.action;
     2 
     3 import org.apache.struts2.convention.annotation.Result;
     4 import org.apache.struts2.convention.annotation.Results;
     5 
     6 import com.opensymphony.xwork2.ActionSupport;
     7 
     8 
     9 public class DemoAction extends ActionSupport{
    10 
    11     public String index(){
    12         return "index";
    13     }
    14     
    15     public String index2(){
    16         return SUCCESS;
    17     }
    18     
    19     public String index3(){
    20         return INPUT;
    21     }
    22     
    23     public String index4(){
    24         return "test";
    25     }
    26 }
     1 package com.sean.action;
     2 
     3 import com.opensymphony.xwork2.ActionSupport;
     4 
     5 public class MyDemoAction extends ActionSupport{
     6 
     7     public String index(){
     8         return "index";
     9     }
    10 }

    同时创建对应的jsp文件:

    当我们的Action名中含有多个大小写的时候,我们需要按照分隔符的规则进行访问

    插件会根据返回值,查找到对应的jsp,比如DemoAction的index返回的字符串是index,我们设置的分隔符是_,那么他找到的是demo_index.jsp

    进过测试,如果函数返回的值,找不到与其对应的文件的时候,插件会以action名去查找对应的文件,如果还查找不到的话,就会报错。比如,index4函数返回的是test,按道理应该查找demo_test.jsp,但是因为没有,插件会去查找demo.jsp来返回,如果还是没有,则报错。

    最后,说一下这种配置方法的优劣。这种方法,之前说了,就是实现“约定由于配置”这个说法,这样做,在项目开发之初制定好相应的规则,开发人员就可以按照对应的规则进行开发,使项目更加规范。不过这里面也有一些劣势,因为这是Struts提供的插件,大部分的规则还是得顺着插件来,规则的制定者还是要收到插件的规则约束的。

  • 相关阅读:
    android 中文 api (43) —— Chronometer
    SVN客户端清除密码
    Android 中文 API (35) —— ImageSwitcher
    Android 中文API (46) —— SimpleAdapter
    Android 中文 API (28) —— CheckedTextView
    Android 中文 API (36) —— Toast
    Android 中文 API (29) —— CompoundButton
    android 中文 API (41) —— RatingBar.OnRatingBarChangeListener
    Android 中文 API (30) —— CompoundButton.OnCheckedChangeListener
    Android 中文 API (24) —— MultiAutoCompleteTextView.CommaTokenizer
  • 原文地址:https://www.cnblogs.com/Seanit/p/4620743.html
Copyright © 2020-2023  润新知