Struts2 Convention Plugin ( struts2 零配置 )
convention-plugin 可以用来实现 struts2 的零配置。
零配置的意思并不是说没有配置,而是通过约定大于配置的方式,大量通过约定来调度页面的跳转而使得配置大大减少。
考虑到某种因素,这里采用 myeclipse 作为示例 IDE,环境 :
web.xml
struts.xml
<constant name="struts.devMode" value="true"/> <!-- 开发模式 --> <constant name="struts.i18n.encoding" value="UTF-8"/> <!-- Web运用编码 --> <constant name="struts.convention.result.path" value="/view/" /> <!-- 搜索视图资源的路径 --> <constant name="struts.convention.action.name.separator" value="_" /> <!-- Action类名分隔符 --> <constant name="struts.convention.classes.reload" value="true" /> <!-- convention类重加载 --> <constant name="struts.convention.action.suffix" value="Action" /> <!-- Action后缀名 --> <constant name="struts.action.extension" value="action,do,html,htm,php,aspx" /> <!-- Action扩展名 --> <constant name="struts.convention.package.locators" value="action,actions" /> <!-- 搜索Action资源的包路径 --> </struts>
convention 几项重要配置 :
Action 类后缀名 : <constant name="struts.convention.action.suffix" value="Action" />
继承了 struts2 的 ActionSupport 类的类不是一个普通的类,它具有能够处理请求和对请求作出响应的能力,
通常,开发者常常为这种特殊的类起一个后缀名,以区分一般普通的类。例如,xxAction,xxController,
这里的类名的后缀 Action,Controller 就是对应上面配置中的 value 的值,这个值会在发起 URL 请求的时候被截去。例如 : TestAction ---> test
Action类扩展名 [多项以逗号隔开] : <constant name="struts.action.extension" value="action,do,html,htm,php,aspx" /> 与文件的扩展名相似的,例如 : TestAction ---> test.action 或 test.do 或 test.html 或 test.php 或 test.aspx 或 ...
注意 : 若该项被配置,则,访问所有的 Action 都需带上 Action 的扩展名,否则客户端将抛出 404 ERROR
Action类名分隔符 : <constant name="struts.convention.action.name.separator" value="_" />
若 Action 类名中出现驼峰标识的串,则用分隔符来切割串,如 HelloWorldAction ---> hello_world
搜索 Action 资源的包路径 [多项以逗号隔开] : <constant name="struts.convention.package.locators" value="action,actions" /> 只有当包名含有以上配置中 value 值中至少一项时,convention plugin 才能搜索找得到该 Action,
否则就算访问的 Action 是存在的,convention plugin 也无法找得到该 Action
注意 : 若包名不是以上列出现过的串结束,则后面的串相当于该包下所有 Action 访问的命名空间 ( 以下面的 LoginAction 作为示例 )。
搜索视图资源(JSP,freemarker,等)的路径 : <constant name="struts.convention.result.path" value="/view/" />
所有的视图资源都需放在配置指定的文件夹路径下,否则,就算结果视图是真实存在的,convention plugin 也无法找得到该视图。默认值是 /WEB-INF/content/
demo 结构图 :
convention 约定 :
1. [ Action 不存在的情况 ] 若 convention plugin 在包搜索路径中搜索不到与请求的 URL 相匹配的 Action,则会到视图的搜索路径下搜索
与请求的 URL 相匹配的视图资源,若还搜索不到,则抛出 no Action mapped Exception
示例 :
view/hello_world.jsp [ 没有与之匹配的 Action 类 ]

2. [ Action 的 execute 方法或动态方法调用的情况 ] 如请求 name!method.action,若 NameAction 存在,且 NameAction 中存在 method 这样一个方法,
则根据 method 方法返回的字符串,结果的视图资源名称规则 ( 视图以 JSP 文件为例 ) :
① success -----> name.jsp 或 name_success.jsp ; 若这两个视图同时存在,则 convention plugin 会选择 name_success.jsp 作为视图来展示
② 非 success 的任意串 string -----> name_string.jsp
示例 :
import com.opensymphony.xwork2.ActionSupport; /** * ----------------------------------------- * @描述 TODO * @作者 fancy * @邮箱 fancydeepin@yeah.net * @日期 2012-10-26 <BR> * ----------------------------------------- */ public class SayHelloAction extends ActionSupport{
private static final long serialVersionUID = 1L;
private String message; public String execute(){ message = "Hello struts2 convention plugin!"; return SUCCESS; } public String say(){ message = "SayHelloAction, say"; return "world"; } public String sayHello(){ message = "SayHelloAction, sayHello"; return "conventionPlugin"; }
public String getMessage() { return message; } }
view/say_hello.jsp
view/say_hello_world.jsp
view/say_hello_conventionPlugin.jsp



