随笔-34  评论-1965  文章-0  trackbacks-0
All Input Is Evil!
-Writing secure code

在写前几篇文章的时候,有些朋友建议我的写一篇关于表单数据校验的文章。 正如文章的开头所引用的《Writing Secure Code》的名言:“所有的输入都是罪恶的”,所以我们应该对所有的外部输入进行校验。而表单是应用程序最简单的入口,对其传进来的数据,我们必须进行校验。

转换与校验(Conversion & Validation)

其实上篇文章,我本来是打算写表单数据校验的内容,但是经过再三思考后,还是决定先写Struts 2.0转换器的内容。原因是我认为转换是校验的基础,只有在数据被正确地转换成其对应的类型后,我们才可以对其取值范围进行校验。看个例子相信大家可以更清楚。现在我们就来改造一下《转换器(Converter)——Struts 2.0中的魔术师》的第一个例子。

首先,从Action开始,修改后的代码如下:

package tutorial;

import java.util.Locale;

import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.util.LocalizedTextUtil;

public class HelloWorld extends ActionSupport {
   
private String msg;
   
private Locale loc = Locale.US;
   
   
public String getMsg() {
       
return msg;        
   }

   
   
public Locale getLoc() {
       
return loc;
   }

   
   
public void setLoc(Locale loc) {
       
this .loc = loc;
   }

   
   @Override
   
public void validate() {
       System.out.println(
" Calling validate() " );
       
if ( ! (loc.equals(Locale.US) || loc.equals(Locale.CHINA))) {
                   addFieldError(
" loc " , getText( " validation.loc " ));
       }

   }

       
   
public void validateExecute() {
       System.out.println(
" Calling validateExecute() by reflection " );
   }

   
   @Override
   
public String execute() {
       System.out.println(
" Calling execute() " );
       
// LocalizedTextUtil是Struts 2.0中国际化的工具类,<s:text>标志就是通过调用它实现国际化的
           msg = LocalizedTextUtil.findDefaultText( " HelloWorld " , loc);
       
return SUCCESS;
   }

}

然后,修改Struts.xml中Action的定义指明输入地址:

< action name ="HelloWorld" class ="tutorial.HelloWorld" >
   
< result > /HelloWorld.jsp </ result >
   
< result name ="input" > /HelloWorld.jsp </ result >
</ action >

接着,在HelloWorld.jsp中加入错误提示:

<% @ page  contentType = " text/html; charset=UTF-8 " %>
<% @taglib prefix = " s " uri = " /struts-tags " %>
< html >
< head >
   
< title > Hello World </ title >
</ head >
< body >
   
< div style ="color:red;" >
       
< s:fielderror />
   
</ div >
   
< s:form action ="HelloWorld" theme ="simple" >            
        Locale:
< s:textfield name ="loc" /> &nbsp; < s:submit />
   
</ s:form >    
   
< h2 >< s:property value ="msg" /></ h2 >
</ body >
</ html >

再修改LocaleConverter.java文件,将内容改为:

package tutorial;

import java.util.Locale;
import java.util.Map;
import java.util.regex.Pattern;

public class LocaleConverter extends ognl.DefaultTypeConverter {
   @Override
   
public Object convertValue(Map context, Object value, Class toType) {
       
if (toType == Locale. class ) {            
           System.out.println(
" Converting String to Locale " );
           String locale
= ((String[]) value)[ 0 ];
           
return new Locale(locale.substring( 0 , 2 ), locale.substring( 3 ));
       }
else if (toType == String. class ) {
           System.out.println(
" Converting Locale to String " );
           Locale locale
= (Locale) value;
           
return locale.toString();
       }

       
return null ;
   }

}

之后,修改国际化资源文件,内容为:

HelloWorld = 你好,世界!
invalid.fieldvalue.loc
= Locale必须为\ " xx_XX\ " 的格式
validation.loc
= 区域必须为中国或美国
globalMessages_zh_CN.properties

HelloWorld = Hello World!
invalid.fieldvalue.loc
= Locale must like \ " xx_XX\ "
validation.loc
= Locale must be China or USA
globalMessages_en_US.properties

发布运行应用程序,在浏览器中键入http://localhost:8080/Struts2_Validation/HelloWorld.action,在Locale中输入zh_CN,按“Submit”提交,效果如上篇文章所示。而在服务器控制台有如下输出:

Converting String to Locale...
Calling validateExecute() by reflection...
Calling validate()...
Calling execute()...
Converting Locale to String...

上述的输出说明了Struts 2.0的数据校验工作方式,它需要经过下面几个步骤:

  1. 通过转换器将请求参数转换成相应的Bean属性;
  2. 判断转换过程是否出现异常。如果有,则将其保存到ActionContext中,conversionError拦截器再封装为fieldError;如果没有,进行下一步;
  3. 通过反射(Reflection)来调用validateXxx()方法(其中,Xxx表示Action的方法名);
  4. 调用validate()方法;
  5. 如果经过上述步骤没有出现fieldError,则调用Action方法;如果有,则会跳过Action方法,通过国际化将fieldError输出到页面。

不喜欢看文字的朋友,可以参考下面的图1。

图1 校验顺序图
图1 校验顺序图

看到这里可能大家会疑问:“这么多地方可以校验表单数据,到底我应该在那里做呢?”有选择是好事,但抉择的过程往往是痛苦的,往往让人不知所措。如果大家参照以下几点建议,相信会比较容易地做出正确的抉择。

  1. 如果需要转换的数据,通常做法在转换的时候做格式的校验,在Action中的校验方法中校验取值。假如用户填错了格式,我们可以通过在资源文件配置invalid.fieldvalue.xxx(xxx为属性名)来提示用户正确的格式,不同的阶段出错显示不同的信息。具体做法请参考上面的例子;
  2. 至于用validate()还是validateXxx(),我推荐使用validate()。原因是validateXxx()使用了反射,相对来说性能稍差,而validate()则是通过接口com.opensymphony.xwork2.Validateable调用。当然如果你的表单数据取值是取决于特定Action方法,则应该使用validateXxx()。

在运行上面的例子时,在Locale中输入zh并提交时出现图2所示页面。

图2 错误格式
图2 错误格式

在Locale中输入de_DE时,出现如图3所示页面。

图3 取值错误
图3 取值错误

使用Struts 2.0的校验框架

上一节的内容都是关于如何编程实现校验,这部分工作大都是单调的重复。更多情况下,我们使用Struts 2.0的校验框架,通过配置实现一些常见的校验。

我学习编程有个习惯——喜欢先看输出结果,再看代码实现。这样学的好处是先看结果可以刺激学习的激情,也可以在看代码前自已思考一下如何实现,然后带着问题去看代码,那就清晰多了。因此下面我们先来做演示。

首先,在tutorial包下新建ValidationAction.java,代码如下:

package tutorial;

import com.opensymphony.xwork2.ActionSupport;

public class ValidationAction extends ActionSupport {
   
private String reqiuredString;

   
public String getReqiuredString() {
       
return reqiuredString;
   }


   
public void setReqiuredString(String reqiuredString) {
       
this .reqiuredString = reqiuredString;
   }

   
   @Override
   
public String execute() {
       
return SUCCESS;
   }
   
}

然后,配置上述所建的Ation,代码片段如下:

< action name ="ValidationAction" class ="tutorial.ValidationAction" >
   
< result > /Output.jsp </ result >
   
< result name ="input" > /Input.jsp </ result >
</ action >

接着,创建Input.jsp和Output.jsp,内容分别如下:

<% @ page  contentType = " text/html; charset=UTF-8 " %>
<% @taglib prefix = " s " uri = " /struts-tags " %>
< html >
< head >
   
< title > Hello World </ title >
   
<!-- 此标志的作用是引入Struts 2.0的常用的Javascript和CSS -->
   
< s:head />
</ head >
< body >
   
< s:form action ="ValidationAction" >            
       
< s:textfield name ="reqiuredString" label ="Required String" />
       
< s:submit />
   
</ s:form >    
</ body >
</ html >
Input.jsp

<% @ page  contentType = " text/html; charset=UTF-8 " %>
<% @taglib prefix = " s " uri = " /struts-tags " %>
< html >
< head >
   
< title > Hello World </ title >
</ head >
< body >
    Required String:
< s:property value ="reqiuredString" />    
</ body >
</ html >
Output.jsp

再接下来,在tutorial包下创建ValidationAction的校验配置文件Xxx-validation.xml(Xxx为Action的类名),在本例中该文件名ValidationAction-validation.xml,内容如下:

<? xml version="1.0" encoding="UTF-8" ?>
<! DOCTYPE validators PUBLIC 
          "-//OpenSymphony Group//XWork Validator 1.0//EN" 
          "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd"
>          
< validators >
   
< field name ="reqiuredString" >
       
< field-validator type ="requiredstring" >
           
< message > This string is required </ message >
       
</ field-validator >
   
</ field >
</ validators >

发布运行应用程序,在地址栏中键入http://localhost:8080/Struts2_Validation/Input.jsp,出现如图4所示页面。

图4 Input.jsp
图4 Input.jsp

直接点击“Submit”提交表单,出现图5所示的页面。

图5 错误提示
图5 错误提示

在Required String中随便填点东西,转到Output.jsp页面,如图6所示。

图6 Output.jsp
图6 Output.jsp

通过上面的例子,大家可以看到使用该校验框架十分简单方便。不过,上例还有两点不足:

  1. 还没有国际化错误消息;
  2. 没有实现客户端的校验。

当然,要完善以上不足,对于Struts 2.0来说,只是小菜一碟。

  1. 在Xxx-validation.xml文件中的<message>元素中加入key属性;
  2. 在Input.jsp中的<s:form>标志中加入validate="true"属性,就可以在用Javascript在客户端校验数据。

下面是具体的实现,首先在国际化资源文件中加入错误消息,然后按照上面说明实现。因为要使用Javascript在客户端显示出错信息,所以在加载Input.jsp页面时,Struts 2.0需要获得国际化的字符串,故我们需要使用Action来访问Input.jsp页面,具体实现请参考《在Struts 2.0中国际化(i18n)您的应用程序》的最后部分。最后发布运行应用程序,直接在页面中点击“Submit”,表单没有被提交并出现错误提示,如图7所示:

图7 客户端校验
图7 客户端校验

校验框架是通过validation拦截器实现,该拦载被注册到默认的拦截器链中。它在conversionError拦截器之后,在validateXxx()之前被调用。这里又出现了一个选择的问题:到底是应该在action中通过validateXxx()或validate()实现校验,还是使用validation拦截器?绝大多数情况,我建议大家使用校验框架,只有当框架满足不了您的要求才自已编写代码实现。

配置文件查找顺序

在上面的例子中,我们通过创建ValidationAction-validation.xml来配置表单校验。Struts 2.0的校验框架自动会读取该文件,但这样就会引出一个问题——如果我的Action继承其它的Action类,而这两个Action类都需要对表单数据进行校验,那我是否会在子类的配置文件(Xxx-validation.xml)中复制父类的配置吗?

答案是不,因为Struts 2.0的校验框架跟《在Struts 2.0中国际化(i18n)您的应用程序》提到的“资源文件查找顺序”相似,有特定的配置文件查找顺序。不同的是校验框架按照自上而下的顺序在类层次查找配置文件。假设以下条件成立:

  1. 接口 Animal;
  2. 接口 Quadraped 扩展了 Animal;
  3. 类 AnimalImpl 实现了 Animal;
  4. 类 QuadrapedImpl 扩展了 AnimalImpl 实现了 Quadraped;
  5. 类 Dog 扩展了 QuadrapedImpl;

如果Dog要被校验,框架方法会查找下面的配置文件(其中别名是Action在struts.xml中定义的别名):

  1. Animal-validation.xml
  2. Animal-别名-validation.xml
  3. AnimalImpl-validation.xml
  4. AnimalImpl-别名-validation.xml
  5. Quadraped-validation.xml
  6. Quadraped-别名-validation.xml
  7. QuadrapedImpl-validation.xml
  8. QuadrapedImpl-别名-validation.xml
  9. Dog-validation.xml
  10. Dog-别名-validation.xml

已有的校验器

Struts 2.0已经为您实现很多常用的校验了,以下在jar的default.xml中的注册的校验器。

< validators >
   
< validator name ="required" class ="com.opensymphony.xwork2.validator.validators.RequiredFieldValidator" />
   
< validator name ="requiredstring" class ="com.opensymphony.xwork2.validator.validators.RequiredStringValidator" />
   
< validator name ="int" class ="com.opensymphony.xwork2.validator.validators.IntRangeFieldValidator" />
   
< validator name ="double" class ="com.opensymphony.xwork2.validator.validators.DoubleRangeFieldValidator" />
   
< validator name ="date" class ="com.opensymphony.xwork2.validator.validators.DateRangeFieldValidator" />
   
< validator name ="expression" class ="com.opensymphony.xwork2.validator.validators.ExpressionValidator" />
   
< validator name ="fieldexpression" class ="com.opensymphony.xwork2.validator.validators.FieldExpressionValidator" />
   
< validator name ="email" class ="com.opensymphony.xwork2.validator.validators.EmailValidator" />
   
< validator name ="url" class ="com.opensymphony.xwork2.validator.validators.URLValidator" />
   
< validator name ="visitor" class ="com.opensymphony.xwork2.validator.validators.VisitorFieldValidator" />
   
< validator name ="conversion" class ="com.opensymphony.xwork2.validator.validators.ConversionErrorFieldValidator" />
   
< validator name ="stringlength" class ="com.opensymphony.xwork2.validator.validators.StringLengthFieldValidator" />
   
< validator name ="regex" class ="com.opensymphony.xwork2.validator.validators.RegexFieldValidator" />
</ validators >
关于每个校验器的具体用法,请参考以下链接:
http://wiki.javascud.org/display/ww2cndoc/Validation
该链接中还有一些很有的信息,请大家仔细阅读。

总结

使用校验框架既可以方便地实现表单数据校验,又能够将校验与Action分离,故我们应该尽可能使用校验框架。在使用校验框架时,请不要忘记通过在资源文件加入invalid.fieldvalue.xxx字符串,显示适合的类型转换出错信息;或者使用conversion校验器。

posted on 2006-11-14 13:38 Max 阅读(51426) 评论(118)  编辑  收藏 所属分类: Struts 2.0系列
评论共2页: 1 2 下一页 

评论:
# re: 在Struts 2.0中实现表单数据校验(Validation)[未登录] 2007-04-19 17:42 | test
请问这个是什么问题?  回复  更多评论
  
# re: 在Struts 2.0中实现表单数据校验(Validation) 2007-04-19 23:12 | Max
@huhuyeah
你是不是设了<s:form />标志的theme属性?
正常情况下,生成的Javascript代码应该在</form>之后,如:
<script type="text/javascript">
function validateForm_Xxx() {
...
}
</script>  回复  更多评论
  
# re: 在Struts 2.0中实现表单数据校验(Validation) 2007-04-20 09:41 | huhuyeah
@Max
是的,我把struts.ui.theme设置成simple了
这样校验就不起作用了。把simple去掉就起作用了
但是这样的话会自动生产一些表格。
能不能表格由我自己定制,而校验依然能使用的方法?
另外自动生产的JS也不是很好,总是提示objectError,然后显示错误标签
我是希望提示的时候就把错误的信息直接alert出来
这种能不能通过设置解决,谢谢  回复  更多评论
  
# re: 在Struts 2.0中实现表单数据校验(Validation) 2007-04-20 12:02 | mm
这里的文章很好耶!  回复  更多评论
  
# re: 在Struts 2.0中实现表单数据校验(Validation)[未登录] 2007-04-20 15:11 | Leo
你好,有个问题请教一下,已经发到你的邮箱里了,有时间时请帮忙解答一下,谢谢!  回复  更多评论
  
# re: 在Struts 2.0中实现表单数据校验(Validation) 2007-04-23 15:46 | mm
如何进行客户端校验?是自己写javascript代码,还是配置Xxx-Validation.xml文件来实现?我想用我自己的javascript代码,怎么用呢?  回复  更多评论
  
# re: 在Struts 2.0中实现表单数据校验(Validation) 2007-04-24 13:53 | jiajia
我的LoginAction里面有两个方法:init,login。如果我要让init方法执行时不验证,logic方法执行时做验证,该怎么配置,
我的LoginAction-validation.xml的内容是:
<validators>
<field name="userId">
<field-validator type="requiredstring">
<message key="required"/>
</field-validator>
</field>
</validators>
struts.xml的内容是:
<package name="loginAction" extends="struts-default">
<action name="login" class="login.LoginAction">
<result name="sussessInit">/WEB-INF/jsp/login.jsp</result>
<result name="sussessLogin">/WEB-INF/jsp/main.jsp</result>
<result name="input">/WEB-INF/jsp/login.jsp</result>
</action>
</package>
请赐教  回复  更多评论
  
# re: 在Struts 2.0中实现表单数据校验(Validation) 2007-04-25 09:40 | huhuyeah
@mm
两种都可以。
如果用自己的js,在form的onsumbit时候里面调用自己的js就可以了
也可以在提交按钮里面onclick调用自己的校验js再forms[0].submit()来提交表单  回复  更多评论
  
# re: 在Struts 2.0中实现表单数据校验(Validation) 2007-04-25 09:47 | Max
@mm
建议使用Struts 2的validation框架。  回复  更多评论
  
# re: 在Struts 2.0中实现表单数据校验(Validation) 2007-04-25 09:49 | Max
最简单的方法就是将你的LoginAction-validation.xml文件改名为“LoginAction-login-validation.xml”。这样validation的配置只对login起作用。  回复  更多评论
  
# re: 在Struts 2.0中实现表单数据校验(Validation) 2007-04-25 13:42 | ddd
使用JS的话, 也有他的好处, 减少和Server间的通信,

Server端校验的话, 用Struts准备的也可以。。

不过,偶以前做的项目,都是自己写校验的类。。。

几乎没用过validation  回复  更多评论
  
# re: 在Struts 2.0中实现表单数据校验(Validation) 2007-04-26 14:42 | jiajia
文章中的验证是用xwork提供的方法,action方法要继承ActionSupport,如果不用xwork提供的验证,使用Struts 2的validation框架验证,验证走DWRValidator类提供的方法,应该怎么办?  回复  更多评论
  
# re: 在Struts 2.0中实现表单数据校验(Validation) 2007-04-26 15:01 | ddd
# re: 在Struts 2.0中实现表单数据校验(Validation) 2007-06-03 22:45 | jezz
在第一个例子有点小问题
validation.loc = 区域必须为中国或美国
这个我显示出错,没有显示出错信息,直接把validate.loc显示出来了!
后来我把
validate.loc = 区域必须为中国或美国
就可以显示了!

我直接在关注你的文章!
已经加了你的gtalk很少看到你!  回复  更多评论
  
# re: 在Struts 2.0中实现表单数据校验(Validation) 2007-06-04 23:26 | Max
@jezz
对不起,最近比较忙一点。  回复  更多评论
  
# re: 在Struts 2.0中实现表单数据校验(Validation)[未登录] 2007-06-07 20:42 | Oliver
huhuyeah,你那个关于theme的验证问题解决了吗?我和你碰到了一样的烦恼,郁闷啊,不知该怎么办!!!!  回复  更多评论
  
# re: 在Struts 2.0中实现表单数据校验(Validation)[未登录] 2007-06-07 22:19 | Oliver
我的action配置为
<action name="类名" class="...">
<interceptor-ref name="validationWorkflowStack"/>
<result>list.jsp</result>
<result name="list" type="redirect-action">类名!list</result>
<result name="input">edit.jsp</result>
</action>
在edit.jsp页面中,通过"类名!save.action"来进行保存,另外配置了"类名-save-validation.xml"文件。
我的问题的,当把验证配置文件改名为"类名-validation.xml"时,会对用"类名"加"!"方式访问的所有方法进行验证,可以只想对save方法进行验证,但将配置文件更名为"类名-save-validation.xml"后,验证就不起作用了.............  回复  更多评论
  
