分类: Java

审核状态机-状态模式的应用

发表于1年前(Dec 14, 2016 8:54:35 PM)  阅读 1732  评论 0

分类: Java

标签: 审核状态机 状态模式 多层审核机制

1、前言

简单描述一下状态模式:

状态模式:允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类。

在很多情况下,一个对象的行为取决于一个或多个动态变化的属性,这样的属性叫做状态,这样的对象叫做有状态的(stateful)对象,这样的对象状态是从事先定义好的一系列值中取出的。当一个这样的对象与外部事件产生互动时,其内部状态就会改变,从而使得系统的行为也随之发生变化。

这里笔者实现一个审核状态机,主要流程是,用户申请审核,审核人员进行审核通过或者拒绝操作,允许用户取消审核申请。这是常用的一个业务流程,用户可以根据实际情况修改。

2、状态

首先,找出所有的状态,如下图:

NullState主要是初始化的时候给的状态。PassEndState主要是为了应对后面的多层审核机制而加上的,因为管理比较严的流程经常需要进行多层审核。

3、方法

......

Hibernate5关于主键生成策略的变化

发表于1年前(Dec 11, 2016 12:03:52 PM)  阅读 850  评论 0

分类: Java

标签: hibernate5 主键生成策略 GenerationType IdGeneratorStrategyInterpreter FallbackInterpreter LegacyFallbackInterpreter hibernate.id.new_generator_mappings

最近在研究springboot,现在最新稳定版本为1.4.2,里面使用的hibernate版本已经升级到5.0.11,搭了个框架,发现几个问题,记录一下。

网上有很多介绍hibernate5新特性的文章,千篇一律,估计都是出自一人手中,其中有一点就是说hibernate5扩展了Auto id的生成支持:

JPA定义的GenerationType.AUTO属性仅支持数字类型.从5.0开始,hibernate高度扩展并支持更广泛的类型,包括内置支持数字类型(如整型(Integer)\长整型(Long))和UUID.通过新的拓展类org.hibernate.boot.model.IdGeneratorStrategyInterpreter,用户还能自由地定制自己的策略来使用GenerationType.AUTO

用过JPA的都知道,JPA提供的四种策略来生成主键,用法为TABLE,SEQUENCE,IDENTITY,AUTO. 

......

设置一周第一天从星期一开始

发表于1年前(Nov 19, 2016 9:35:39 PM)  阅读 1291  评论 0

分类: Java

标签: Calendar setFirstDayOfWeek

也许你碰到过这种业务,需要根据星期几来做某种操作,例如,每周二,上周二等。Java提供了Calendar类可以实现这些需求,不过这里有个坑,值得注意。

国外都是以星期日作为每周的第一天,而我们都是以周一作为第一天,所以如果你不注意的话,在周日的时候获取上周的某个星期几,或者这周的某个星期几就会出现错误。因为Java就是默认以星期日作为一周的第一天。还好Calendar提供了接口,修改这个配置。

Calendar c = Calendar.getInstance();c.setFirstDayOfWeek(Calendar.MONDAY);

这样,Calendar就是以周一作

......

使用AOP的方式修改第三方jar包中的源码

发表于2年前(Jul 5, 2016 5:03:49 PM)  阅读 840  评论 0

分类: Java

标签: AOP 拦截器 修改源码 类加载 切面

一个好的工具库,一般都会提供灵活的接口给用户进行修改和扩展,但还是会有没有考虑的情况,或者总有原因会促使我们去修改源码。这里,笔者主要是面对需要修改源码中一个类的一个方法的情况,其他情况都可以类似解决,只是复杂度的问题。

修改源码有几种方式,我们可以将修改编译后的class文件,替换原来jar包里面的class文件,这种方法不推荐使用。还一种办法就是在自己项目工程里面加入新的同名,同包的类,这样虚拟机会优先加载项目中的class,这是一种比较好的方式。不过这种方式有些情况也不适用,如自己发布了一个jar包,里面有一个class就是修改的第三方jar包源码,这时,很有可能编译或者运行时加载的class就不是你需要的那个class了。如果运行时加载的class不是你所需要的class,我们还可以通过配置启动命令,指定优先加载的jar包来修改类加载顺序,我们在weblogic使用jpa2.0的时候,经常需要修改优先加载的jar包。这样问题解决了,但是需要后期部署做一些额外操作,所以也不算完美。

最完美的方式就是使用aop机制。使用aop机制,我们

......

RMI CacheException - problem starting listener for RMICachePeer

发表于2年前(May 24, 2016 2:18:04 PM)  阅读 822  评论 0

分类: Java 异常

标签: Ehcache CacheException RMICachePeer

在tomcat下使用ehcache时,启动报错。在ehcache官网Tomcat Issues and Best Practices一文中有明确说:

I get the following error:

net.sf.ehcache.CacheException: Problem starting listener for RMICachePeer ... java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is: java.net.MalformedURLException: no protocol: Files/Apache.

What is going on? This issue occurs to any RMI listener

......

hql,jpql变量占位符不能出现.

发表于2年前(May 19, 2016 8:27:55 AM)  阅读 710  评论 0

分类: Java

标签: hql jpql 占位符 Unresolved property path unexpected AST node