convention 注解 :
@ParentPackage : 对应于 struts.xml 常量配置项的 <constant name="struts.convention.default.parent.package" value="xx"/> 默认值是 convention-default
@ResultPath : 对应于 struts.xml 常量配置项的 <constant name="struts.convention.result.path" value="xx" /> 默认值是 /WEB-INF/content/
@Namespace : Action 访问的命名空间,该注解一旦声明,结果的视图资源需放在 : 视图搜索目录/命名空间 ( 如 : view/simple/demo.jsp )
import org.apache.struts2.convention.annotation.Namespace; import org.apache.struts2.convention.annotation.ParentPackage; import org.apache.struts2.convention.annotation.ResultPath; import com.opensymphony.xwork2.ActionSupport; /** * ----------------------------------------- * @描述 TODO * @作者 fancy * @邮箱 fancydeepin@yeah.net * @日期 2012-10-26 <BR> * ----------------------------------------- */ @ParentPackage("convention-default") @Namespace("/simple") @ResultPath("/view/") public class DemoAction extends ActionSupport{
private static final long serialVersionUID = 1L; private String message; public String execute(){ message = "DemoAction"; return SUCCESS; }
public String getMessage() { return message; } }
view/simple/demo.jsp

@Action
import org.apache.struts2.convention.annotation.Action; import com.opensymphony.xwork2.ActionSupport; /** * ----------------------------------------- * @描述 TODO * @作者 fancy * @邮箱 fancydeepin@yeah.net * @日期 2012-10-26 <BR> * ----------------------------------------- */ public class ActionannotationAction extends ActionSupport{
private static final long serialVersionUID = 1L; private String message; @Action("invoke") public String invokeMethod(){ message = "ActionannotationAction, invokeMethod"; return SUCCESS; }
public String getMessage() { return message; } }
view/invoke.jsp

@Result,@Results
import java.util.Random; import org.apache.struts2.convention.annotation.Action; import org.apache.struts2.convention.annotation.Result; import org.apache.struts2.convention.annotation.Results; import com.opensymphony.xwork2.ActionSupport; /** * ----------------------------------------- * @描述 TODO * @作者 fancy * @邮箱 fancydeepin@yeah.net * @日期 2012-10-26 <BR> * ----------------------------------------- */ @Results({@Result(name = "success", location = "result.jsp")}) public class ResultAction extends ActionSupport{
private static final long serialVersionUID = 1L; private String message; public String execute(){ message = "ResultAction, execute"; return SUCCESS; } @Action(value = "doIt", results = { @Result(name = "isTrue", location = "result_true.jsp"), @Result(name = "isFalse", location = "result_false.jsp") } ) public String doExecute(){
message = "doExecute isFalse."; if(new Random().nextBoolean()){ message = "doExecute isTrue."; return "isTrue"; } return "isFalse"; }
public String getMessage() { return message; } }
view/result.jsp
view/result_true.jsp
view/result_false.jsp



The last example
import com.opensymphony.xwork2.ActionSupport; /** * ----------------------------------------- * @描述 TODO * @作者 fancy * @邮箱 fancydeepin@yeah.net * @日期 2012-10-26 <BR> * ----------------------------------------- */ public class LoginAction extends ActionSupport{
private static final long serialVersionUID = 1L; private String username; private String password;
public String log(){ username = username.intern(); password = password.intern(); if(username == "admin" && password == "fancy"){ return SUCCESS; } return ERROR; }
public void setUsername(String username) { this.username = username; }
public void setPassword(String password) { this.password = password; } }
view/admin/login_success.jsp
view/admin/login_error.jsp


