标签:des c style class blog code
系统需要使用Action的不同方法来处理用户请求,这就需要让同一个Action里面包含多个控制处理逻辑。
1)动态方法调用
即DMI(dynamic method invocation),使用actionName!methodName的形式来指定想要调用的方法,如果想使用DMI,需要在struts.xml里面加入这句话:
<constant name="struts.enable.DynamicMethodInvocation" value="true" />
用例子来说明,在以前的登录上再加个注册的模拟功能,如下:
Action里增加register方法,如下:
public class LoginAction{ private String uname; private String pwd; public String getUname() { return uname; } public void setUname(String uname) { this.uname = uname; } public String getPwd() { return pwd; } public void setPwd(String pwd) { this.pwd = pwd; } public String login(){ ActionContext ac = ActionContext.getContext(); Integer count = (Integer) ac.getApplication().get("count"); if(count == null){ count = 1; }else{ count++; } ac.getApplication().put("count", count); if(uname.equals("zhangsan")&&pwd.equals("123")){ ac.getSession().put("username", uname); ac.put("tip", "您已成功登陆"); //增加cookie Cookie cookiee = new Cookie("user",uname); cookiee.setMaxAge(60*60); ServletActionContext.getResponse().addCookie(cookiee); return "success"; }else{ ac.put("tip", "失败登陆"); return "error"; } } public String register(){ ActionContext ac = ActionContext.getContext(); ac.getSession().put("username", uname); ac.put("tip", "恭喜您"+uname+",注册成功"); return "success"; } }
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1.7//EN" "http://struts.apache.org/dtds/struts-2.1.7.dtd"> <struts> <!-- 这句用来配置动态方法调用 --> <constant name="struts.enable.DynamicMethodInvocation" value="true" /> <!-- 开发者模式 --> <constant name="struts.devMode" value="true" /> <package name="user" extends="struts-default" > <default-action-ref name="loginAction"></default-action-ref> <action name="loginAction" class="com.test.action.LoginAction"> <result name="success" >/success.jsp</result> <result name="error" >/error.jsp</result> </action> </package> </struts>
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <base href="<%=basePath%>"> <title>My JSP 'login.jsp' starting page</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="This is my page"> <!-- <link rel="stylesheet" type="text/css" href="styles.css"> --> <script> function register(){ var tform = document.forms[0]; tform.action = "loginAction!register"; tform.submit(); } function login(){ var tform = document.forms[0]; tform.action = "loginAction!login"; tform.submit(); } </script> </head> <body> <form action="" method="post"> 用户名:<input type="text" name="uname" value=""><br/> 密码: <input type="password" name="pwd" value=""><br/> <input type="button" value="登录" onclick="login();"> <input type="button" value="注册" onclick="register();"> </form> </body> </html>
看运行结果~~~~~~
2)在struts.xml的action中指定method属性
在action元素里有method属性,可以让该action调用指定的方法,例如这样:
<action name="loginAction" class="com.test.action.LoginAction" method="login"> <result name="success" >/success.jsp</result> <result name="error" >/error.jsp</result> </action>
<action name="loginAction" class="com.test.action.LoginAction" method="login"> <result name="success" >/success.jsp</result> <result name="error" >/error.jsp</result> </action> <action name="registerAction" class="com.test.action.LoginAction" method="register"> <result name="success" >/success.jsp</result> </action>
将上述的login.jsp的js方法里可以改改了:
<script> function register(){ var tform = document.forms[0]; tform.action = "registerAction"; tform.submit(); } function login(){ var tform = document.forms[0]; tform.action = "loginAction"; tform.submit(); } </script>
3)在struts.xml中使用通配符
在配置Action元素时,允许在指定name属性的时候使用模式字符串(即用“*”代表一个或多个任意字符),接下来就可以在class,method属性以及result子元素中使用{N}的形式代表前面第N个“*”所匹配的字符串。
当我们在Action的name属性中使用通配符以后,可以用一个action元素代替多个逻辑Action。
例如,可以将上面的两个逻辑Action使用通配符合并为这样:
<action name="*Action" class="com.test.action.LoginAction" method="{1}"> <result name="success" >/success.jsp</result> <result name="error" >/error.jsp</result> </action>
还有一个注意的地方,除非一个请求的URL与Action的name属性完全相同,负责将按先后顺序来决定由哪个Action来处理。因此,我们应将name="*"的action元素放到配置文件的最后,否则,struts2将使用该Action来处理所有希望使用模式匹配的请求。
struts2学习笔记(4)---------action中的方法调用,布布扣,bubuko.com
struts2学习笔记(4)---------action中的方法调用
标签:des c style class blog code
原文地址:http://blog.csdn.net/jihaixiao8/article/details/27486361