码迷,mamicode.com
首页 > 其他好文 > 详细

struts2学习笔记(4)---------action中的方法调用

时间:2014-06-05 08:05:09      阅读:248      评论:0      收藏:0      [点我收藏+]

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

value值为true的使用即可启用DMI。。。

用例子来说明,在以前的登录上再加个注册的模拟功能,如下:

bubuko.com,布布扣

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";
		
	}
}

struts.xml配置如下:

<?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>	

login.jsp如下:

<%@ 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>

form表单里想调用哪个方法,就写成actionName!methodName的形式。。。。

看运行结果~~~~~~

bubuko.com,布布扣

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里面有多个逻辑方法,可以在配置文件里将该Action分为多个逻辑Action,它们对应同一个类,但是name根据method来决定,例如登录和注册,可以再配置文件里这么改~:

<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>

将一个Action一分为二成两个逻辑Action,它们的class属性一样,但是name不一样,默认调用的方法也不一样

将上述的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>

同理,class属性也可以使用通配符

还有一个注意的地方,除非一个请求的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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!