深入分析JavaWeb Item46 -- Struts2数据校验与国际化

页面导航:首页 > 网络编程 > JavaScript > 深入分析JavaWeb Item46 -- Struts2数据校验与国际化

深入分析JavaWeb Item46 -- Struts2数据校验与国际化

来源: 作者: 时间:2016-01-23 10:23 【

1、用户输入数据的校验1、校验方式a:客户端校验。(防君子防不了小人)在页面中写js脚本。 这样做的好处是:输入错误的话提醒比较及时;减轻服务器的压力 b、服务器端校验。 数

1、用户输入数据的校验

1、校验方式

a:客户端校验。(防君子防不了小人)在页面中写js脚本。 这样做的好处是:

输入错误的话提醒比较及时; 减轻服务器的压力

b、服务器端校验

数据安全 ,整个应用阻止非法数据的最后防线

而在实际开发中通常选择:a+b

2、服务器端数据校验:

1、编程式校验:自己Action中编写一个校验代码(缺点:验证规则都写在了代码中)

前提:动作类继承ActionSupport,重写Validateable接口中的validate()方法 ,在该方法中完成验证。

步骤如下:
* validate()方法在其他的业务方法之前执行

验证出错转向的页面
struts.xml配置/validate/login.jsp
其中input转向是在action中已经定义好的.
     public static final String INPUT = "input"; 
什么时候表示验证出错(转向input所指向的页面)
this.addFieldError("sss", "错误信息");方法指向的是一个集合 当集合不为空时,转向错误页面.显示错误Jsp页面: 使用显示错误消息

1、针对动作类中的所有动作进行校验

编写UserAction继承 ActionSupport,并validate()方法。

package com.itheima.actions;

import java.util.Arrays;
import org.apache.commons.lang3.StringUtils;
import org.apache.struts2.interceptor.validation.SkipValidation;
import com.opensymphony.xwork2.ActionSupport;

public class UserAction extends ActionSupport {
    private String username;
    private String password;
    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;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }

public String add(){
    //调用Service
    try{
        System.out.println("保存成功:"+this);
        return SUCCESS;
    }catch(Exception e){
        e.printStackTrace();
        return ERROR;
    }
}

    //在此处编写校验规则:针对所有的动作方法进行验证

public void validate() {
    //用户名不能为null或“”
    if(StringUtils.isEmpty(username)){
        addFieldError("username", "用户名不能为空");//   Mapkey:字段名,value错误提示
    }
}
    @Override
    public String toString() {
        return "UserAction [username=" + username + ", password=" + password
                + ", age=" + age + ", birthday=" + birthday + ", hobby="
                + Arrays.toString(hobby) + "]";
    }

}

在struts.xml中配置action


        

校验器介绍

required 必填校验器

       性别不能为空!
requiredstring 必填字符串校验器

       true
       用户名不能为空!
stringlength:字符串长度校验器

    10
    2
    true
    
int:整数校验器

    1
    150
    年龄必须在1-150之间
date: 日期校验器

    1900-01-01
    2050-02-21
    生日必须在${min}到${max}之间
url: 网络路径校验器

    传智播客的主页地址必须是一个有效网址
email:邮件地址校验器

    电子邮件地址无效

regex:正则表达式校验器

     
     手机号格式不正确!
fieldexpression : 字段表达式校验

       
       两次密码输入不一致

3、自定义声明式校验

自定义验证程序必须实现 Validator 接口.

Validation 拦截器负责加载和执行各种验证程序. 在加载了一个验证程序之后, 这个拦截器将调用那个验证程序的 setValidatorContext 方法, 把当前的 ValidatorContext 对象传递给它, 这使程序员可以访问当前 Action. 接下来, Validation 拦截器将调用 validate 方法并把需要验证的对象传递给它. validate 方法是编写一个自定义的验证程序时需要覆盖的方法.

ValidatorSupport 和 FieldValidatorSupport 实现了 Validator 接口

