在前一篇文章中 SSH2 AJAX LoginDemo 项目添加 国际化信息,我们为 LoginDemo 添加了国际化方面的支持,今天我们增加验证体系。
Struts2 框架的验证体系主要分为:
- action 中重写 validate() 进行 action类全局校验
- action 中添加 validateXxx() 为 Xxx() 方法专门做的前置校验。(Strut2 利用反射自动映射)
- 使用Struts2 验证框架 进行校验
我们在 LoginDemo 中对这几种方法都会有举例:
LoginAction.java
package com.track2web.demo.action;
import com.opensymphony.xwork2.ActionSupport;
import com.track2web.demo.entity.User;
import com.track2web.demo.service.IUserService;
public class LoginAction extends ActionSupport {
//定义登录是否成功状态,验证错误信息国际化信息常量
public static final String LOGIN_STATUS_SUCCESS = "login.status.message.success";
public static final String LOGIN_STATUS_FAIL = "login.status.messsage.fail";
public static final String USERNAME_VALIDATE_LENGTH = "input.minlenth.username";
public static final String USERPASS_VALIDATE_LENGTH = "input.minlenth.userpass";
//user对象接受页面传值
private User user;
//loginMessage 回传登录是否成功的状态
private String loginMessage;
//IOC接口
private IUserService userService;
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
public String getLoginMessage() {
return loginMessage;
}
public void setLoginMessage(String loginMessage) {
this.loginMessage = loginMessage;
}
public IUserService getUserService() {
return userService;
}
public void setUserService(IUserService userService) {
this.userService = userService;
}
/**
* action 全局验证
*/
@Override
public void validate() {
if (this.user.getUserName().length()<4) {
addFieldError("user.userName", getText(USERNAME_VALIDATE_LENGTH));
}
}
/**
* 通过反射(Reflection)调用 validateLoginAjax()方法(为 loginAjax 方法验证数据)
*/
public void validateLoginAjax() {
if (this.user.getUserPass().length()<4) {
addFieldError("user.userPass", getText(USERPASS_VALIDATE_LENGTH));
}
}
/**
* Ajax 方式所调用的 Action 方法
* @return 返回调用成功信号
*/
public String loginAjax() {
//将 登录信息保存至 user 属性,如果校验失败,user 属性值为 NULL
this.user = this.userService.login(user);
if (user==null) {
this.loginMessage = getText(LOGIN_STATUS_FAIL);
}
else {
this.loginMessage = getText(LOGIN_STATUS_SUCCESS);
}
return SUCCESS;
}
}
struts.xml
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<!-- AJAX方式登录 注意 extends 自 json-default 时 result 的 type 值才有 json 类型-->
<package name="login-ajax" extends="json-default">
<!-- method 指定了 请求 Action 中哪个具体方法-->
<action name="loginAjax" class="LoginAction" method="loginAjax">
<!-- JSON 格式的结果 拦截器 -->
<interceptor-ref name="jsonValidationWorkflowStack" />
<!-- 返回值类型为 json -->
<result type="json">
<param name="excludeNullProperties">true</param>
<!-- 序列化 json 值时,不包括 的属性,userSerive 为 Spring 注入属性-->
<param name="excludeProperties">
userService
</param>
</result>
<!-- 为验证失败配置返回路径 -->
<result name="input">/index.jsp</result>
</action>
</package>
</struts>
配置 STRUTS2 验证框架 (action类名称)-(action name)-validation.xml,依据 struts.xml 中的配置,存放于ACTION类同包中
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE validators PUBLIC
"-//OpenSymphony Group//XWork Validator 1.0//EN"
"http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">
<validators>
<field name="user.userName">
<field-validator type="requiredstring">
<message key="input.required.username" />
</field-validator>
</field>
<field name="user.userPass">
<field-validator type="requiredstring">
<message key="input.required.userpass" />
</field-validator>
</field>
</validators>
今天对整个登录页面 index.jsp 做了较大的改动。使用了基本的HTML 标签,只是提交按钮使用了 STRUTS-JQUERY 插件的标签.样式全部转移到 style.css .所用到的 Javascript 全部转移到 login.js 保持了 index.jsp 的清爽
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@taglib prefix="s" uri="/struts-tags" %>
<%@taglib prefix="sj" uri="/struts-jquery-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">
<sj:head locale="zh_CN" jqueryui="true" />
<!-- AJAX 方式登录 callback 函数响应 login.js -->
<script type="text/javascript" src="js/login/login.js"></script>
<!-- 载入样式表 -->
<link rel="stylesheet" type="text/css" href="css/style.css" />
<title><s:text name="index.title" /></title>
</head>
<body>
<div id="login_div">
<form action="login-ajax/loginAjax.action" method="post" id="login_form">
<fieldset class="login-fieldset">
<legend><s:text name="form.ajax.title" /></legend>
<label for="input_username" class="login-label">
<s:text name="text.label.username" />
<span id="user_username_error" class="error-message"></span>
</label>
<span class="input-span-block">
<input type="text" id="input_username" name="user.userName" />
</span>
<label for="input_userpass" class="login-label">
<s:text name="text.label.userpass" />
<span id="user_userpass_error" class="error-message"></span>
</label>
<span class="input-span-block">
<input type="password" id="input_userpass" name="user.userPass" />
</span>
<span class="button-span-block">
<sj:submit id="login_submit"
targets="result_message"
validate="true"
validateFunction="customLoginValidate"
onBeforeTopics="clearFieldErrors"
onSuccessTopics="success"
dataType="json"
value="%{getText('button.label.loginbyajax')}" />
</span>
</fieldset>
</form>
</div>
<div id="result_message" class="error-message"></div>
</body>
</html>
login.js
//JSON 格式错误返回值中,KEY 中保存的是 input name的值,自定义函数进行同输出错误信息元素的映射
//本例中将 "user.userName" 转化为 "#user_username_error"
function formatErrorElementId(value) {
var elem = value.toLowerCase();
elem = elem.replace(/\./g , "_");
elem += "_error"
elem = "#"+elem;
return elem;
}
//处理 JSON 格式的 validate 失败返回值
function customLoginValidate(form , errors) {
if (errors.fieldErrors) {
$.each(errors.fieldErrors , function(key,value) {
var elem = formatErrorElementId(key);
if (elem) {
$(elem).html(value[0]);
}
});
}
}
//清除前次留下的错误信息
$.subscribe("clearFieldErrors", function() {
$("#user_username_error").html("");
$("#user_userpass_error").html("");
});
//登录陈功后,输出的登录状态信息
$.subscribe("success" , function(event) {
$("#result_message").html(event.originalEvent.data.loginMessage);
});
style.css
body {
margin: 0;
padding: 0;
text-align: center;
font-family: Georgia,'Times New Roman',times,serif;
}
#login_div {
width:300px;
margin: 2em auto;
padding: 0.5em;
}
#login_div .error-message {
font-size: 0.8em;
font-style: italic;
color: red;
font-weight: bold;
}
#login_div .login-fieldset {
padding: 0.3em;
text-align: left;
font-weight: bold;
}
#login_div .login-label {
display: block;
}
#login_div .input-span-block {
display: block;
}
#login_div .button-span-block {
display: block;
text-align: right;
}
#input_username , #input_userpass {
width: 98%;
}
#login_submit {
margin: 0.3em 0;
padding: 0.3em 1em;
font-weight: bold;
}
#result_message {
width: 400px;
margin: 0 auto;
padding: 1em;
font-weight: bold;
font-size: 1.5em;
color: red;
}
Struts2 数据提交的步骤是:
- 校验框架
- validate()
- validateXxx()
- action()
当然在生产环境中,最前端我们一般还要加上 JavaScript 校验。将在下一篇文章中涉及。以下是相关图片
Categories: 网页编程
学习了