您的位置:首页 > 编程语言 > Java开发

使用Struts2验证框架实现输入校验

2011-04-01 21:53 162 查看
学习了《Struts2权威指南》中关于Struts2的输入校验,自己动手测试了一把,也遇到一些问题,在这里记录一下。直接看代码:

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),从而无法生成客户端脚本.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: