使用Struts2验证框架实现输入校验
2011-04-01 21:53
162 查看
学习了《Struts2权威指南》中关于Struts2的输入校验,自己动手测试了一把,也遇到一些问题,在这里记录一下。直接看代码:
login.jsp
LoginAction.java
校验文件LoginAction-validation.xml,其生成路径要和LoginAction.class在一起.
struts.xml
国际化资源文件messageResource_zh_CN.properties
文件结构:
登录页面:
不输入任何内容,点击"提交",效果如下:
可见对LoginAction中的password属性定义的两个校验器都起作用了,但如果这两个校验信息同时显示有点冗余,此时可以通过设置short-circuit="true"来配置校验器短路.修改后的LoginAction-validation.xml中password字段的定义如下:
这样如果密码为空就提交的话只会提示"密码不能为空",效果如下:
PS:直接访问jsp页面(http://localhost:8080/struts/login.jsp)会报错:
但是通过action(http://localhost:8080/struts/login.action)就可以正常访问,去掉struts的客户端验证(在jsp页面的form表单中去掉validate="true"属性)也可以正常访问.在网上查了一下资料,大家的解决方法都是走action.个人觉得原因是:通过Action访问Struts2会加载LoginAction-validation.xml,从而读取配置的校验器信息,根据配置的校验器信息生成客户端校验脚本(Javascript),如果直接访问jsp页面那么就获取不到校验器信息(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@18db6e1 - Class: freemarker.ext.beans.SimpleMethodModel),从而无法生成客户端脚本.
login.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@taglib prefix="s" uri="/struts-tags" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title></title> </head> <body> <!-- 使用Struts标签 通过配置form表单validate="true"开启客户端校验--> <s:form action="login" validate="true"> <s:textfield name="username" label="用户名"></s:textfield> <s:password name="password" label="密 码"></s:password> <s:submit value="提交"></s:submit> </s:form> </body> </html>
LoginAction.java
package com.petrochina.action.system; import com.opensymphony.xwork2.ActionSupport; public class LoginAction extends ActionSupport { private static final long serialVersionUID = 1L; private String username;//用户名 private String password;//密码 @Override public String execute() throws Exception { if (getUsername().equals("admin") && getPassword().equals("admin")) { return SUCCESS; } else { return INPUT; } } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } }
校验文件LoginAction-validation.xml,其生成路径要和LoginAction.class在一起.
<?xml version="1.0" encoding="UTF-8"?> <!-- xwork校验器的DTD信息 --> <!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0.2//EN" "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd"> <validators> <!-- 字段校验器,校验username属性 --> <field name="username"> <!-- 配置必填字符串校验器 --> <field-validator type="requiredstring"> <!-- 通过key指定国际化资源文件 --> <message key="user.required"/> </field-validator> </field> <!-- 字段校验器,校验password属性 --> <field name="password"> <!-- 配置必填字符串校验器 --> <field-validator type="requiredstring"> <message key="pass.required"></message> </field-validator> <!-- 密码长度必须是3到6位 --> <field-validator type="stringlength"> <param name="minLength">3</param> <param name="maxLength">6</param> <message key="pass.length"></message> </field-validator> </field> </validators>
struts.xml
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd"> <struts> <!-- struts常量定义 --> <!-- 指定struts国际化资源文件的baseName --> <constant name="struts.custom.i18n.resources" value="messageResource"/> <!-- 指定每次HTTP请求时是否重新加载国际化资源文件,默认为false,开发阶段设为true --> <constant name="struts.i18n.reload" value="true"/> <!-- 配置应用的编码方式 --> <constant name="struts.i18n.encoding" value="UTF-8"/> <!-- action 定义 --> <package name="mystruts" extends="struts-default"> <action name="login" class="com.petrochina.action.system.LoginAction"> <result name="success">/welcome.jsp</result> <!-- 校验错误直接返回"input"字符串,所以要定义"input"对应的视图资源 --> <result name="input">/login.jsp</result> </action> </package> </struts>
国际化资源文件messageResource_zh_CN.properties
#struts校验 user.required=用户名不能为空 pass.required=密码不能为空 pass.length=密码必须是3到6位
文件结构:
登录页面:
不输入任何内容,点击"提交",效果如下:
可见对LoginAction中的password属性定义的两个校验器都起作用了,但如果这两个校验信息同时显示有点冗余,此时可以通过设置short-circuit="true"来配置校验器短路.修改后的LoginAction-validation.xml中password字段的定义如下:
<!-- 字段校验器,校验password属性 --> <field name="password"> <!-- 配置必填字符串校验器 --> <field-validator type="requiredstring" short-circuit="true"> <message key="pass.required"></message> </field-validator> <!-- 密码长度必须是3到6位 --> <field-validator type="stringlength"> <param name="minLength">3</param> <param name="maxLength">6</param> <message key="pass.length"></message> </field-validator> </field>
这样如果密码为空就提交的话只会提示"密码不能为空",效果如下:
PS:直接访问jsp页面(http://localhost:8080/struts/login.jsp)会报错:
但是通过action(http://localhost:8080/struts/login.action)就可以正常访问,去掉struts的客户端验证(在jsp页面的form表单中去掉validate="true"属性)也可以正常访问.在网上查了一下资料,大家的解决方法都是走action.个人觉得原因是:通过Action访问Struts2会加载LoginAction-validation.xml,从而读取配置的校验器信息,根据配置的校验器信息生成客户端校验脚本(Javascript),如果直接访问jsp页面那么就获取不到校验器信息(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@18db6e1 - Class: freemarker.ext.beans.SimpleMethodModel),从而无法生成客户端脚本.
相关文章推荐
- 使用Struts2验证框架实现输入校验
- JAVA_WEB Struts2学习:使用验证框架进行校验JSP页面元素 反编译工具的配置 Strtuts2 国际化学习
- Struts2输入校验(二)----验证框架
- 使用验证框架实现数据校验
- struts2使用XML框架进行输入校验
- 7 Struts2输入校验(二)----验证框架
- JAVAWEB开发之Struts2详解(二)——Action接受请求参数、类型转换器、使用Struts2的输入校验、以及遵守约定规则实现Struts2的零配置
- S6.2_Struts2_Validation ~ S6.5_Struts2_Validation 使用Validation框架实现验证的4种方式
- 关于Struts2基于验证框架的输入校验的经验
- Struts2数据校验(2)--使用XWork检验框架实现校验
- struts2使用validate方法来实现对表单输入数据的校验操作
- Spring框架整合Struts2使用Validation框架验证表单用户输入数据的详细教程
- struts2基于验证框架的输入校验
- Spring框架整合Struts2使用Validation框架验证表单用户输入数据的详细教程
- struts2的输入验证框架(xml配置)
- Struts2拦截器之使用拦截器模拟实现登陆校验
- 使用jquery validate+jquery.form实现输入验证以及注册成功提示
- struts2中使用validation框架进行校验的注意事项
- Struts2教程5:使用Validation框架验证数据
- Struts2 数据输入校验(1) —— 函数验证