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

关于Struts2的手工代码检验示例

2010-10-27 22:09 337 查看
Struts2的检验机制是先从表单得到数据,然后进行数据格式转换,如果在转换时出现异常则把错误信息封装进FieldErrors集合中,然后无论转换是否成功则会调用Action的检验方法,首先会调用Action的指定方法检验即ValidateXxx()方法,然后再是Validate方法,此方法会对Action内的所有方法进行检验,在检验到错误时会把错误信息封装进FieldErrors内。最后如果FieldErrors集合的长度不为0则调用Action的input视图用于显示错误信息,在JSP文件内可以用<s:fielderror>标签显示错误信息。

为便于说明特做一示例程序。在项目下编辑index.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>My JSP 'index.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" mce_href="styles.css">
-->
</head>

<body>
<h1>用户信息验证</h1>
<hr/>
<form action="test/user_register" method="post">
姓名:<input type="text" name="user.name"/><br/>
性别:<input type="radio" name="user.sex" value="男" checked="checked"/>男
<input type="radio" name="user.sex" value="女"/>女<br/>
手机:<input type="text" name="user.phone"/><br/>
生日:<input type="text" name="user.birthday"/><br/>
<input type="submit" value="注册"/>
<s:fielderror></s:fielderror>
</form>
</body>
</html>


为表单中的数据创建一个JavaBean类:user.java

package bean;
import java.util.Date;
public class User {
private String name;
private String sex;
private String phone;
private int age;
private Date birthday;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
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;
}

}


创建一个UserAction类用于演示手工代码,此类必须显式的继承ActionSupport类。

package web.action;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.regex.Pattern;
import bean.User;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
public class UserAction extends ActionSupport {
private User user;
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
public String register() {
ActionContext.getContext().put("user", user);
return "success";
}
@Override
public void validate() {
// 此方法将对此Action内的所有方法进行检验,
// 并在其他检验方法结束完后最后运行
if (user.getBirthday() == null)
this.addFieldError("user.birthday", "生日必须输入且格式必须正确!");
}
public void validateRegister() {
// 此方法用于针对register方法所需要的数据检验
// 此处故意不对生日字段时行检验
if (user.getName() == null || user.getName().equals(""))
this.addFieldError("user.name", "用户名必须输入");
if (user.getPhone() == null || user.getPhone().equals(""))
this.addFieldError("user.phone", "手机号码必须输入");
else {
if (Pattern.compile("^1[358]//d9$").matcher(user.getPhone())
.matches()) {
this.addFieldError("user.phone", "手机号格式错误!");
}
}
}
}


在这个类中表单会把调用register方法处理数据,因此validateRegister方法是专门针对register方法检验,如果检验到错误的话则把错误信息用addFieldError封装进FieldErrors集合中,假设此类中还有一个update方法也需要检验的话则还要新增一个名为validateUpdate的方法,总之,在这些检验方法调用完毕后才会调用validate方法检验,当所有的检验方法都完毕后再判断FieldErrors集合的长度,如果长度大于0则说明集合内有错误信息,则直接调用此Action类的input视图显示错误信息,如无错误则执行相应的方法,此类中为register方法。

类型转换类

package bean.conversion;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map;
import org.apache.struts2.util.StrutsTypeConverter;
public class ConverDate extends StrutsTypeConverter {
@Override
public Object convertFromString(Map arg0, String[] arg1, Class arg2) {
// TODO Auto-generated method stub
Date date = null;
if(arg1[0]==null)
return null;
DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
try{
date = df.parse(arg1[0]);
}catch (Exception e){
e.printStackTrace();//在控制台抛出异常
date = null;
}
return date;
}
@Override
public String convertToString(Map arg0, Object arg1) {
// TODO Auto-generated method stub
Date date = (Date)arg1;
return arg1.toString();
}
}


相应的转换配置文件和UserAction放于同一个包内,文件名为UserAction-conversion.properties

user.birthday=bean.conversion.ConverDate


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="vaildate" extends="struts-default" namespace="/test">
<action name="user_*" class="web.action.UserAction" method="{1}">
<result name="success">/WEB-INF/userinfo.jsp</result>
<result name="input">/index.jsp</result>
</action>
</package>
</struts>


userinfo.jsp用于输出结果

<body>
${user.name }<br/>
${user.sex }<br/>
${user.phone }<br/>
${user.birthday }<br/>
</body>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: