最近接触到一个新的项目,是做一个使用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. storm源码之storm代码结构【译】

    storm源码之storm代码结构[译] 说明:本文翻译自Storm在GitHub上的官方Wiki中提供的Storm代码结构描述一节Structure of the codebase,希望对正在基于S ...

  2. 开启和禁用Wifi热点命令

    netsh wlan set hostednetwork mode=allow ssid=[无线网络名字] key=[密码] netsh wlan start hostednetwork --启用 禁 ...

  3. phantomjs初次认识

    phantomjs初次认识 最近没什么重要的任务,就抽空看了看项目组爬虫小组的代码,因为我们的爬虫主要是以python的scrapy框架为主,看起来比较方便.在看代码的时候看到一个叫phantomjs ...

  4. JavaScript正则表达式的坑很深

    Javascript的正则表达式,不能不说方便,简简单单“//”就可以声明一个RegExp对象,配合编辑器的颜色渲染,实在让人舒心.但过于方便的东西,必然也会有一些瑕疵需要我们去注意. 首先要说的是使 ...

  5. 使用easy_install进行模块/包管理

    使用easy_install进行模块/包管理 今天在阅读以前项目代码时,发现里面使用的第三方模块的参数相当诡异,总是对不上.经过分析之后,发现是自己安装的第三方模块跟项目使用的版本不一致.在Pytho ...

  6. mysql 建表 AUTO_INCREMENT , 数据类型 VARCHAR

    建表: 原帖地址: http://blog.sina.com.cn/s/blog_5da3d5c50100bjh0.html MySQL AUTO_INCREMENT 简介 (2009-01-02 1 ...

  7. VIM 多行输入 数字递增 新方法 循环记录法

    采用的是mario register这个方法,然后,把一段 auto-increament 操作记录下来,然后playback 循环往复多次.就达到了,每行都递增的目的. 我写的文字如下: vim 输 ...

  8. ZOJ 1204 一个集合能组成多少个等式

    Additive equations Time Limit : 20000/10000ms (Java/Other)   Memory Limit : 65536/32768K (Java/Other ...

  9. QTime中currentTime()的使用方法

    QTime中currentTime()的使用方法 QTime是Qt中一个处理时间的类,其成员函数currentTime()是最经常用到函数,下面举例说明该成员函数如何使用. 1. 包含头文件 #inc ...

  10. (转)Tomcat 配置成https协议

    Tomcat 配置成https协议 TomcatXMLServlet  在命令提示符窗口,进入Tomcat目录,执行以下命令: keytool -genkey -alias tomcat -keyal ...