- 浏览: 308847 次
最新评论
-
nucleus:
为什么都是没有图的。。。。。。。求图片啊
《研磨struts2》第七章 值栈和OGNL 之 7.4 ActionContext和ServletActionContext -
nucleus:
为什么都是没有图的。。。。。。。求图片啊
《研磨struts2》第七章 值栈和OGNL 之 7.4 ActionContext和ServletActionContext -
nucleus:
为什么都是没有图的。。。。。。。求图片啊
《研磨struts2》第七章 值栈和OGNL 之 7.4 ActionContext和ServletActionContext -
nucleus:
为什么都是没有图的。。。。。。。求图片啊
《研磨struts2》第七章 值栈和OGNL 之 7.4 ActionContext和ServletActionContext -
hunanjun000:
《研磨struts2》第四章 Action 之 4.5 Action的其它重要知识
21.2 约定大于配置
21.2.1 约定大于配置的HelloWorld
先来做一个示例,让大家体会一下什么是约定大于配置。
1:Convention Plugin
从Struts2.1版本起,Struts2官方就推荐使用Convention Plugin替换Codebehind Plugin来实现零配置。相对Codebehind Plugin而言,Convention Plugin有如下一些特点:
- 通过包的命名习惯来指定Action的位置
- 通过命名习惯来约定Result(包括Jsp、FreeMarker等)的路径
- 类名对应于URL的约定转换
- 包名对应于命名空间的约定转换
- 遵循SEO规范的链接地址,比如:使用test-action来替换TestAction
- 基于注解的Action名称约定
- 基于注解的拦截器约定
- 基于注解的命名空间约定
- 基于注解的XWork包
- 默认action以及默认的Result
等等。总之,使用Convention Plugin来实现零配置,会更灵活、更彻底,基本上可以做到不需要struts.xml来进行配置,甚至不需要注解进行配置,完全由Struts2依靠约定进行自动配置即可。
2:设置环境
要使用Convention Plugin,需要把struts2-convention-plugin-2.1.8.1.jar包拷贝到web工程的WEB-INF\lib包里面。
3:最简单的HelloWorld
要示范零配置,当然首先去掉struts.xml文件,缺省情况下,Convention Plugin会约定所有的结果页面都存放在WEB-INF\content文件夹下。
在WEB-INF文件夹下新建一个content文件夹,然后在content文件夹下新建一个名称为helloworld.jsp的文件,内容示例如下:
访问的方式是:在web上下文后面直接访问这个页面,不用加后缀,直接用名字就可以了,也就是URL为:http://localhost:9080/helloworld/helloworld,运行结果如下:
图21.1 约定配置示例
4:说明
在这个HelloWorld里面,根本就没有写Action,当然也不存在struts.xml文件,完全是按照Convention Plugin的约定来运行,直接到WEB-INF/content文件夹下面,根据请求的url来找到对应的helloworld.jsp,然后直接运行这个页面就得到了如上的运行结果。
那么对于Convention Plugin来说,到底有哪些约定呢?
21.2.2 常见的约定
1:默认把所有的结果页面都存储在WEB-INF/content文件夹下,这个值可以通过在struts.xml或者struts.properties文件中设置struts.convention.result.path这个属性的值来改变到其他路径。示例如下:
这样就将默认的result页面路径设置到了WEB-INF/mypage文件夹里面。
2:在应用启动的时候,Convention插件会自动搜索位于action、actions、struts、struts2的包及其子包下的所有Java类,以搜索Action类。
可以通过在struts.xml或者struts.properties文件中设置struts.convention.package.locators这个属性的值来改变搜索的文件夹。示例如下:
上面的示例定义了:在项目中,包路径中包含web和s2的将被视为包含Action类的路径而被搜索。
3:在应用启动的时候,Convention插件在上述包及其子包的路径下搜索满足如下条件的类来作为Action类:
(1) 实现com.opensymphony.xwork2.Action的类
(2) 类名以Action结尾的Java类
比如:在cn.javass.testproject.action包下面,有一个HelloAction的类,那么Convention插件会自动把这个HelloAction类当作Action来进行处理。
4:在映射Action的名称的时候,通常遵循如下规则:
(1) 如果该Action类名以Action作为后缀,那么会将后缀的Action去掉,其他的不做处理。
(2) 如果该Action类名采用驼峰式的写法,也就是每个单词首字母大写的写法,那么需要把所有字母变成小写,单词与单词之间以中画线隔开。
比如有一个Action的名称为HelloWorldAction,那么对应的映射资源的名称为hello-world。
(3) 如果是单个词的Action名称,那么把它的所有字母变成小写,作为对应的映射资源的名称。比如Action类名为HelloAction,它是以Action作为后缀的,那么对应的映射资源的名称为先去掉Action后缀,得到Hello,又是单个词的名称,变成小小,那么最终对应的映射资源的名称为hello。
5:命名空间:
从定义的package.locators开始到包结束的部分,就是命名空间。比如有一个Action类位于如下包中:cn.javass.testproject.action.t1.t2,那么命名空间就是/t1/t2。
命名空间对应着访问的url中的path部分,位于web上下文之后,具体的资源名称之前的部分,比如访问的url为:http://localhost:9080/helloworld/t1/t2/hello-world,其中的helloworld就是web上下文,而后面的hello-world就是要访问的资源的名称,中间的/t1/t2就是url的path部分。
命名空间还对应着WEB-INF/content文件夹下的子文件夹路径,如果命名空间为/t1/t2,那就以为着对应的result页面,应该放在WEB-INF/content/t1/t2文件夹下。
6:对应resutl页面的约定:
(1) Result页面默认的都以WEB-INF/content作为定位的起点。
(2) 如果没有对应的Action存在,那么访问资源的名称就直接和页面的名称对应,要注意都是小写的
(3) 如果有对应的Action存在,那么对应的方式是:优先按照“Action的URL+Result的字符串+文件类型的后缀”的方式进行对应,如果没有对应的页面,那么也可以按照“Action的URL+文件类型的后缀”的方式进行对应。
7:Action链的约定
如果一个Action执行完成后,希望进入到另外一个Action,从而形成Action链,基本的约定如下:
(1) 第一个Action返回的result没有对应的页面存在。
(2) 第二个Action和第一个Action在同一个包中,而且第二个Action映射的URL为:第一个Action映射的URL+返回的result字符串,而且名称采用驼峰式的写法,也就是首字母大写。
21.2.3 示例常见的约定
看了上面的约定,感觉如何,很糟糕是不是,这些约定的规则太抽象了,具体怎么使用呢?接下来就通过示例来说明。
1:没有Action的时候,就如同前面约定大于配置的HelloWorld那样,访问的URL为:http://localhost:9080/helloworld/helloworld,由于没有对应的Action,因此直接到WEB-INF的content文件夹下面,寻找名称为“helloworld”,后缀可以为“.jsp”、“.htm”、“.html”等的页面,找到后就直接运行。
2:如果有如下的包结构和类的定义:
图21.2 示例的包结构
(1)如果要运行HelloWorldAction的话,对应的URL应该为:http://localhost:9080/helloworld/t1/t2/hello-world,而且在content文件夹下应该有t1文件夹,t1文件夹下应该有t2文件夹,t2文件夹下应该有相应的result页面,如下图:
图21.3 t2文件夹示例
像这个示例中,同时存在hello-world-success.jsp和hello-world.jsp,那么会优先匹配到hello-world-success.jsp,如果不存在hello-world-success.jsp才匹配hello-world.jsp。
(2)先看看ConventionAction的实现,示例代码如下:
- public class ConventionAction extends ActionSupport{
- public String msg = "";
- public String userId = "";
- public String execute() throws Exception {
- System.out.println("now in ConventionAction");
- if(userId==null || userId.trim().length()==0){
- msg = "用户编号不能为空";
- return "toadd";
- }
- msg = "用户编号输入正确";
- return SUCCESS;
- }
- }
此时在content文件夹下,有如下图所示的页面:
图21.4 content文件夹
如果运行的URL为:http://localhost:9080/helloworld/convention?userId=22,那么会匹配到ConventionAction这个类,运行结束后,返回success。接下来到content文件夹下去优先匹配到convention-success.jsp,然后运行这个页面,展示给用户。
如果运行的URL为:http://localhost:9080/helloworld/convention,那么会匹配到ConventionAction这个类,运行结束后,返回toadd。接下来到content文件夹下去优先匹配到convention-toadd.jsp,然后运行这个页面,展示给用户。
如果此时把convention-toadd.jsp文件去掉,然后再次运行,运行的URL同样为:http://localhost:9080/helloworld/convention,那么会匹配到ConventionAction这个类,运行结束后,返回toadd。接下来到content文件夹下去寻找匹配的页面,没有能匹配上的,那么就会到ConventionAction这个类的同包下,寻找是否有ConventionToaddAction这个类,有这个类,那么就会运行这个类,相当于是Action链了。
私塾在线网站原创《研磨struts2》系列
转自请注明出处:【http://sishuok.com/forum/blogPost/list/0/4184.html】
欢迎访问http://sishuok.com获取更多内容
发表评论
-
研磨struts2 目录贴
2012-08-24 12:12 163321.1 《研磨struts2》 第一章 Struts2 ... -
跟着cc学设计 之 研磨设计模式 视频教程 出炉了
2012-08-15 07:16 2研磨设计模式——跟着CC学设计系列精品课程,上线了! ... -
研磨struts2 目录
2012-07-30 21:15 2471.1 《研磨struts2》 第一章 Strut ... -
研磨struts2 目录
2012-07-30 16:54 361.1 《研磨struts2》 第一章 Stru ... -
《研磨struts2》A.2 struts.properties的配置 之 A.2.1 概述
2012-07-09 12:10 3055A.2.1 概述 如果我们希望覆盖在 ... -
《研磨struts2》附录A Struts2的配置 之 A.1 struts.xml的配置
2012-07-09 12:10 2710A.1 struts.xml的配置 A.1.1 ... -
《研磨struts2》第二十一章 零配置 之 21.3 通过注解来实现零配置
2012-07-06 08:07 291021.3 通过注解来实现零配置 21.3.1 ... -
《研磨struts2》第二十一章 零配置 之 21.1 概述
2012-07-05 10:44 231221.1 概述 21.1.1 零配置概述 在 ... -
《研磨struts2》第二十章 整合SiteMesh 之 20.3 整合Struts2与SiteMesh
2012-07-04 08:15 2072在Struts2中使用SiteMesh ... -
《研磨struts2》第二十章 整合SiteMesh 之 20.2 单独使用SiteMesh
2012-07-03 08:00 209120.2 单独使用SiteMesh 20. ... -
《研磨struts2》第二十章 整合SiteMesh 之 20.1 调整应用的风格
2012-07-03 07:59 185420.1 调整应用的风 ... -
《研磨struts2》19.2 使用execAndWait拦截器模拟进度条 之 19.2.1 模拟长时间运行的Action
2012-07-02 12:24 213719.2.1模拟长时间运行的Action ... -
《研磨struts2》第十九章 进度条 之 19.1 使用“进度条”告知用户进度
2012-07-02 12:23 214019.1 使用“进度条”告知用户进度 ... -
《研磨struts2》第十八章 结合JFreeChart 之 18.3 Struts2结合JFreeChart
2012-06-28 12:12 199918.3 Struts2结合JFreeChart ... -
《研磨struts2》第十八章 结合JFreeChart 之 18.2 Struts2插件概述
2012-06-28 12:11 2020Struts2并没有求大求全,企图把所有 ... -
《研磨struts2》第十八章 结合JFreeChart 之 18.1 JFreeChart使用
2012-06-20 15:48 227718.1 JFreeChart使用 18.1.1概 ... -
研磨struts2(1-10章)电子书下载
2012-06-19 07:30 6057研磨struts2的博客文章 私塾在线学习网 《研 ... -
《研磨struts2》第十七章 防止重复提交 之 17.3 更强大的tokenSession拦截器
2012-06-18 13:46 206717.3 更强大的tokenSession拦截器 ... -
《研磨struts2》第十七章 防止重复提交 之 17.2 使用标签
2012-06-18 13:45 233217.2 使用<s:token/>标签 ... -
《研磨struts2》第十七章 防止重复提交 之 17.1 什么是重复提交
2012-06-18 13:45 214417.1 什么是重复提交 所谓重复提交,就是用户在 ...
相关推荐
这个压缩包中的“研磨Struts2配书视频对应的演示源代码”是《研磨Struts2》一书作者为了帮助读者更好地理解和实践书中理论知识而提供的实际示例代码。 首先,让我们深入理解Struts2的核心概念和技术特性: 1. **...
- **Action类**:Action是Struts2的核心组件之一,负责处理用户的请求。本节将详细讲解Action类的设计原则和实现方法。 - **配置文件**:struts.xml用于配置Action的映射关系以及其他一些设置。本节将详细介绍如何...
由于文件较大,我把这个文档切割为2部分,这是第一部分,请下载完第一部分后一定要下载第二部分,否则不能阅读。
Struts2是一个强大的Java web应用程序开发框架,它基于Model-View-Controller(MVC)设计模式,为开发者提供了构建高效、可扩展且易于维护的Web应用的工具和组件。《研磨Struts2》这本书是专门针对Struts2框架的学习...
根据提供的文件信息,我们可以推断出这是一份关于《研磨Struts 2》书籍PDF版本的下载资源。为了更好地理解和概括这份资料所涉及的知识点,我们先来了解一下Struts 2框架及其重要性,然后深入探讨《研磨Struts 2》这...
研磨Struts2 高清完整版,请和第一部分一起下载啊
Struts2是一个强大的Java web应用程序框架,用于构建MVC(Model-View-Controller)结构的Web应用。这个框架简化了开发过程,提供了丰富的插件和拦截器机制,以支持复杂的应用场景。《研磨Struts2》这本书主要介绍了...
研磨Struts2_12859679_高清完整版
研磨Struts2-高清-完整目录-2011年10月,分享给所有需要的人
第21章 解释器模式(Interpreter) 第22章 装饰模式(Decorator) 第23章 职责链模式(Chain of Responsibility) 第24章 桥接模式(Bridge) 第25章 访问者模式(Visitor) 附录A常见面向对象设计原则 附录...
第21章 解释器模式(Interpreter) 第22章 装饰模式(Decorator) 第23章 职责链模式(Chain of Responsibility) 第24章 桥接模式(Bridge) 第25章 访问者模式(Visitor) 附录A常见面向对象设计原则 附录...
第21章 解释器模式(Interpreter) 第22章 装饰模式(Decorator) 第23章 职责链模式(Chain of Responsibility) 第24章 桥接模式(Bridge) 第25章 访问者模式(Visitor) 附录A常见面向对象设计原则 附录...
第21章 解释器模式(Interpreter) 第22章 装饰模式(Decorator) 第23章 职责链模式(Chain of Responsibility) 第24章 桥接模式(Bridge) 第25章 访问者模式(Visitor) 附录A常见面向对象设计原则 ...
Java工程师三大框架面试题.pdf