Struts1框架提供了DispatchAction,从而允许一个Action内包含多个处理逻辑。例如对于同一个表单,当用户通过不同的请求按钮提交表单时,应该使用Action的不同方法来处理请求。
Struts2同样提供了这种处理多个请求的Action,看下面的JSP页面。
上面的JSP页面包含两个提交按钮,但两个提交按钮分别提交给Action的不同方法处理,其中“登陆”按钮希望使用登陆逻辑来处理请求,而“注册”按钮则希望使用注册逻辑来处理请求。
此时,可以采用DMI(Dynamic Method Invocation,动态方法)调用来处理这种请求,动态方法调用是指表单元素的action并不是直接等于某个Action的名字,而是以如下形式来指定Form的action属性:
<!-- action属性为actionName!methodName的形式 -->
action="ActionName!methodName.action"
于上面JSP页面的“注册”按钮的代码如下:
<!-- “注册”按钮是一个没有任何动作的按钮,但单击该按钮时触发regist函数 -->
<input type="button" value="注册" onClick="regist();"/>
单击“注册”按钮时将触发regist函数,该函数的代码如下:
function regist()
{
//获取JSP页面中的一个表单元素
targetForm = document.forms[0];
//动态修改目标表单的action属性
targetForm.action = "Login!regist.action";
//提交表单
targetForm.submit();
}
上面JavaScript代码的核心在于动态修改表单元素的action属性,修改后action属性为:Login!regist.action,其实质就是将该表单提交给login Action的regist方法处理。
login Action类的代码如下:
public class LoginRegistAction extends ActionSupport
{
//封装用户请求参数的两个属性
private String username;
private String password;
//封装处理结果的tip属性
private String tip;
//username属性对应的setter和getter方法
public String getUsername()
{
return username;
}
public void setUsername(String username)
{
this.username = username;
}
//password属性对应的getter和setter方法
public String getPassword()
{
return password;
}
public void setPassword(String password)
{
this.password = password;
}
//tip属性对应的setter和getter方法
public String getTip()
{
return tip;
}
public void setTip(String tip)
{
this.tip = tip;
}
//Action包含的注册逻辑
public String regist() throws Exception
{
ActionContext.getContext().getSession().put("user" , getUsername());
setTip("恭喜您," + getUsername() + ",您已经注册成功!");
return SUCCESS;
}
//Action包含的默认处理逻辑
public String execute() throws Exception
{
if (getUsername().equals("scott")
&& getPassword().equals("tiger") )
{
ActionContext.getContext().getSession().put("user" , getUsername());
setTip("欢迎," + getUsername() + ",您已经登陆成功!");
return SUCCESS;
}
else
{
return ERROR;
}
}
}
图4.1所示的JSP页面中的“登陆”按钮就是一个普通按钮,没有任何特殊之处,当浏览者单击“登陆”按钮时,系统将提交给对应Action的默认方法处理。当浏览者单击“注册”按钮时,系统将提交给login Action的regist方法处理。因此,如果单击“注册”按钮,将看到如图4.2所示的页面。
通过这种方式,我们可以在一个Action中包含多个处理逻辑,并可以通过为表单元素指定不同action属性来提交给Action的不同方法。
对于使用动态方法调用的方法,例如regist方法,该方法的方法声明与系统默认的execute方法的方法声明,只有方法名不同,其他方法参数,返回值类型都应该绝对相同。
注意:使用动态方法调用必须设置Struts2允许动态方法调用。开启系统的动态方法调用是通过设置struts.enable.DynamicMethodInvocation常量完成的,设置该常量的值为true,将开启动态方法调用;否则将关闭关闭动态方法调用。
分享到:
相关推荐
Struts2动态方法调用 包括 1.js方法调用 2.普通的表单提交调用 3.通配符
NULL 博文链接:https://takeme.iteye.com/blog/1631525
NULL 博文链接:https://cdxs2.iteye.com/blog/1925232
Struts2_动态方法调用,使用struts2架构的动态方法进行资源调用
主要介绍了详解Struts2动态方法调用,涉及调用方法的代码,具有一定参考价值,需要的朋友可以了解下。
struts 1框架的动态调用也许你会,但是struts2 的动态调用更经典,这个文档让你玩转struts 2 动态调用.......
struts动态访问调用之一,采用method属性,同一个Action内的不同方法来响应用户请求
struts2动态调用之通配符,相当于是改进的method动态调用方法,减少对同一action不同method的多次配置
struts2利用通配符调用同一个Action里面不同的方法,在struts.xml配置文件中将请求方法的不相同部分抽象成“*".
struts2中动态方法的调用,如何实现动态方法调用
本文档主要介绍了struts2中API耦合的三种方法以及动态方法调用(Dynamic Method Invoked)的两种方法,希望对你有所帮助,谢谢!
利用Struts 2框架创建一个web项目chap2_e22,实现用户登录过程。具体要求是在loginAction类中分别用login()和registered()处理用户登录和注册的过程,分别创建login.jsp和register.jsp两个页面实现登录和注册的...
带有分页,分页跳转,部门员工表的CRUD,hibernate注解方式操作实体,struts2动态方法调用
Struts2中直接和间接访问ServletAPI以及动态方法调用之感叹号
Struts2调用EJB异常项目包,出现的问题以及解决方案参见EJBStruts.zip中的说明.txt 以及博客 http://blog.csdn.net/icecream0/article/details/7167853
struts2实验一:动态方法调用+请求参数的获取+简单的表单数据验证
主要介绍了struts中动态方法调用使用通配符的相关资料,非常不错,具有参考借鉴价值,感兴趣的朋友一起看看吧
参考博文:http://blog.csdn.net/u011638419/article/details/41773411
Webservice+spring+struts小例子,简单方法调用
如题,Struts2登陆+输入验证+动态调用实例,使用MyEclipse导入直接就可以运行