- 浏览: 417840 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (244)
- struts2 (15)
- ognl (1)
- hibernate (17)
- gwt (17)
- GROOVY (2)
- GRAILS学习 (7)
- SPRING (4)
- AJAX (2)
- JQUERY (6)
- XML (1)
- DWR (3)
- 线程 (0)
- SVN (0)
- json (1)
- anotation (0)
- 反射 (2)
- rapidframework (0)
- OA工作流 (2)
- 事务 (0)
- mysql (0)
- oracle (26)
- EXTJ (0)
- 求职 (2)
- 随笔 (22)
- 注释 (1)
- java综合 (30)
- 设计模式 (1)
- JSP SERVLET (2)
- 插件 (7)
- 应用 (3)
- HTML (5)
- flex (13)
- android (8)
- javascript (14)
- Exception (0)
- Linux (2)
- 计算机常识 (3)
- EXCEL (2)
- 正则表达式 (1)
- 开源工具 (2)
- 测试 (1)
- 生活 (7)
- 房子 (0)
- 购房大学 (4)
- UML (1)
- 服务器 (1)
- 发展 (1)
- 英语 (1)
- 项目管理 (1)
- 摘 (1)
- 网站 (1)
最新评论
-
a347911:
架构师教程:https://note.youdao.com/s ...
架构师之路--- 一个四年 JAVA 程序员的工作经历 转 -
hzxlb910:
对我帮助很大。
架构师之路--- 一个四年 JAVA 程序员的工作经历 转 -
xly_971223:
引用因此,while (!isInterrupted())也可 ...
Java 终止线程方法 -
zdglt88:
其实这个datagrid挺简单的,没有难度
Jquery easy ui 之datagrid简介 -
完善自我:
抓住重点,支持一下!
Jquery easy ui 之datagrid简介
在 WebWork2 中,可以使用感叹号(!)来指定要执行(或调用)非 execute 方法,但是还没有一个真正的术语该种方式的定义。在 s2 的讨论中,我们定义了“动态方法调用”这个术语来描述 webwork/s2 对感叹号的使用。
动态方法调用( DMI )通过在 action 名称和要调用的 Action 方法之间添加一个感叹号进行分割,以表示调用 action 中指定的方法(非 exeucte 方法)。如:“ Category ! create.action ”,表示调用 Category Action 中定义的 create 方法。
在 Struts2 中,让动态方法调用可配置,有两个原因: 1 )如果使用的是 POJO action ,动态方法调用可能会引起安全问题; 2 )动态方法调用和从 Struts 1 中引用过来的通配符方法有重叠;如果你的应用涉及到安全,或者习惯在 action 配置中使用感叹号作为通配符的话,需要在 struts 应用的 struts.properties 配置文件中将 struts.enable.DynamicMethodInvocation 设置为 false 。
Struts2支持动态方法调用,它指的是一个Action中有多个方法,系统根据表单元素给定的action来访问不同的方法,而不用写多个Action。
使用动态方法调用前必须设置Struts2允许动态方法调用,它是通过设置
struts.enable.DynamicMethodInvocation = true来完成的。
Struts2有多种方式实现动态方法调用(以下action请求的后缀均设置为do,而非默认的action):
(1). 修改页面Form的action请求方式
将页面上action的请求方式改为:action = “ActionName!MethodName.do”,示例:
Login.jsp
……
var contextPath = “<%=request.getContextPath()%>”;
<script type=”text/javascript”>
function dynamicMethodInvoke(){
document.forms[0].action = contextPath + “Login!dynamicMethod.do”;
document.forms[0].submit();
}
</script>
……
<input type=”button” value=”动态方法调用” onclick=”dynamoicMethodInvoke()”/>
……
当点击“动态方法调用”按钮时,执行dynamoicMethodInvoke方法,在此方法中修改提交的action为Login!dynamicMethod.do,它的意思是将表单提交给Login Action的dynamicMethod方法进行处理。
LoginAction.java
public class LoginAction {
……
public String dynamicMethod() throws Exception{
……
return “success”;
}
public String execute() throws Exception{
……
if (…){
return “error”;
}
……
return “success”
}
}
通过这种方式,可以在一个Action中包含多个方法,通过指定不同的action属性来提交给Action的不同方法进行处理。
对于使用动态方法调用的方法,它的声明与系统默认的execute方法的方法声明只有方法名不同,其他的如参数、返回值类型都必须相同。
(2). 指定action的method属性
另一种动态调用方式是在struts.xml中指定action的method属性,这样可以让Action类调用指定方法,而不是默认的execute方法来处理请求。示例:
struts.xml
……
<package name=”demo1” extends=”struts-default”>
<action name=”Login” class=”com.demo.LoginAction” />
<result name=”input”>/input.jsp</result>
<result name=”error”>/error.jsp</result>
<result name=”success”>/success.jsp</result>
</action>
<action name=”Registry” class=”com.demo.LoginAction” method=”registry” />
<result name=”input”>/input.jsp</result>
<result name=”error”>/error.jsp</result>
<result name=”success”>/success.jsp</result>
</action>
</package>
上述配置中两个action的实现类均为com.demo.LoginAction,他们的实现类虽然相同,但处理逻辑却不同,处理逻辑通过method方法指定,其中名为Login的Action对应的处理逻辑为默认的execute方法,而名为Registry的Action对应的处理逻辑则为method指定的registry方法。
(3). 使用通配符
仔细看上面struts.xml中两个action的定义,可以发现他们除了name和method属性不同以外,其余的都一样,这种定义相当的冗余,为了解决这种类型的问题,Struts2提供了通配符定义方式。
在配置<action/>元素时,需要指定name、class、method等属性,这3个属性都支持通配符,在使用通配符定义Action的name属性时,相当于一个元素action定义多个逻辑Action。(2)中的action配置可以更改为:
<package name=”demo” extends=”struts-default”>
<action name=”*Action” class=”com.demo.LoginAction” method=”{1}”>
<result name=”input”>/input.jsp</result>
<result name=”error”>/error.jsp</result>
<result name=”success”>/success.jsp</result>
</action>
</package>
上述定义不是定义了一个普通的action,而是定义一系列的action,只要用户请求的URL满足*Action.do的模式,都可通过该Action进行处理,而method属性使用了一个表达式{1},该表达式的值就是name属性中第一个*的值,例如,用户请求的URL为LoginAction.do,则调用com.demo.LoginAction类的Login方法来处理,如果请示的URL为RegistryAction.do的话,则调用com.demo.LoginAction的Registry方法进行处理。
以下配置在class属性中使用通配符:
<package name=”demo” extends=”struts-default”>
<action name=”*Action” class=”com.demo.{1}Action”>
<result name=”input”>/input.jsp</result>
<result name=”error”>/error.jsp</result>
<result name=”success”>/success.jsp</result>
</action>
</package>
此配置中没有指定method属性,所以请示由默认的execute方式来执行,但class中使用了通配符,它的含义与上面一样,例如,当用户请求的为LoginAction.do时,其中*的值为Login,该值传入class属性,即该Action的处理类为com.demo.LoginAction;而如果请求为RegistryAction.do时,则该Action的处理类将变为com.demo.RegistryAction。
Struts2允许在class属性和method属性中同时使用表达式,示例如下:
<action name=”*_*” class=”com.demo.{1} method=”{2}” />
不难看出,只要满足*_*模式的Action都会被其处理,例如有Order_Booking.do请求到来,由于第一个*的值为Order,第二个*的值为Booking,那么意味着将会调用com.demo.Order处理类中的Booking方法来处理用户请求。
Struts2除了允许在name、class、method中使用表达式外,在<result/>元素中也可以使用表达式,如下:
<action name=”*Action” class=”com.demo.{1}Action method=”{1}” >
<result name=”success”>/{1}.jsp</result>
</action>
当请求为LoginAction.do时,将调用com.demo.LoginAction处理类中的Login方法处理用户的请求,当返回为success时,显示/Login.jsp页面。
注意:在使用通配符后,除非请求的URL与Action的name属性绝对相同,否则将按Action在struts.xml中定义的先后顺序来决定由哪个Action来处理用户请求。
对于一些只是简单的转发操作,如超级链接等的请求,可以定义name为*的Action来处理,此外,Struts2框架允许在struts.xml中使用<default-action-ref/>元素定义一个默认Action来处理用户请求:
<package name=”demo” extends=”struts-default” namespace=”/”>
<action name=”defaultAction” class=”com.demo.DefaultAction”>
<result>/default.jsp</action>
</action>
<default-action-ref name=”defaultAction” />
</package>
<default-action-ref/>的name属性为struts.xml中一个已经定义好的Action。
动态方法调用( DMI )通过在 action 名称和要调用的 Action 方法之间添加一个感叹号进行分割,以表示调用 action 中指定的方法(非 exeucte 方法)。如:“ Category ! create.action ”,表示调用 Category Action 中定义的 create 方法。
在 Struts2 中,让动态方法调用可配置,有两个原因: 1 )如果使用的是 POJO action ,动态方法调用可能会引起安全问题; 2 )动态方法调用和从 Struts 1 中引用过来的通配符方法有重叠;如果你的应用涉及到安全,或者习惯在 action 配置中使用感叹号作为通配符的话,需要在 struts 应用的 struts.properties 配置文件中将 struts.enable.DynamicMethodInvocation 设置为 false 。
Struts2支持动态方法调用,它指的是一个Action中有多个方法,系统根据表单元素给定的action来访问不同的方法,而不用写多个Action。
使用动态方法调用前必须设置Struts2允许动态方法调用,它是通过设置
struts.enable.DynamicMethodInvocation = true来完成的。
Struts2有多种方式实现动态方法调用(以下action请求的后缀均设置为do,而非默认的action):
(1). 修改页面Form的action请求方式
将页面上action的请求方式改为:action = “ActionName!MethodName.do”,示例:
Login.jsp
……
var contextPath = “<%=request.getContextPath()%>”;
<script type=”text/javascript”>
function dynamicMethodInvoke(){
document.forms[0].action = contextPath + “Login!dynamicMethod.do”;
document.forms[0].submit();
}
</script>
……
<input type=”button” value=”动态方法调用” onclick=”dynamoicMethodInvoke()”/>
……
当点击“动态方法调用”按钮时,执行dynamoicMethodInvoke方法,在此方法中修改提交的action为Login!dynamicMethod.do,它的意思是将表单提交给Login Action的dynamicMethod方法进行处理。
LoginAction.java
public class LoginAction {
……
public String dynamicMethod() throws Exception{
……
return “success”;
}
public String execute() throws Exception{
……
if (…){
return “error”;
}
……
return “success”
}
}
通过这种方式,可以在一个Action中包含多个方法,通过指定不同的action属性来提交给Action的不同方法进行处理。
对于使用动态方法调用的方法,它的声明与系统默认的execute方法的方法声明只有方法名不同,其他的如参数、返回值类型都必须相同。
(2). 指定action的method属性
另一种动态调用方式是在struts.xml中指定action的method属性,这样可以让Action类调用指定方法,而不是默认的execute方法来处理请求。示例:
struts.xml
……
<package name=”demo1” extends=”struts-default”>
<action name=”Login” class=”com.demo.LoginAction” />
<result name=”input”>/input.jsp</result>
<result name=”error”>/error.jsp</result>
<result name=”success”>/success.jsp</result>
</action>
<action name=”Registry” class=”com.demo.LoginAction” method=”registry” />
<result name=”input”>/input.jsp</result>
<result name=”error”>/error.jsp</result>
<result name=”success”>/success.jsp</result>
</action>
</package>
上述配置中两个action的实现类均为com.demo.LoginAction,他们的实现类虽然相同,但处理逻辑却不同,处理逻辑通过method方法指定,其中名为Login的Action对应的处理逻辑为默认的execute方法,而名为Registry的Action对应的处理逻辑则为method指定的registry方法。
(3). 使用通配符
仔细看上面struts.xml中两个action的定义,可以发现他们除了name和method属性不同以外,其余的都一样,这种定义相当的冗余,为了解决这种类型的问题,Struts2提供了通配符定义方式。
在配置<action/>元素时,需要指定name、class、method等属性,这3个属性都支持通配符,在使用通配符定义Action的name属性时,相当于一个元素action定义多个逻辑Action。(2)中的action配置可以更改为:
<package name=”demo” extends=”struts-default”>
<action name=”*Action” class=”com.demo.LoginAction” method=”{1}”>
<result name=”input”>/input.jsp</result>
<result name=”error”>/error.jsp</result>
<result name=”success”>/success.jsp</result>
</action>
</package>
上述定义不是定义了一个普通的action,而是定义一系列的action,只要用户请求的URL满足*Action.do的模式,都可通过该Action进行处理,而method属性使用了一个表达式{1},该表达式的值就是name属性中第一个*的值,例如,用户请求的URL为LoginAction.do,则调用com.demo.LoginAction类的Login方法来处理,如果请示的URL为RegistryAction.do的话,则调用com.demo.LoginAction的Registry方法进行处理。
以下配置在class属性中使用通配符:
<package name=”demo” extends=”struts-default”>
<action name=”*Action” class=”com.demo.{1}Action”>
<result name=”input”>/input.jsp</result>
<result name=”error”>/error.jsp</result>
<result name=”success”>/success.jsp</result>
</action>
</package>
此配置中没有指定method属性,所以请示由默认的execute方式来执行,但class中使用了通配符,它的含义与上面一样,例如,当用户请求的为LoginAction.do时,其中*的值为Login,该值传入class属性,即该Action的处理类为com.demo.LoginAction;而如果请求为RegistryAction.do时,则该Action的处理类将变为com.demo.RegistryAction。
Struts2允许在class属性和method属性中同时使用表达式,示例如下:
<action name=”*_*” class=”com.demo.{1} method=”{2}” />
不难看出,只要满足*_*模式的Action都会被其处理,例如有Order_Booking.do请求到来,由于第一个*的值为Order,第二个*的值为Booking,那么意味着将会调用com.demo.Order处理类中的Booking方法来处理用户请求。
Struts2除了允许在name、class、method中使用表达式外,在<result/>元素中也可以使用表达式,如下:
<action name=”*Action” class=”com.demo.{1}Action method=”{1}” >
<result name=”success”>/{1}.jsp</result>
</action>
当请求为LoginAction.do时,将调用com.demo.LoginAction处理类中的Login方法处理用户的请求,当返回为success时,显示/Login.jsp页面。
注意:在使用通配符后,除非请求的URL与Action的name属性绝对相同,否则将按Action在struts.xml中定义的先后顺序来决定由哪个Action来处理用户请求。
对于一些只是简单的转发操作,如超级链接等的请求,可以定义name为*的Action来处理,此外,Struts2框架允许在struts.xml中使用<default-action-ref/>元素定义一个默认Action来处理用户请求:
<package name=”demo” extends=”struts-default” namespace=”/”>
<action name=”defaultAction” class=”com.demo.DefaultAction”>
<result>/default.jsp</action>
</action>
<default-action-ref name=”defaultAction” />
</package>
<default-action-ref/>的name属性为struts.xml中一个已经定义好的Action。
发表评论
-
实现xwork配置文件的自动加载-摘自http://blog.csdn.net/snow_fox_yaya/article/details/2218141
2012-07-09 15:54 1934一、 如果配置文件struts ... -
Struts2 s:if 界面判断集合or对象
2011-10-28 17:10 2762判断 ArrayList size 是否为0 <s:if ... -
struts2日期标签datetimepicker
2011-10-27 15:30 1317http://blog.csdn.net/wuxinfengj ... -
struts2的checkbox标签--value和fieldValue
2011-10-19 15:21 2330struts2的checkbox标签在使用的时候需要注意它的两 ... -
struts iterator
2011-03-24 20:19 760<s:iterator value="dept ... -
struts2+jsonplugin
2011-03-02 12:00 10781、引入包(本文中的包全部引自struts-2.1.8.1\l ... -
Struts2返回JSON
2011-03-02 11:53 42231.导入jsonplugin包 Struts2.16:导入j ... -
JSP页面获取ValueStack中的值
2011-02-22 09:48 1739我们知道Struts2会将Action中的属性存放到Value ... -
webwork.properties 详解
2010-12-23 18:19 981WebWork有很多属性可以根据需要改变.要改变它们,请指定c ... -
webwork中关于ValueStack的描述
2010-12-08 11:05 1140关于ValueStack的描述: 1、 ValueStac ... -
WebWork执行流程
2010-11-30 18:37 938com.opensymphony.webwork下有两个类:p ... -
struts2 标签
2010-11-28 08:51 993struts2的select标签中,常用的有以下几个属性: ... -
struts与webwork
2010-11-08 19:55 870不想过多的争论struts与webwork的优越性,只是自己做 ... -
struts2中减少action数量(通配符使用)
2009-12-01 20:40 1191struts2中减少action数量(通配符使用) 如str ...
相关推荐
在Struts2中,动态方法调用(Dynamic Method Invocation,DMI)是一种特性,允许我们通过URL直接调用Action类的方法,而无需在配置文件中显式指定。这在某些情况下提供了更大的灵活性。 在Struts2的动态方法调用中...
对于非Ajax的表单提交,Struts2同样支持动态方法调用。在HTML表单中,我们通常将Action方法的名称作为表单的提交动作。Struts2的配置文件(struts.xml)可以通过通配符来定义Action,使得一个Action能够处理多个...
3. **动态方法调用**:Struts2支持动态方法调用,即通过URL中的参数名自动映射到Action类的方法,大大简化了控制器的配置。 4. **国际化支持**:Struts2内置了强大的国际化支持,可以通过配置文件轻松实现多语言切换...
Struts2支持动态方法调用,这意味着可以通过URL直接调用Action类的方法,而不是传统的Action类名+方法名的方式,增加了路由的灵活性。 8. **Struts2的安全性**: 尽管Struts2在安全方面有一些漏洞,但通过遵循...
8. **动态方法访问**:Struts2支持动态方法调用,允许Action方法名与请求参数相关联,增强了灵活性。 9. **拦截器(Interceptor)**:Struts2的拦截器是处理请求和响应的关键组件,它们在Action执行前后运行,实现...
- 动态方法调用:Struts2支持动态方法调用,通过Action类的方法名直接映射URL,减少了配置文件的工作量。 2. **Action类与结果类型**: - 在商品展示系统中,Action类是处理用户请求的核心,通常包含处理用户操作...
5. **动态方法调用**:Struts2支持动态方法调用,这意味着Action方法可以根据请求参数动态确定,增加了代码的灵活性。 通过对Struts2源码的深入研究,开发者可以更好地理解其内部工作原理,从而优化应用性能,解决...
此外,Struts2支持动态方法调用,这意味着Action方法的调用可以通过Action名和方法名组合来实现,增强了代码的可读性和可维护性。 框架还引入了Ognl(Object-Graph Navigation Language)表达式语言,用于在视图层...
2. 动态方法调用:Struts2支持动态方法调用,无需预先定义所有可能的Action方法,只需在Action类中按需实现。 3. 模板技术:Struts2集成了FreeMarker和Velocity等多种模板技术,可以灵活选择视图层的实现方式。 4....
5. **动态方法调用**:Struts2支持动态方法调用,这意味着Action方法名可以从请求参数中动态获取,提高了代码的灵活性。 6. **国际化和本地化**:Struts2提供内置的支持来处理多语言环境,你可以通过例子学习如何...
2. **配置与动态方法调用**: Struts2支持XML配置和注解配置,XML配置在struts.xml文件中,用于定义Action、结果类型、拦截器栈等。此外,Struts2支持动态方法调用,即根据请求参数直接调用Action类的方法,增强了...
8. ** strut2的动态方法调用**:Struts2支持动态方法调用,这意味着Action方法可以根据请求参数动态决定,增强了代码的灵活性。 9. **Struts2的拦截器**:拦截器在Action执行前后执行,可以用于权限控制、日志记录...
6. **动态方法调用**:Struts2支持动态方法调用,即可以通过URL直接调用Action类的方法,无需在配置文件中一一映射。 7. **插件支持**:Struts2拥有丰富的插件库,如Struts2-dojo-plugin用于增强AJAX功能,Struts2-...
此外,Struts2支持动态方法调用(Dynamic Method Invocation,DMI),这意味着你可以直接通过URL调用Action类的方法,而无需在配置文件中一一映射。这极大地简化了配置工作。 Struts2还引入了OGNL(Object-Graph ...
- **动态方法调用(DYNAMIC_METHOD_INVOCATION)**:Struts2支持动态方法调用,允许通过URL直接调用Action中的方法。 3. **插件系统**: - Struts2拥有强大的插件系统,如FreeMarker和Velocity模板引擎支持,JSON...
6. ** strut2 动态方法调用**:Struts2支持动态方法调用,这意味着你可以通过URL直接调用Action类的任何公共方法,而无需在配置文件中显式声明。 7. **Struts2标签库**:在JSP页面中,Struts2提供了一系列标签来...
Struts2支持动态方法调用,这意味着Action方法名可以从请求URL动态解析,增加了灵活性。 6. **OGNL(Object-Graph Navigation Language)**: OGNL是Struts2中的默认表达式语言,用于在Action对象、值栈和JSP标签...
3. **动态方法调用**:Struts2支持动态方法调用,意味着Action方法的选择不仅可以通过Action类名,还可以通过请求参数来决定,这增加了系统的灵活性。 4. **插件体系**:Struts2拥有丰富的插件库,如Tiles、...
10. **动态方法调用(Dynamic Method Invocation,DMI)**:Struts2支持动态方法调用,使得Action方法的调用不再局限于固定的命名规则,增加了灵活性。 综上所述,Struts2是一个全面的Web开发框架,它提供了许多功能...