Struts2的Action中自定义方法的输入校验

自定义方法的输入校验

  1. 对于通过 action​ 的 method​ 属性所指定的自定义方法 myExecute​ ,其对应的自定义输入校验方法名为 validateMyExecute​ 。 (底层是通过反射调用的)

    public void validateMyExecute() {
    	System.out.println("validateMyExecute invoked");
    
    	 this.addActionError("action error");
    }
    
    public String myExecute() throws Exception {
    	System.out.println("myExecute invoked");
    	return SUCCESS;
    }
    
  2. 校验方法的执行顺序

    当在 Action​ 中指定了自定义的 execute​ 方法时,首先会执行自定义的 execute​ 方法所对应的输入校验方法,然后再去执行 validate​ 方法,执行完毕之后如果出现了任何错误都不会再去执行自定义的 execute​ 方法,流程转向了 input​ 这个名字所对应的页面上。

    public void validateMyExecute() {
    	System.out.println("validateMyExecute invoked");
    
    	 this.addActionError("action error");
    }
    
    @Override
    public void validate() {
    	System.out.println("validate invoked");
    
    	// this.addActionError("action error");
    }
    
    @Override
    public String execute() throws Exception {
    	return SUCCESS;
    }
    
    public String myExecute() throws Exception {
    	System.out.println("myExecute invoked");
    	return SUCCESS;
    }
    // validateMyExecute invoked
    // validate invoked
    

    效果


Terwer...大约 2 分钟后端开发Struts2方法自定义校验执行输入信息customvalidatemsgmessage
Struts2输入校验剖析之编码方式校验

Struts2 提供了两种校验方式。

使用编码方式进行校验

新建 register.jsp 页面

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags"%>

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Register</title>
</head>
<body>
	<h2 style="color:blue;">用户注册</h2>

	<s:actionerror cssStyle="color:red;" />

	----------------------------------------------------------------------

	<%--
	<form action="register.action">
		username: <input type="text" name="username" size="20" /><br/>
		password: <input type="password" name="password" size="20" /><br/>
		repassword: <input type="password" name="repassword" size="20" /><br/>
		age: <input type="text" name="age" size="20" /><br/>
		birthday: <input type="text" name="birthday" size="20"/><br/>
		geaduation: <input type="text" name="graduation" size="20"/><br/>
	
		<input type="submit" value="submit"/>
	</form>
	 --%>

	<s:fielderror cssStyle="color:blue;"></s:fielderror>
	<s:form action="register" theme="simple">
		username:<s:textfield name="username" label="username"></s:textfield><br/>
		password: <s:password name="password" label="password"></s:password><br/>
		repassword: <s:password name="repassword" label="repassword"></s:password><br/>
		age: <s:textfield name="age" label="age"></s:textfield><br/>
		birthday: <s:textfield name="birthday" label="birthday"></s:textfield><br/>
		geaduation: <s:textfield name="graduation" label="graduation"></s:textfield><br/>
	
		<s:submit value="submit"></s:submit>
	</s:form>

	<%--
	<s:form action="register">
		<s:textfield name="username" label="username"></s:textfield>
		<s:password name="password" label="password"></s:password>
		<s:password name="repassword" label="repassword"></s:password>
		<s:textfield name="age" label="age"></s:textfield>
		<s:textfield name="birthday" label="birthday"></s:textfield>
		<s:textfield name="graduation" label="graduation"></s:textfield>
	
		<s:submit value="submit"></s:submit>
	</s:form>
	--%>
</body>
</html>

Terwer...大约 4 分钟后端开发Struts2方法错误集合校验进行struts2strutscodevalidate
Struts2自定义方法最佳实践

自定义方法实现

在 struts.xml 配置 method ,并且在对应的 Action 实现对应方法即可。

struts.xml

<action name="login2" class="space.terwer.struts23.LoginAction2" method="myExecute">
	<result name="success">/result2.jsp</result>
</action>

Terwer...大约 1 分钟后端开发Struts2方法自定义实现对应逻辑strutsstruts2custommethod
Struts2类型转换之全局类型转换

概述

全局类型转换。在 src​ 目录下新建 xwork-conversion.properties​ ,该文件的内容是 待转换的类=转换器名字 ,即:

space.terwer.bean.User=space.terwer.converter.UserConverter2

Terwer...小于 1 分钟后端开发Struts2目录新建文件概述全局类型转换converterglobal
Struts2类型转换之批量类型转换

输入页面 input2.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Struts2.3 converter</title>
</head>
<body>

	

	<form action="userAction2.action">

		user info 1: <input type="text" name="user"/><br/>
		user info 2: <input type="text" name="user"/><br/>
		user info 3: <input type="text" name="user"/><br/>
		user info 4: <input type="text" name="user"/><br/>
	
		<input type="submit" value="submit"/>

	</form>

</body>
</html>

Terwer...大约 1 分钟后端开发Struts2输入流程跳转业务处理类型转换批量multi
Struts2类型转换之单个对象深入研究

重要特性总结

  1. Struts2 的类型转换,对于 8 个原生数据类型以及 Date,String 等常见类型,Struts2 可以使内建的类型转换器实现自动的转换;但对于自定义的对象类型来说,需要我们自己指定类型转换的方式,即自定义类型转换器。

  2. 对于自定义类型的转换器来说,需要提供三个信息:Action 的名字、Action 中待转换的属性名以及该属性对应的类型转换器。

    其中 Action 的名字是通过属性文件的 文件名​​ 来获得的、 Action 中待转换的属性名是通过属性文件中的 key ​​ 来获得的,该属性对应的类型转换器是通过该 key​​ 对应的 value​​ 来获得的。


Terwer...大约 3 分钟后端开发Struts2类型转换器类型转换属性转换strutsstruts2typetype-converterconverter
Struts2的类型转换

使用标签

注意:Struts2使用标签库找不到URI:[struts-tags]的taglib[s]问题解决

新建 login2.jsp​ 文件,内容如下:

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Struts2.3 Login2</title>
</head>
<body>
	<s:form action="login">
		<s:textfield name="username" label="username"></s:textfield>
		<s:textfield name="password" label="password"></s:textfield>
		<s:submit label="submit"></s:submit>
	</s:form>
</body>
</html>

Terwer...大约 3 分钟后端开发Struts2使用标签注意转换strutsstruts2taglibconvertvalidate
2