第十二部分_Struts2输入校验

下面提供一个输入校验的一个实例,递进式学习:

首先,建立输入页面:register.jsp:

<%@ page language="java" import="java.util.*" pageEncoding="GBK"%>
<%@ taglib uri="/struts-tags" prefix="s" %>
<%
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 ‘register.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">
	-->

  </head>

  <body>

  	<table align="center" width="40%" border="0">
    		<tr>
    			<td>
    				 <s:actionerror cssStyle="color:red"/><%--actionerror中增加的所有信息显示到页面上 --%>
    				 __________________________________________________
    				 <s:fielderror cssStyle="color:blue"></s:fielderror>
    			</td>
    		</tr>
    </table>

    <form action="register.action" method="post">

    	<table align="center" width="40%" border=1">
    		<tr>
    			<td>
    				username:
    			</td>

    			<td>
    				<input type="text" name="username" size="20">
    			</td>
    		</tr>

    		<tr>
    			<td>
    				password:
    			</td>

    			<td>
    				<input type="password" name="password" size="20">
    			</td>
    		</tr>

    		<tr>
    			<td>
    				re-password:
    			</td>

    			<td>
    				<input type="password" name="repassword" size="20">
    			</td>
    		</tr>

    		<tr>
    			<td>
    				age:
    			</td>

    			<td>
    				<input type="text" name="age" size="20">
    			</td>
    		</tr>

    		<tr>
    			<td>
    				birthday:
    			</td>

    			<td>
    				<input type="text" name="birthday" size="20">
    			</td>
    		</tr>

    		<tr>
    			<td>
    				graduation:
    			</td>

    			<td>
    				<input type="text" name="graduation" size="20">
    			</td>
    		</tr>

    		<tr>
    			<td>
    				<input type="submit" value="submit"/>
    			</td>

    			<td>
    				<input type="reset" value="reset"/>
    			</td>
    		</tr>
    	</table>

    </form>

  </body>
</html>

接着建立处理类RegisterAction:

package com.test.action;

import java.util.Calendar;
import java.util.Date;

import com.opensymphony.xwork2.ActionSupport;

public class RegisterAction extends ActionSupport
{
	private String username;

	private String password;

	private String repassword;

	private int age;

	private Date birthday;

	private Date graduation;

	public String getUsername()
	{
		return username;
	}

	public void setUsername(String username)
	{
		this.username = username;
	}

	public String getPassword()
	{
		return password;
	}

	public void setPassword(String password)
	{
		this.password = password;
	}

	public String getRepassword()
	{
		return repassword;
	}

	public void setRepassword(String repassword)
	{
		this.repassword = repassword;
	}

	public int getAge()
	{
		return age;
	}

	public void setAge(int age)
	{
		this.age = age;
	}

	public Date getBirthday()
	{
		return birthday;
	}

	public void setBirthday(Date birthday)
	{
		this.birthday = birthday;
	}

	public Date getGraduation()
	{
		return graduation;
	}

	public void setGraduation(Date graduation)
	{
		this.graduation = graduation;
	}

	@Override
	public String execute() throws Exception
	{
		System.out.println("execute invoked");
		return SUCCESS;
	}

	public String test() throws Exception
	{
		System.out.println("test invoked");
		return SUCCESS;
	}

	public void validateTest()
	{

	}

	@Override
	public void validate()
	{
		System.out.println("validate~~~~~~~~~~~~~~~~");

		if(null == username || username.length() < 6 || username.length() > 10)
		{
			// 进行错误消息输出
			this.addActionError("username invalid");
			this.addFieldError("username", "field error: username invalid");
		}

		if(null == password || password.length() < 6 || password.length() > 10)
		{
			this.addActionError("password invalid");
		}
		else if(null == repassword || repassword.length() < 6 || repassword.length() > 10)
		{
			this.addActionError("repassword invalid");
		}
		else if(!password.equals(repassword))
		{
			this.addActionError("two passwords not the same");
		}

		if(age < 1 || age > 150)
		{
			this.addActionError("age invalid");
			// this.addFieldError("age", "field error: age invalid");
		}

		if(null == birthday)
		{
			this.addActionError("birthday invalid");
		}

		if(null == graduation)
		{
			this.addActionError("graduation invalid");
		}

		if(null != birthday && null != graduation) // 可以不写,因为前面验证通过了
		{
			Calendar c1 = Calendar.getInstance();
			c1.setTime(birthday);

			Calendar c2 = Calendar.getInstance();
			c2.setTime(graduation);

			if(!c1.before(c2))
			{
				this.addActionError("birthday should be before graduation");
			}
		}
	}
}

