使用客户端校验

简介:

Struts 2应用中使用客户端校验非常简单,只需改变如下两个地方即可。

Ø  将输入页面的表单元素改为使用Struts 2标签来生成表单。

Ø  为该<s:form.../>元素增加validate="true"属性。

修改前面应用的regist.jsp页面,将页面代码改为如下形式。

程序清单:codes\04\4.2\clientValidate\regist.jsp

<h2>请输入您的注册信息</h2>

<s:fielderror/>

<s:form action="regist" validate="true">

     <s:textfield name="name" label="用户名"/>

     <s:textfield name="pass" label="密码"/>

     <s:textfield name="age" label="年龄"/>

     <s:textfield name="birth" label="生日"/>

     <s:submit value="注册"/>

</s:form>

根据Struts 2的官方文档所说的,只要将JSP页面改成如上的形式,就应该可以完成客户端校验。但当笔者在浏览器中浏览该regist.jsp页面时,看到如图4.13所示的页面。

 

4.13  使用客户端校验中出现的异常

4.13显示了FreeMarker模板的详细出错信息。当然,在Tomcat控制台也可看到系列的异常信息。

出现这种错误的原因是因为,如果我们希望Struts 2的客户端校验能发生作用,那我们进入该regist.jsp页面之前必先经过Struts 2的核心Filter,而上面我们直接请求了regist.jsp页面,并未经过StrutsPrepareAndExecuteFilter

前面我们介绍的应用都是直接将JSP页面放在Web应用的根路径下了,实际上这种做法与MVC思想是违背的,因为在纯粹的MVC思想中,JSP页面只是简单的视图,用户请求不应该直接向视图页面发送请求,而是应该向控制器发送请求,由控制器来调用视图页面向浏览者呈现数据。

为了避免这种情况,我们把上面应用中所有JSP页面都移到WEB-INF/content目录下,这样就可以避免浏览者直接向指定页面发送请求。接下来我们在struts.xml文件中配置一个通用的action,配置片段如下:

<!-- 可以匹配任何请求,直接转向对应的页面

     例如abc请求,那么就会跳转到/WEB-INF/content/abc.jsp -->

<action name="*">

     

</action>

增加上面的配置之后,浏览者不应该直接向regist.jsp页面发送请求,而是应该向regist发送请求,这个请求将会先经过StrutsPrepareAndExecuteFilter,然后再由该Filter forward/WEB-INF/content/ regist.jsp页面。

此时,如果浏览者的输入不再符合校验规则,将看到如图4.14所示的页面。

 

 

4.14  客户端校验的效果

从图4.14中可以看出,虽然使用客户端校验,却看不到弹出JavaScript的警告框,这种效果看起来与服务器端校验几乎完全相同,但读者可以仔细看图4.14中的地址栏,该页面的地址依然停留在原来的页面,并未提交到对应的Action。这就表明:上面的数据校验过程是客户端完成的。

客户端校验依然是基于JavaScript完成的,因为JavaScript脚本本身的限制,有些服务器端校验不能转换成客户端校验。也就是说,并不是所有的服务器端校验都可以转换成客户端校验。

客户端校验仅仅支持如下几种校验器。

Ø  required validator(必填校验器)。

Ø  requiredstring validator(必填字符串校验器)。

Ø  stringlength validator(字符串长度校验器)。

Ø  regex validator(表达式校验器)。

Ø  email validator(邮件校验器)。

Ø  url validator(网址校验器)。

Ø  int validator(整数校验器)。

Ø  double validator(双精度数校验器)。

客户端校验有三个值得注意的地方:

Ø  Struts 2<s:form .../>元素有一个theme属性,不要将该属性指定为simple

Ø  浏览者不能直接访问启用客户端校验的表单页,这样会引发异常。我们可以把启用客户端校验的表单页放到WEB-INF路径下去,让浏览者访问所有资源之前都先经过它的核心Filter

Ø  启用客户端校验的表单页面的actionnamespace要分开写,例如我们向namespace/leenameregistProAction请求,应写成<s:form action="registPro" namespace= "/ee">,而不应该写成<s:form action="lee/registPro" >。提示:

 

 

 

正如前面提到的,一旦我们使用了MVC框架,就应该严格遵守MVC思想,应该尽量避免让浏览者直接访问Web应用的视图页面,而是应该让浏览者向控制器发送请求,由控制器调用视图页面向浏览者呈现数据。所以我们后面的全部示例的JSP页面都会放入WEB-INF/content目录下,这一点希望读者能注意,不要轻率地认为示例程序不完整

  

本文转自 

fkJava李刚 51CTO博客,原文链接:http://blog.51cto.com/javaligang/878341 ,如需转载请自行联系原作者

相关文章
|
2天前
|
搜索推荐 编译器 Linux
一个可用于企业开发及通用跨平台的Makefile文件
一款适用于企业级开发的通用跨平台Makefile,支持C/C++混合编译、多目标输出(可执行文件、静态/动态库)、Release/Debug版本管理。配置简洁,仅需修改带`MF_CONFIGURE_`前缀的变量,支持脚本化配置与子Makefile管理,具备完善日志、错误提示和跨平台兼容性,附详细文档与示例,便于学习与集成。
253 116
|
17天前
|
域名解析 人工智能
【实操攻略】手把手教学,免费领取.CN域名
即日起至2025年12月31日,购买万小智AI建站或云·企业官网,每单可免费领1个.CN域名首年!跟我了解领取攻略吧~
|
11天前
|
安全 Java Android开发
深度解析 Android 崩溃捕获原理及从崩溃到归因的闭环实践
崩溃堆栈全是 a.b.c?Native 错误查不到行号?本文详解 Android 崩溃采集全链路原理,教你如何把“天书”变“说明书”。RUM SDK 已支持一键接入。
650 220
|
存储 人工智能 监控
从代码生成到自主决策:打造一个Coding驱动的“自我编程”Agent
本文介绍了一种基于LLM的“自我编程”Agent系统,通过代码驱动实现复杂逻辑。该Agent以Python为执行引擎,结合Py4j实现Java与Python交互,支持多工具调用、记忆分层与上下文工程,具备感知、认知、表达、自我评估等能力模块,目标是打造可进化的“1.5线”智能助手。
886 61
|
9天前
|
人工智能 移动开发 自然语言处理
2025最新HTML静态网页制作工具推荐:10款免费在线生成器小白也能5分钟上手
晓猛团队精选2025年10款真正免费、无需编程的在线HTML建站工具,涵盖AI生成、拖拽编辑、设计稿转代码等多种类型,均支持浏览器直接使用、快速出图与文件导出,特别适合零基础用户快速搭建个人网站、落地页或企业官网。
1467 157
|
6天前
|
编解码 Linux 数据安全/隐私保护
教程分享免费视频压缩软件,免费视频压缩,视频压缩免费,附压缩方法及学习教程
教程分享免费视频压缩软件,免费视频压缩,视频压缩免费,附压缩方法及学习教程
282 139
|
8天前
|
存储 安全 固态存储
四款WIN PE工具,都可以实现U盘安装教程
Windows PE是基于NT内核的轻量系统,用于系统安装、分区管理及故障修复。本文推荐多款PE制作工具,支持U盘启动,兼容UEFI/Legacy模式,具备备份还原、驱动识别等功能,操作简便,适合新旧电脑维护使用。
591 109