propertyvalue="age"/>
propertyvalue="birthDay"/>
(8)运行程序
重新布置项目,并重启服务器。
输入页面如下:
结果输出如下:
注意:
以下几处属性应该匹配,即必须一致,否则程序不能正确(成功)运行。
①JSP页面中的属性必须与所请求的Action中的属性名一致;
②
(9)批量数据类型转换(转换成List)
JSP页面代码如下:
formaction="convert.action">
textfieldname="point"key="Point">
textfield>
textfieldname="point"key="Point1">
textfield>
textfieldname="userName"key="UserName">
textfield>
textfieldname="birthDay"key="BirthDay">
textfield>
textfieldname="age"key="Age">
textfield>
submitvalue="Submit">
submit>
form>
Converter.java转换类改写如下:
publicclassConverterextendsStrutsTypeConverter{
@Override
publicObjectconvertFromString(Mapmap,String[]src,ClasstoType)
{
Listpoint=newArrayList();
Pointp=null;
for(Stringstr:
src){
p=newPoint();
String[]tStr=str.split(",");
p.setX(Integer.valueOf(tStr[0]));
p.setY(Integer.valueOf(tStr[1]));
point.add(p);
}
returnpoint;
}
@Override
publicStringconvertToString(Mapmap,Objectsrc){
Listpoint=(List)src;
StringBuildersb=newStringBuilder();
sb.append("[");
for(Pointp:
point){
sb.append("("+p.getX()+","+p.getY()+")");
}
sb.append("]");
returnsb.toString();
}
}
ConvertAction.java只把point属性由Point类型更改为List类型,并产生相应的gettert和setter方法即可。
转换属性配置文件,在此情况下只能用局部类型转换,即ConvertAction-conversion.properties文件,不作任何修改,即可。
运行程序:
结果如下:
2.3数据校验
2.3.1编写validate()方法
在ConvertAction.java中重载父类的validate()方法,内容如下:
publicvoidvalidate(){
if(null==userName||"".equals(userName)){
this.addFieldError("userName","用户名必须填写");
}
}
注意:
addFieldError()方法中的第1个参数为与请求该Action的JSp中对应的标签名字,即标签的name属性值。
如userName,有textfieldname="userName"key="UserName">
textfield>与之对应。
重新布置,并重启服务器,运行结果如下:
结果为:
注意:
由于要校验的ConvertAction中含有自定义类型转换,所以即使在Point,Point1两处文本框输入是正确的前提下,仍提示有错误出现,这是因为Struts2在进行类型转换时,遇到Listpoint;类型,它不知道如何进行转换(此时还没有调用到我们写的Converter.java转换类),因此把它看作一个错误。
这说明Struts2是把所有数据校验都完成(即把相关Action中的属性都验证一遍)以后,才会调用我们自定义的转换函数。
若在这种情况下(即要验证的Action中含有自定义转换类型,比如我们的point属性),必须在自定义类型转换函数中加入判断语句:
publicObjectconvertFromString(Mapmap,String[]src,ClasstoType)
{
if(src==null){
return"";
}
//具体转换部分
returnpoint;
}
@Override
publicStringconvertToString(Mapmap,Objectsrc){
if(null==src){
returnnull;
}
//具体转换部分
returnsb.toString();
}
否则提示以下错误,这是由于struts2.1.6的bug所致!
typeExceptionreport
message
descriptionTheserverencounteredaninternalerror()thatpreventeditfromfulfillingthisrequest.
exception
org.apache.jasper.JasperException:
Class:
ponents.template.TemplateEngineManager
File:
TemplateEngineManager.java
Method:
getTemplateEngine
Line:
102-org/apache/struts2/components/template/TemplateEngineManager.java:
102:
-1
org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:
541)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:
435)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:
320)
2.3.2编写xml验证文件
验证文件的命名规则:
类名-validation.xml,位置必须与要验证的Action在同一个包下。
ConvertAction-validation.xml验证文件内容如下:
xmlversion="1.0"encoding="UTF-8"?
>
DOCTYPEvalidatorsPUBLIC"-//OpenSymphonyGroup//XWorkValidator1.0.2//EN""
true
Usernamemustnotbeempty
6
20
Theusernamemustbetween${minLength}and${maxLength}
TheBirthdaymustnotbeempty!