struts2---验证框架的简单例子及其疑问

来源:互联网 发布:形容网络不好的说说 编辑:程序博客网 时间:2024/06/07 05:57
废话不多说,贴代码:

验证Action

public class QuizAction extends ActionSupport {private static final long serialVersionUID = 1L;String name;int age;String answer;public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String getAnswer() {return answer;}public void setAnswer(String answer) {this.answer = answer;}private boolean isInvalid(String value) {return (value == null || value.length() == 0);}public String execute() throws Exception {if (isInvalid(getName())) {//this.addFieldError("name", "name can't empty!");return INPUT;}return SUCCESS;}


QuizAction-validate.xml

<validators>    <field name="name">        <field-validator type="requiredstring">            <message>You must enter a name</message>        </field-validator>    </field>    <field name="age">        <field-validator type="int">            <param name="min">13</param>            <param name="max">19</param>            <message>Only people ages 13 to 19 may take this quiz</message>        </field-validator>    </field></validators>


jsp 代码

<body><s:form method="post" namespace="/" action="QuizAction"><s:textfield label="Name" name="name"/><s:fielderror fieldName="name"/> <s:textfield label="Age" name="age" /><s:textfield label="Favorite color" name="answer" /><s:submit/></s:form></body></html>

Struts.xml配置

<struts><include file="struts.xml" /><constant name="struts.custom.i18n.resources" value="actions.resources" /><package name="zx.action" namespace="/" extends="struts-default"><action name="QuizAction" class="zx.action.QuizAction"><result name="success">/reg_success.jsp</result><result name="input">/reg.jsp</result></action></package></struts>

总结:

  1.显示错误信息。

     看了官方文档,简单的例子并没有烦恼显示错误信息,在xml中配置了massage这个属性,实践中在页面中却并无显示,

     查了百度有人说使用<s:fielderror fieldName="name"/> 这个标签,手工显示,如果我每个错误信息都这么手工,那validateXML中这个message有什么卵用。

     显然不知道这里哪里配置的问题还是怎么的。就是不显示。。醉了。 

     而且即使我加上了这个标签,也没显示错误信息,我也是醉了。目前正在寻找原因中,能快点水落石出是最好啦。

     还有一种显示错误信息方式就是代码显示 在Action中:this.addFieldError("name", "name can't empty!");

     这个最搞扯,同时用标签加代码,就会显示两遍错误信息,说明这个标签它是有用的,只是不造自己哪里没写好而已。妈蛋。

     这里关于这两种手工显示错误信息的方式:可以参考这位大大的:http://blog.csdn.net/luckygll/article/details/6696760

     虽然也比较简单和简陋,将就看吧。官网文档也还没找到这个标签的具体详情,ORZ,英文Low,好难过,目前正在努力寻找中。


  2.在jsp页面s:form表单中加上validate属性

     表示自己最开始是这么写的:<s:form method="post" namespace="/" action="QuizAction" validate="true">

     然后开始报错。一个超级大黄色的页面出现:错误代码如下:

 FreeMarker template error!

Method public java.util.List org.apache.struts2.components.Form.getValidators(java.lang.String) threw an exception when invoked on org.apache.struts2.components.Form@1bb1dd2The problematic instruction:----------==> list tag.getValidators("${tagName}") as validator [on line 46, column 9 in template/xhtml/form-close-validate.ftl] in include "/${parameters.templateDir}/xhtml/form-close-validate.ftl" [on line 25, column 1 in template/xhtml/form-close.ftl]----------Java backtrace for programmers:----------freemarker.template.TemplateModelException: Method public java.util.List org.apache.struts2.components.Form.getValidators(java.lang.String) threw an exception when invoked on org.apache.struts2.components.Form@1bb1dd2at freemarker.ext.beans.SimpleMethodModel.exec(SimpleMethodModel.java:130)at freemarker.core.MethodCall._getAsTemplateModel(MethodCall.java:93)at freemarker.core.Expression.getAsTemplateModel(Expression.java:89)at freemarker.core.IteratorBlock.accept(IteratorBlock.java:94)at freemarker.core.Environment.visit(Environment.java:221)at freemarker.core.IteratorBlock$Context.runLoop(IteratorBlock.java:167)at freemarker.core.Environment.visit(Environment.java:428)at freemarker.core.IteratorBlock.accept(IteratorBlock.java:102)at freemarker.core.Environment.visit(Environment.java:221)at freemarker.core.MixedContent.accept(MixedContent.java:92)at freemarker.core.Environment.visit(Environment.java:221)at freemarker.core.ConditionalBlock.accept(ConditionalBlock.java:79)at freemarker.core.Environment.visit(Environment.java:221)at freemarker.core.MixedContent.accept(MixedContent.java:92)at freemarker.core.Environment.visit(Environment.java:221)at freemarker.core.Environment.include(Environment.java:1508)at freemarker.core.Include.accept(Include.java:169)at freemarker.core.Environment.visit(Environment.java:221)at freemarker.core.MixedContent.accept(MixedContent.java:92)at freemarker.core.Environment.visit(Environment.java:221)at freemarker.core.Environment.process(Environment.java:199)
以下省略...

解决方案 如下 :

      <s:form method="post" namespace="/" action="QuizAction.action" validate="true">

给action补充后缀.action即可解决这个问题  

应该是不合符拦截器模板的问题 (个人猜测)


  3.struts2在提交<s:form>表单时,namespace报错

     最开始我是<s:form method="post" action="QuizAction">这样子的

     虽然无伤大雅,但是总会提示 :No configuration found for the specified action: 'Quit' in namespace: '/jsp/weekly'. Form action defaulting to 'action' attribute's literal value. (抱歉我懒惰,直接把大大的错误代码复制过来了。)

看着也烦心:参考了这位大大的方法:大大链接:http://www.cnblogs.com/Jesuca/archive/2011/07/19/2110739.html

加一个 namespace="/"即可

4.关于校验框架的运行原理:

   参考大大:http://blog.csdn.net/woshisap/article/details/7300907 

   比较详细易懂

     


0 0