最近接触到一个新的项目,是做一个使用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文件中添加相应的配置。说是零配置,实际上是一次配置便不再需要做其他的配置了。

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

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

实例

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

 package com.sean.action;

 import org.apache.struts2.convention.annotation.Result;
import org.apache.struts2.convention.annotation.Results; import com.opensymphony.xwork2.ActionSupport; public class DemoAction extends ActionSupport{ public String index(){
return "index";
} public String index2(){
return SUCCESS;
} public String index3(){
return INPUT;
} public String index4(){
return "test";
}
}
 package com.sean.action;

 import com.opensymphony.xwork2.ActionSupport;

 public class MyDemoAction extends ActionSupport{

     public String index(){
return "index";
}
}

同时创建对应的jsp文件:

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

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

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

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

Struts2 注解零配置方法(convention插件使用)的更多相关文章

  1. Struts2的零配置和rest插件

    1. 零配置使用struts2-convention-plugin-2.3.16.jar,rest使用struts2-rest-plugin-2.3.16.jar 1.1 Struts2的conven ...

  2. struts 多文件上传 annotation注解(零配置)+ ajaxfileupload + 异步 版本

    [本文简介] struts 多文件上传.基于”零配置“+"ajaxfileupload" 的一个简单例子. [导入依赖jar包] jquery-1.7.2.js : http:// ...

  3. Spring 基于注解零配置开发

    本文是转载文章,感觉比较好,如有侵权,请联系本人,我将及时删除. 原文网址:< Spring 基于注解零配置开发 > 一:搜索Bean 再也不用在XML文件里写什么配置信息了. Sprin ...

  4. struts2的零配置

    最近开始关注struts2的新特性,从这个版本开始,Struts开始使用convention-plugin代替codebehind-plugin来实现struts的零配置.配置文件精简了,的确是简便了 ...

  5. Hibernate4之注解零配置

    @Entity ,注册在类头上,将一个类声明为一个实体bean(即一个持久化POJO类) . @Table ,注册在类头上,注解声明了该实体bean映射指定的表(table). @Id用来注册主属性, ...

  6. Spring3注解零配置

    我们在以前学习 Spring 的时候,其所有的配置信息都写在 applicationContext.xml 里,大致示例如下: java代码: 查看复制到剪贴板打印     OracleDriver& ...

  7. spring bean的介绍以及xml和注解的配置方法

    5.Bean 下边我们来了解一下Bean的: Bean的作用域Bean的生命周期Bean的自动装配Resources和ResourceLoader 5.1Bean容器的初始化 Bean容器的初始化 两 ...

  8. Spring学习笔记(14)——注解零配置

    我们在以前学习  Spring  的时候,其所有的配置信息都写在  applicationContext.xml  里,大致示例如下: java代码: <beans> <bean n ...

  9. Struts2 Convention Plugin ( struts2 零配置 )

    Struts2 Convention Plugin ( struts2 零配置 ) convention-plugin 可以用来实现 struts2 的零配置.零配置的意思并不是说没有配置,而是通过约 ...

随机推荐

  1. IOS学习之路十七(通过delegate进行页面传值)

    加入有A B两个页面,要实现从A跳到B的时候把值传过去,现在用delegate协议来实现 在A中定义一个协议,定义一个实现该协议的属性变量 在B中定义一个值(要获得的值类型)和set方法. 要传值B ...

  2. Google开源的Deep-Learning项目word2vec

    用中文把玩Google开源的Deep-Learning项目word2vec   google最近新开放出word2vec项目,该项目使用deep-learning技术将term表示为向量,由此计算te ...

  3. cooking eggs

    1: what is egg? what's the shape of it in details? 2: can egg run like this http://item.taobao.com/i ...

  4. 基于libgdx游戏引擎开发的飞天猫

    闲来没事学学游戏,这是鄙人第一个小游戏——飞天猫 1,基于Android开发的小游戏,至少Android2.2以上的系统. 2,界面简洁,美观,游戏易操作,上手快. 3,可以左右摇摆手机来改变飞天猫的 ...

  5. apache cxf笔记之Spring客户端访问和调用webservice服务

    继续上次的spring服务的问题,这边介绍一种spring配置客户端的方法. 1.src目录下新建client-beans.xml文件 <?xml version="1.0" ...

  6. 【Servlet3.0新特性】第03节_文件上传

    这是一个Web Project 首先是web.xml <?xml version="1.0" encoding="UTF-8"?> <web- ...

  7. [ios]iphone 获取UIWebView内Html方法

    原文:http://blog.csdn.net/diyagoanyhacker/article/details/6564897 获取所有html:NSString *lJs = @"docu ...

  8. java基础IO流综合加习题

    IO流初学者在学习时都有一点迷糊,今天我们就讲讲IO流,希望通过讲解可以帮助大家 IO流分为字节流,字符流,缓冲流.我们只要记住这三个就可以了. 1*字节流有:字节输入流(FileInputStrea ...

  9. PostScript学习:另一种缩写为PS的技术

    1.前言 PostScript是一种编程语言,直译为"后处理脚本"[相对印刷过程而言],学名为页面描述语言.更为详细的解释见维基百科,以及其翻译版百度百科. 值得一提的是,Post ...

  10. PHP多维数组元素操作类

    我的框架里面一个多维数组元素操作类,主要用于读取数组中配置数据,可以通过字符串节点的方式:a.b.c 来获取和设置元素,以及多维数组的覆盖,有需求的可以参考下吧! <?php /** * Cre ...