分类:
Java
标签:
审核状态机
状态模式
多层审核机制
1、前言
简单描述一下状态模式:
状态模式:允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类。
在很多情况下,一个对象的行为取决于一个或多个动态变化的属性,这样的属性叫做状态,这样的对象叫做有状态的(stateful)对象,这样的对象状态是从事先定义好的一系列值中取出的。当一个这样的对象与外部事件产生互动时,其内部状态就会改变,从而使得系统的行为也随之发生变化。
这里笔者实现一个审核状态机,主要流程是,用户申请审核,审核人员进行审核通过或者拒绝操作,允许用户取消审核申请。这是常用的一个业务流程,用户可以根据实际情况修改。
2、状态
首先,找出所有的状态,如下图:
NullState主要是初始化的时候给的状态。PassEndState主要是为了应对后面的多层审核机制而加上的,因为管理比较严的流程经常需要进行多层审核。
3、方法
......
分类:
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.
......
分类:
Java
标签:
Calendar
setFirstDayOfWeek
也许你碰到过这种业务,需要根据星期几来做某种操作,例如,每周二,上周二等。Java提供了Calendar类可以实现这些需求,不过这里有个坑,值得注意。
国外都是以星期日作为每周的第一天,而我们都是以周一作为第一天,所以如果你不注意的话,在周日的时候获取上周的某个星期几,或者这周的某个星期几就会出现错误。因为Java就是默认以星期日作为一周的第一天。还好Calendar提供了接口,修改这个配置。
Calendar c = Calendar.getInstance();c.setFirstDayOfWeek(Calendar.MONDAY);
这样,Calendar就是以周一作
......
分类:
Java
标签:
AOP
拦截器
修改源码
类加载
切面
一个好的工具库,一般都会提供灵活的接口给用户进行修改和扩展,但还是会有没有考虑的情况,或者总有原因会促使我们去修改源码。这里,笔者主要是面对需要修改源码中一个类的一个方法的情况,其他情况都可以类似解决,只是复杂度的问题。
修改源码有几种方式,我们可以将修改编译后的class文件,替换原来jar包里面的class文件,这种方法不推荐使用。还一种办法就是在自己项目工程里面加入新的同名,同包的类,这样虚拟机会优先加载项目中的class,这是一种比较好的方式。不过这种方式有些情况也不适用,如自己发布了一个jar包,里面有一个class就是修改的第三方jar包源码,这时,很有可能编译或者运行时加载的class就不是你需要的那个class了。如果运行时加载的class不是你所需要的class,我们还可以通过配置启动命令,指定优先加载的jar包来修改类加载顺序,我们在weblogic使用jpa2.0的时候,经常需要修改优先加载的jar包。这样问题解决了,但是需要后期部署做一些额外操作,所以也不算完美。
最完美的方式就是使用aop机制。使用aop机制,我们
......
分类:
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
......
分类:
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";
两种方式各有优势,都有相应地使用场景。
笔者要在这提的是变量绑定时需要注意的一个问题,如果变量里面包含".",将会
......
分类:
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
......
分类:
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
......
分类:
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最早是
......
分类:
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
......