返回列表 发帖

[Struts] Struts2.1.8版本的客户端输入校验的问题

先说一下我完成客户端校验已完成的部分:
①已经提供了一个LoginAction-login-validation.xml校验规则文件
②struts.xml配置文件中LoginAction类对应的action配置完全正确
③在index.jsp页面中有一个表单标签,其中的表单域标签在这里省略不谈了,
  这个表单标签在不使用客户端校验属性 validation="true",即之前采用
  服务器端校验时完全正确,发布并在FireFox里输入值都可以正确完成服务器
  端的校验

我的问题是:
网上有很多人问Struts2.1.8到底支不支持客户端校验?
就有一部分人说,2.1.8版本也是支持的,我在学习李刚的《Struts2.1权威指南》
时,书中也只是说在页面端的表单标签内使用validation=“true”就可以启用
客户端校验的功能。那为什么我按照我的步骤不能完成客户端校验?

还是贴上我使用struts2.1.8版本并在firefox浏览时报的错误吧:
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@18faef1 - Class: freemarker.ext.beans.SimpleMethodModel
File: SimpleMethodModel.java
Method: exec
Line: 130 - freemarker/ext/beans/SimpleMethodModel.java:130:-1
org.apache.struts2.components.UIBean.end(UIBean.java:515)
org.apache.struts2.views.jsp.ComponentTagSupport.doEndTag(ComponentTagSupport.java:42)
org.apache.jsp.index_jsp._jspx_meth_s_005fform_005f0(index_jsp.java:143)
org.apache.jsp.index_jsp._jspService(index_jsp.java:80)
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:393)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:320)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:266)
javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.doFilter(StrutsPrepareAndExecuteFilter.java:88)


后面的一些异常就省略了,相信以上异常已经是很多人共同出现的问题了。



请问有Struts2.1.8的使用者成功完成过该版本的客户端校验功能吗?
如果该版本支持客户端校验,到底与Struts2.1.6版本有什么配置上的差别?
劳烦懂的人费点时间帮忙解决下这个版本的客户端输入校验的问题吧。

谢谢···

刚刚验证了一下:Struts 2.1.8.1完全支持客户端校验,没有任何问题。

如果你配置的Action所在的package没有指定namespace属性,那JSP页面中的<s:form.../>标签无需任何改变。
如果你配置的Action所在的package指定了namespace属性,那JSP页面中的<s:form.../>标签也需要指定namespace属性!

至于你的错误——这是一个很简单地错误。按下面方法即可解决:
不要直接访问你的JSP页面,为应用中所有页面都配置一个通用Action,例如:
  1. <action name="*">
  2.     <result>{1}.jsp</result>
  3. </action>
复制代码
比如你要访问abc.jsp页面,你应该访问abc.action,或者省略.action后缀,直接访问abc也可以。
但不要直接访问abc.jsp。
生命没有假期!
如果生命只剩下最后一秒,你可会想到我?

TOP

倚楼听风雨,笑看江湖路。。。

TOP

回复 2# kongyeeku 的帖子

先谢谢站长了,你的意思我明白了:
    不能直接通过xxx.jsp来使用struts的客户端校验,而应该通过一个action来跳转到需要使用客户端校验的页面。

我在struts.xml文件中配置了一个name=“index”的result,并指向实际视图资源index.jsp后,然后访问时使用index和index.action后,客户端校验功能已经可以正常使用了。

TOP

回复 2# kongyeeku 的帖子

有个新的问题还需要向您咨询下:

    比如我的项目名称为train,WebRoot下的首页为index.jsp。

    我现在的需求是:对index.jsp页面启用struts2.1.8的客户端校验功能。

    考虑到如果用户是记录下http://localhost:8080/train/index.jsp的URL地址,然后手动输入该地址的话,那么必然没有正确使用到客户端校验(因为没有通过action),因此还会报出我在原帖当中出现的异常。

   为了将以jsp为后缀的url请求也通过struts2的action, 所以我想出了如下方式来解决:
    第①步:在struts.xml中配置常量
    <!-- 将后缀为jsp的url请求也纳入struts2的框架之中 -->
    <constant name="struts.action.extension" value="action, jsp" />
    第②步:再配合上面的action配置
    <action name="*">
        <result>/{1}.jsp</result>
    </action>
    我实现了对后缀为jsp的url请求的客户端校验。

最后给出我的问题:
有更好的对后缀为jsp的url请求启用客户端校验的方式吗?如果有,那么我上面实现的方式会有什么样的弊端呢?

谢谢站长啦。

TOP

回复 2# kongyeeku 的帖子

李老师果然超强啊,一出手就轻松搞定问题。

看来网络上那些找这个问题答案的人,都没有找对位置啊。

TOP

返回列表