第二讲:添加验证
首先我们new一个JSP,这个页面我们称为login2.jsp。代码如下:
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>JSP Page</title>
</head>
<body>
<s:form action="login">
<s:textfield name="username" label="username" />
<s:password name="password" label="password" />
<s:submit label="submit" />
</s:form>
</body>
</html>
很明显,这个JSP我们使用了struts2定义的标签。
<%@ taglib prefix="s" uri="/struts-tags" %>
这一句是导入了struts2的标签,前缀规定为“s”
另外,我们看到了struts2自定义的表单标签:
<s:form action="login">
我们看到,action属性赋给了login,而不是login.action。
另外,我们也能看到几个表单控件的标签:
<s:textfield name="username" label="username" />
<s:password name="password" label="password" />
<s:submit label="submit" />
其中的name属性仍然是为控件命名,用于标识这个控件,而label属性则是为相应的控件生成相应的说明文字(如果看不太懂这句话,你可以抄完这段代码后运行它,然后仔细观察就可以知道了)。而且,struts2的标签还有一些格式化的功能,不过,个人认为这个功能作用并不大,因为现在的网页都是需要重写CSS的,这种功能仅仅提供了一个基本的对齐格式,并没有太大的意义。
接下来,我们要修改LoginAction.java文件。代码如下:
package com.speakmore.struts2test.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;
}
@Override
public String execute() throws Exception {
if(this.getUsername().trim().equals("accp")&&this.getPassword().trim().equals("accp")){
return "success";
}else{
this.addFieldError("username", "用户名或密码不正确");
return "failer";
}
}
@Override
public void validate() {
if(null==this.getUsername() || "".equals(this.getUsername().trim())){
this.addFieldError("username", "username is required!");
}
if(null==this.getPassword()||"".equals(this.getPassword().trim())){
this.addFieldError("password", "password is required!");
}
}
}
大家仔细看后就会发现,代码作了四处修改,首先是导入了一个包。
import com.opensymphony.xwork2.ActionSupport;
这个类在xwork-2.0.4.jar包中。ActionSupport对于很多通用的行为提供了一个默认的实现,特别是验证。它实现了绝大部分的验证。所以,第二个改动就是让我们的LoginAction继承了它。
public class LoginAction extends ActionSupport {
第三处改动是添加了一个validate()方法。
@Override
public void validate() {
if(null==this.getUsername() || "".equals(this.getUsername().trim())){
this.addFieldError("username", "username is required!");
}
if(null==this.getPassword()||"".equals(this.getPassword().trim())){
this.addFieldError("password", "password is required!");
}
}
这个方法的内容里有两个if语句,分别判断username和password是否为空,如果为空,则返回一个错误信息,有意思的是,它并没有使用return语句来进行错误信息的返回,而是使用了addFieldError()方法。
this.addFieldError("password", "password is required!");
addFieldError()方法有两个参数,第一个参数表示错误显示在哪个表单控件的上方,第二个参数表示错误信息,这里的意思是:把错误信息“password is required!”显示在login2.jsp里的<s:password name=”password”>这个控件的上方,这也是由struts2自定义控件来实现的。
第四处改动就是execute()方法了。
@Override
public String execute() throws Exception {
if(this.getUsername().trim().equals("accp")&&this.getPassword().trim().equals("accp")){
return "success";
}else{
this.addFieldError("username", "用户名或密码不正确");
return "failer";
}
}
这里添加了一个if语句,判断用户名与密码是否都是accp,如果是,返回“success”,而不是则返回“failer”。也就是说,在我们的struts2.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="login" class="com.speakmore.struts2test.action.LoginAction">
<result name="input">/login2.jsp</result>
<result name="success">/result.jsp</result>
<result name="failer">/login2.jsp</result>
</action>
</package>
</struts>
很明显可以看出来,这里添加了两个result标签:
<result name="input">/login2.jsp</result>
<result name="failer">/login2.jsp</result>
name=input是说明当validate()方法调用出现验证失败时(即addFieldError()被调用时)返回的页面是login2.jsp。而name=failer则是对应于execute()方法中的return语句返回的字符串的。
下面我们进行测试。
这个程序我们首先运行的当然是login2.jsp页面,第一次测试我们什么也不填,直接点submit按钮时,服务器容器(这里是Tomcat)会根据struts2.xml文件里的action标记描述的信息,把login2.jsp页面的信息提交给LoginAction.class的一个实例,调用LoginAction的validate()方法来进行验证,我们什么也没填,addFieldError()方法将被调用,服务器容器(这里是Tomcat)会根据struts2.xml中的<result name=input>标记的指示,将页面转回login2.jsp页面来,并将错误消息显示于特定的控件上方(我们看到的结果就是username文本框上方出现“name is required”,password框上方出现“password is required”)。
第二次测试,我们在用户名和密码框里都填上abc,当我们点submit按钮时,服务器容器仍然将信息提交给LoginAction,调用LoginAciton的validate()方法,这一次验证将通过(addFieldError()方法不被调用),当validate方法执行完毕之后,服务器容器接着调用LoginAction的execute()方法,进行用户名和密码的验证,当然,我们的用户名和密码输入的都不是accp,所以验证失败,execute()方法将返回“failer”,服务器容器根据<result name=”failer”>标记的指示,将页面转到login2.jsp,并将错误消息“用户名或密码不正确”也传给了login2.jsp,于是我们看到的结果就是login2.jsp页面的username文本框上方出现了“用户名或密码不正确”。
第三次测试,我们在用户名和密码框里都填上accp,当我们点submit按钮时,服务器容器仍然将信息提交给LoginAction,首先调用LoginAction的validate()方法,验证通过,接着调用execute()方法,验证也通过,execute()方法将返回“success”,服务器容器根据<result name=”success”>标记的指示,将页面转到了result.jsp,于是我们看到了我们填入的用户名和密码:accp。
至此,大功告成,我们的第一个struts2的应用就写完了。
您好:
当您在阅读和使用我所提供的各种内容的时候,我非常感谢,您的阅读已是对我最大的支持。
我更希望您能给予我更多的支持。
1.希望您帮助我宣传我的博客,让更多的人知道它,从中获益。
2.希望您能多提出宝贵意见,包括我所提供的内容中的错误,建设性的意见,更希望获得哪些方面的帮助,您的经验之谈等等。
3.更希望能得到您经济上的支持。
我博客上面的内容均属于个人的经验,所有的内容均为开源内容,允许您用于任何非商业用途,并不以付费为前提,如果您觉得在阅读和使用我所提供的各种内容的过程中,您得到了帮助,并能在经济上给予我支持,我将感激不尽。
您可以通过银行转帐付款给我(5元10元的,随意):
招商银行一卡通:
卡号:6225888712586894
姓名:牟勇
您也可以通过汇款的方式(5元10元的,随意):
通讯地址:云南省昆明市女子(28)中学人民中路如意巷1号
收信人:陈谦转牟勇收
邮编:650021
无论您给予我怎么样的支持,我都衷心的再次感谢。
欢迎光临我的博客,欢迎宣传我的博客
http://hi.csdn.net/mouyong
http://blog.csdn.net/mouyong
http://blog.sina.com.cn/mouyong
EMail:mouyong@yeah.net
发表于 @ 2008年02月15日 22:27:00|评论(loading...)|编辑