java自定义注解实现前后台参数校验的实例

其实是可以通过@Constraint来限定自定义注解的方法。

@Constraint(validatedBy = xxxx.class)

下面是我做的 java自定义注解实现前后台参数校验 的代码示例

对这个感兴趣的,请好好看,好好学:

package sonn.sonnannotation;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

import javax.validation.Constraint;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import javax.validation.Payload;

import sonn.util.StringUtill;

/**
* @ClassName: IsValidString
* @Description: 自定义注解实现前后台参数校验,判断是否包含非法字符
* @author 无名
* @date 2016-7-25 下午8:22:58
* @version 1.0
 */
@Target({ElementType.FIELD, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = IsValidString.ValidStringChecker.class)
@Documented
public @interface IsValidString
{
  String message() default "The string is invalid.";

  Class<?>[] groups() default {};

  Class<? extends Payload>[] payload() default{};

  class ValidStringChecker implements ConstraintValidator<IsValidString,String>
  {

    @Override
    public void initialize(IsValidString arg0)
    {
    }

    @Override
    public boolean isValid(String strValue, ConstraintValidatorContext context)
    {
      if(StringUtill.isStringEmpty(strValue))
      {
        return true;
      }
      if(strValue.contains("<"))
      {
        return false;
      }
      return true;
    }

  }
}

上述代码,通过@Constraint(validatedBy = IsValidString.ValidStringChecker.class)限定了注解的方法逻辑---该注解类的名为ValidStringChecker的内部类。

而该内部类实现了ConstraintValidator<IsValidString,String>接口

官方文档是这样描述的:

javax.validation
Interface ConstraintValidator<A extends Annotation,T>

------------------------------------------------

public interface ConstraintValidator<A extends Annotation,T>Defines the logic to validate a given constraint A for a given object type T.
Implementations must comply to the following restriction:

•T must resolve to a non parameterized type
•or generic parameters of T must be unbounded wildcard types
The annotation SupportedValidationTarget can be put on a ConstraintValidator implementation to mark it as supporting cross-parameter constraints. Check out SupportedValidationTarget and Constraint for more information.

实现的isValid方法便是,该接口的校验方法。

试验一下效果,在要校验的实体类字段加上注解:

写文章页面,文章标题内加入'<'然后提交:

提交失败,报500错误,说明注解生效:

但这样还有问题,我的blog网站不能直接打印出报错信息。还是要搞一个error页面出来。

这个简单,web.xml下加入error页面路径,然后做一个页面即可:

<error-page>
<error-code>500</error-code>
<location>/error.jsp</location>
</error-page>

首先介绍些基本概念:

1.java用@interface xx{}定义一个注解。

注解这个东西,其实并不神秘,不过是一种标记,程序运行到标记处,就执行相应逻辑罢了。注解本身即是一个类。

2.注解在定义时,标注一些注解可以表示特定意义:

@Retention(RetentionPolicy.SOURCE) // 注解仅存在于源码中,在class字节码文件中不包含

@Retention(RetentionPolicy.CLASS) // 默认的保留策略,注解会在class字节码文件中存在,但运行时无法获得

@Retention(RetentionPolicy.RUNTIME) // 注解会在class字节码文件中存在,在运行时可以通过反射获取到

(RUNTIME的值得注意下,因为意味着可以反射来获取)

@Target(ElementType.TYPE) // 接口、类、枚举、注解

@Target(ElementType.FIELD) // 字段、枚举的常量

@Target(ElementType.METHOD) // 方法

@Target(ElementType.PARAMETER) // 方法参数

@Target(ElementType.CONSTRUCTOR) // 构造函数

@Target(ElementType.LOCAL_VARIABLE) // 局部变量

@Target(ElementType.ANNOTATION_TYPE) // 注解

@Target(ElementType.PACKAGE) // 包

有一种做法就是在定义注解时加上@Taget(xx)和@Retention(RetentionPolicy.RUNTIME) ,但没有在注解中写方法,只是在运行时通过反射机制来获取注解,然后自己写相应逻辑(所谓注解解析器)

大概是类似的写法:

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Documented
@Inherited
@Target({ ElementType.FIELD, ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
public @interface Validate
{
  public int min() default 1;

  public int max() default 10;

  public boolean isNotNull() default true;
}

之后运行时,用反射获取注解,具体不谈。

之前在网上查找这方面技术文章找到的都是这种,给当时的我带来很大困惑。觉得不是我想要的。

以上这篇java自定义注解实现前后台参数校验的实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • java使用计算md5校验码方式比较两个文件是否相同

    复制代码 代码如下: public class MD5Check {/*** 默认的密码字符串组合,用来将字节转换成 16 进制表示的字符,apache校验下载的文件的正确性用的就是默认的这个组合*/    protected char hexDigits[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };    protected  MessageDigest messa

  • Java基于正则实现的日期校验功能示例

    本文实例讲述了Java基于正则实现的日期校验功能.分享给大家供大家参考,具体如下: private void checkDate() throws IOException { // 4种分隔符 String sep = "[-\\./_]"; // 年份 String strPattern = "^(19[4-9]\\d|20\\d{2})" + sep; strPattern += "("; // 月(1,3,5,7,8,10,12) strP

  • java中文及特殊字符的校验方法

    本文实例为大家分享了Android九宫格图片展示的具体代码,供大家参考,具体内容如下 参考链接:Character.UnicodeBlock中cjk的说明详解 1.关于Character.UnicodeBlock的介绍 CJK的意思是"Chinese,Japanese,Korea"的简写 ,实际上就是指中日韩三国的象形文字的Unicode编码 Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS : 4E00-9FBF:Unicode 编码为 U+

  • java身份证合法性校验并提取身份证有效信息

    java身份证合法性校验并获取身份证号有效信息,供大家参考,具体内容如下 java身份证合法性校验 /**身份证前6位[ABCDEF]为行政区划数字代码(简称数字码)说明(参考<GB/T 2260-2007 中华人民共和国行政区划代码>): * 该数字码的编制原则和结构分析,它采用三层六位层次码结构,按层次分别表示我国各省(自治区,直辖市,特别行政区). * 市(地区,自治州,盟).县(自治县.县级市.旗.自治旗.市辖区.林区.特区). 数字码码位结构从左至右的含义是: 第一层为AB两位代码表

  • JAVA 18位身份证号码校验码的算法

    public static char doVerify(String id) { char pszSrc[]=id.toCharArray(); int iS = 0; int iW[]={7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2}; char szVerCode[] = new char[]{'1','0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'}; int i; for(i=0;i

  • 利用Java正则表达式校验邮箱与手机号

    主要是运用java.util.regex类. 复制代码 代码如下: import java.util.regex.Matcher; import java.util.regex.Pattern; public class CheckMobileAndEmail { /** * 验证邮箱地址是否正确 * @param email * @return */ public static boolean checkEmail(String email){ boolean flag = false; tr

  • Java struts2 validate用户登录校验功能实现

    首先贴一下搭配的环境: 配置: Eclipse4.3.2 jdk1.7_45 Mysql 5.0+ 然后切入正题: 1.login.jsp 主要是使用OGNL 标签 也可使用html form表单,调用LoginAction.action,以post 方式传输. 在LoginaAction 经过判断,然后会有提示信息,需要用到 <s:fielderror/>来显示. <%@ taglib uri="/struts-tags" prefix="s"%

  • java累加和校验实现方式16进制(推荐)

    已知一个字符串,求该字符串的16进制累加和,已知一段字符串和校验码,校验和累加是否合法,话不多说了直接上代码 public static String makeChecksum(String data) { if (data == null || data.equals("")) { return ""; } int total = 0; int len = data.length(); int num = 0; while (num < len) { Str

  • Java校验银行卡是否正确的核心代码

    多说无益,贴代码: /** * 校验银行卡卡号 * * @param cardId * @return */ public static boolean checkBankCard(String cardId) { char bit = getBankCardCheckCode(cardId .substring(0, cardId.length() - 1)); return cardId.charAt(cardId.length() - 1) == bit; } /** * 从不含校验位的银

  • java使用正则表达校验手机号码示例(手机号码正则)

    复制代码 代码如下: public static boolean isMobileNumber(String mobiles) {return Pattern.compile("^((13[0-9])|(15[^4,\\D])|(18[^1^4,\\D]))\\d{8}").matcher(mobiles).matches();}

随机推荐