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文件中添加相应的配置。说是零配置,实际上是一次配置便不再需要做其他的配置了。
要实现如我所说的这种方式,需要添加配置如下
<!-- 不进行扫描的包,用,分割,被包含的包,将不会被扫描成为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插件使用)的更多相关文章
- Struts2的零配置和rest插件
1. 零配置使用struts2-convention-plugin-2.3.16.jar,rest使用struts2-rest-plugin-2.3.16.jar 1.1 Struts2的conven ...
- struts 多文件上传 annotation注解(零配置)+ ajaxfileupload + 异步 版本
[本文简介] struts 多文件上传.基于”零配置“+"ajaxfileupload" 的一个简单例子. [导入依赖jar包] jquery-1.7.2.js : http:// ...
- Spring 基于注解零配置开发
本文是转载文章,感觉比较好,如有侵权,请联系本人,我将及时删除. 原文网址:< Spring 基于注解零配置开发 > 一:搜索Bean 再也不用在XML文件里写什么配置信息了. Sprin ...
- struts2的零配置
最近开始关注struts2的新特性,从这个版本开始,Struts开始使用convention-plugin代替codebehind-plugin来实现struts的零配置.配置文件精简了,的确是简便了 ...
- Hibernate4之注解零配置
@Entity ,注册在类头上,将一个类声明为一个实体bean(即一个持久化POJO类) . @Table ,注册在类头上,注解声明了该实体bean映射指定的表(table). @Id用来注册主属性, ...
- Spring3注解零配置
我们在以前学习 Spring 的时候,其所有的配置信息都写在 applicationContext.xml 里,大致示例如下: java代码: 查看复制到剪贴板打印 OracleDriver& ...
- spring bean的介绍以及xml和注解的配置方法
5.Bean 下边我们来了解一下Bean的: Bean的作用域Bean的生命周期Bean的自动装配Resources和ResourceLoader 5.1Bean容器的初始化 Bean容器的初始化 两 ...
- Spring学习笔记(14)——注解零配置
我们在以前学习 Spring 的时候,其所有的配置信息都写在 applicationContext.xml 里,大致示例如下: java代码: <beans> <bean n ...
- Struts2 Convention Plugin ( struts2 零配置 )
Struts2 Convention Plugin ( struts2 零配置 ) convention-plugin 可以用来实现 struts2 的零配置.零配置的意思并不是说没有配置,而是通过约 ...
随机推荐
- storm源码之storm代码结构【译】
storm源码之storm代码结构[译] 说明:本文翻译自Storm在GitHub上的官方Wiki中提供的Storm代码结构描述一节Structure of the codebase,希望对正在基于S ...
- 开启和禁用Wifi热点命令
netsh wlan set hostednetwork mode=allow ssid=[无线网络名字] key=[密码] netsh wlan start hostednetwork --启用 禁 ...
- phantomjs初次认识
phantomjs初次认识 最近没什么重要的任务,就抽空看了看项目组爬虫小组的代码,因为我们的爬虫主要是以python的scrapy框架为主,看起来比较方便.在看代码的时候看到一个叫phantomjs ...
- JavaScript正则表达式的坑很深
Javascript的正则表达式,不能不说方便,简简单单“//”就可以声明一个RegExp对象,配合编辑器的颜色渲染,实在让人舒心.但过于方便的东西,必然也会有一些瑕疵需要我们去注意. 首先要说的是使 ...
- 使用easy_install进行模块/包管理
使用easy_install进行模块/包管理 今天在阅读以前项目代码时,发现里面使用的第三方模块的参数相当诡异,总是对不上.经过分析之后,发现是自己安装的第三方模块跟项目使用的版本不一致.在Pytho ...
- mysql 建表 AUTO_INCREMENT , 数据类型 VARCHAR
建表: 原帖地址: http://blog.sina.com.cn/s/blog_5da3d5c50100bjh0.html MySQL AUTO_INCREMENT 简介 (2009-01-02 1 ...
- VIM 多行输入 数字递增 新方法 循环记录法
采用的是mario register这个方法,然后,把一段 auto-increament 操作记录下来,然后playback 循环往复多次.就达到了,每行都递增的目的. 我写的文字如下: vim 输 ...
- ZOJ 1204 一个集合能组成多少个等式
Additive equations Time Limit : 20000/10000ms (Java/Other) Memory Limit : 65536/32768K (Java/Other ...
- QTime中currentTime()的使用方法
QTime中currentTime()的使用方法 QTime是Qt中一个处理时间的类,其成员函数currentTime()是最经常用到函数,下面举例说明该成员函数如何使用. 1. 包含头文件 #inc ...
- (转)Tomcat 配置成https协议
Tomcat 配置成https协议 TomcatXMLServlet 在命令提示符窗口,进入Tomcat目录,执行以下命令: keytool -genkey -alias tomcat -keyal ...