标签: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