success.jsp如下:

<%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%>
<%
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 ‘success.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">
	-->

  </head>

  <body>

    <table align="center" width="40%" border=1">
    		<tr>
    			<td>
    				username:
    			</td>

    			<td>
    				${requestScope.username }
    			</td>
    		</tr>

    		<tr>
    			<td>
    				password:
    			</td>

    			<td>
    				${requestScope.password }
    			</td>
    		</tr>

    		<tr>
    			<td>
    				age:
    			</td>

    			<td>
    				${requestScope.age }
    			</td>
    		</tr>

    		<tr>
    			<td>
    				birthday:
    			</td>

    			<td>
    				${requestScope.birthday }
    			</td>
    		</tr>

    		<tr>
    			<td>
    				graduation:
    			</td>

    			<td>
    				${requestScope.graduation }
    			</td>
    		</tr>
    	</table>

  </body>
</html>

web.xml文件配置如下:

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
	xmlns="http://java.sun.com/xml/ns/javaee"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
	http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">

  <filter>
  	<filter-name>struts2</filter-name>
  	<filter-class>
  		org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
  	</filter-class>
  </filter>

  <filter-mapping>
  	<filter-name>struts2</filter-name>
  	<url-pattern>/*</url-pattern>
  </filter-mapping>

</web-app>

struts.xml配置如下:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd">

	<struts>

		<package name="struts2" extends="struts-default">

			<action name="helloworld" class="com.test.action.HelloWorld">
				<result name="success">/helloworld.jsp</result>
			</action>

			<action name="login" class="com.test.action.LoginAction">
				<result name="success">/result.jsp</result>
			</action>

			<action name="converterAction" class="com.test.action.PointAction" method="test">
				<result name="success">/output.jsp</result>
			</action>

			<action name="register" class="com.test.action.RegisterAction" method="test">
				<result name="success">/success.jsp</result>
				<result name="input">/register.jsp</result>
			</action>
		</package>

	</struts>

为了实现本地化,在RegisterAction.java所在的包com.test.action下新建一个RegisterAction.properties文件,通过Add的方式添加以下内容:

  

访问http://localhost:8080/struts2/register.jsp,这里是一个输出案例:

这里需要注意的几点:校验方法中自己定义的校验方法首先执行,最后执行validate方法;Action级别的消息struts是不会帮助我们自动生成的,而field级别的错误消息会帮助我们生成,同时还可以写自己的错误消息,这是field级别的struts定义的和字节定义的消息都会输出;为了在页面上输出信息,需要在form表单上面添加类似下面这样的信息:

<s:actionerror cssStyle="color:red"/><%--actionerror中增加的所有信息显示到页面上 --%> 
<s:fielderror cssStyle="color:blue"></s:fielderror>

  

时间: 2024-11-05 20:38:51

第十二部分_Struts2输入校验的相关文章

java之jvm学习笔记六-十二(实践写自己的安全管理器)(jar包的代码认证和签名) (实践对jar包的代码签名) (策略文件)(策略和保护域) (访问控制器) (访问控制器的栈校验机制) (jvm基本结构)

java之jvm学习笔记六(实践写自己的安全管理器) 安全管理器SecurityManager里设计的内容实在是非常的庞大,它的核心方法就是checkPerssiom这个方法里又调用 AccessController的checkPerssiom方法,访问控制器AccessController的栈检查机制又遍历整个 PerssiomCollection来判断具体拥有什么权限一旦发现栈中一个权限不允许的时候抛出异常否则简单的返回,这个过程实际上比我的描述要复杂 得多,这里我只是简单的一句带过,因为这

java jvm学习笔记十二(访问控制器的栈校验机制)

欢迎装载请说明出处:http://blog.csdn.net/yfqnihao 本节源码:http://download.csdn.net/detail/yfqnihao/4863854 这一节,我们会简单的描述一下jvm访问控制器的栈校验机制. 这节课,我们还是以实践为主,什么是栈校验机制,讲一百遍不如你自己实际的代码一下然后验证一下,下面我们下把环境搭起来. 第一步,配置系统环境.(copy吧,少年) path=%JAVA_HOME%/bin JAVA_HOME=C:/Java/jdk1.6

Java-第十四章-代参的方法(二)-编程实现,输入班里10名学生的身高,获得身高最高的学生要求对象数组类型方法

package com.ww.yzpA; public class Students { int No; int Height; } package com.ww.yzpA; public class Height { public Students getMaxHeigth(Students[] str) { Students A = new Students(); for (int i = 0; i < str.length; i++) { if (str[i].Height > A.He

JAVAWEB开发之Struts2详解(二)——Action接受请求参数、类型转换器、使用Struts2的输入校验、以及遵守约定规则实现Struts2的零配置

Action接受请求参数 作为MVC框架,必须要负责解析HTTP请求参数,并将其封装到Model对象中 Struts2提供了非常强大的类型转换机制用于请求数据 到 model对象的封装 Struts2和MVC定义关系 StrutsPrepareAndExecuteFilter:控制器 在Struts2中action是什么?(Struts2是一个MVC框架) V:jsp M:action C:action StrutsPrepareAndExecuteFilter Struts2提供了三种数据封装

struts2学习笔记之十五(输入校验)

输入校验 输入校验和类型转换相辅相成 提交String请求参数,首先是类型转换,再次验证数据的合理性,然后进一步处理 分为客户端校验和服务器校验 客户端:js代码 服务器校验:java代码 客户端校验不能阻止恶意行为,决不能代替服务器校验 客户端也必不可少,由于大部分的浏览行为是正常行为,这样可以降低服务器的负担 两者必不可少. struts2的输入校验完全是模块化的方式 需要检验哪个Action 1.继承ActionSupport类 2.为该Action增加校验规则文件 --struts2会自

hbase 学习(十二)集群间备份原理

集群建备份,它是master/slaves结构式的备份,由master推送,这样更容易跟踪现在备份到哪里了,况且region server是都有自己的WAL 和HLog日志,它就像mysql的主从备份结构一样,只有一个日志来跟踪.一个master集群可以向多个slave集群推送,收到推送的集群会覆盖它本地的edits日志. 这个备份操作是异步的,这意味着,有时候他们的连接可能是断开的,master的变化不会马上反应到slave当中.备份个格式在设计上是和mysql的statement-based

【Dev Club 分享】腾讯验证码的十二年

源:http://mp.weixin.qq.com/s?__biz=MzA3NTYzODYzMg==&mid=2653578147&idx=3&sn=94a8f8f8b4a23b2429ba18bd50c4e048&chksm=84b3b1a4b3c438b28476200037170798276cf7762a115dad9e4b49afeed3151955afe7cf82c4&scene=4#wechat_redirect 内容简介:验证码的诞生就是用来对抗自动机

第十二章、软件包管理

第十二章.软件包管理 本章内容 ?软件运行环境 ?软件包基础 ?rpm包管理 ?yum管理 ?定制yum仓库 ?编译安装 软件运行和编译 ABI:Application Binary Interface Windows与Linux不兼容 ELF(Executable and Linkable Format) PE(Portable Executable) 库级别的虚拟化: Linux: WINE Windows: Cywin API:Application Programming Interfa

十二.HTTPS网站安全访问实践

期中集群架构-第十二章-HTTPS安全证书访问连接实践配置========================================= 01:网络安全涉及的问题: ①. 网络安全问题-数据机密性问题 传输的数据可能会被第三方随时都能看到 ②. 网络安全问题-数据完整性问题 传输的数据不能随意让任何人进行修改 ③. 网络安全问题-身份验证问题 第一次通讯时,需要确认通讯双方的身份正确 02:网络安全涉及的问题: ①. 网络安全问题-数据机密性问题解决 a) 利用普通加密算法解决机密性 利用相