- 浏览: 412331 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (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 1908一、 如果配置文件struts ... -
Struts2 s:if 界面判断集合or对象
2011-10-28 17:10 2742判断 ArrayList size 是否为0 <s:if ... -
struts2日期标签datetimepicker
2011-10-27 15:30 1297http://blog.csdn.net/wuxinfengj ... -
struts2的checkbox标签--value和fieldValue
2011-10-19 15:21 2292struts2的checkbox标签在使用的时候需要注意它的两 ... -
struts iterator
2011-03-24 20:19 749<s:iterator value="dept ... -
struts2+jsonplugin
2011-03-02 12:00 10571、引入包(本文中的包全部引自struts-2.1.8.1\l ... -
Struts2返回JSON
2011-03-02 11:53 41981.导入jsonplugin包 Struts2.16:导入j ... -
JSP页面获取ValueStack中的值
2011-02-22 09:48 1718我们知道Struts2会将Action中的属性存放到Value ... -
webwork.properties 详解
2010-12-23 18:19 966WebWork有很多属性可以根据需要改变.要改变它们,请指定c ... -
webwork中关于ValueStack的描述
2010-12-08 11:05 1118关于ValueStack的描述: 1、 ValueStac ... -
WebWork执行流程
2010-11-30 18:37 919com.opensymphony.webwork下有两个类:p ... -
struts2 标签
2010-11-28 08:51 970struts2的select标签中,常用的有以下几个属性: ... -
struts与webwork
2010-11-08 19:55 850不想过多的争论struts与webwork的优越性,只是自己做 ... -
struts2中减少action数量(通配符使用)
2009-12-01 20:40 1173struts2中减少action数量(通配符使用) 如str ...
相关推荐
一直以来都知道Struts2的OGNL支持在前台调用后台的静态方法,以前也用过,但用的比较少,今天自己重新开始了一个新的项目,在实现一个功能的时候用到了Struts2的在前台调用后台的静态方法,弄了半天没有出来结果,...
该属性设置Struts 2是否支持动态方法调用,该属性的默认值是true.如果需要关闭动态方法调用,则可设置该属性为false. struts.enable.SlashesInActionNames 该属性设置Struts 2是否允许在Action名中使用斜线,该属性的...
15.2 动态方法调用 310 15.2.1 通配符方法的选择 310 15.2.2 动态工作流 312 15.3 使用令牌防止表单重复提交 313 15.3.1 使用s:token/表单标签 313 15.3.2 令牌拦截器规则的例外 314 15.4 自动显示等待页面 316 15.5...
methodName类型的动态方法调用,也只能配置一个package 7./fileupload - 文件上传 <br>本资源来自QQ群:3038490,更多资源请访问http://blogxy.googlecode.com/svn/trunk/<br>由于依赖包很大就不放上来了,...
一个演示Struts2下如何集成PageOffice的最简单示例。 PageOffice是标准Java组件,标准JSP Tag标签方式引用,完美支持Eclipse、MyEclipse等开发工具。 通过Word动态数据填充功能,实现格式复杂的模板套红。不但可以...
该属性设置Struts 2是否支持动态方法调用,该属性的默认值是true。如果需要关闭动态方法调用,则可设置该属性为false。 struts.enable.SlashesInActionNames 该属性设置Struts 2是否允许在Action名中使用斜线,...
3.8 动态方法调用 51 3.9 对动作类进行测试 51 3.10 小结 51 第4章 OGNL 52 4.1 Value Stack栈 52 4.2 读取Object Stack里的对象的属性 53 4.3 读取Context Map里的对象的属性 54 4.4 如何调用字段和方法 55 ...
3.2. Struts2的Action调用业务逻辑 - 19 - 3.2.1. 登录Action--OpenIDLoginAction - 19 - 3.2.2. 进入的Action—FirstPageAction - 20 - 3.3. JSP页面 - 20 - 3.4. 运行示例 - 21 - 3.4.1. 登录 - 21 - 3.4.2. ...
2、支持类静态的方法调用和值访问,表达式的格式为@[类全名(包括包路)]@[方法名 | 值名],例如: @java.lang.String@format('foo %s', 'bar')或@tutorial.MyConstant@APP_NAME; 3、支持赋值操作和表达式串联,...
Struts 2 标签库(文档手册) Tags-API-CLSW-JSP <%@ taglib prefix="s" uri="/struts-tags" %> 就能使用struts2.0的标签库 下面就介绍每个标签的具体应用实例说明:按字母排列 A: 1. 2. <s:a href=""></s:a>-...
★ JSP调用页面(全面支持struts1.2)(增、删、改、查),分页功能自动实现 (如果数据库是sqlserver,又需要分页的,请使用sqlserver2005) 2、特色 ☆ 一键生成,简洁使用。 ☆ 生成的代码全部开源,没有任何通过...
3.8 动态方法调用 51 3.9 对动作类进行测试 51 3.10 小结 51 第4章 OGNL 52 4.1 Value Stack栈 52 4.2 读取Object Stack里的对象的属性 53 4.3 读取Context Map里的对象的属性 54 4.4 如何调用字段和方法 55 4.5 ...
2、支持类静态的方法调用和值访问,表达式的格式为@[类全名(包括包路径)]@[方法名 | 值名],例如:@java.lang.String@format('foo %s', 'bar')或@tutorial.MyConstant@APP_NAME; 3、支持赋值操作和表达式串联...
DefaultActionMapper类支持以"action:"、"redirect:"、"redirectAction:"作为导航或是重定向前缀,但是这些前缀后面同时可以跟OGNL表达式,由于struts2没有对这些前缀做过滤,导致利用OGNL表达式调用java静态方法...
这里我们只涉及Struts2框架中对OGNL的基本支持。 Struts 2默认的表达式语言是OGNL,原因是它相对其它表达式语言具有下面几大优势: 1. 支持对象方法调用,如xxx.doSomeSpecial(); 2. 支持类静态的方法调用和...
action:直接调用一个Action,根据executeResult参数,可以将Action的处理结果包含到页面中。 bean:创建一个JavaBean实例。。 date:格式化输出一个日期属性。 debug:生成一个调试链接,当单击该链接时,可以看到...
2.支持类的静态方法调用和常量值的调用 3.操作集合对象 <s:property value="#"></s:property> 除了ValueStack不加#,直接取用,其他都要加#,ActionContent用#name或其他对象#相应对象.name ActionContent用#name?
使用JFreeChart,必须调用在web-inf目录下导入jfreechart.jar,和jcommon.jar包 使用jfreechart-1.0.13.jar查看图表时中文乱码,降低jfreechart版本ok 显示图表时都可以在获取JfreeChart对象方法中使用3D方式 ...