精华内容
下载资源
问答
  • SpringBoot 参数校验

    2020-11-03 17:32:43
    通过注解实现参数校验。 单个参数校验 /** * controller 上必须加 @Validated ,同时NotNull和 RequestParam本身的非空冲突 * 加 @Validated之后,并意味着其他类型参数校验可以不用@Validated * @param id *...

    背景

    参考地址:https://mp.weixin.qq.com/s/lcXIl2ifr3OmiSOPdaXLnw
    通过注解实现参数校验。

    单个参数校验

    /**
         * controller 上必须加 @Validated ,同时NotNull和 RequestParam本身的非空冲突
    	 * 加 @Validated之后,并不意味着其他类型参数校验可以不用@Validated
         * @param id
         * @throws Exception
         */
        @ApiOperation("单个参数校验")
        @GetMapping("/singleParam")
        public void login(@ApiParam(value= "主键id") @Min(1) @RequestParam Integer id) throws Exception{
            ResponseFactory.success();
        }
    

    一般DTO使用

    DTO 定义:

    public class UserDTO {
    	/**
    	 * 用户名
    	 */
    	@NotNull(message = "用户名不能为空")
    	private String userName;
    
    	/**
    	 * 密码
    	 */
    	@NotNull(message = "密码不能为空")
    	private String passWord;
    }
    

    controller层:

    @PostMapping("/login")
    public ResponseVo<User> login(@Valid @RequestBody UserDTO userDTO)throws Exception{
    
    	return ResponseFactory.success(userService.login(userDTO));
    }
    @PostMapping("/login2")
    public ResponseVo<User> login2(@Validated @RequestBody UserDTO userDTO)throws Exception{
    
    	return ResponseFactory.success(userService.login(userDTO));
    }
    

    总结:这时候使用 @Valid 或 @Validated 效果一致

    分组校验

    起因:在实际项目中,可能多个方法需要使用同一个DTO类来接收参数,而不同方法的校验规则很可能是不一样的。
    比如保存User的时候,UserId是可空的,但是更新User的时候,UserId的必须有值。
    解决方案:约束注解上声明适用的分组信息groups
    DTO定义:

    @Data
    @ApiModel("分组校验dto1")
    public class UserGloupValidDTO1 {
    
    	public interface Add {
    	}
    	public interface Update {
    	}
    
    	/**
    	 * 用户名
    	 */
    	@NotNull(message = "id不能为空", groups = UserGloupValidDTO1.Add.class)
    	@ApiModelProperty(value = "id")
    	private Integer id; //用int的话,@NotNull校验不行,因为它校验的是对象
    	/**
    	 * 用户名
    	 */
    	@NotNull(message = "用户名不能为空", groups = {UserGloupValidDTO1.Add.class, UserGloupValidDTO1.Update.class} )
    	@ApiModelProperty(value = "用户名")
    	private String userName;
    
    	/**
    	 * 密码
    	 */
    	@NotNull(message = "密码不能为空", groups = {UserGloupValidDTO1.Add.class, UserGloupValidDTO1.Update.class})
    	@ApiModelProperty(value = "密码")
    	private String passWord;
    
    }
    

    controller定义:

    @ApiOperation("分组校验1")
    @PostMapping("/valid3")
    public void login3(@Validated(UserGloupValidDTO1.Add.class) @RequestBody UserGloupValidDTO1 reqDTO)throws Exception{
    }
    

    注:DTO中定义接口类标识分组类别,接口类除了名字,没有别的内容。与controller 层中@Validated(UserGloupValidDTO1.Add.class) 对应。说明这个只是起到一个标识的作用。因为一个项目有多个dto,如果每个都自己定义分组的话,就太多了。
    定义公共校验分组 :

    public class ValidGroups {
    	public interface Add {
    	}
    	public interface Delete {
    	}
    	public interface Query {
    	}
    	public interface Update {
    	}
    }
    

    DTO和controller 中分别使用这个标记{

    @NotNull(message = "id不能为空", groups = ValidGroups.Update.class)
    		
    @Validated(ValidGroups.Update.class)
    

    ps:分组校验不能用@Valid ,编译就失败了

    嵌套校验

    前面的示例中,DTO类里面的字段都是基本数据类型和String类型。
    但是实际场景中,有可能某个字段也是一个对象,这种情况先,可以使用嵌套校验。
    比如,上面保存User信息的时候同时还带有Job信息。
    需要注意的是,此时DTO类的对应字段必须标记@Valid注解。
    NestValidDTO.java:

    @NotNull(message = "用户名不能为空", groups = {ValidGroups.Add.class, ValidGroups.Update.class})
    private String userName;
    
    @Valid //DTO类的对应字段必须标记@Valid注解
    private JobDTO jobDTO;
    

    注:当NestValidDTO.java 只剩下 jobDTO ,同时将它修改为List ,也就实现了集合校验

    集合校验

    参考的文章中使用的是
    定义一个validList{

    public class ValidationList<E> implements List<E> {
    	@Delegate // @Delegate是lombok注解
    	@Valid // 一定要加@Valid注解
    	public List<E> list = new ArrayList<>();
    
    	// 一定要记得重写toString方法
    	@Override
    	public String toString() {
    		return list.toString();
    	}
    }
    

    }
    controller {

    /**
     * 多个错误只能抛出一个,同时错误为“java.lang.IllegalStateException: JSR-303 ”
     * 无法被参数异常捕获
     * @param userList
     * @return
     */
    @ApiOperation("集合-分组校验(文章示例)")
    @PostMapping("/saveList6")
    public ResponseVo saveList(@RequestBody @Validated(ValidGroups.Update.class) ValidationList<UserGloupValidDTO2> userList) {
    	// 校验通过,才会执行业务逻辑处理
    	return ResponseFactory.success();
    }
    

    }
    总结:这种方式不行,使用嵌套校验“注”中提到的方式。

    编程式校验

    @Autowired
    private javax.validation.Validator globalValidator;
    /**
     * 编程式校验
     * @param userDTO
     * @return
     */
    @ApiOperation("编程式校验")
    @PostMapping("/saveList7")
    public ResponseVo saveWithCodingValidate(@RequestBody UserGloupValidDTO2 userDTO) {
        Set<ConstraintViolation<UserGloupValidDTO2>> validate = globalValidator.validate(userDTO, ValidGroups.Update.class);
        // 如果校验通过,validate为空;否则,validate包含未校验通过项
        if (validate.isEmpty()) {
            // 校验通过,才会执行业务逻辑处理
    
        } else {
            for (ConstraintViolation<UserGloupValidDTO2> userDTOConstraintViolation : validate) {
                // 校验失败,做其它逻辑
                System.out.println(userDTOConstraintViolation);
            }
        }
        return ResponseFactory.success();
    }
    	
    

    当我们并不是参数失败就退出时,需要这种方式

    自定义参数校验注解

    参考我的一篇注解文章

    展开全文
  • 博客地址 :https://lqcoder.com前言做web开发有一点很烦人就是要校验参数,基本上每个接口都要对参数进行校验,比如一些格式校验 非空校验都是必可少的。如果参数比较少的话还是容易 处理的一但参数比较多了的话...

    博客地址 :https://lqcoder.com

    前言

    做web开发有一点很烦人就是要校验参数,基本上每个接口都要对参数进行校验,比如一些格式校验 非空校验都是必不可少的。如果参数比较少的话还是容易 处理的一但参数比较多了的话代码中就会出现大量的IF ELSE就比如下面这样:

    8ffb4b61512ce82f455938c9423792bb.png

    这个例子只是校验了一下空参数。如果需要验证邮箱格式和手机号格式校验的话代码会更多,所以介绍一下validator通过注解的方式进行校验参数。

    什么是Validator

    Bean Validation是Java定义的一套基于注解的数据校验规范,目前已经从JSR 303的1.0版本升级到JSR 349的1.1版本,再到JSR 380的2.0版本(2.0完成于2017.08),已经经历了三个版本 。在SpringBoot中已经集成在 starter-web中,所以无需在添加其他依赖。

    e198414acd4618d87016af9d50f53718.png

    注解介绍

    validator内置注解

    注解详细信息@Null被注释的元素必须为 null@NotNull被注释的元素必须不为 null@AssertTrue被注释的元素必须为 true@AssertFalse被注释的元素必须为 false@Min(value)被注释的元素必须是一个数字,其值必须大于等于指定的最小值@Max(value)被注释的元素必须是一个数字,其值必须小于等于指定的最大值@DecimalMin(value)被注释的元素必须是一个数字,其值必须大于等于指定的最小值@DecimalMax(value)被注释的元素必须是一个数字,其值必须小于等于指定的最大值@Size(max, min)被注释的元素的大小必须在指定的范围内@Digits (integer, fraction)被注释的元素必须是一个数字,其值必须在可接受的范围内@Past被注释的元素必须是一个过去的日期@Future被注释的元素必须是一个将来的日期@Pattern(value)被注释的元素必须符合指定的正则表达式

    Hibernate Validator 附加的 constraint

    注解详细信息@Email被注释的元素必须是电子邮箱地址@Length被注释的字符串的大小必须在指定的范围内@NotEmpty被注释的字符串的必须非空@Range被注释的元素必须在合适的范围内@NotBlank验证字符串非null,且长度必须大于0

    注意

    • @NotNull 适用于任何类型被注解的元素必须不能与NULL
    • @NotEmpty 适用于String Map或者数组不能为Null且长度必须大于0
    • @NotBlank 只能用于String上面 不能为null,调用trim()后,长度必须大于0

    使用

    使用起来也非常简单,下面略过创建项目

    GITHUB地址:

    模拟用户注册封装了一个UserDTO

    当提交数据的时候如果使用以前的做法就是IF ELSE判断参数使用validator则是需要增加注解即可。

    例如非空校验:

    44f4e9022f695097cd0efb89d2c6558c.png

    然后需要在controller方法体添加@Validated不加@Validated校验会不起作用

    1b8f256137e8a0b443fa4361a2897f7b.png

    然后请求一下请求接口,把Email参数设置为空

    参数:

    { "userName":"luomengsun", "mobileNo":"11111111111", "sex":1, "age":21, "email":""}

    返回结果:

    164d647111d08eaa0cca65144dd06f62.png

    后台抛出异常

    91d6d32f5ec8a4c14cc1c2113c006d86.png

    这样是能校验成功,但是有个问题就是返回参数并不理想,前端也并不容易处理返回参数,所以我们添加一下全局异常处理,然后添加一下全局统一返回参数这样比较规范。

    添加全局异常

    创建一个GlobalExceptionHandler类,在类上方添加@RestControllerAdvice注解然后添加以下代码:

     /** * 方法参数校验 */@ExceptionHandler(MethodArgumentNotValidException.class)public ReturnVO handleMethodArgumentNotValidException(MethodArgumentNotValidException e) { log.error(e.getMessage(), e); return new ReturnVO().error(e.getBindingResult().getFieldError().getDefaultMessage()); }

    此方法主要捕捉MethodArgumentNotValidException异常然后对异常结果进行封装,如果需要在自行添加其他异常处理。

    添加完之后我们在看一下运行结果,调用接口返回:

    { "code": "9999", "desc": "邮箱不能为空", "data": null}

    OK 已经对异常进行处理。

    校验格式

    如果想要校验邮箱格式或者手机号的话也非常简单。

    校验邮箱

     /** * 邮箱 */ @NotBlank(message = "邮箱不能为空") @NotNull(message = "邮箱不能为空") @Email(message = "邮箱格式错误") private String email;

    使用正则校验手机号

    校验手机号使用正则进行校验,然后限制了一下位数

     /** * 手机号 */ @NotNull(message = "手机号不能为空") @NotBlank(message = "手机号不能为空") @Pattern(regexp ="^[1][3,4,5,6,7,8,9][0-9]{9}$", message = "手机号格式有误") @Max(value = 11,message = "手机号只能为{max}位") @Min(value = 11,message = "手机号只能为{min}位") private String mobileNo;

    查看一下运行结果

    传入参数:

    { "userName":"luomengsun", "mobileNo":"111111a", "sex":1, "age":21, "email":"1212121"}

    返回结果:

    { "code": "9999", "desc": "邮箱格式错误", "data": null}

    这里不再验证手机号的例子

    自定义注解

    上面的注解只有这么多,如果有特殊校验的参数我们可以使用Validator自定义注解进行校验

    首先创建一个IdCard注解类

    @Documented@Target({ElementType.PARAMETER, ElementType.FIELD})@Retention(RetentionPolicy.RUNTIME)@Constraint(validatedBy = IdCardValidator.class)public @interface IdCard { String message() default "身份证号码不合法"; Class>[] groups() default {}; Class extends Payload>[] payload() default {};}

    在UserDTO中添加@IdCard注解即可验证,在运行时触发,本文不对自定义注解做过多的解释,下篇文章介绍自定义注解

    • message 提示信息
    • groups 分组
    • payload 针对于Bean

    然后添加IdCardValidator 主要进行验证逻辑

    cb4085eb2e3b3d8450c52983250c312b.png

    上面调用了is18ByteIdCardComplex方法,传入参数就是手机号,验证身份证规则自行百度:see_no_evil:

    然后使用

     @NotNull(message = "身份证号不能为空") @IdCard(message = "身份证不合法") private String IdCardNumber;

    分组

    就比如上面我们定义的UserDTO中的参数如果要服用的话怎么办?

    在重新定义一个类然后里面的参数要重新添加注解?

    Validator提供了分组方法完美了解决DTO服用问题

    现在我们注册的接口修改一下规则,只有用户名不能为空其他参数都不进行校验

    先创建分组的接口

    public interface Create extends Default {}

    我们只需要在注解加入分组参数即可例如:

     /** * 用户名 */ @NotBlank(message = "用户姓名不能为空",groups = Create.class) @NotNull(message = "用户姓名不能为空",groups = Create.class) private String userName; @NotBlank(message = "邮箱不能为空",groups = Update.class) @NotNull(message = "邮箱不能为空",groups = Update.class) @Email(message = "邮箱格式错误",groups = Update.class) private String email;

    然后在修改Controller在@Validated中传入Create.class

     @PostMapping("/user") public ReturnVO userRegistra(@RequestBody @Validated(Create.class) UserDTO userDTO){ ReturnVO returnVO = userService.userRegistra(userDTO); return returnVO ; }

    然后调用传入参数:

    { "userName":"",}

    返回参数:

    { "code": "9999", "desc": "用户姓名不能为空", "data": null}

    OK 现在只对Create的进行校验,而Updata组的不校验,如果需要复用DTO的话可以使用分组校验

    校验单个参数

    在开发的时候一定遇到过单个参数的情况,在参数前面加上注解即可

     @PostMapping("/get") public ReturnVO getUserInfo(@RequestParam("userId") @NotNull(message = "用户ID不能为空") String userId){ return new ReturnVO().success(); }

    然后在Controller类上面增加@Validated注解,注意不是增加在参数前面。

    点击下方链接 更好的阅读体验

    展开全文
  • 通知地址差异化处理, 每笔交易发给渠道方的通知地址一样 ...严格对请求参数非空校验(比如,某渠道文档说明了在通知时传递支付金额,那么,当某次通知的参数里没有支付金额时,就认定是非法通知;某渠...

    通知地址差异化处理,

    1. 每笔交易发给渠道方的通知地址都不一样
    2. url不能包含敏感数据,如自增id,而且通过加密混淆来保证URL不容易被模仿

     

     

    接收到通知请求后,

    api层:

    1. 验证IP白名单
    2. 验证请求url的合法性

    渠道层:

    1. 严格对请求参数做非空校验(比如,某渠道文档说明了在通知时传递支付金额,那么,当某次通知的参数里没有支付金额时,就认定是非法通知;某渠道文档说明了在通知时传递支付账号,那么,当某次通知的参数里没有支付账号时,就认定是非法通知)
    2. 数据的合法性校验,如金额必须为数值

    Service层:

    1. 支付单是否存在
    2. 验证当前支付状态,如果是终态,则终止处理
    3. 如果渠道有如下请求参数:
      •   验证支付金额是否一致
      •   支付账号是否匹配
      •   验证请求url的合法性(如果某渠道定义了特定的url规则)
      •   对于扫码支付:验证通知时间 如果在支付时间的24小时之后,则认定为非法通知(如果是其他支付方式,需另做相关控制)
      •   验证支付完成时间 如果早于支付时间,则认定为非法通知

     

    ————————————————————–我是萌萌哒分界线————————————————————

    【PDCA】

    程序上线后,经过监控,在时间验证方面数次发现,渠道方的通知报文里的支付完成时间早于我方的支付发起时间!经进一步分析得知,两组时间的差异均在5秒之内,不难推断出,这是双方服务器时间不一致导致的,事实上也往往无法保证两台服务器的时间完全一致。 所以,需要对时间验证做完善,设置一个阈值,比如2分钟,支付完成时间不能早于支付时间减去这个阈值。这样,就可以兼容这种实际情况下的不一致。

    转载于:https://www.cnblogs.com/buguge/p/8480431.html

    展开全文
  • C++随记备忘(1)

    2020-06-01 13:39:14
    地址和目的地址非空断言。 c.返回值应为目的地址。 3.传入函数的参数应该是地址,二级指针! 4.malloc后面应该跟着对于是否真正分配成功的检查以及free(p),同时最好将p = NULL,防止野指针。 5.指针未初始定义

    C++的复习其实前几天就开始了。这里先记录一下前面看过的一部分内容,后续继续补充,每天更新。复习主要通过nowcode,表示感谢。

    1.string后面的 ‘\0’, 在复制字符串的时候一定要注意。

    2.写一个strcpy。注意事项:
    a.源数组不能改动,需要加const。
    b.源地址和目的地址加非空断言。
    c.返回值应为目的地址。

    3.传入函数的参数应该是地址,二级指针!

    4.malloc后面应该跟着对于是否真正分配成功的检查以及free(p),同时最好将p = NULL,防止野指针。

    5.指针未初始定义是不能使用的。

    6.写宏的话,一定要把括号完全打好

    7.结构体的对齐规则:
    a.每个成员的起始偏移量必须为其大小的整数倍。
    b.总的偏移量必须是最大的成员的大小的整数倍。

    8.类的构造函数,析构函数, 赋值函数,拷贝构造函数
    构造函数接受外面传进来的参数,并将其经过处理检查后赋值给类内部的private里的变量。当然,传进来的参数应该为const

    析构函数一般是delete内部的参数,不接受参数

    拷贝构造函数:当类内部有指针类成员变量时,一定要有拷贝构造函数。在C++中,下面三种对象需要调用拷贝构造函数:
    1.对象以值传递的方式传入函数参数。
    2.对象以值传递的方式从函数返回。
    3.对象需要通过另一个对象初始化。
    拷贝构造函数接受的参数应该是另一个相同的类other,且必须为const

    赋值函数
    判断自引用,即this == other时应该返回原指针。
    释放原有的内存资源
    在最后一定是return *this

    9.static 与 const关键字
    static有以下几个作用:
    1.全局静态变量:static + 全局变量
    未经初始化的话会被自动初始化为0,位于静态存储区。作用域仅限于定义它的文件中。
    2.局部静态变量:static + 局部变量
    作用域仍为局部作用域,但离开作用域后不会销毁,也无法访问,直到该函数再次被调用,且值不变。
    3.静态函数:static + 函数定义
    该函数只在声明它的cpp文件中可见,不会与其他cpp文件中的同名函数冲突。不要在头文件中声明static, 不要在cpp中声明非static。如果需要复用某函数,将其放在头文件。
    4.类的静态成员 & 类的静态函数
    静态成员可以成为类中多个对象的数据共享,而不是某一个对象的成员。对多个对象来说,静态成员只储存一处,供所有对象使用
    在静态成员函数的实现中不能直接引用类中说明的非静态成员,可以引用静态成员。如果要引用非静态成员,可以通过对象来引用。

    展开全文
  •  引用:在引用传递过程中,被调函数的形式参数虽然也作为局部变量在栈区开辟了内存空间,但这时存放的是主函数实参变量的地址,正因为如此,被调函数对形参的 任何操作都会成为间接寻址,即通过栈存放的地址访问...
  • 列表对象的排序方法sort____只能按...已知x为非空列表,那么执行语句x[0] = 3之后,列表对象x的内存地址不变(√) (列表可以通过下标原地修改) 在Python 3.x中可以使用中文作为变量名(√) Python集合中的元素..
  • 注意:应使用全局变量 pthread_t tid,在子线程中通过pthread_create传出参数来获取线程ID,而应使用pthread_self。 pthread_create函数 创建一个新线程。 其作用,对应进程中fork() 函数。 int pthread_create...
  • 1、必须修改后台地址,英文字母加下划线随意组合,支持中文。 2、请修改数据库文件名,同时请修改前台include/conn_tsdqq.asp和后台conn.asp配置参数。 3、对于知道数据库文件名的同学,请自行搜索文件名含有...
  • 上传头像处使用上传头像至阿里云的OSS对象存储中,由于上传问题并没有返回上传成功后的图片url地址,于是只好设置OSS的Bucket为公共读权限,然后当上传成功后手动拼接图片url并存入数据库 项目中最大的难点还是莫...
  • 2009达内SQL学习笔记

    2010-02-10 19:46:58
    可转化为日期、字符、数值等三种(注意:转化时,两参数必须要同类型) 如:NVL(date, '01-JAN-95') NVL(title,'NO Title Yet') NVL(salary,0) 错误写法: Select last_name,title,salary*commission_pct/100 COMM ...
  • 实例102 解析URL地址中传递的编码参数 134 实例103 转义帖子中的特殊字符 135 实例104 获取任意字符的ASCII码 136 实例105 查找指定ASCII码对应的字符 136 实例106 合理定义上传文件的名称 137 实例107 通过异或方式...
  • 实例102 解析URL地址中传递的编码参数 134 实例103 转义帖子中的特殊字符 135 实例104 获取任意字符的ASCII码 136 实例105 查找指定ASCII码对应的字符 136 实例106 合理定义上传文件的名称 137 实例107 通过异或方式...
  • 类型 参数 描述 字符类型 char 1~2000字节 固定长度字符串,长度不够的用空格补充 varchar2 1~4000字节 可变长度字符串,与CHAR类型相比,使用VARCHAR2可以节省磁盘空间,但查询效率没有char类型高 数值类型 Number...
  • xcopy 要复制的文件或目录树 目标地址目录名 复制文件和目录树,用参数/Y将提示覆盖相同文件 用参数/e才可连目录下的子目录一起复制到目标地址下。 tftp -i 自己IP(用肉机作跳板时这用肉机IP) get server.exec...
  • 包含各种工具类的集合,会定期更新,欢迎贡献code 使用方法: 2.0.0以后,放弃了support库,请使用AndroidX implementation 'com.easyandroid:easytools:2.0.3' 然后,在自己的Application中调用Utils.init(this)...
  • X-Cart Gold 4.5.4.zip

    2019-05-27 11:39:04
    2012年10月] 22日,AIM - 问题(0127289):Authorize.Net SIM:“x_currency_code参数不通过的交易请求。固定的。 Thanks2Seyfin。 [!] 2012年10月17号,随机 - 错误(0126864):PayPal快速结帐:您的API凭证...
  • 技巧49 限制只能输入E-mail地址 技巧50 限制单元格只能输入特定编码 技巧51 单元格中切换中英文输入法 技巧52 限制输入重复数据 技巧53 禁止重复报餐 技巧54 复制数据有效性 技巧55 取消对单元格的输入...
  •  4.4.13 在区域中查找第一个非空单元格  4.4.14 替换多个字符  4.4.15 从文本中获取数字  4.4.16 将星期编号转换为日期  4.4.17 从用分隔符分隔的字符串中提取值  4.4.18 排序并拼接  4.4.19 对数字和...
  • Oracle事例

    2007-08-26 10:35:53
    not null 非空约束 default 缺省值约束 check 检查约束,使列的值符合一定的标准范围 unqiue 唯一性约束 foreign key 外部键约束 29、查看创建视图的select语句 SQL>set view_name,text_length from user_...
  • 1.8.3 空白但非空的单元格 37 1.8.4 显示值与实际值 38 1.8.5 返回错误值 39 1.8.6 循环引用 41 1.9 公式使用技巧 42 1.9.1 在多个单元格中输入同一个公式 42 1.9.2 显示公式而不是值 42 1.9.3 查看公式的...
  • 数据结构(C++)有关练习题

    热门讨论 2008-01-02 11:27:18
    内容及步骤: 1、 设计一个图的类,采用临接表法进行存储,该图每个结点的数据类型类模板的模板参数进行定义(注:需先设计一个结点类Node); 2、 为该类分别设计一个实现深度优先搜索和广度优先搜索的成员...
  • 元素ai的存储地址为:ADR(ai)=ADR(a1)+(i-1)k,ADR(a1)为第一个元素的地址,k代表每个元素占的字节数。 (3)顺序表的运算有查找、插入、删除3种。 1.3 栈 1. 栈的基本概念 栈(stack)是一种特殊的线性表,是限定只...
  • Excel新增工具集

    2011-12-20 09:30:27
    6、群发同附件邮件:将同标题、同内容、同附件的共性邮件群发到多个邮箱与手机,与邮箱群发不同的是能“逐个群发”,受群发数量限制,不会被对方看到多个地址,不会被过滤成垃圾邮件。 7、自动进入网易邮箱:凡是...
  • 《数据结构 1800题》

    热门讨论 2012-12-27 16:52:03
    16.连续存储设计时,存储单元的地址(A )。【中山大学 1999 一、1(1分)】 A.一定连续 B.一定连续 C.一定连续 D.部分连续,部分连续 17.以下属于逻辑结构的是(C )。【西安电子科技大学应用 2001一...

空空如也

空空如也

1 2
收藏数 24
精华内容 9
关键字:

地址参数非空不通过