Struts2 学习笔记——Action开发详解
2017-10-18 00:00
465 查看
对于开发Struts2应用的开发者来说,Action才是应用的核心,我们通过开发不同的业务控制器—Action来处理不同的用户请求逻辑。
实现Action类
Struts2采用了低入侵式的、松耦合设计,开发一个Action类,不需要继承或实现任何Struts2的类或接口。
我们先来看一下标准的Action类的格式:
从上面的结构中我们可以看出这与普通的POJO没有多大区别,唯一的区别就是Action类必须包含一个无参数的、返回字符串的execute()方法。而Action的属性则是与Action要处理的HTTP请求信息中封装的参数对应。
在Struts2中提供了一个Action接口和一个ActionSupport类来帮助我们开发Struts2应用。如果需要我们可以继承他们。
Action接口提供了execute()接口方法和一些常用的表示处理逻辑结果的逻辑视图名。
Action接口结构如下:
实现Action接口能够帮助我们规范Action的开发,对常用的处理结果有着统一规范的作用。
ActionSupport类围绕请求逻辑处理提供了很多方法,如默认处理用户请求、数据校验、错误消息、国际化资源等方面。
Action间接访问ServletAPI
Struts2的Action没有与任何ServletAPI耦合,这就能够方便的测试Action。但是在开发Web应用中,不访问ServletAPI是不可能的。在Struts2中提供了一个ActionContext类来帮助我们访问ServletAPI。
下面是关于我们常要访问ServletAPI的一些方法:
Action直接访问ServletAPI
Struts2还提供了两种方式直接访问ServletAPI。
1、 实现相应的接口
Struts2提供了以下接口来访问ServletAPI:
2、 借助于ServletActionContext类
在Struts2中还提供了一个ServletActionContext类,来帮助我们直接访问ServletAPI。
ServletActionContext类中包含了以下静态方法帮我们获得相应的实例对象:
注意:即使我们在Struts2的Action中获得了HttpServletResponse对象,也不要尝试产生对客户端的输出内容信息。
配置Action
Struts2使用包来管理Action信息,所以我们需要在struts.xml文件中使用<action>元素作为<package>元素的子元素来配置Action信息。
一个完整的Action信息如下格式:
在配置Action信息,class属性可以省略,这时默认的实现类为ActionSupport类。
name属性:Action的名称,其属性值对应着它所处理URL的前半部分。
如:http://localhost://8080/Strurs2Demo/index.action
我们看到Action类的execute方法在处理完请求逻辑后返回一个字符串,这个字符串只是一个逻辑视图名,和实际的物理视图资源没有任何关联。为了让Struts2能够找寻到请求逻辑后响应的具体物理资源,我们需要使用<action>元素的子元素<result>元素来表述逻辑视图与物理视图资源的关联关系。
动态方法调用
到目前为止我们知道了如何编写一个Action类,配置Action信息。但是这个Action只能处理一个请求,如何能够像Struts1那样继承了DispatchAction后,能够一个Action类处理多个请求逻辑?
在Struts2中是使用动态方法调用技术来解决这个问题的。下面我们就来看看如何实现的:
为了让Struts2开启动态调用功能,我们需要将Struts2常量struts.enable.DynamicMethodInvocation的值设置为true如下:
有两种方式可以实现动态调用,来达到一个Action类处理多个请求逻辑能。
方式一:为<action>元素指定method属性。如:
但是这样我们发现这两个Action的配置信息绝大部分相同,因此这种配置相当冗余。为了解决这个问题,Struts2还提供了另外一种形式的动态方法调用。
方式二:使用通配符
在配置Action信息是,我们需要指定name,class,method属性,这3个属性都可支持通配符,这种通配符的方式就是另一种动态方法调用。
如:
这个配置表明只要以*Action结尾的请求都可以处理。比如aAction.action、abcAction.action。
比如:LoginAction.action请求会被org.struts2.samples1.LoginAction实例的Login方法处理。
比如:Book_save.action请求会被org.struts2.samples1.BookAction实例的save方法处理。
我们还可以通过使用通配符来配置一个能够处理任何请求的通用Action。如:
现在我们会碰到如下问题:在处理用户请求时,我们能够找到多个匹配的、符合条件处理这个请求的Action配置信息,这时怎么选择呢?请看下面实例代码:
当请求http://localhost:8888/Struts2Demo/regist.action到达时,我们可以看出上述的3个action都可以处理这个请求信息,但是Struts2会采用什么策略来确定选择使用哪一个action来处理这个请求呢。
会采用以下策略:
Struts2会扫描struts.xml文件中是否有名为regist的Action,如果有则使用此Action处理,如果没有,则会查找与regist匹配的action,这时会找到两个匹配的信息,即名称为”*”的通用Action和名称为”*Action”的Action,然后会按照顺序选择第一个找到的Action来处理请求。
由此可见,我们需要将通用的Action配置放到最后,否则它将处理除了请求与action名绝对相同之外的所有的请求。
方式三:使用Struts2默认约定格式的URL请求< xmlnamespace prefix ="o" ns ="urn:schemas-microsoft-com:office:office" />
我们可以使用下列格式的请求来达到一个Action处理不同业务逻辑的效果。
url = 请求前缀+action名!方法名.处理请求后缀的格式。
比如:http://locahost:8888/Demo/LoginAction!login.action这样一条请求。
表示需要名为LoginAction的Action的login方法来处理这个请求。
配置默认的Action
在Struts2找不到请求与action名绝对相同的Action,也找不到使用通配符能够匹配的Action是就会调用默认的Action来处理请求。也就是说在有通用Action配置的情况下会先调用通用Action来处理请求。
Action的处理结果
我们知道Action只是一个处理用户请求的控制器,他不能也不应该提供处理响应信息。他只提供一个处理结果的逻辑字符串,对应的具体的响应信息则由Struts2查找逻辑视图名对应的物理资源来产生响应信息。
在struts.xml文件中我们使用<result>元素来配置处理结果。
处理结果分为两种类型:
局部处理结果:将<result>元素作为<action>元素的子元素来配置。
全局处理结果:将<result>元素作为<global-results>元素的子元素来配置。如:
下面为<result>元素完整属性配置格式:
其中:
通常无需指定parse,所以可以简写为:
Struts2支持处理的14中结果类型:默认dispatcher类型,即jsp资源视图。
具体详细的说明请参考响应的资料了解。
使用通配符配置处理结果:
与Action配置信息支持通配符一样,处理结果也支持通配符。如:
使用ONGL表达式结合请求参数来获得处理结果:
以ONGL表达式,即${属性名.属性名.属性名…}再结合请求中的请求参数共同组合成一个实际的视图资源。如:
实现Action类
Struts2采用了低入侵式的、松耦合设计,开发一个Action类,不需要继承或实现任何Struts2的类或接口。
我们先来看一下标准的Action类的格式:
public class 类名 { private String 属性1; private String 属性2; ... ... 属性对应的get和set方法 public String execute() throws Exception { return 逻辑视图字符串; } } |
在Struts2中提供了一个Action接口和一个ActionSupport类来帮助我们开发Struts2应用。如果需要我们可以继承他们。
Action接口提供了execute()接口方法和一些常用的表示处理逻辑结果的逻辑视图名。
Action接口结构如下:
public interface Action { public static final String SUCCESS = "success"; public static final String NONE = "none"; public static final String ERROR = "error"; public static final String INPUT = "input"; public static final String LOGIN = "login"; public String execute() throws Exception; } |
ActionSupport类围绕请求逻辑处理提供了很多方法,如默认处理用户请求、数据校验、错误消息、国际化资源等方面。
Action间接访问ServletAPI
Struts2的Action没有与任何ServletAPI耦合,这就能够方便的测试Action。但是在开发Web应用中,不访问ServletAPI是不可能的。在Struts2中提供了一个ActionContext类来帮助我们访问ServletAPI。
下面是关于我们常要访问ServletAPI的一些方法:
方法名 | 说明 |
public Object get(String key) | 类似于调用HttpServletRequest的getAttribute(String name)方法。 |
public Map<String, Object> getApplication() | 返回一个Map对象,类似于获得ServletContext对象 |
public static ActionContext getContext() | 获得ActionContext实例 |
public Map<String, Object> getParameters() | 类似于调用HttpServletRequest的getParameterMap()方法。 取得值是一个String[]类型的值 |
public Map<String, Object> getSession() | 返回一个Map对象,类似于获得HttpSession对象 |
Struts2还提供了两种方式直接访问ServletAPI。
1、 实现相应的接口
Struts2提供了以下接口来访问ServletAPI:
接口 | 说明 |
ServletContextAware | 实现该接口,就可以直接访问Web应用的ServletContext对象实例。 |
ServletRequestAware | 实现该接口,就可以直接HttpServletRequest对象实例。 |
ServletResponseAware | 实现该接口,就可以直接HttpServletResponse对象实例。 |
在Struts2中还提供了一个ServletActionContext类,来帮助我们直接访问ServletAPI。
ServletActionContext类中包含了以下静态方法帮我们获得相应的实例对象:
静态方法名 | 说明 |
PageCotext getPageContext() | 获得PageCotext对象 |
HttpServletRequest getRequest() | 获得HttpServletRequest对象 |
HttpServletResponse getResponse () | 获得HttpServletResponse对象 |
ServletContext getServletContext() | 获得ServletContext对象 |
配置Action
Struts2使用包来管理Action信息,所以我们需要在struts.xml文件中使用<action>元素作为<package>元素的子元素来配置Action信息。
一个完整的Action信息如下格式:
<package name="sample1" extends="struts-default"> <action name="index" class="org.struts2.samples1.HelloWorld"> <result name="success">/index.jsp</result> </action> </package> |
name属性:Action的名称,其属性值对应着它所处理URL的前半部分。
如:http://localhost://8080/Strurs2Demo/index.action
我们看到Action类的execute方法在处理完请求逻辑后返回一个字符串,这个字符串只是一个逻辑视图名,和实际的物理视图资源没有任何关联。为了让Struts2能够找寻到请求逻辑后响应的具体物理资源,我们需要使用<action>元素的子元素<result>元素来表述逻辑视图与物理视图资源的关联关系。
动态方法调用
到目前为止我们知道了如何编写一个Action类,配置Action信息。但是这个Action只能处理一个请求,如何能够像Struts1那样继承了DispatchAction后,能够一个Action类处理多个请求逻辑?
在Struts2中是使用动态方法调用技术来解决这个问题的。下面我们就来看看如何实现的:
为了让Struts2开启动态调用功能,我们需要将Struts2常量struts.enable.DynamicMethodInvocation的值设置为true如下:
<constant name="struts.enable.DynamicMethodInvocation" value="true"></constant> |
方式一:为<action>元素指定method属性。如:
<action name="login" class=" org.struts2.samples1.LoginRegistAction"> <action name="regist" class=" org.struts2.samples1. LoginRegistAction "> |
方式二:使用通配符
在配置Action信息是,我们需要指定name,class,method属性,这3个属性都可支持通配符,这种通配符的方式就是另一种动态方法调用。
如:
<action name="*Action" class=" org.struts2.samples1.LoginRegistAction"> |
比如:LoginAction.action请求会被org.struts2.samples1.LoginAction实例的Login方法处理。
<action name="*Action" class="org.struts2.samples1.{1}Action" method="{1}"> |
<action name="*_*" class="org.struts2.samples1.{1}Action" method="{2}"> |
<action name="*"><result>/{1}.jsp</result></action> |
<package name="sample" extends="struts-default"> <action name="*" class="org.struts2.samples.OneAction"> <result name="success">/welcome.jsp</result> </action> <action name="*Action" class="org.struts2.samples.TwoAction"> <result name="success">/welcome.jsp</result> </action> <action name="threeAction" class="org.struts2.samples.ThreeAction"> <result name="success">/welcome.jsp</result> </action> </package> |
会采用以下策略:
Struts2会扫描struts.xml文件中是否有名为regist的Action,如果有则使用此Action处理,如果没有,则会查找与regist匹配的action,这时会找到两个匹配的信息,即名称为”*”的通用Action和名称为”*Action”的Action,然后会按照顺序选择第一个找到的Action来处理请求。
由此可见,我们需要将通用的Action配置放到最后,否则它将处理除了请求与action名绝对相同之外的所有的请求。
方式三:使用Struts2默认约定格式的URL请求< xmlnamespace prefix ="o" ns ="urn:schemas-microsoft-com:office:office" />
我们可以使用下列格式的请求来达到一个Action处理不同业务逻辑的效果。
url = 请求前缀+action名!方法名.处理请求后缀的格式。
比如:http://locahost:8888/Demo/LoginAction!login.action这样一条请求。
表示需要名为LoginAction的Action的login方法来处理这个请求。
配置默认的Action
<default-action-ref name="defaultAction"></default-action-ref> <action name="defaultAction" class="org.struts2.samples.DefaultAction"> <result name="success">/welcome.jsp</result> </action> |
Action的处理结果
我们知道Action只是一个处理用户请求的控制器,他不能也不应该提供处理响应信息。他只提供一个处理结果的逻辑字符串,对应的具体的响应信息则由Struts2查找逻辑视图名对应的物理资源来产生响应信息。
在struts.xml文件中我们使用<result>元素来配置处理结果。
处理结果分为两种类型:
局部处理结果:将<result>元素作为<action>元素的子元素来配置。
全局处理结果:将<result>元素作为<global-results>元素的子元素来配置。如:
<global-results> <result name="success">/${result}.jsp</result> <result name="error">/error.jsp</result> </global-results> |
<result name="逻辑视图名" type="结果类型"> <param name="location">实际视图资源</param> <param name="parse">true</param> </result> |
属性 | 说明 |
name | 逻辑视图名 |
type | 结果类型,Struts2支持14中类型的结果类型 |
loaction | 指定逻辑视图名对应的实际视图资源 |
parse | 指定了是否允许在实际试图资源名中是否能够使用ONGL表达式。默认值为true。通常无需修改此属性的值。 |
<result name="逻辑视图名" type="结果类型">实际视图资源</result> |
类型 | 说明 |
chain | Action链式处理结果 |
chart | 用于处理JfreeChart类型的视图资源 |
dispatcher | 用于处理JSP视图资源 |
freemarker | 用于FreeMarker视图资源 |
httpheader | 用于控制特殊的Http行为的视图资源 |
jasper | 用于JasperReports视图资源 |
jsf | 用于JSF的结果类型视图资源 |
redirect | 用于直接跳到其他URL视图资源 |
redirect-action | 用于直接跳转到其他的Action视图资源 |
stream | 用于流类型的视图资源 |
tiles | 用于Tiles类型视图资源 |
velocity | 用于Velocity类型视图资源 |
xslt | 用于XML/XSLT类型视图资源 |
plaintext | 用于显示某个页面源码的视图资源 |
使用通配符配置处理结果:
与Action配置信息支持通配符一样,处理结果也支持通配符。如:
<action name="*Action" class="org.struts2.samples.TwoAction"> <result name="success">/{1}.jsp</result> </action> |
以ONGL表达式,即${属性名.属性名.属性名…}再结合请求中的请求参数共同组合成一个实际的视图资源。如:
<action name="load" class="org.struts2.samples.TwoAction"> <result name="success" type=”redirect”>/edit.action?name=${user.name}</result> </action> |
相关文章推荐
- Struts2 学习笔记——Action开发详解
- Struts2 学习笔记——Action开发详解
- struts2学习笔记 -- day01struts开发包详解、入门案例环境搭建
- Dynamic CRM 2013学习笔记(三十八)流程1 - 操作(action)开发与配置详解
- [原创]java WEB学习笔记55:Struts2学习之路---详解struts2 中 Action,如何访问web 资源,解耦方式(使用 ActionContext,实现 XxxAware 接口),耦合方式(通过ServletActionContext,通过实现 ServletRequestAware, ServletContextAware 等接口的方式)
- Struts2.x--学习笔记之页面对象数据传递 详解
- IOS开发学习笔记(2)-----UIButton 详解(原创)
- Android开发学习笔记:TextView的属性详解
- struts2系列学习笔记(6)---------------Action的结果处理
- Struts2学习笔记之struts.xml配置常量和Action处理流程
- struts2学习笔记二--准备struts2的学习和开发环境
- Struts2学习笔记5_Action的搜索顺序
- IOS开发学习笔记(2)-----UIButton 详解
- Android开发学习笔记:5大布局方式详解
- Struts2学习笔记2-搭建开发环境3步走
- Struts2学习笔记之开发环境搭建
- 框架学习之Struts2 第二节 Action的详解
- Struts2学习笔记之开发环境搭建
- Struts2学习笔记之与struts.xml配置和Action有关的属性
- LifeRay Portal 6学习笔记6:使用Struts2开发Portlet