文档章节

Struts学习--DMI

smartstone_2015
 smartstone_2015
发布于 2017/03/16 21:31
字数 651
阅读 19
收藏 0

      假如如下页面, form中指定action为login, 当点击"登录"按钮时,会调用login这个action的execute方法, 现在希望当点击"注册"按钮时, 能调用action的另外一个方法, 也就是希望login这个action中有多个处理逻辑, 当用户做某一个操作时, 能够调用相应的处理逻辑, 问题是form元素中只能指定一个action, 默认操作是调用Action的execute方法, 那么其它的操作如果调用Action中相应的方法呢?

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<%@taglib prefix="s" uri="/struts-tags" %>
<html>
<head>
<script type="text/javascript" src="js/login.js"></script>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Login</title>
</head>
<body>
	<s:form action="login" method="post">
		<s:textfield name="username" key="user"/>
		<s:textfield name="password" key="pass"/>
		<tr>
			<td><s:submit key="login"/></td>
			<td><s:submit key="regist" onclick="regist();" /></td>
		</tr>
	</s:form>
</body>
</html>

       Struts2的动态方法调用(DMI)可以解决这样的问题, DMI使得表单元素的action属性并不是直接等于某个Action的名字, 而是以如下形式指定表单元素的action属性:
        action="ActionName!MethodName"
        使用DMI的具体步骤如下:
        1 设置Struts允许DMI, 即设置常量struts.enable.DynamicMethodInvocation值为true, 方式为在struts.xml中添加加配置<constant name="struts.enable.DynamicMethodInvocation" value="true"/>
          2 配置action对应的方法, 方法是在struts.xml文件中action标签下的<allowed-methods>标签下指定方法, 例如这里要指定login这个action的regist方法, 在struts.xml中配置如下:

	<package name="action" extends="struts-default" namespace="/">
		<action name="login" class="action.LoginAction">
			<result name="input">/login.jsp</result>
			<result name="error">/view/error.jsp</result>
			<result name="success">/view/welcome.jsp</result>
			<allowed-methods>regist</allowed-methods>
		</action>
	</package>

    3 完善login这个Action, 代码如下:

package action;

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;

public class LoginAction extends ActionSupport{
	private String username;
	private String password;
	private String tip;
	
	//省略属性的set和get方法
	
	public String regist() throws Exception{
		ActionContext.getContext().getSession().put("user", getUsername());
		setTip("恭喜您, " + getUsername() + ", 您已成功注册!");
		return SUCCESS;
	}
	
	public String execute() throws Exception{
		ActionContext ctx = ActionContext.getContext();
		Integer counter = (Integer) ctx.getApplication().get("counter");
		if(counter == null){
			counter = 1;
		}else{
			counter += 1;
		}
		
		ctx.getApplication().put("counter", counter);
		if(getUsername().equals("toby") && getPassword().equals("toby")){
			ActionContext.getContext().getSession().put("user", getUsername());
			ctx.put("tip", "服务器提示:您已成功登录");
			return SUCCESS;
		}
		else{
			ctx.put("tip", "服务器提示:登录失败");
			return ERROR;
		}
	}
}

           4 增加js脚本, 当用户点击注册时, 将表单的action设置为login!regist, 方法是在页面中引入如下脚本:

function regist()
{
	targetForm = document.forms[0];
	targetForm.action = "login!regist";
}

            这样就完成了DMI配置, 当在登录页面点击"登录"时,执行login这个action的execute方法, 当点击
"注册时", 执行login这个Action的regist方法.

© 著作权归作者所有

smartstone_2015
粉丝 0
博文 18
码字总数 17117
作品 0
郑州
程序员
私信 提问
struts 笔记 action namespace

Struts请求处理流程 请求先被struts过滤器拦截下来,然后在struts中做处理,如果处理中未发现请求的地址,再发回tomcat服务器 让tomcat处理 自定义action 给在struts.xml中 action类添加cla...

脑丨残
2014/06/15
76
0
调用Action中其他方法的两种实现

在struts2中,我们可以通过两种方法来调用action类中除了execute之外的其他方法。而这两种方法都是struts框架直接支持的。 而在以前,而可以在form页面提交的时候指定一个特定的参数,如act...

淼淼
2013/01/18
146
0
Struts2远程代码执行漏洞(CNNVD-201703-152)最新漏洞

近日,国家信息安全漏洞库(CNNVD)发布了关于Apache Struts2 (S2-045)远程代码执行漏洞(CNNVD-201703-152)的情况。由于该漏洞影响范围广,危害级别高,国家信息安全漏洞库(CNNVD)对此...

amosguo
2017/03/09
3
0
Struts 2.5 GA 版本发布

Apache Struts 2.5 GA 正式发布了! 详细改进: JIRA Release Notes 2.5 Issue 列表: Struts 2.3.28 DONE Struts 2.5.x TODO 内部更变详情: All security patches from prior versions wer......

冰雪峰
2016/05/18
4.3K
33
Struts2通配符映射/Struts <action name="/*/*" method...

struts2的关于method=“{1}"意思详解   <action name= "Login_* " method= "{1} " class= "mailreader2.Login ">   中Login_带是什么意思?method= "{1} "带{}这个是什么意思?   ===......

杨昊亚
2012/12/17
10.3K
0

没有更多内容

加载失败,请刷新页面

加载更多

关于java中变量的重名问题

在java语言中,变量的命名有很多规则和规范,但是有的地方可以使用相同的变量名,有的地方却不能使用,这是为什么呢? 下面是个人的一点见解,是从作用域和内存来分析的,目的是为了方便理解...

INEVITABLE
17分钟前
4
0
MySQL的COUNT语句,竟然都能被面试官虐的这么惨?

数据库查询相信很多人都不陌生,所有经常有人调侃程序员就是CRUD专员,这所谓的CRUD指的就是数据库的增删改查。 在数据库的增删改查操作中,使用最频繁的就是查询操作。而在所有查询操作中,...

程序员修BUG
20分钟前
4
0
PHP+Mysql统计文件下载次数实例

PHP+Mysql统计文件下载次数实例,实现的原理也很简单,是通过前台点击链接download.php传参id,来更新点击次数。 获取文件列表: <?php require 'conn.php'; $query = mysql_query("S...

ymkjs1990
21分钟前
3
0
一、环境变量及Jshell

一、环境变量: 作用: 可执行文件所在位置的链接。CLI输入命令时,通过环境变量指引找到命令所在位置 windows的环境变量名不区分大小写,Linux区分 Windows下的用户变量即只有当前用户生效 ...

清自以敬
22分钟前
4
0
微软改名部又出手:Office 365正在悄悄更名为Microsoft 365

然而让人疑惑的是Microsoft 365 是微软面向企业提供的服务,这项服务附带操作系统以及办公软件的订阅授权。 现在把面向家庭消费者的办公软件也换成Microsoft 365 是什么操作?没人知道因为微...

linuxCool
22分钟前
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部