若需要普通的验证程序, 可以继承 ValidatorSupport 类 若需要字段验证程序, 可以继承 FieldValidatorSupport 类 若验证程序需要接受一个输入参数, 需要为这个参数增加一个相应的属性

案例:验证密码的强度
开发步骤:
1、编写一个StrongPasswordValidator类:实现Validator接口或者继承ValidatorSupport。如果是验证表单字段有关,建议继承FieldValidatorSupport。

package com.itheima.actions;

import com.opensymphony.xwork2.validator.ValidationException;
import com.opensymphony.xwork2.validator.validators.FieldValidatorSupport;

public class StrongPasswordValidator extends FieldValidatorSupport {

    private int minLength  = -1;

    public int getMinLength() {
        return minLength;
    }
    public void setMinLength(int minLength) {
        this.minLength = minLength;
    }
    //验证方法:针对不符合要求的内容进行判断,向Map中添加信息即可
    //参数:object就是当前的动作对象
    public void validate(Object object) throws ValidationException {
        //获取要验证的字段名称
        String fieldName = getFieldName();
        Object fieldValue = getFieldValue(fieldName, object);
        if(fieldValue==null)
            return;
        if(!isStrong((String)fieldValue)){
            addFieldError(fieldName, object);
        }
        if((minLength>-1)&&((String)fieldValue).length()

2、要注册校验器
在WEB-INF\classes目录下,建立一个固定名称为validators.xml的配置文件






    

3、可以像使用requiredstring这样的验证器来使用了

这里写图片描述

2、Struts2的国际化

之前讲到过国际化

ResourceBundle rb = ResourceBundle.getBunle(“message”,Locale);

这里讲在struts2中,先准备资源文件,资源文件的命名格式如下:
baseName_language_country.properties
baseName_language.properties
baseName.properties
其中baseName是资源文件的基本名,我们可以自定义,但language和country必须是java支持的语言和国家。如:
中国大陆: baseName_zh_CN.properties
美国: baseName_en_US.properties

现在为应用添加两个资源文件:
第一个存放中文:msg_zh_CN.properties

hello=\u60A8\u5403\u4E86\u5417\u554A\u6CA1\u5403
username=\u7528\u6237\u540D

第二个存放英语(美国): msg_en_US.properties
内容为:

hello=good morning
username=Username

对于中文的属性文件,我们编写好后,应该使用jdk提供的native2ascii命令把文件转换为unicode编码的文件。命令的使用方式如下:

native2ascii  源文件.properties  目标文件.properties

1、配置全局国际化消息资源包

a、配置全局消息资源包
当准备好资源文件之后,我们可以在struts.xml中通过struts.custom.i18n.resources常量把资源文件定义为全局资源文件,如下:

msg为资源文件的基名。

b、如何访问

在动作类中:
前提,动作类继承ActionSupport
package com.itheima.actions;

import com.opensymphony.xwork2.ActionSupport;
//在动作类中访问国际化消息
public class I18nAction extends ActionSupport {
    public String execute(){
        String value = getText("hello");// TextProvider
        System.out.println(value);
        return SUCCESS;
    }
}
在页面中:
    
    

或者

    
自由指定消息资源包,借助struts2的有关国际化的标签:
  
        

如果消息资源包在com.itheima.resources.msg_zh_CN.properties

  
        

2、配置局部消息资源包

一定要经过Action才行:
书写规范:在动作类所在包中,建立名字”动作类名-zh-CN.properties”的配置文件。动作类中访问,发现局部的比全局的优先级高。

这里写图片描述

3、包范围的消息资源包

也得经过action访问
书写有规范的,名称为package_zh_CN.properties,放在类的包中。可以被包中及子包的所有动作类来访问。
当查找指定key的消息时,会先从ActionClassName_language_country.properties资源文件查找,如果没有找到对应的key,然后沿着当前包往上查找基本名为package 的资源文件,一直找到最顶层包。如果还没有找到对应的key,最后会从常量struts.custom.i18n.resources指定的资源文件中寻找。

顺序如下

这里写图片描述

Tags:

文章评论


<