# re: 在Struts 2.0中实现表单数据校验(Validation)[未登录] 2007-06-07 22:20 | Oliver
@Oliver
可“是”只想对save方法进行验证,打错一个字:(  回复  更多评论
  
# re: 在Struts 2.0中实现表单数据校验(Validation) 2007-06-11 14:23 | Mosquito
为什么我一进页面错误提示就出现呢??
没提交之前就出现。。。。
为什么,帮忙分析一下原因呗!!  回复  更多评论
  
# re: 在Struts 2.0中实现表单数据校验(Validation) 2007-06-12 11:25 | wldandan
楼主,我的Action 定义如下
<action name="save" class="ManagerConfigAction"
method="save">
<result name="input" type="dispatcher">/Conf/mozartConf.jsp</result>
<result type="redirect">/mozartConf/show.action</result>
</action>

然后定义了validator配置文件
运行后,当在input框输入错误值时,错误提示信息可以显示出来,但服务器端还是对数据进行了保存啊!!  回复  更多评论
  
# re: 在Struts 2.0中实现表单数据校验(Validation) 2007-06-19 17:40 | jpma
请问:"在Xxx-validation.xml文件中的<message>元素中加入key属性; "
这个怎么操作啊?
谢谢了!  回复  更多评论
  
# re: 在Struts 2.0中实现表单数据校验(Validation) 2007-06-21 17:01 | jpma
@jpma
自己找到答案了,我是这样写的,功能实现了,不知有没有其它的方式。
修改Xxx-validation.xml文件中的<validators>部分
<validators>
<field name="reqiuredString">
<field-validator type="requiredstring">
<message key="validation.req" />
</field-validator>
</field>
</validators>

其中key的值对应globalMessages_en_US.properties与globalMessages_zh_CN.properties中“validation.req”
-------------------------------------------------
HelloWorld=HelloWorld!
invalid.fieldvalue.loc = Locale must like \ " xx_XX\ "
validation.loc = Locale must be China or USA
validation.require=${getText(fileName)} is required
validation.rqu=This string is required
-------------------------------------------------  回复  更多评论
  
# re: 在Struts 2.0中实现表单数据校验(Validation) 2007-06-21 17:05 | jpma
最后一行写错了,是
validation.req=This string is required

globalMessages_zh_CN.properties内容
-------------------------------------------------
HelloWorld=你好,世界!哈哈
invalid.fieldvalue.loc = Locale必须为\ " xx_XX\ " 的格式
validation.loc = 区域必须为中国或美国
validation.require=${getText(fileName)} is required
validation.req=字符串不可为空
-------------------------------------------------  回复  更多评论
  
# re: 在Struts 2.0中实现表单数据校验(Validation) 2007-06-26 00:00 | jezz
那不用写javascript验证啊?  回复  更多评论
  
# re: 在Struts 2.0中实现表单数据校验(Validation) 2007-07-04 17:39 | 任遨游
在</form>这后已产生了js,为什么验证不起作用呢,并没有提示信息
<script type="text/javascript">
function validateForm_ValidationAction() {
form = document.getElementById("ValidationAction");
clearErrorMessages(form);
clearErrorLabels(form);

var errors = false;

return !errors;
}
</script>  回复  更多评论
  
# re: 在Struts 2.0中实现表单数据校验(Validation) 2007-07-04 23:30 | Max
@任遨游
--------------------------------------------
在Input.jsp中的<s:form>标志中加入validate="true"属性,就可以在用Javascript在客户端校验数据。  回复  更多评论
  
# re: 在Struts 2.0中实现表单数据校验(Validation) 2007-07-05 11:59 | 任遨游
@Max

以下是我input.jsp代码,可是还是不起作用
<%@ page contentType="text/html;charset=UTF-8" %>
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
<head>
<title> Hello World </title>
<!-- 姝ゆ爣蹇楃殑浣滅敤鏄紩鍏truts 2.0鐨勫父鐢ㄧ殑Javascript鍜孋SS -->
<s:head/>
</head>
<body>
<s:form action="ValidationAction" validate="true">
<s:textfield name="reqiuredString" label="Required String" />
<s:submit/>
</s:form>
</body>
</html>   回复  更多评论
  
# re: 在Struts 2.0中实现表单数据校验(Validation) 2007-07-05 15:16 | 妖狐
Struts2.x是否可以像Struts1.x那样使用统一的表单校验文件validation.xml  回复  更多评论
  
# re: 在Struts 2.0中实现表单数据校验(Validation) 2007-07-05 22:40 | Max
@妖狐
我认为不可以。  回复  更多评论
  
# re: 在Struts 2.0中实现表单数据校验(Validation) 2007-07-06 11:28 | 任遨游
表单校验很重要,max的所有例子我都运行了下,只有这个校验,还有那个showproduct.jsp这两个例子
怎么也调不过去了。郁闷ing  回复  更多评论
  
# re: 在Struts 2.0中实现表单数据校验(Validation) 2007-07-11 15:21 | 任遨游
没有回复了?我用的struts2.0.8,怎么校验不起作用呢  回复  更多评论
  
# re: 在Struts 2.0中实现表单数据校验(Validation) 2007-07-11 22:37 | Max
@任遨游
三言两语,我也帮不了你。
不如你留下Email,我有空的时候可以将例子的源码发你。  回复  更多评论
  
# re: 在Struts 2.0中实现表单数据校验(Validation) 2007-07-12 09:35 | 任遨游
@Max
supershan@163.com,非常感谢  回复  更多评论
  
# re: 在Struts 2.0中实现表单数据校验(Validation) 2007-07-19 19:38 | 游客
今天用一下validator框架,也遇到了这个问题真是郁闷极了.
哪位知道解决办法啊?  回复  更多评论
  
# re: 在Struts 2.0中实现表单数据校验(Validation) 2007-07-21 12:01 | tans
我的验证都通过了,但是验证错误信息提示老显示在上方,有没有什么办法可以让它显示在验证行之后呢?还有有哪位老大把他那官方Using FieldValidators示例调式通过了的啊,为什么我老提示No result defined for action  回复  更多评论
  
# re: 在Struts 2.0中实现表单数据校验(Validation) 2007-07-24 17:10 | 任遨游
这个例子通过了,其实max的例子都是可以的,有时运行不通过,很有可能是配置时,只差了一点点。  回复  更多评论
  
# re: 在Struts 2.0中实现表单数据校验(Validation) 2007-08-13 16:46 | tans
能不能修改错误信息显示的位置啊?显示在上方不太好看?  回复  更多评论
  
# re: 在Struts 2.0中实现表单数据校验(Validation) 2007-08-14 13:55 | 陈利
如果在表单中填入数字,而且是必填的,如何写配置文件啊?  回复  更多评论
  
# re: 在Struts 2.0中实现表单数据校验(Validation) 2007-08-16 11:14 | darvsum
讲解得相当透彻。谢谢  回复  更多评论
  
# re: 在Struts 2.0中实现表单数据校验(Validation) 2007-08-20 17:25 | 甲生
如果使用框架验证,每一个action需要一个相应的配置文件,那岂不是增加了工作量?  回复  更多评论
  
# re: 在Struts 2.0中实现表单数据校验(Validation) 2007-08-20 17:33 | 甲生
文章写到后面,怎么草草收兵了,颇有不解之处  回复  更多评论
  
# re: 在Struts 2.0中实现表单数据校验(Validation) 2007-08-20 23:53 | Max
@甲生
1、“增加了工作量”这个问题可以说是见仁见智;
2、有些东西是“师傅领入门,修行靠自己”;我本人能力和时间有限,所以不可以面面俱到。  回复  更多评论
  
# re: 在Struts 2.0中实现表单数据校验(Validation) 2007-08-21 08:27 | 甲生
是的,虽然有些不懂,但也学了不少,非常感谢!  回复  更多评论
  
# re: 在Struts 2.0中实现表单数据校验(Validation) 2007-08-22 11:03 | romatory
为什么使用自定义校验器不行,
严重: Servlet.service() for servlet default threw exception
java.lang.ExceptionInInitializerError
at com.opensymphony.xwork2.validator.ValidatorFileParser.
addValidatorConfigs(ValidatorFileParser.java:192)  回复  更多评论
  
# re: 在Struts 2.0中实现表单数据校验(Validation) 2007-08-22 16:51 | zouzhihua
把validate="true"这个加上之后会出现
FreeMarker template error!

Method public java.lang.String com.opensymphony.xwork2.validator.validators.ValidatorSupport.getMessage(java.lang.Object) threw an exception when invoked on com.opensymphony.xwork2.validator.validators.RequiredStringValidator@10699ea
The problematic instruction:
----------
==> ${validator.getMessage(action)?js_string} [on line 28, column 26 in template/xhtml/form-close-validate.ftl]
in include "/${parameters.templateDir}/xhtml/form-close-validate.ftl" [on line 3, column 1 in template/xhtml/form-close.ftl]
----------

Java backtrace for programmers:
----------
freemarker.template.TemplateModelException: Method public java.lang.String com.opensymphony.xwork2.validator.validators.ValidatorSupport.getMessage(java.lang.Object) threw an exception when invoked on com.opensymphony.xwork2.validator.validators.RequiredStringValidator@10699ea  回复  更多评论
  
# re: 在Struts 2.0中实现表单数据校验(Validation) 2007-08-22 16:52 | zouzhihua
在线等待解决  回复  更多评论
  
# re: 在Struts 2.0中实现表单数据校验(Validation) 2007-08-23 15:56 | pxcong
@Max
你写的文章太好啦,讲解的也很仔细,可以出书了,呵呵~:)
能帮我解决下 提交前就进行验证的问题,(我不想在未提交前就输出警告信息,如:字符不为空。)
如果好的例子的话可以发给我吗?
邮箱:pxcong007@126.com
  回复  更多评论
  
# re: 在Struts 2.0中实现表单数据校验(Validation) 2007-08-28 12:06 | louleigh
max哥..小弟又来拜读你的大作啦..
请问一下。
在alidation框架下面。
如果想用红色显示该怎么做啊。.
  回复  更多评论
  
# re: 在Struts 2.0中实现表单数据校验(Validation) 2007-08-28 12:11 | louleigh
如果按照你的第一种方法来弄。.则会显示两个.
一个是红色的.一个是黑色的。请问应该怎么解决也  回复  更多评论
  
# re: 在Struts 2.0中实现表单数据校验(Validation) 2007-08-28 23:09 | Max
@louleigh
不是很明白你的问题,能否详细一点  回复  更多评论
  
# re: 在Struts 2.0中实现表单数据校验(Validation) 2007-08-30 08:44 | louleigh
我的问题就是你验证后要提示错误信息嘛。

怎么把那个错误信息变成红色的。。

我看了一下我的表达好象是有点问题。。

我现在的问题是他要提示错误。

但是错误显示是黑色的。。

我可以在他前面加上

<div style="color:red"><s:fielderror></div>

但是这样的话。他就会显示两次错误信息。

我想显示一次。并且让他成为红色。

请问该怎么做。

麻烦你啦。。max哥  回复  更多评论
  
# re: 在Struts 2.0中实现表单数据校验(Validation) 2007-09-01 15:59 | louleigh
我配置出来的后。。
validation他显示的颜色是黑色。。。
我的意思大概就是这个  回复  更多评论
  
# re: 在Struts 2.0中实现表单数据校验(Validation) 2007-09-01 16:29 | gdm
我的程序怎么出不来呢?加上验证的就过不去。请教高手除了写actionname-validation.xml 以外还需要配置别的地方吗?谢谢
  回复  更多评论
  
# re: 在Struts 2.0中实现表单数据校验(Validation) 2007-09-01 16:33 | ts
按照上面的配置之后,运行出以下的错误
Document is invalid: no grammar found
请问该如何解决  回复  更多评论
  
# re: 在Struts 2.0中实现表单数据校验(Validation) 2007-09-01 16:41 | louleigh
@gdm
actionname-validation.xml除了这个玩意儿没有地方需要写了
请你把max的例子。。仔细看下哪里整错了没有。
max的例子是绝对正确的

仔细检查  回复  更多评论
  
# re: 在Struts 2.0中实现表单数据校验(Validation) 2007-09-01 16:42 | louleigh
max我知道问题出在哪里了
问题出在
我以前没有写<s:head/>
这个东西。。
现在用了这个就可以变色了

请问s:head是实现的什么东西啊

我可以重写他的内容吗。

他改变了我页面的其他显示啊。。

我不想用他的字体。。如果知道请回答  回复  更多评论
  
# re: 在Struts 2.0中实现表单数据校验(Validation) 2007-09-01 16:47 | gdm
首先感谢louleigh的回复,我阅读好几遍了
以下是我的RegisterAction-validation.xml中写到的
<?xml version="1.0" encoding="UTF-8"?>
<validators>
<field name ="user.username">
<field-validator type ="requiredstring">
<message> This string is required </message>
</field-validator>
</field>
<field name="user.password">
<field-validator type="requiredstring">
<message>You must enter a value for password.</message>
</field-validator>
<field-validator type="fieldexpression">
<param name="expression">
user.password == user.verifyPassword
</param>
<message>Passwords don't match.</message>
</field-validator>
</field>
<field name="user.birthday">
<field-validator type="date">
<param name="min">12/22/1980</param>
<param name="max">9/1/2007</param>
<message>The date must be between 12-22-2002 and 12-25-2002.</message>
</field-validator>
</field>

<field name="user.email">
<field-validator type="email">
<message>You must enter a valid email.</message>
</field-validator>
</field>
<field name="user.age">
<field-validator type="int">
<param name="min">6</param>
<param name="max">100</param>
<message>
Age must be between ${min} and ${max}, current value is
${user.age}.
</message>
</field-validator>
</field>
</validators>
下面是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="default" extends="struts-default">
<action name="reg"
class="com.gdm.actions.RegisterAction.RegisterAction">
<result name="success" type="dispatcher">
<param name="location">/result.jsp</param>
</result>

<result name="input" type="dispatcher">
<param name="location">/register.jsp</param>
</result>

<interceptor-ref name="validationWorkflowStack"/>
</action>
</package>

</struts>
请教高手帮忙分析一下!在线等  回复  更多评论
  
# validate失败以后,画面中的list重新复值得问题 2007-09-05 18:19 | elegant
我用validate-别名-validate.xml方式验证画面的数据项目,如果失败的情况下,直接返回到提交画面,但是这个画面的list项目还没有设定(因为没有进入action)我怎么做才能重新这个list得值呢  回复  更多评论
  
# re: 在Struts 2.0中实现表单数据校验(Validation) 2007-09-07 17:04 | 大米
@zouzhihua
跟你的问题一模一样。没人解答 算了...等我解决告诉你  回复  更多评论
  
# re: 在Struts 2.0中实现表单数据校验(Validation) 2007-09-11 11:32 | bqshi
@大米

这个问题的直接原因是validationsupport.getMessage的时候需要根据你传进来的action对象o,得到o.class的log,产生了nullpoiter exception,根本原因是没有通过action访问jsp文件,所以传进来的action是null。
我的mail:shiboqing@gmail.com  回复  更多评论
  
# re: 在Struts 2.0中实现表单数据校验(Validation) 2007-10-09 14:59 | yangdamao
@Max
請問:"1.在Xxx-validation.xml文件中的<message>元素中加入key属性;
2.在Input.jsp中的<s:form>标志中加入validate="true"属性,就可以在用Javascript在客户端校验数据。 "這兩條是不是不能同時實現啊?
我試驗了一下,如果滿足了第一條的情況下,再加上validate="true",就會出現
和zouzhihua & 大米 一樣的錯誤提示.但是只滿足第貳條時,就可以在客戶端進行驗證.還請Max先生解釋一下!Tks!  回复  更多评论
  
# re: 在Struts 2.0中实现表单数据校验(Validation) 2007-11-09 16:16 | jiang
我在做验证的一个例子:
在注册时,通常要输入密码和验证密码两项内容,请问如何才能用validation.xml来进行验证.
我看了几个例子,但是它们的输入数据都是只能一个,如何往validation.xml中传入两个数据呢?
请你帮我解决一下,谢谢了!
  回复  更多评论
  
# re: 在Struts 2.0中实现表单数据校验(Validation) 2007-11-17 15:48 | sophia
页面第一次显示的时候,不想引发验证。该怎么设置呢?  回复  更多评论
  
