【学习笔记】Struts2之一个Action包含多个控制处理逻辑
2013-08-29 20:36
489 查看
一、使用Action的动态方法调用
注意:使用动态方法调用前,必须设置Struts2允许动态方法调用,需要设置struts.enable.DyanmicMethodInvocation常量为true。
二、指定method属性及使用通配符
1)使用method属性
对应的javaScript代码为:
2)使用通配符
在上述的struts.xml文件中,两个Action定义绝大部分相同,可见这种定义相当冗余,为了解决这个问题,Struts2可以使用通配符。
在配置<action ../>时,允许在指定name属性时使用通配符,然后在class、method属性及<result…/>子元素中使用{N}的形式来代表前面第N个星号所匹配的子串。
示例一:
例如,如果请求URL为loginAction.action,则调用LoginAction类的login方法,如果请求URL为registAction.action,则调用LoginAction类的regist方法。
示例二:
例如,如果请求URL为Book_save.action,则对应的处理类为BookAction,处理方法为save方法。
3)对子元素使用通配符
Struts2不仅允许在class属性、name属性中使用表达式,还可以在<result…/>子元素中使用{N}表达式。
上面的Action的定义可以匹配任意的Action,所用的用户请求都可通过Action来处理,因为没有指定class属性,该Action使用ActionSupport来作为处理类,而且因为该ActionSupport类的execute方法返回success字符串, 即该Action总是直接返回result中指定的JSP资源,JSP资源使用表达式来生成资源名。上面Action定义的含义是如果请求a.aciton,则进入a.jsp页面;如果请求b.action,则进入b.jsp页面……
通过这种方式,可以避免让浏览者直接访问系统的JSP页面,而是让Struts2框架来管理所有用户请求。
对于使用Struts2框架的应用而言,尽量不要让超级链接直接连接到某个视图资源,因为这种方式增加了额外的风险。推荐将所有请求都发送给Struts2框架,让框架来处理用户请求,即使只是简单的超级链接。
4)关于因通配符带来的优先级的问题。
假设有URL为abcAction.action的请求,在struts.xml文件中配置了如下三个Action,它们的name的值分别为:abcAction、*Action和*,则这个请求将会被名为abcAction的Action处理。
假设有URL为defAction.action的请求,在struts.xml文件中配置了如下三个Action,它们的name的值分别为:abcAction、*Action和*,则*Action不会比*更优先匹配defAction.action的请求,而是先找到那个Action,就会由那个Action来处理用户请求。
如果一个页面包含多个按钮,系统分别提交给Action的不同方法处理.此时可以采用DMI(Dynamic Method Invocation,动态方法调用)来处理这种请求。动态方法调用是指表单元素的Action并不是直接等于某个Action名字,而且以如下形式指定表单的Action属性:
其中一个按钮的代码如下:
上述代码中指定“注册”按钮被单击时触发regist函数,该函数的代码如下:
上述JavaScript代码改变了表单元素的Action属性,修改后的属性为login!regist,其实质就是将该表单提交给login Action的regist方法处理。
struts.xm中的配置:
<!-- action属性为actionNmae!methodName的形式 其中ActionName指定提交到哪个Action,而methodName指定提交到指定方法--> action="ActionName!methodName"
其中一个按钮的代码如下:
<input type="submit" value="注册" onclick="regist();" />
上述代码中指定“注册”按钮被单击时触发regist函数,该函数的代码如下:
<script type="text/javascript"> function regist(){ targetForm = document.forms[0]; targetForm.action = "login!regist"; } </script>
上述JavaScript代码改变了表单元素的Action属性,修改后的属性为login!regist,其实质就是将该表单提交给login Action的regist方法处理。
struts.xm中的配置:
<package name="lee" extends="struts-default"> <action name="login" class="org.crazyit.app.action.LoginAction"> <!-- 定义三个逻辑视图和物理资源之间的映射 --> <result name="error">/error.jsp</result> <result name="success">/welcome.jsp</result> </action> </package>
注意:使用动态方法调用前,必须设置Struts2允许动态方法调用,需要设置struts.enable.DyanmicMethodInvocation常量为true。
二、指定method属性及使用通配符
1)使用method属性
<action name="login" class="org.crazyit.app.action.LoginAction" method="execute"> <result name="error">/error.jsp</result> <result name="success">/welcome.jsp</result> </action> <action name="regist" class="org.crazyit.app.action.LoginAction" method="regist"> <result name="error">/error.jsp</result> <result name="success">/welcome.jsp</result> </action>
对应的javaScript代码为:
function regist(){ targetForm = document.forms[0]; targetForm.action = "regist"; }
2)使用通配符
在上述的struts.xml文件中,两个Action定义绝大部分相同,可见这种定义相当冗余,为了解决这个问题,Struts2可以使用通配符。
在配置<action ../>时,允许在指定name属性时使用通配符,然后在class、method属性及<result…/>子元素中使用{N}的形式来代表前面第N个星号所匹配的子串。
示例一:
<action name="*Action" class="org.crazyit.app.action.LoginAction" method="{1}"> <result name="error">/error.jsp</result> <result name="success">/welcome.jsp</result> </action>
例如,如果请求URL为loginAction.action,则调用LoginAction类的login方法,如果请求URL为registAction.action,则调用LoginAction类的regist方法。
示例二:
<action name="*_*" class="org.crazyit.app.action.{1}Action" method="{2}"> <result name="error">/error.jsp</result> <result name="success">/welcome.jsp</result> </action>
例如,如果请求URL为Book_save.action,则对应的处理类为BookAction,处理方法为save方法。
3)对子元素使用通配符
Struts2不仅允许在class属性、name属性中使用表达式,还可以在<result…/>子元素中使用{N}表达式。
<action name="*" > <result>/{1}.jsp</result> </action>
上面的Action的定义可以匹配任意的Action,所用的用户请求都可通过Action来处理,因为没有指定class属性,该Action使用ActionSupport来作为处理类,而且因为该ActionSupport类的execute方法返回success字符串, 即该Action总是直接返回result中指定的JSP资源,JSP资源使用表达式来生成资源名。上面Action定义的含义是如果请求a.aciton,则进入a.jsp页面;如果请求b.action,则进入b.jsp页面……
通过这种方式,可以避免让浏览者直接访问系统的JSP页面,而是让Struts2框架来管理所有用户请求。
对于使用Struts2框架的应用而言,尽量不要让超级链接直接连接到某个视图资源,因为这种方式增加了额外的风险。推荐将所有请求都发送给Struts2框架,让框架来处理用户请求,即使只是简单的超级链接。
4)关于因通配符带来的优先级的问题。
假设有URL为abcAction.action的请求,在struts.xml文件中配置了如下三个Action,它们的name的值分别为:abcAction、*Action和*,则这个请求将会被名为abcAction的Action处理。
假设有URL为defAction.action的请求,在struts.xml文件中配置了如下三个Action,它们的name的值分别为:abcAction、*Action和*,则*Action不会比*更优先匹配defAction.action的请求,而是先找到那个Action,就会由那个Action来处理用户请求。
相关文章推荐
- Struts2之一个Action包含多个控制处理逻辑
- Struts2一个action包含多个处理逻辑解决方法(动态方法调用)
- Struts2一个Action内包含多个请求处理方法(三种方式)
- 笔记01 登录、常用配置参数、Action访问Servlet API 和设置Action中对象的值、命名空间和乱码处理、Action中包含多个方法如何调用
- Struts2一个Action内包含多个请求处理方法的处理
- Struts2学习笔记之struts.xml配置常量和Action处理流程
- Struts2一个Action内包含多个请求处理方法的处理,method的使用方法,struts2中的路径问题,通配符映射
- Java学习笔记 struts逻辑控制标签
- struts2 笔记01 登录、常用配置参数、Action访问Servlet API 和设置Action中对象的值、命名空间和乱码处理、Action中包含多个方法如何调用
- Struts2学习笔记之struts.xml配置常量和Action处理流程
- struts2第十七讲学习笔记,Action处理复选框与JSP页面使用ognl处理map
- Struts2一个Action内包含多个请求处理方法的处理
- Struts2一个Action内包含多个请求处理方法的处理(三种方式)
- struts学习笔记—Action实例:保存用户信息到数据库(1)
- SQL Server 2005 技术内幕 TSQL查询学习笔记chapter1and 2逻辑查询处理和物理查询处理
- Struts 学习笔记之Action
- 一个Action内包含多个请求处理方法的处理
- Struts2.0学习笔记---设置国际化全局配置文件和包范围配置文件和Action范围配置
- Unable to load configuration. - action 解决方案(struts 2 学习笔记)
- Struts2一个Action内包含多个请求处理方法的处理