zoukankan      html  css  js  c++  java
  • 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提供的插件,大部分的规则还是得顺着插件来,规则的制定者还是要收到插件的规则约束的。

  • 相关阅读:
    观察者模式
    简单工厂
    一个数组先按值排序,如果它的值有相同,就再按键排序(转)
    Python 一些好玩的函数
    python 一些基础知识
    python3 写CSV文件多一个空行的解决办法
    pandas学习笔记
    pycharm2017.1破解方法
    python的Debug调试
    python中字典的陷阱
  • 原文地址:https://www.cnblogs.com/Seanit/p/4620743.html
Copyright © 2011-2022 走看看