# re: 在Struts 2.0中实现表单数据校验(Validation)[未登录] 2007-11-29 09:36 | Elven
Struts2,好东西!  回复  更多评论
  
# re: 在Struts 2.0中实现表单数据校验(Validation) 2007-11-29 17:01 | Elven
各位,为什么我的校验框架,无论是在输入出错或者没有出错的时候都会抛出错误呢?
补充:我是按照max的流程来做的。  回复  更多评论
  
# re: 在Struts 2.0中实现表单数据校验(Validation) 2007-12-16 16:49 | way
为什么我完全按照例子来的 可是不输入任何内容的时候也会正常显示 只是为空罢了 大家认为错误最可能出在哪了 ?  回复  更多评论
  
# re: 在Struts 2.0中实现表单数据校验(Validation) 2008-01-02 11:52 | javer
很不错,收藏.  回复  更多评论
  
# re: 在Struts 2.0中实现表单数据校验(Validation) 2008-01-03 22:19 | socretes
我测试client端的验证,但是我发现其实根本是 虚的,我可以断定表单依然提交到了后台然后才进行验证的,我不知道这里是否有人真正实现过。
我发现的问题是,虽然验证js代码都生成了,但是不能执行,原因是找不到clearErrorMessages(form); 方法,而且我观察可能是要加载的<script type="text/javascript" src="/testss1/struts/xhtml/validation.js"></script> 找不到的缘故,因为这个目录根本就不存在,testss1是本人测试的应用。

望这里有高手回答我疑惑,万分感激!!
能给我邮件最好: yuchw(at)capitek.com.cn  回复  更多评论
  
# re: 在Struts 2.0中实现表单数据校验(Validation)[未登录] 2008-01-10 16:22 | bill
谢谢您提供给我们这么好一篇文章,对我最近的工作带来了很大帮助。

有个小问题:在深入理解一段时间后,发现struts2的校验流程比您描述的还要复杂一点(您文章文章中的流程图),应该是js+拦截器1+拦截器2三个阶段。  回复  更多评论
  
# re: 在Struts 2.0中实现表单数据校验(Validation)[未登录] 2008-01-18 13:26 | song
@zouzhihua
我也遇到了,你解决了吗?  回复  更多评论
  
# re: 在Struts 2.0中实现表单数据校验(Validation) 2008-01-29 15:56 | 小周
请问如何才能修改struts 2.0中错误显示的位置呢。就是用验证框架后返回到页面上显示的报错信息,
默认是显示控件的上方(红色),但是我现在想让它显示在控件的右边。
如何处理.......  回复  更多评论
  
# re: 在Struts 2.0中实现表单数据校验(Validation) 2008-01-29 15:57 | 小周
这个问题有点急,项目里面要用。
哎找了很多资料都没有找到。
请大家帮我一下!
谢谢了  回复  更多评论
  
# re: 在Struts 2.0中实现表单数据校验(Validation) 2008-02-02 15:19 | 日本の項目に対する新人
需要在指定位置输出错误信息时,form主题theme不能设置成默认,应是simple,默认的主题会在每个控件上面输出错误信息。然后在你需要输出错误信息的地方用
<s:fielderror>
<s:param value="%{'fieldname'}"/></s:fielderror>  回复  更多评论
  
# re: 在Struts 2.0中实现表单数据校验(Validation) 2008-02-14 15:51 | happy
我是刚刚接触struts2.0
我写的验证但是没有反映,也没有错误  回复  更多评论
  
# re: 在Struts 2.0中实现表单数据校验(Validation) 2008-03-04 16:41 | 小周
@日本の項目に対する新人
这个方法可以,但是页面的格式和布局不是很好看,有没有方法让框架产生的HTML页面显示错误信息时不产生<ui><li>标签呢?  回复  更多评论
  
# re: 在Struts 2.0中实现表单数据校验(Validation) 2008-03-04 16:43 | 小周
<s:fielderror>
<s:param value="%{'fieldname'}"/></s:fielderror>

上面的方法很好。
但是页面的格式和布局不是很好看,有没有方法让框架产生的HTML页面显示错误信息时不产生<ui><li>标签呢?   回复  更多评论
  
# re: 在Struts 2.0中实现表单数据校验(Validation)[未登录] 2008-03-05 10:56 | Nick
@mz

原因是在校验配置文件***-validation.xml中使用了package.properties中消息键,该消息资源中的消息在不调用Action是不能使用的,只有调用Action,该页面对应的校验配置文件***-validation.xml才能使用了package.properties中消息键。所以直接调用ordernew.jsp是不行的  回复  更多评论
  
# re: 在Struts 2.0中实现表单数据校验(Validation)[未登录] 2008-03-05 10:57 | Nick
@test
原因是在校验配置文件***-validation.xml中使用了package.properties中消息键,该消息资源中的消息在不调用Action是不能使用的,只有调用Action,该页面对应的校验配置文件***-validation.xml才能使用了package.properties中消息键。所以直接调用ordernew.jsp是不行的  回复  更多评论
  
# re: 在Struts 2.0中实现表单数据校验(Validation)[未登录] 2008-03-05 10:57 | Nick
@zouzhihua

原因是在校验配置文件***-validation.xml中使用了package.properties中消息键,该消息资源中的消息在不调用Action是不能使用的,只有调用Action,该页面对应的校验配置文件***-validation.xml才能使用了package.properties中消息键。所以直接调用ordernew.jsp是不行的  回复  更多评论
  
# re: 在Struts 2.0中实现表单数据校验(Validation) 2008-04-25 11:10 | 懒人
感谢楼主百忙中给我们整理资料  回复  更多评论
  
# re: 在Struts 2.0中实现表单数据校验(Validation) 2008-05-13 15:21 | Min
@Nick
是的,可以改为
< action name ="HelloWorld_*" class ="tutorial.HelloWorld" method="{1}">
< result > /HelloWorld.jsp </ result >
< result name ="input" > /HelloWorld.jsp </ result >
</ action >
然后访问
http://localhost:8080/Struts2_Validation/HelloWorld_input.action  回复  更多评论
  