hql,即hibernate query language,使用面向对象的方式书写sql语句,jpql,Java Persistence Query Language,主要用于jpa,而hibernate是jpa的一种实现,所以其实hql也可以说是jpql的一种实现,两者用法基本一致。

为了避免直接拼写hql,造成sql注入,我们写hql的时候,必须使用绑定变量的方式进行赋值。hql绑定变量有两种方式,一种是使用"?"占位符,根据"?"出现的顺序,提供参数,一种是使用变量名称的方式绑定。两种方式的示例:

String hql = "from Person p where p.id=?";
String hql = "from Person p where p.id=:id";

两种方式各有优势,都有相应地使用场景。

笔者要在这提的是变量绑定时需要注意的一个问题,如果变量里面包含".",将会

......

Freemarker使用java枚举值、静态属性和调用静态方法

发表于2年前(May 17, 2016 3:14:52 PM)  阅读 6186  评论 0

分类: Java

标签: BeansWrapper TemplateHashModel StaticModels StaticModel 枚举值 enum 静态属性 静态方法

1、前言:

在java后台,规范的编码方式将会使我们使用很多静态属性,枚举值等,还有许多工具类,都会定义很多静态方法方便调用,这些都方便了我们java后台的开发,但如果结合到前台freemarker模板该如何使用呢,freemarker模板并不能像jsp那样import标签导入java类。

首先我们来看这么一个枚举值类OptionValueType:

 

package com.cangzhitao.common.enums;

/**
 * Created by cangzhitao on 16/5/13.
 */
public enum OptionValueType {

    TEXT(0), TEXTAREA(1), RADIO(2), SELECT(3), CHECKBOX(4), THEME(10), NAVMENU(11);

    private int code;

    priv
......

Spring MVC上下文与Spring上下文的关系

发表于2年前(May 4, 2016 8:44:22 AM)  阅读 801  评论 0

分类: Java

标签: spring上下文 spring-mvc WebApplicationContext WebApplicationContextUtils RequestContextUtils

用Spring容器管理Bean是我们一惯的做法,这里的Spring容器指的就是Spring上下文。一般来说,我们会使用注入的方式将所需要的Bean注入到目标Target,但有时还是会存在不适合注入的情况,例如动态获取之类的,这时我们可能会直接去Spring上下文中去取。笔者就经常使用ContextLoader.getCurrentWebApplicationContext().getBean("")的方式去获取Bean。

前两天笔者在项目中引入了hibernate-validate库,在Spring-MVC.xml配置文件中增加了hibernate-validate的相关配置,为了不影响之前固有接口,笔者准备使用编程式验证,将Spring-MVC中得validator注入到所有controller的共同父类中去。可是发现,竟然从Spring上下文中取不出validator来。

查了下资料,发现原来是有两个上下文,Spring上下文保存在ServetContext中,追查源码可以看到key是
String R

......

formhash的使用

发表于2年前(Apr 26, 2016 11:53:42 AM)  阅读 655  评论 0

分类: Java

标签: formhash htmlunit 投票

1、前言:

前几天朋友让帮忙网上投票,研究了一下投票的网站,投票的机制是同一ip每天只能投一票,这种机制比较弱,使用代理ip即可解决,或者在家用代码控制路由器重新拨号或重启获取新的ip,于是笔者就开始进一步抓取投票的服务地址。服务地址很容易提取,换ip进行测试投票,发现服务器拒绝了,说请求非法,经过仔细分析测试,发现服务地址中包含了formhash参数,值为固定8位字符,很像md5后取8位的字符,如:d952227a。请求页面时,将会生成formhash,提交请求时,后台将验证formhash的正确性,笔者分析了下,这里formhash的生成跟ip地址以及浏览器类型(可能是User-agent)有关,应该是这两者加混淆字符后8位md5,如果能解密出这个加密方法,生成formhash,问题就解决了,这涉及到密码学的问题,笔者想想难度应该还是挺大的,formhash在这就一定程度上防止了程序提交。

2、formhash:

在这里,formhash有点像不用用户自己输入的验证码,笔者搜索了一下,好像formhash最早是

......

搭建基于mybatis的后台框架

发表于2年前(Apr 18, 2016 11:51:17 AM)  阅读 1125  评论 0

分类: Java 框架 mybatis

标签: mybatis mapper Interceptor 框架搭建

1、前言

最近新搭建一个框架,以前用过mybatis,这次第一次自己搭建基于mybatis的框架,架构基本上沿袭以前hibernate的套路,说到这,笔者对两者的观念基本还是停留在hibernate自动生成SQL,mybatis需要自己写SQL,mybatis自己写SQL开发起来麻烦,但SQL语句写起来灵活,容易实现功能,性能也更容易优化,而hibernate其实大部分情况下性能也够用,优化起来确实需要一定功底,在hibernate有时不容易实现的功能,笔者实际上会结合jdbcTemplate一起使用,所以一直使用hibernate也没发现什么问题。这次选用mybatis,其实主要是一次尝试。

2、概述

所有的实体都必须实现Entity接口;
所有的Mapper都必须继承BaseMapper,BaseMapper是一个泛型类,有两个泛型参数,一个是该Mapper操作的实体类型,另一个是序列化id类型,BaseMapper里面定义了通用的Mapper接口;
所有的DAO接口都继承于IBaseDA

......