四阶偏微分方程求解四(1)

&& 文章内容
复制日期相差4年零1天的原因和解决办法(不启用1904日期系统)
[日期:] & 来源:IT部落窝& 作者:IT部落窝 & 阅读:438次[字体:
内容提要:文章介绍两个工作簿之间复制日期相差4年零1天的原因是因为启用了1904日期系统和1900日期系统,并给出两种解决办法.
  Excel中有两种日期系统,分别是1904日期系统和1900日期系统。
  下面我们通过一个实例来理解1904日期系统和1900日期系统。下面截图,左边的文件是使用的1900日期系统,右边的文件是使用的1904日期系统。当将左边文件A列的内容复制到右边文件A列,发现所有的日期发生了变化,所有日期自动增加了四年零一天。
  要解决两个文件日期统一匹配,有两种解决方法。
第一,不启用1904日期系统
  将右边文件的日期系统进行如下设置,执行&文件&&选项&,打开&excel选项&&高级&&不勾选&使用1904日期系统&&。
第二,使用公式进行复制
  举例说明:现在有两个工作簿:文件名分别是&工作簿3&和&工作簿4&,工作簿3没有勾选&使用1904日期系统&,工作簿4勾选了&使用1904日期系统&。
  &工作簿3&是1900日期系统,A1单元格日期为:。
  &工作簿4&是1904日期系统,如果要保持和&工作簿3&A1单元格日期一致,可以输入公式:=[工作簿3]Sheet1!$A$1-1462,那么两个工作簿日期还是保持一致的。
  根据实际情况,在公式中,用日期加或者减1462,使其日期一致。
  小知识:1904日期系统和1900日期系统
  Excel支持两个不同的日期系统。1900 日期系统中,所支持的第一天是 1900 年 1 月 1 日。1904 日期系统中,所支持的第一天是 1904 年 1 月 1 日。
赞助商链接
赞助商链接其他登录方式:
Hi~亲,欢迎来到题谷网,新用户注册7天内每天完成登录送积分一个,7天后赠积分33个,购买VIP服务可抵相同金额现金哦~
意见详细错误描述:
教师讲解错误
错误详细描述:
当前位置:>>>
已知直线l1∶y=kx+b过点A(4,-1),B(-4,-5),将直线l1绕坐标原点旋转180°后得到l2,点A的对应点为A1,点B的对应点为B1.(1)在直角坐标系中作出以上四点;(2)求直线l1,l2的解析式;(3)计算四边形ABA1B1的面积.
主讲:王哲
评分:4.0分
【思路分析】
(1) 将直线l1绕坐标原点旋转180°后得到l2,点A的对应点为A1,点B的对应点为B1,即点A、 A1是关于原点成中心对称,点B、 B1是关于原点成中心对称,可得A1(-4,1),B1(4,5)(2)两点确定一条直线买药求解析式,将两点坐标分别代入解析式,求出k,b即可.(3)图形画出发现四边形ABA1B1是平行四边形,平行四边形的面积等于底×高,易确定底A1B =6,高EF=8,故S= A1B·EF=6×8=48
【解析过程】
解:(1)(2)直线l1∶y=kx+b过点A(4,-1),B(-4,-5)依题意得A1(-4,1),B1(4,5)设直线l2:y=k1x+b1过点A1(-4,1),B1(4,5)(3)如图由图知:A(4,-1),B(-4,-5),A1(-4,1),B1(4,5)∴A1B=B1A=6,A1B∥y轴,B1A∥y轴∴A1B∥B1A,EF=8∴四边形ABA1B1是平行四边形∴S= A1B·EF=6×8=48即四边形ABA1B1的面积48平方单位.
,(1)(2)直线l1∶y=kx+b过点A(4,-1),B(-4,-5)依题意得A1(-4,1),B1(4,5)设直线l2:y=k1x+b1过点A1(-4,1),B1(4,5)(3)如图由图知:A(4,-1),B(-4,-5),A1(-4,1),B1(4,5)∴A1B=B1A=6,A1B∥B1A,EF=8∴四边形ABA1B1是平行四边形∴S= A1B·EF=6×8=48即四边形ABA1B1的面积48平方单位.
本题应用到的知识点有(1)中心对称的概念,(2)待定系数法求直线解析式,(3)判断是平行四边形,再据平行四边形的面积公式求解.
给视频打分
电话:010-
地址:北京市西城区新街口外大街28号B座6层601
扫一扫有惊喜!
COPYRIGHT (C)
INC. ALL RIGHTS RESERVED. 题谷教育 版权所有
京ICP备号 京公网安备第一章 运动的描述 1 质点 参考系和坐标系 2 时间和位移 3 运动快慢的描述──速度 4 实验:用打点计时器测速度 5 速度变化快慢的描述──加速度 章综合 第二章 匀变速直线运动的研究 1 实验:探究小车速度随时间变化的规律 2 匀变速直线运动的速度与时间的关系 3 匀变速直线运动的位移与时间的关系 4 匀变速直线运动的位移与速度的关系 5 自由落体运动 6 伽利略对自由落体运动的研究 章综合 第三章 相互作用 1 重力 基本相互作用 2 弹力 3 摩擦力 4 力的合成 5 力的分解 章综合 第四章 牛顿运动定律 1 牛顿第一定律 2 实验:探究加速度与力、质量的关系 3 牛顿第二定律 4 力学单位制 5 牛顿第三定律 6 用牛顿运动定律解决问题(一) 7 用牛顿运动定律解决问题(二) 章综合 -学优高考网欢迎回到学优高考网|||||||新课标高考:自主命题区:大纲高考区:教材年级学币:2上传时间:大小:2MB学币:2上传时间:大小:591KB学币:2上传时间:大小:504KB学币:2上传时间:大小:2MB学币:2上传时间:大小:363KB学币:2上传时间:大小:5MB学币:2上传时间:大小:812KB学币:2上传时间:大小:4MB学币:2上传时间:大小:371KB学币:2上传时间:大小:3MB学币:2上传时间:大小:2MB学币:2上传时间:大小:4MB学币:2上传时间:大小:2MB学币:2上传时间:大小:8MB学币:2上传时间:大小:2MB学币:2上传时间:大小:1MB学币:2上传时间:大小:3MB学币:2上传时间:大小:37KB学币:2上传时间:大小:104KB学币:2上传时间:大小:39KB加载中,请稍后...求解(3+1)(3^2+1)(3^4+1)(3^8+1)(3^16+1)_百度作业帮
求解(3+1)(3^2+1)(3^4+1)(3^8+1)(3^16+1)
求解(3+1)(3^2+1)(3^4+1)(3^8+1)(3^16+1)
(3+1)(3^2+1)(3^4+1)(3^8+1)(3^16+1)=(1/2)(3-1)(3+1)(3^2+1)(3^4+1)(3^8+1)(3^16+1)=(1/2)(3^2-1)(3^2+1)(3^4+1)(3^8+1)(3^16+1)=(1/2)(3^4-1)(3^4+1)(3^8+1)(3^16+1)=(1/2)(3^8-1)(3^8+1)(3^16+1)=(1/2)(3^16-1)(3^16+1)=(1/2)(3^32-1)=3^32/2-1/2明教为您解答,请点击[满意答案];如若您有不满意之处,请指出,我一定改正!希望还您一个正确答复!祝您学业进步!
(3+1)(3^2+1)(3^4+1)(3^8+1)(3^16+1)=(1/2)(3-1)(3+1)(3^2+1)(3^4+1)(3^8+1)(3^16+1)=(1/2)(3^2-1)(3^2+1)(3^4+1)(3^8+1)(3^16+1)=(1/2)(3^4-1)(3^4+1)(3^8+1)(3^16+1)=(1/2)(3^8-1)(3^8+1)(3^16+1)=(1/2)(3^16-1)(3^16+1)=(1/2)(3^32-1)提示:运用平方差公式
根据平方差公式(a+b)(a-b)=a^2-b^2得[3^(2n)-1][3^(2n)+1]=3^(4n)-1原式=(3-1)(3+1)(3^2+1)(3^4+1)(3^8+1)(3^16+1)/(3-1)
=(3^2-1)(3^2+1)(3^4+1)(3^8+1)(3^16+1)/(3-1)
=(3^4-1)(3^4+...Spring4新特性——集成Bean Validation 1.1(JSR-349)到SpringMVC - 开涛的博客(欢迎关注我的公众号[博客头像二维码]) - ITeye技术网站
博客分类:
在之前的《》中的《》中已经介绍过SpringMVC集成Bean Validation 1.0(JSR-303),目前Bean Validation最新版本是(JSR-349),新特性可以到官网查看,笔者最喜欢的两个特性是:跨参数验证(比如密码和确认密码的验证)和支持在消息中使用EL表达式,其他的还有如方法参数/返回值验证、CDI和依赖注入、分组转换等。对于方法参数/返回值验证,大家可以参阅《 》。
Bean Validation 1.1当前实现是Hibernate validator 5,且spring4才支持。接下来我们从以下几个方法讲解Bean Validation 1.1,当然不一定是新特性:
集成Bean Validation 1.1到SpringMVC
分组验证、分组顺序及级联验证
消息中使用EL表达式
方法参数/返回值验证
自定义验证规则
类级别验证器
脚本验证器
cross-parameter,跨参数验证
混合类级别验证器和跨参数验证器
组合多个验证注解
因为大多数时候验证都配合web框架使用,而且很多朋友都咨询过如分组/跨参数验证,所以本文介绍下这些,且是和SpringMVC框架集成的例子,其他使用方式(比如集成到JPA中)可以参考其官方文档:
hibernate validator文档:
1、集成Bean Validation 1.1到SpringMVC
1.1、项目搭建
首先添加hibernate validator 5依赖:
&dependency&
&groupId&org.hibernate&/groupId&
&artifactId&hibernate-validator&/artifactId&
&version&5.0.2.Final&/version&
&/dependency&
如果想在消息中使用EL表达式,请确保EL表达式版本是 2.2或以上,如使用Tomcat6,请到Tomcat7中拷贝相应的EL jar包到Tomcat6中。
&dependency&
&groupId&javax.el&/groupId&
&artifactId&javax.el-api&/artifactId&
&version&2.2.4&/version&
&scope&provided&/scope&
&/dependency&
请确保您使用的Web容器有相应版本的el jar包。
对于其他POM依赖请下载附件中的项目参考。
1.2、Spring MVC配置文件(spring-mvc.xml):
&!-- 指定自己定义的validator --&
&mvc:annotation-driven validator="validator"/&
&!-- 以下 validator
ConversionService 在使用 mvc:annotation-driven 会 自动注册--&
&bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean"&
&property name="providerClass" value="org.hibernate.validator.HibernateValidator"/&
&!-- 如果不加默认到 使用classpath下的 ValidationMessages.properties --&
&property name="validationMessageSource" ref="messageSource"/&
&!-- 国际化的消息资源文件(本系统中主要用于显示/错误消息定制) --&
&bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource"&
&property name="basenames"&
&!-- 在web环境中一定要定位到classpath 否则默认到当前web应用下找
&value&classpath:messages&/value&
&value&classpath:org/hibernate/validator/ValidationMessages&/value&
&/property&
&property name="useCodeAsDefaultMessage" value="false"/&
&property name="defaultEncoding" value="UTF-8"/&
&property name="cacheSeconds" value="60"/&
此处主要把bean validation的消息查找委托给spring的messageSource。
1.3、实体验证注解:
public class User implements Serializable {
@NotNull(message = "{user.id.null}")
@NotEmpty(message = "{user.name.null}")
@Length(min = 5, max = 20, message = "{user.name.length.illegal}")
@Pattern(regexp = "[a-zA-Z]{5,20}", message = "{user.name.illegal}")
@NotNull(message = "{user.password.null}")
对于验证规则可以参考官方文档,或者《》。
1.4、错误消息文件messages.properties:
user.id.null=用户编号不能为空
user.name.null=用户名不能为空
user.name.length.illegal=用户名长度必须在5到20之间
user.name.illegal=用户名必须是字母
user.password.null=密码不能为空
1.5、控制器
@Controller
public class UserController {
@RequestMapping("/save")
public String save(@Valid User user, BindingResult result) {
if(result.hasErrors()) {
return "error";
return "success";
1.6、错误页面:
&spring:hasBindErrors name="user"&
&c:if test="${errors.fieldErrorCount & 0}"&
字段错误:&br/&
&c:forEach items="${errors.fieldErrors}" var="error"&
&spring:message var="message" code="${error.code}" arguments="${error.arguments}" text="${error.defaultMessage}"/&
${error.field}------${message}&br/&
&/c:forEach&
&c:if test="${errors.globalErrorCount & 0}"&
全局错误:&br/&
&c:forEach items="${errors.globalErrors}" var="error"&
&spring:message var="message" code="${error.code}" arguments="${error.arguments}" text="${error.defaultMessage}"/&
&c:if test="${not empty message}"&
${message}&br/&
&/c:forEach&
&/spring:hasBindErrors&
大家以后可以根据这个做通用的错误消息显示规则。比如我前端页面使用validationEngine显示错误消息,那么我可以定义一个tag来通用化错误消息的显示:。
输入如: , 我们得到如下错误:
name------用户名必须是字母
name------用户名长度必须在5到20之间
password------密码不能为空
id------用户编号不能为空
基本的集成就完成了。
如上测试有几个小问题:
1、错误消息顺序,大家可以看到name的错误消息顺序不是按照书写顺序的,即不确定;
2、我想显示如:用户名【zhangsan】必须在5到20之间;其中我们想动态显示:用户名、min,max;而不是写死了;
3、我想在修改的时候只验证用户名,其他的不验证怎么办。
接下来我们挨着试试吧。
2、分组验证及分组顺序
如果我们想在新增的情况验证id和name,而修改的情况验证name和password,怎么办? 那么就需要分组了。
首先定义分组接口:
public interface First {
public interface Second {
分组接口就是两个普通的接口,用于标识,类似于java.io.Serializable。
接着我们使用分组接口标识实体:
public class User implements Serializable {
@NotNull(message = "{user.id.null}", groups = {First.class})
@Length(min = 5, max = 20, message = "{user.name.length.illegal}", groups = {Second.class})
@Pattern(regexp = "[a-zA-Z]{5,20}", message = "{user.name.illegal}", groups = {Second.class})
@NotNull(message = "{user.password.null}", groups = {First.class, Second.class})
验证时使用如:
@RequestMapping("/save")
public String save(@Validated({Second.class}) User user, BindingResult result) {
if(result.hasErrors()) {
return "error";
return "success";
即通过@Validate注解标识要验证的分组;如果要验证两个的话,可以这样@Validated({First.class, Second.class})。
接下来我们来看看通过分组来指定顺序;还记得之前的错误消息吗? user.name会显示两个错误消息,而且顺序不确定;如果我们先验证一个消息;如果不通过再验证另一个怎么办?可以通过@GroupSequence指定分组验证顺序:
@GroupSequence({First.class, Second.class, User.class})
public class User implements Serializable {
@Length(min = 5, max = 20, message = "{user.name.length.illegal}", groups = {First.class})
@Pattern(regexp = "[a-zA-Z]{5,20}", message = "{user.name.illegal}", groups = {Second.class})
通过@GroupSequence指定验证顺序:先验证First分组,如果有错误立即返回而不会验证Second分组,接着如果First分组验证通过了,那么才去验证Second分组,最后指定User.class表示那些没有分组的在最后。这样我们就可以实现按顺序验证分组了。
另一个比较常见的就是级联验证:
public class User {
@ConvertGroup(from=First.class, to=Second.class)
1、级联验证只要在相应的字段上加@Valid即可,会进行级联验证;@ConvertGroup的作用是当验证o的分组是First时,那么验证o的分组是Second,即分组验证的转换。
3、消息中使用EL表达式
假设我们需要显示如:用户名[NAME]长度必须在[MIN]到[MAX]之间,此处大家可以看到,我们不想把一些数据写死,如NAME、MIN、MAX;此时我们可以使用EL表达式。
@Length(min = 5, max = 20, message = "{user.name.length.illegal}", groups = {First.class})
错误消息:
user.name.length.illegal=用户名长度必须在{min}到{max}之间
其中我们可以使用{验证注解的属性}得到这些值;如{min}得到@Length中的min值;其他的也是类似的。
到此,我们还是无法得到出错的那个输入值,如name=zhangsan。此时就需要EL表达式的支持,首先确定引入EL jar包且版本正确。然后使用如:
user.name.length.illegal=用户名[${validatedValue}]长度必须在5到20之间
使用如EL表达式:${validatedValue}得到输入的值,如zhangsan。当然我们还可以使用如${min & 1 ? '大于1' : '小于等于1'},及在EL表达式中也能拿到如@Length的min等数据。
另外我们还可以拿到一个java.util.Formatter类型的formatter变量进行格式化:
${formatter.format("%04d", min)}
4、方法参数/返回值验证
这个可以参考《 》,概念是类似的,具体可以参考Bean Validation 文档。
5、自定义验证规则
有时候默认的规则可能还不够,有时候还需要自定义规则,比如屏蔽关键词验证是非常常见的一个功能,比如在发帖时帖子中不允许出现admin等关键词。
1、定义验证注解
package com.sishuok.spring4.
import javax.validation.C
import javax.validation.P
import java.lang.annotation.D
import java.lang.annotation.R
import java.lang.annotation.T
import static java.lang.annotation.ElementType.*;
import static java.lang.annotation.RetentionPolicy.*;
* &p&User: Zhang Kaitao
* &p&Date: 13-12-15
* &p&Version: 1.0
@Target({ FIELD, METHOD, PARAMETER, ANNOTATION_TYPE })
@Retention(RUNTIME)
//指定验证器
@Constraint(validatedBy = ForbiddenValidator.class)
@Documented
public @interface Forbidden {
//默认错误消息
String message() default "{forbidden.word}";
Class&?&[] groups() default { };
Class&? extends Payload&[] payload() default { };
//指定多个时使用
@Target({ FIELD, METHOD, PARAMETER, ANNOTATION_TYPE })
@Retention(RUNTIME)
@Documented
@interface List {
Forbidden[] value();
2、 定义验证器
package com.sishuok.spring4.
import org.hibernate.validator.internal.engine.constraintvalidation.ConstraintValidatorContextI
import org.springframework.beans.factory.annotation.A
import org.springframework.context.ApplicationC
import org.springframework.util.StringU
import javax.validation.ConstraintV
import javax.validation.ConstraintValidatorC
import java.io.S
* &p&User: Zhang Kaitao
* &p&Date: 13-12-15
* &p&Version: 1.0
public class ForbiddenValidator implements ConstraintValidator&Forbidden, String& {
private String[] forbiddenWords = {"admin"};
public void initialize(Forbidden constraintAnnotation) {
//初始化,得到注解数据
public boolean isValid(String value, ConstraintValidatorContext context) {
if(StringUtils.isEmpty(value)) {
for(String word : forbiddenWords) {
if(value.contains(word)) {
//验证失败
验证器中可以使用spring的依赖注入,如注入:@Autowired
private ApplicationC
public class User implements Serializable {
@Forbidden()
4、当我们在提交name中含有admin的时候会输出错误消息:
forbidden.word=您输入的数据中有非法关键词
问题来了,哪个词是非法的呢?bean validation 和 hibernate validator都没有提供相应的api提供这个数据,怎么办呢?通过跟踪代码,发现一种不是特别好的方法:我们可以覆盖org.hibernate.validator.internal.metadata.descriptor.ConstraintDescriptorImpl实现(即复制一份代码放到我们的src中),然后覆盖buildAnnotationParameterMap方法;
private Map&String, Object& buildAnnotationParameterMap(Annotation annotation) {
//将Collections.unmodifiableMap( parameters );替换为如下语句
即允许这个数据可以修改;然后在ForbiddenValidator中:
for(String word : forbiddenWords) {
if(value.contains(word)) {
((ConstraintValidatorContextImpl)context).getConstraintDescriptor().getAttributes().put("word", word);
//验证失败
通过((ConstraintValidatorContextImpl)context).getConstraintDescriptor().getAttributes().put("word", word);添加自己的属性;放到attributes中的数据可以通过${} 获取。然后消息就可以变成:
forbidden.word=您输入的数据中有非法关键词【{word}】
这种方式不是很友好,但是可以解决我们的问题。
典型的如密码、确认密码的场景,非常常用;如果没有这个功能我们需要自己写代码来完成;而且经常重复自己。接下来看看bean validation 1.1如何实现的。
6、类级别验证器
6.1、定义验证注解
package com.sishuok.spring4.
import javax.validation.C
import javax.validation.P
import javax.validation.constraints.NotN
import java.lang.annotation.D
import java.lang.annotation.R
import java.lang.annotation.T
import static java.lang.annotation.ElementType.*;
import static java.lang.annotation.RetentionPolicy.*;
* &p&User: Zhang Kaitao
* &p&Date: 13-12-15
* &p&Version: 1.0
@Target({ TYPE, ANNOTATION_TYPE})
@Retention(RUNTIME)
//指定验证器
@Constraint(validatedBy = CheckPasswordValidator.class)
@Documented
public @interface CheckPassword {
//默认错误消息
String message() default "";
Class&?&[] groups() default { };
Class&? extends Payload&[] payload() default { };
//指定多个时使用
@Target({ FIELD, METHOD, PARAMETER, ANNOTATION_TYPE })
@Retention(RUNTIME)
@Documented
@interface List {
CheckPassword[] value();
6.2、 定义验证器
package com.sishuok.spring4.
import com.sishuok.spring4.entity.U
import org.springframework.util.StringU
import javax.validation.ConstraintV
import javax.validation.ConstraintValidatorC
* &p&User: Zhang Kaitao
* &p&Date: 13-12-15
* &p&Version: 1.0
public class CheckPasswordValidator implements ConstraintValidator&CheckPassword, User& {
public void initialize(CheckPassword constraintAnnotation) {
public boolean isValid(User user, ConstraintValidatorContext context) {
if(user == null) {
//没有填密码
if(!StringUtils.hasText(user.getPassword())) {
context.disableDefaultConstraintViolation();
context.buildConstraintViolationWithTemplate("{password.null}")
.addPropertyNode("password")
.addConstraintViolation();
if(!StringUtils.hasText(user.getConfirmation())) {
context.disableDefaultConstraintViolation();
context.buildConstraintViolationWithTemplate("{password.confirmation.null}")
.addPropertyNode("confirmation")
.addConstraintViolation();
//两次密码不一样
if (!user.getPassword().trim().equals(user.getConfirmation().trim())) {
context.disableDefaultConstraintViolation();
context.buildConstraintViolationWithTemplate("{password.confirmation.error}")
.addPropertyNode("confirmation")
.addConstraintViolation();
其中我们通过disableDefaultConstraintViolation禁用默认的约束;然后通过buildConstraintViolationWithTemplate(消息模板)/addPropertyNode(所属属性)/addConstraintViolation定义我们自己的约束。
@CheckPassword()
public class User implements Serializable {
放到类头上即可。
7、通过脚本验证
@ScriptAssert(script = "_this.password==_this.confirmation", lang = "javascript", alias = "_this", message = "{password.confirmation.error}")
public class User implements Serializable {
通过脚本验证是非常简单而且强大的,lang指定脚本语言(请参考javax.script.ScriptEngineManager JSR-223),alias是在脚本验证中User对象的名字,但是大家会发现一个问题:错误消息怎么显示呢? 在springmvc 中会添加到全局错误消息中,这肯定不是我们想要的,我们改造下吧。
7.1、定义验证注解
package com.sishuok.spring4.
import org.hibernate.validator.internal.constraintvalidators.ScriptAssertV
import java.lang.annotation.D
import java.lang.annotation.R
import java.lang.annotation.T
import javax.validation.C
import javax.validation.P
import static java.lang.annotation.ElementType.TYPE;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
@Target({ TYPE })
@Retention(RUNTIME)
@Constraint(validatedBy = {PropertyScriptAssertValidator.class})
@Documented
public @interface PropertyScriptAssert {
String message() default "{org.hibernate.validator.constraints.ScriptAssert.message}";
Class&?&[] groups() default { };
Class&? extends Payload&[] payload() default { };
String lang();
String script();
String alias() default "_this";
String property();
@Target({ TYPE })
@Retention(RUNTIME)
@Documented
public @interface List {
PropertyScriptAssert[] value();
和ScriptAssert没什么区别,只是多了个property用来指定出错后给实体的哪个属性。
7.2、验证器
package com.sishuok.spring4.
import javax.script.ScriptE
import javax.validation.ConstraintDeclarationE
import javax.validation.ConstraintV
import javax.validation.ConstraintValidatorC
import com.sishuok.spring4.validator.PropertyScriptA
import org.hibernate.validator.constraints.ScriptA
import org.hibernate.validator.internal.util.C
import org.hibernate.validator.internal.util.logging.L
import org.hibernate.validator.internal.util.logging.LoggerF
import org.hibernate.validator.internal.util.scriptengine.ScriptE
import org.hibernate.validator.internal.util.scriptengine.ScriptEvaluatorF
import static org.hibernate.validator.internal.util.logging.Messages.MESSAGES;
public class PropertyScriptAssertValidator implements ConstraintValidator&PropertyScriptAssert, Object& {
private static final Log log = LoggerFactory.make();
private String languageN
public void initialize(PropertyScriptAssert constraintAnnotation) {
validateParameters( constraintAnnotation );
this.script = constraintAnnotation.script();
this.languageName = constraintAnnotation.lang();
this.alias = constraintAnnotation.alias();
this.property = constraintAnnotation.property();
this.message = constraintAnnotation.message();
public boolean isValid(Object value, ConstraintValidatorContext constraintValidatorContext) {
Object evaluationR
ScriptEvaluator scriptE
ScriptEvaluatorFactory evaluatorFactory = ScriptEvaluatorFactory.getInstance();
scriptEvaluator = evaluatorFactory.getScriptEvaluatorByLanguageName( languageName );
catch ( ScriptException e ) {
throw new ConstraintDeclarationException( e );
evaluationResult = scriptEvaluator.evaluate( script, value, alias );
catch ( ScriptException e ) {
throw log.getErrorDuringScriptExecutionException( script, e );
if ( evaluationResult == null ) {
throw log.getScriptMustReturnTrueOrFalseException( script );
if ( !( evaluationResult instanceof Boolean ) ) {
throw log.getScriptMustReturnTrueOrFalseException(
evaluationResult,
evaluationResult.getClass().getCanonicalName()
if(Boolean.FALSE.equals(evaluationResult)) {
constraintValidatorContext.disableDefaultConstraintViolation();
constraintValidatorContext
.buildConstraintViolationWithTemplate(message)
.addPropertyNode(property)
.addConstraintViolation();
return Boolean.TRUE.equals( evaluationResult );
private void validateParameters(PropertyScriptAssert constraintAnnotation) {
Contracts.assertNotEmpty( constraintAnnotation.script(), MESSAGES.parameterMustNotBeEmpty( "script" ) );
Contracts.assertNotEmpty( constraintAnnotation.lang(), MESSAGES.parameterMustNotBeEmpty( "lang" ) );
Contracts.assertNotEmpty( constraintAnnotation.alias(), MESSAGES.parameterMustNotBeEmpty( "alias" ) );
Contracts.assertNotEmpty( constraintAnnotation.property(), MESSAGES.parameterMustNotBeEmpty( "property" ) );
Contracts.assertNotEmpty( constraintAnnotation.message(), MESSAGES.parameterMustNotBeEmpty( "message" ) );
和之前的类级别验证器类似,就不多解释了,其他代码全部拷贝自org.hibernate.validator.internal.constraintvalidators.ScriptAssertValidator。
@PropertyScriptAssert(property = "confirmation", script = "_this.password==_this.confirmation", lang = "javascript", alias = "_this", message = "{password.confirmation.error}")
和之前的区别就是多了个property,用来指定出错时给哪个字段。 这个相对之前的类级别验证器更通用一点。
8、cross-parameter,跨参数验证
直接看示例;
8.1、首先注册MethodValidationPostProcessor,起作用请参考《 》
&bean class="org.springframework.validation.beanvalidation.MethodValidationPostProcessor"&
&property name="validator" ref="validator"/&
8.2、Service
@Validated
public class UserService {
@CrossParameter
public void changePassword(String password, String confirmation) {
通过@Validated注解UserService表示该类中有需要进行方法参数/返回值验证;
@CrossParameter注解方法表示要进行跨参数验证;即验证password和confirmation是否相等。
8.3、验证注解
package com.sishuok.spring4.
//省略import
@Constraint(validatedBy = CrossParameterValidator.class)
@Target({ METHOD, CONSTRUCTOR, ANNOTATION_TYPE })
@Retention(RUNTIME)
@Documented
public @interface CrossParameter {
String message() default "{password.confirmation.error}";
Class&?&[] groups() default { };
Class&? extends Payload&[] payload() default { };
8.4、验证器
package com.sishuok.spring4.
//省略import
@SupportedValidationTarget(ValidationTarget.PARAMETERS)
public class CrossParameterValidator implements ConstraintValidator&CrossParameter, Object[]& {
public void initialize(CrossParameter constraintAnnotation) {
public boolean isValid(Object[] value, ConstraintValidatorContext context) {
if(value == null || value.length != 2) {
throw new IllegalArgumentException("must have two args");
if(value[0] == null || value[1] == null) {
if(value[0].equals(value[1])) {
其中@SupportedValidationTarget(ValidationTarget.PARAMETERS)表示验证参数; value将是参数列表。
@RequestMapping("/changePassword")
public String changePassword(
@RequestParam("password") String password,
@RequestParam("confirmation") String confirmation, Model model) {
userService.changePassword(password, confirmation);
} catch (ConstraintViolationException e) {
for(ConstraintViolation violation : e.getConstraintViolations()) {
System.out.println(violation.getMessage());
return "success";
调用userService.changePassword方法,如果验证失败将抛出ConstraintViolationException异常,然后得到ConstraintViolation,调用getMessage即可得到错误消息;然后到前台显示即可。
从以上来看,不如之前的使用方便,需要自己对错误消息进行处理。 下一节我们也写个脚本方式的跨参数验证器。
9、混合类级别验证器和跨参数验证器
9.1、验证注解
package com.sishuok.spring4.
//省略import
@Constraint(validatedBy = {
CrossParameterScriptAssertClassValidator.class,
CrossParameterScriptAssertParameterValidator.class
@Target({ TYPE, FIELD, PARAMETER, METHOD, CONSTRUCTOR, ANNOTATION_TYPE })
@Retention(RUNTIME)
@Documented
public @interface CrossParameterScriptAssert {
String message() default "error";
Class&?&[] groups() default { };
Class&? extends Payload&[] payload() default { };
String script();
String lang();
String alias() default "_this";
String property() default "";
ConstraintTarget validationAppliesTo() default ConstraintTarget.IMPLICIT;
此处我们通过@Constraint指定了两个验证器,一个类级别的,一个跨参数的。validationAppliesTo指定为ConstraintTarget.IMPLICIT,表示隐式自动判断。
9.2、验证器
请下载源码查看
9.3.1、类级别使用
@CrossParameterScriptAssert(property = "confirmation", script = "_this.password==_this.confirmation", lang = "javascript", alias = "_this", message = "{password.confirmation.error}")
指定property即可,其他和之前的一样。
9.3.2、跨参数验证
@CrossParameterScriptAssert(script = "args[0] == args[1]", lang = "javascript", alias = "args", message = "{password.confirmation.error}")
public void changePassword(String password, String confirmation) {
通过args[0]==args[1] 来判断是否相等。
这样,我们的验证注解就自动适应两种验证规则了。
10、组合验证注解
有时候,可能有好几个注解需要一起使用,此时就可以使用组合验证注解
@Target({ FIELD})
@Retention(RUNTIME)
@Documented
@NotNull(message = "{user.name.null}")
@Length(min = 5, max = 20, message = "{user.name.length.illegal}")
@Pattern(regexp = "[a-zA-Z]{5,20}", message = "{user.name.length.illegal}")
@Constraint(validatedBy = { })
public @interface Composition {
String message() default "";
Class&?&[] groups() default { };
Class&? extends Payload&[] payload() default { };
这样我们验证时只需要:
@Composition()
简洁多了。
11、本地化
即根据不同的语言选择不同的错误消息显示。
1、本地化解析器
&bean id="localeResolver" class="org.springframework.web.servlet.i18n.CookieLocaleResolver"&
&property name="cookieName" value="locale"/&
&property name="cookieMaxAge" value="-1"/&
&property name="defaultLocale" value="zh_CN"/&
此处使用cookie存储本地化信息,当然也可以选择其他的,如Session存储。
2、设置本地化信息的拦截器
&mvc:interceptors&
&bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor"&
&property name="paramName" value="language"/&
&/mvc:interceptors&
即请求参数中通过language设置语言。
3、消息文件
4、 浏览器输入
http://localhost:9080/spring4/changePassword?password=1&confirmation=2&language=en_US
到此,我们已经完成大部分Bean Validation的功能实验了。对于如XML配置、编程式验证API的使用等对于我们使用SpringMVC这种web环境用处不大,所以就不多介绍了,有兴趣可以自己下载官方文档学习。
下载次数: 536
浏览 40267
博主,hibernate-validator-5.1.2.Final和validation-api-1.1.0.Final这两个jar包从官网上下载下来,加入项目,启动web项目之后就报错(配置文件还没配置),这个怎么破我也遇见这个问题了,你解决了吗? srping4、hibernate4.2、hibernate-validator-5.1.3.Final、validation-api-1.1.0.Final
mingming_java 写道博主,你好,由于我的项目是spring4+hibernate4的,引入的是hibernate-validator-5.1.1.Final.jar的jar包,可是在网上又找不到validation-api& 的1.1版本的jar包,这个在那下载呢?我是手动搭建的框架急需这个包,麻烦博主看到后能发往邮箱,感激不尽!&dependency&
&groupId&org.hibernate&/groupId&
&artifactId&hibernate-validator&/artifactId&
&version&5.1.1.Final&/version&
&/dependency&
博主,你好,由于我的项目是spring4+hibernate4的,引入的是hibernate-validator-5.1.1.Final.jar的jar包,可是在网上又找不到validation-api& 的1.1版本的jar包,这个在那下载呢?我是手动搭建的框架急需这个包,麻烦博主看到后能发往邮箱,感激不尽!
最近在做一个项目,请求有2个参数比如orderData(订单参数组成的字符串)和signedData(orderData签名后的数据),orderData的字符串实际上是一个json字符串,我希望能够将orderData先验签,再转成对象以后,再valid其中的数据,为了实现这个功能,我自己加了一个注解(@VerifyAndToJson),并写写了一个类去实现HandlerMethodArgumentResolver来处理这个它。现在的使用他的方式是这样的public String doSomeThing(
@VerifyAndToJson(originalMsgKey = "orderData", signedDataKey = "signedData", type = Xxx.class)
BindingResult br){...}但是请求过来以后,会报一个异常,说BindingResult必须跟在model attribute或者@RequestBody或@ResponseBody之后。于是我加上了@ModelAtrribute注解,改成了如下形式public String doSomeThing(
@Valid @ModelAttribute @VerifyAndToJson(originalMsgKey = "orderData", signedDataKey = "signedData", type = Xxx.class)
BindingResult br){...}但是这样一来,@VerifyAndToJson好像就失效了,程序不会进入我实现HandlerMethodArgumentResolver的类中去。请问有什么办法,能够实现我的需求吗? 我自己解决了:),将实现HandlerMethodArgumentResolver的类参考了RequestResponseBodyMethodProcessor的写法,就解决了~
hellostory 写道mayuanfei 写道这个校验为什么不用Jquery的Validater呢?为什么要到后台校验?如果你用过firebug,或chrome的调试工具,你就不会有这种疑问!你的问题搞定了没? 还好,就是自己提取message大括号里面的“{XXX}”变量,然后再读取文件进行匹配。
mayuanfei 写道这个校验为什么不用Jquery的Validater呢?为什么要到后台校验?如果你用过firebug,或chrome的调试工具,你就不会有这种疑问!你的问题搞定了没?
& 上一页 1
jinnianshilongnian
浏览: 5877035 次
浏览量:966467
浏览量:1028289
浏览量:1865150
浏览量:113413
浏览量:443908
浏览量:128430
浏览量:888331
浏览量:88805
看得懵懵懂懂的,,还是非常感谢
构造器注入:就是容器实例化Bean时注入那些依赖,通过在在Be ...
更新maven依赖就好了
在shiro-example-chapter19中好像没有im ...}

我要回帖

更多关于 四阶行列式求解 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信