# re: 在Struts 2.0中实现表单数据校验(Validation) 2008-05-14 18:04 | 类风
请问在ActionName-validation.xml中如何对double类型的变量进行验证,我是这样写的
<field name="price">
<field-validator type="conversion" short-circuit="true">
<param name="repopulateField">true</param>
<message>价格必须是数字类型</message>
</field-validator>
<field-validator type="double" >
<param name="min">1</param>
<message>价格必须大于1元</message>
</field-validator>
</field>

它默认在文本框中显示0.0 ,价格的范围还是验证不了,请问这到底是什么原因,我该如何解决?  回复  更多评论
  
# re: 在Struts 2.0中实现表单数据校验(Validation) 2008-05-22 15:20 | oskin
楼主您好,我是struts2新手.在调试你上面给的校验框架的那个例子的时候,出现问题了.代码都是照搬过来的,但是在我这执行就是不正确,不知道为什么?头大!
错误代码如下:

2008-5-22 15:08:34 org.apache.struts2.components.Form evaluateExtraParamsServletRequest
警告: No configuration found for the specified action: 'ValidationAction.action' in namespace: '/'. Form action defaulting to 'action' attribute's literal value.

这个警告会出来两遍~~然后程序是没有执行校验,随便输入什么值都没有执行action...
当我把<s:form>换成普通的<form action=...>时,上面的错误警告就没了,但是还是没有执行到action.只有把ValidationAction-validation.xml挪到别的地方,action才会被执行...

另外我把<s:form action="ValidationAction.action">写成这样才能找到action,看到一些文章说是不需要写上.action的,我不知道哪里设置~~

问题比较多,希望能帮帮忙,谢谢了.如果可能的话,能不能把上面的例子项目给发到我邮箱? oskin2002@gmail.com 再次感谢.

  回复  更多评论
  
# re: 在Struts 2.0中实现表单数据校验(Validation) 2008-05-22 17:35 | oskin
补充一下,上面那个警告是在刷新Input.jsp的时候就出现的  回复  更多评论
  
# re: 在Struts 2.0中实现表单数据校验(Validation)[未登录] 2008-05-26 12:02 | kevin
submit后提示Invalid field value for field "loc".这是为什么啊?  回复  更多评论
  
# re: 在Struts 2.0中实现表单数据校验(Validation) 2008-07-09 13:04 | kane82
关于struts2的验证。我在做的demo的时候碰到这么个问题,struts.xml文件的input配置jsp页面没有问题,但是如果配置input跳到action的话,怎么也不能跳过去。
请问LZ该怎么解决这个问题啊!  回复  更多评论
  
# re: 在Struts 2.0中实现表单数据校验(Validation) 2008-07-28 18:33 | se
@kevin
用局部资源 全局的无法找到  回复  更多评论
  
# re: 在Struts 2.0中实现表单数据校验(Validation)[未登录] 2008-08-06 17:37 | matrix
@Max
文中“...Struts 2.0的校验框架自动会读取该文件,但这样就会引出一个问题——如果我的Action继承其它的Action类,而这两个Action类都需要对表单数据进行校验,那我是否会在子类的配置文件(Xxx-validation.xml)中复制父类的配置吗?答案是不,因为...”

怎么我看了后面的解释,我觉得你应该说“答案是肯定的”,怎么是“不”呢?
因为照你的意思是,先找父类配置,然后再找子类(自己)配置,不正是你所说的复制父类的配置吗???  回复  更多评论
  
# re: 在Struts 2.0中实现表单数据校验(Validation) 2008-08-12 11:11 | xmy
@日本の項目に対する新人
这个方法好像不行啊,我试了下,可是错误提示还是在顶上,倒是设置了theme=“simple”后我的标签什么的都没了  回复  更多评论
  
# re: 在Struts 2.0中实现表单数据校验(Validation) 2008-10-21 20:01 | xiaosong
看到您的博客收获很多,文章写的非常详细,很容易理解,祝博客越来越好  回复  更多评论
  
# re: 在Struts 2.0中实现表单数据校验(Validation) 2009-01-18 22:37 | shuzigui
我运行你的第二个例子时,在里面输入了字符串,结果报错是:
root cause

org.apache.jasper.JasperException: org.apache.jasper.JasperException: File "/struts-tags " not found

请问这是怎么回事,如果不输入可以正常运行  回复  更多评论
  
# re: 在Struts 2.0中实现表单数据校验(Validation)[未登录] 2009-04-22 09:36 | jezz
呵呵不错!  回复  更多评论
  
# re: 在Struts 2.0中实现表单数据校验(Validation) 2009-07-01 10:26 | dfd
sfsafasf  回复  更多评论
  
# re: 在Struts 2.0中实现表单数据校验(Validation) 2009-10-17 00:42 | Martson
@socretes
遇到同样的问题,不知道为什么。  回复  更多评论
  
# re: 在Struts 2.0中实现表单数据校验(Validation) 2010-09-26 10:45 | 风里面
麻烦也发我一份 谢谢 public_private@163.com  回复  更多评论
  
# re: 在Struts 2.0中实现表单数据校验(Validation)[未登录] 2010-11-14 15:35 |
@kane82
这个问题,和你写了一个死循环没有区别。  回复  更多评论
  
# re: 在Struts 2.0中实现表单数据校验(Validation) 2011-03-29 00:42 | 刘轩
你好,我想问个事,就是我在试用框架验证时 我的struts.xml中action节点是这样的<action name="*_metaAction" class="com.ewaytec.merchant.product.action.AddAndEditMetaAction" method="{1}" > 那我那个验证配置文件的名字怎么命名?  回复  更多评论
  
# re: 在Struts 2.0中实现表单数据校验(Validation)[未登录] 2013-04-10 11:15 | tang
要不您发个源码给我吧,ianafollow@163.com,谢谢!  回复  更多评论
  
# re: 在Struts 2.0中实现表单数据校验(Validation) 2013-11-08 15:40 | 胡应
怎么去掉圆点儿啊?  回复  更多评论
  
# re: 在Struts 2.0中实现表单数据校验(Validation)[未登录] 2014-04-08 12:56 | 李林
怎么去掉圆点儿啊!  回复  更多评论
  
评论共2页: 1 2 下一页 

只有注册用户登录后才能发表评论。


网站导航:
博客园   IT新闻   Chat2DB   C++博客   博问