您的位置:首页 > 编程语言 > Java开发

Struts2输入校验之代码校验

2015-03-13 15:13 288 查看
今天学习了Struts2框架中的数据校验,我们在登录系统时一般会校验用户输入的是否合法,有客户端校验和服务端校验,客户端校验一般用js脚本校验,Struts2框架的校验是服务端的校验,其中又分为两种:自己写代码校验和Struts2框架校验,今天记录的是第一种校验方法:自己写代码校验。

为了学习Struts2的编码校验,我们还是用例子来学习。

一、新建Struts2工程,导入Struts2依赖的jar包

二、为了测试校验,我们模拟一个登录系统的过程,在WebRoot目录下新建login.jsp,代码如下:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@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>login</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>
    <s:form action="loginAction">
    	<s:textfield name="username" label="用户名"></s:textfield>
    	<s:password name="password" label="密码"></s:password>
    	<s:submit value="登录"></s:submit>
    </s:form>
  </body>
</html>
上面的代码中使用taglib标签库做了个简单的登录页面,在浏览器中访问的效果如下图:



三、配置Struts.xml文件。

在上面的form表单中,我们为提交按钮指定了loginAction来处理请求,下面是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="validateTest" extends="struts-default"> 
	<action name="loginAction" class="com.example.action.LoginAction" method="test">
		<result name="success">/success.jsp</result>
		<result name="input">/login.jsp</result>
	</action>
	</package>
</struts>
我们用com.example.action.LoginAction类来处理请求,并指定了result标签中的内容,分为success和input两个,注意上面我们为action添加了method属性并指定属性值为test,下面我们新建LoginAction这个类,该类需要继承ActionSupport类

四、编写LoginAction类,代码如下:

package com.example.action;

import com.opensymphony.xwork2.ActionSupport;

public class LoginAction extends ActionSupport {

	private String username;
	private String password;

	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 execute() throws Exception {
		System.out.println("call method execute");
		return SUCCESS;
	}
	
	public String test() throws Exception{
		System.out.println("call method test");
		return SUCCESS;
	}
	
	public void validateTest(){
		System.out.println("call method validateTest");
	}
	
	@Override
	public void validate() {
		super.validate();
		System.out.println("call method validate");
	}
}
请注意在上面的LoginAction中,我们不同以往,只有execute()方法,这里我们为LoginAction添加了更多方法,包括validate()、test()、validateTest(),下面我来解释这几个方法的作用:由于在struts.xml文件中,我们为action标签添加了method="test"属性,所以当LoginAction处理请求时,不会再调用execute()方法,转而调用test()方法去了,execute()方法是没有指定method="test"时默认会执行的方法,validate()方法的作用是,在获得请求时,校验参数的方法,即当LoginAction返回SUCCESS前,会用validate()方法校验参数的正确性,当然这里的校验方法是由我们自己编写的,比如指定username不能为空,password不能为空等等,那为什么还有个validateTest()方法呢?这里需要注意的是,当action没有指定method="test"属性时,LoginAction默认会用validate()方法去校验数据,但是一旦设置了method="test"属性时,Struts2框架会先在LoginAction中找validateTest()方法来校验数据,然后才执行validate()方法,说了这么多,我们用程序运行的结果来证明上面的说法。

上面的代码执行的结果如下图:



从打印输出的结果可以很明显的看到:Struts2框架在使用LoginAction处理请求时,先调用了validateTest()方法,然后调用validate()方法,最后调用了test()方法,而execute()方法则没有被调用,这个结果符合上面我们说的过程,如果我们去掉struts.xml中action的method="test"属性,后台打印的结果则是:



很明显test()方法和validateTest()方法都没有被调用

五、执行数据校验

上面我们搞清楚了LoginAction中各个方法的执行过程后,再要开始来做数据校验的工作了,我们还是为action标签加上method="test"属性,然后在validateTest()方法中加入如下代码:

public void validateTest(){
	System.out.println("call method validateTest");
	if(username == null || "".equals(username)){
		addFieldError("username", "username should not be empty");
	}
	if(password == null || "".equals(password)){
		addFieldError("password", "password should not be empty");
	}
}
上面的逻辑是,如果username或密码为空,则调用addFieldError()方法将错误信息加入到对应的字段,下面我们访问login.jsp页面,什么都不填就提交数据,发现结果如下:



可以看到提交是不成功的,页面上输出的对应的错误信息,这里主要是login.jsp中的taglib标签库的作用,错误信息的输出主要归功于taglib标签,控制台的打印结果则如下图所示:



可以看到,这里validateTest()方法和validate()方法都被调用了,但是test()方法并未调用,这是因为校验数据不通过,所以test()方法没有得到调用,struts.xml配置文件中,action跳转到result name为input的标签了,而不是result name为success的标签,当我们填写用户名和密码再提交后,结果如下:



控制台打印的结果如下:



可以看到,由于验证通过,所以test方法得到调用,返回SCUUESS,然后页面跳转到success.jsp页面,并在页面上输出了用户名,success.jsp的代码很简单,在body标签中只有一句:

欢迎您:${requestScope.username }
Struts2框架的数据校验第一部分就到这里,下面一篇将会记录用Struts2的校验框架完成数据的校验,这种校验方式不需要编写代码,所有的校验过程都在配置文件中
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: