今天学习了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的校验框架完成数据的校验,这种校验方式不需要编写代码,所有的校验过程都在配置文件中