文章转自:http://www.blogjava.net/fancydeepin/archive/2012/10/26/struts2_convention_plugin.html
Struts2 Convention Plugin ( struts2 零配置 )的更多相关文章
- struts2采用convention-plugin实现零配置
最近开始关注struts2的新特性,从这个版本开始,Struts开始使用convention-plugin代替codebehind-plugin来实现struts的零配置. 配置文件精简了,的确是简便 ...
- Convention插件 struts零配置
http://blog.csdn.net/spyjava/article/details/13631961系列课程使用 注解:http://www.yiibai.com/struts_2/struts ...
- 菜鸟学Struts2——零配置(Convention )
又是周末,继续Struts2的学习,之前学习了,Struts的原理,Actions以及Results,今天对对Struts的Convention Plugin进行学习,如下图: Struts Conv ...
- 从struts2.1开始Convention零配置
从struts2.1开始,struts2不再推荐使用Codebehind作为零配置插件,而是改为使用Convention插件来支持零配置,和Codebehind相比,Convention插件更彻底,该 ...
- struts2 Convention插件零配置,使用注解开发
从struts21开始,struts2不再推荐使用codebehind作为零配置插件,而是改用Convention插件来支持零配置.与以前相比较,Convention插件更彻底. 使用Conventi ...
- Struts2 注解零配置方法(convention插件使用)
最近接触到一个新的项目,是做一个使用S2SH的电子商务商城的二次开发.之前使用过S2SH,在此之前的项目中,Struts2 使用的是XML配置而这个项目是使用注解.在这个项目中,注解还不需要使用Act ...
- spring+hibernate+struts2零配置整合
说句实话,很久都没使用SSH开发项目了,但是出于各种原因,再次记录一下整合方式,纯注解零配置. 一.前期准备工作 gradle配置文件: group 'com.bdqn.lyrk.ssh.study' ...
- 13、零配置Struts2开发
Convention 插件 从 Struts 2.1 开始, Struts 可以使用 Convention 插件来支持零配置: Convention 插件完全抛弃配置信息, 不仅不需要使用 strut ...
- Struts2零配置介绍(约定访问)
从struts2.1开始,struts2 引入了Convention插件来支持零配置,使用约定无需struts.xml或者Annotation配置 需要 如下四个JAR包 插件会自动搜索如下类 act ...
随机推荐
- 解决Java线程池任务执行完毕后线程回收问题
转载请注明出处:http://www.cnblogs.com/pengineer/p/5011965.html 对于经常使用第三方框架进行web开发的程序员来说,Java线程池理所 ...
- java中使用SimpleDateFormat实现字符串和日期的相互转换
java中使用SimpleDateFormat实现字符串和日期的相互转换 import java.text.ParseException; import java.text.SimpleDateFor ...
- 为啥要使用Hessian
1.为啥要使用Hessian? 有需求就有市场,挨踢界也是一样,想要实现远程调用,Hessian就应运而生. 场景:有一个后台系统,基本上所有的用户管理都在这个系统里操作,其中有一个方法是添加用户的方 ...
- Linux系统性能测试工具(三)——内存性能综合测试工具lmbench
本文介绍关于Linux系统(适用于centos/ubuntu等)的内存性能综合测试工具-lmbench.内存性能测试工具包括: 内存带宽测试工具——mbw: 内存压力测试工具——memtester: ...
- Python安装模块包
可以利用pycharm安装模块包 使用这种方法安装时,可能会报下面类型的异常 AttributeError: module 'pip' has no attribute 'main' 出现这这样的异常 ...
- systemd 相关及服务启动失败原因
1 查看启用的units systemctl list-unit-files | grep enabled 2 查看指定服务的日志 按服务单元过滤 journalctl -u j 查看j.serv ...
- linux ab 压测
https://www.cnblogs.com/shenshangzz/p/8340640.html https://www.cnblogs.com/shenshangzz/p/8340640.htm ...
- php-fpm参数优化
php-fpm参数优化 2013-11-18 Posted by yeho php-fpm进程设置多少合适,设成动态还是静态? <lnmp一键安装包>中会根据你服务器内存调整php-fpm ...
- 【bzoj4552】【Tjoi2016&Heoi2016】【NOIP2016模拟7.12】排序
题目 在2016年,佳媛姐姐喜欢上了数字序列.因而他经常研究关于序列的一些奇奇怪怪的问题,现在他在研究一个难题,需要你来帮助他.这个难题是这样子的:给出一个1到n的全排列,现在对这个全排列序列进行m次 ...
- 【leetcode】1147. Longest Chunked Palindrome Decomposition
题目如下: Return the largest possible k such that there exists a_1, a_2, ..., a_k such that: Each a_i is ...