QBC(QueryByCriteria)查询方式是Hibernate提供的“更加面向对象”的一种检索方式。QBC在条件查询上比HQL查询更为灵活,而且支持运行时动态生成查询语句。
1、在Hibernate应用中使用QBC查询通常经过3个步骤(1)使用Session实例的createCriteria()方法创建Criteria对象
(2)使用工具类Restrictions的相关方法为Criteria对象设置查询对象
(3)使用Criteria对象的list()方法执行查询,返回查询结果
//查询名字为zhangsan的用户 Criteria criteria = session.createCriteria(User.class); criteria.add(Restrictions.eq("username", "zhangsan")); List<User> users = criteria.list(); for(User user : users){ System.out.println(user.getId() + "--" + user.getUsername()); }
3、Restrictions用法
Hibernate中Restrictions的方法 说明
Restrictions.eq =
Restrictions.allEq 利用Map来进行多个等于的限制
Restrictions.gt >
Restrictions.ge
>=
Restrictions.lt <
Restrictions.le <=
Restrictions.between BETWEEN
Restrictions.like LIKE
Restrictions.in in
Restrictions.and and
Restrictions.or or
Restrictions.sqlRestriction 用SQL限定查询
查询id大于100,小于200的用户:
Criteria criteria = session.createCriteria(User.class); criteria.add(Restrictions.gt("id", 100)).add(Restrictions.lt("id", 200)); List<User> users = criteria.list(); for(User user : users){ System.out.println(user.getId() + "--" + user.getUsername()); }
由于网上关于EJBCA接口调用的文章几乎没有,只有自己看源码了。按照WIKI上所说的,看了一下。把看的结果分享一下。
Org/ejbca/ui/cli
Ø ErrorAdminCommandException
管理员命令出错后的异常
Ø IAdminCommand
执行管理员命令
Ø IllegalAdminCommandException
非法管理员命令异常
org/ejbca/ui/web /protocolØ IHealtChecker
一个接口。会被healthcheckservlet调用。
l String healthCheck(boolean doSignTest, boolean doValidityTest);
Ø RFC4387URL
是一个枚举类。创建RFC4387URL和HTML的一些引用到一些URL上。
l public String appendQueryToURL(/blog_article/String url, HashID hash, booleanisDelta/index.html)
把RFC的查询添加到URL上
l public String appendQueryToURL(/blog_article/String url, HashID hash/index.html)
appendQueryToURL(/blog_article/url, hash, false/index.html)
l public String getRef(String url, HashID hash, boolean isDelta)
以String的形式得到一个证书或者CRL
l public String getRef(String url, HashID hash)
重构。
/pubØ ServletDebug
向浏览器客户端打印出调试信息
l public void ieCertFix(byte[] bA)ie证书修复(感觉用不上), 在这里面调用了RequestHelper里面的函数
RequestHelper.ieCertFormat(bA,tmpPrinter);
l public void printDebugInfo()
打印出调试信息
Ø ServletUtils
这里的函数在很多servelet中都会用到,整理成一个类,避免了以后重复使用。
l public static void removeCacheHeaders(HttpServletResponse res)
将response中的header给去掉。No-cache的header会让IE拒绝保存一个文件。
l public static void addCacheHeaders(HttpServletResponse res)
向response中添加一个header
/clusterØ IHealthCheck
一个接口,有一个函数,并未实现
l public String checkHealth(HttpServletRequest request)
Ø CommonHealthCheck
是一个抽象类
继承自IHealthCheck
l init()函数中初始化维护文件
主要有checkMaintenance()函数,检查主维护文件是否有错误
checkMemory(),检查JVM内存
Ø ValidationAuthorityHealthCheck
继承自CommonHealthCheck
检查HttpServletRequest的请求是否有问题
l public void printDebugInfo()打印出调试信息
l public void printMessage(String msg)打印出消息
l public void printInsertLineBreaks(byte[] bA)打印出输入的信息
Ø RequestHelper
一个辅助类,帮助处理来自浏览器的证书请求,或者产生PKCS#10
l public byte[] nsCertRequest(SignSessionLocal signsession, byte[] reqBytes,String username, String password)处理证书请求(貌似是firefox)
@paramsignsession EJB session to signature bean.
@paramreqBytes buffer holding the request from NS.
@param username username in EJBCAfor authoriation. @param password users password forauthorization. 返回包含了一定格式的字符,返回格式:
<code> SignedPublicKeyAndChallenge::=SEQUENCE{
publicKeyAndChallenge PublicKeyAndChallenge,
signatureAlgorithm AlgorithmIdentifier,
signature BIT STRING }</code>
公钥格式必须遵守RSAX.509.
l public byte[] pkcs10CertRequest(SignSessionLocal signsession, byte[]b64Encoded, String username,String password, int resulttype, boolean doSplitLines)处理PKCS10证书请求
@param signsession signsession to getcertificate from
@param b64Encoded base64 encodedpkcs10 request message
@param username username ofrequesting user @param password passwordof requesting user @param resulttypeshould indicate if a PKCS7 or just the certificate is wanted.
@param doSplitLines
@return Base64 encoded byte[]
l public byte[]cvcCertRequest(SignSessionLocal signsession, byte[] b64Encoded, Stringusername, String password)处理CVC证书请求(我们用不上)
@param signsession signsession to getcertificate from @param b64Encodedbase64 encoded cvc request message
@param username username ofrequesting user @param password passwordof requesting user @return Base64encoded byte[]
l public static void sendNewCertToNSClient(byte[] certs,HttpServletResponse out)发送新的证书给NS客户端(用不到)
@param certs DER encoded certificatesto be installed in browser
@param out output stream to send to
l public static void sendNewB64File(byte[] b64cert,HttpServletResponse out, String filename, String beginKey, String endKey)通过二进制的发送新的证书给客户端,base64编码
@param b64cert base64 encoded certificate tobe returned
@param out output stream to send to
@param filename filename sent as'Content-disposition' header
@param beginKey, String contaitning keyinformation @param beginKey, String contaitning keyinformation
l public static void sendNewB64Cert(byte[] b64cert,HttpServletResponse out, String beginKey, String endKey)重构,不提供文件名,文件名默认为"cert.pem"
l public static voidsendNewX509CaCert(byte[] cert, HttpServletResponse out)将CA证书以二进制的形式返回,应该是X509证书
l public static void setDefaultCharacterEncoding(HttpServletRequestrequest)设置默认的编码集
l public static String getFileNameFromCertNoEnding(Certificate cacert,String defaultname)得到证书的文件名
Ø CertificateView
将X509证书的原始数据(二进制而文件)以网页的形式展示出来给用户看,格式化证书。
通过一个Certificate的实例得到证书的各种信息
Ø LimitLengthASN1Reader
ASN1:一种 ISO/ITU-T 标准,描述了一种对数据进行表示、编码、传输和解码的数据格式。它提供了一整套正规的格式用于描述对象的结构,而不管语言上如何执行及这些数据的具体指代,也不用去管到底是什么样的应用程序。
这也是一个辅助类。
继承自ASN1InputStream,包bouncycastle中的一个类。
限制读入到ASN1格式数据的大小。
l public byte[] readFirstASN1Object()
把流中的数据读入到第一个ASN1对象中,并限制大小。
l public int read()
得到读入数据的大小。
Ø RevokedInfoView
证书的撤销状态视图。
这个类提供了查询关于证书撤销状态的所有信息。
这么多类,我只是觉得最主要的功能都在RequestHelper中,这个类处理浏览器发来的请求,给用户生成证书。
大家对REST的认识?
谈到REST大家的第一印象就是通过http协议的GET,POST,DELETE,PUT方法实现对url资源的CRUD(创建、读取、更新和删除)操作。比如
http://www.aizher.com/c2/(读取)
仍然保持为 [GET] http://www.aizher.com/c2/
http://www.aizher.com/c2/create(创建)
改为 [POST] http://www.aizher.com/c2/
http://www.aizher.com/c2/update(更新)
改为 [PUT] http://www.aizher.com/c2/
http://www.aizher.com/c2/delete(删除)
改为 [DELETE] http://www.aizher.com/c2/
这种形式的REST只是CRUD(增删改查),从这个层面上,好像REST只是和RPC一个层面的东西,没有什么了不起,其实这些都是对REST误读。也误导大家实现REST时,特种注重GET,POST,PUT,DELETE方法的处理,包括一些所谓的REST框架,比如JBoss RESTEasy,Restlet Tomcat。究其原因是, REST提供了一组架构约束,当作为一个整体来应用时,强调组件交互的可伸缩性、接口的通用性、组件的独立部署、以及用来减少交互延迟、增强安全性、封装遗留系统的中间组件。其实从整个REST推导过程中可以了解到,REST没有提及HTTP协议的任何方法,只是后期大家从REST的统一接口中扩展出这些操作概念。
到底什么是REST?
REST是中文翻译为表征状态转移(英文:Representational State Transfer)是Roy Fielding博士在2000年他的博士论文中提出来的一种软件架构风格。从字面意思来说,“表述”是很难理解是什么东西的?从论文上我们可以看到表述,一般指HTML文档(包括json,xml等),jpeg等图片资源。
先从理论层次上我们看一下REST是怎么推导来的(参考论文第五章)
Web架构背后的设计基本原理,能够被描述为由一组应用于架构中元素之上的约束组成的架构风格。当将每个约束添加到进化中的风格时,会产生一些影响。通过检查这些影响,我们就能够识别出Web的约束所导致的属性。然后就能够应用额外的约束来形成一种新的架构风格,这种风格能够更好地反映出现代Web架构所期待的属性。通过简述REST作为架构风格的推导过程,后面各节将会详细描述组成REST风格的各种特定约束
1:从“空”风格开始。从架构的观点来看,空风格描述了一个组件之间没有明显边界的系统,这就是我们描述REST的起点。
2:客户-服务器。客户-服务器约束背后的原则是分离关注点。通过分离用户接口和数据存储这两个关注点,我们改善了用户接口跨多个平台的可移植性;同时通过简化服务器组件,改善了系统的可伸缩性。
3:无状态。这个约束导致了可见性、可靠性和可伸缩性三个架构属性,但是无状态并不是没有缺点的,无状态增加了在一系列请求中发送的重复数据(每次交互的开销),可能会降低网络性,正因为这个缺点,所以在REST风格中增加了缓存的考虑。
4:缓存,添加缓存约束的好处在于,它们有可能部分或全部消除一些交互,从而通过减少一系列交互的平均延迟时间,来提高效率、可伸缩性和用户可觉察的性能。但是缓存还是有缺点的,如果缓存中陈旧的数据与将请求直接发送到服务器得到的数据差别很大,那么缓存会降低可靠性。注意这里的缓存并不是指MC,redis之类的缓存,而是在网络代理中,比如proxy服务器上的缓存机制。
5:统一接口。使REST架构风格区别于其他基于网络的架构风格的核心特征是,它强调组件之间要有一个统一的接口,为了获得统一的接口,需要有多个架构约束来指导组件的行为。REST由四个接口约束来定义:资源的识别(identification ofresources)、通过表述对资源执行的操作、自描述的
消息(self-descriptive messages)、以及作为应用状态引擎的超媒体相关因素
REST和其他概念关系。统一接口的虽然晦涩,但是它是REST风格核心特征,也是前面我们讨论通过CURD方式操作资源的一种表现,也是我们最容易接触感受到的一层,后面淘宝,微博,微信开放平台的开放接口,其实就是我们接触这个平台的统一接口,评价一个开发平台是否REST的标准,也在于这个平台的设计者对统一接口的理解。
6:,分层系统,分成系统风格通过限制组件的行为(即,每个组件只能“看到”与其交互的紧邻层),将架构分解为若干等级的层。通过将组件对系统的知识限制在单一层内,为整个系统的复杂性设置了边界,并且提高了底层独立性。分层系统增加了数据处理的开销和延迟,因此降低了用户可觉察的性能对于一个支持缓存约束的基于网络的系统来说,可以通过在中间层使用共享缓存所获得的好处来弥补这一缺点。正因为REST风格有这样的缺点,才会特意强调缓存的作用。
7:按需代码,通过下载并执行applet形式或脚本形式的代码,REST允许对客户端的功能进行扩展,看似简单的一种风格设计,其实对B/S贡献最大的就是这个特性,现在ajax的底层其实就是按需代码机制。
小结:基于网络的架构风格图形化地描述了REST约束的来源
数据流风格(Data-flow Styles)
PF:管道和过滤器(Pipe and Filter,PF)
UPF:统一管道和过滤器(Uniform Pipe andFilter,UPF)
复制风格(Replication Styles)
RR:复制仓库(ReplicatedRepository,RR)--apache 多woker-利用多个进程提供相同的服务,来改善数据的可访问
性(accessibility of data)和服务的可伸缩性(scalability of service)。CVS[www.cyclic.com]这样的远程版本控制系统
$ 缓存(Cache,$)
分层风格(Hierarchical Styles)
客户-服务器(Client-Server,CS)(rpc,corba)
分层系统(Layered System,LS)和分层-客户-服务器(Layered-Client-Server,LCS)
客户-无状态-服务器(Client-Stateless-Server,CSS)
客户-缓存-无状态-服务器(Client-Cache-Stateless-Server,C$SS)
分层-客户-缓存-无状态-服务器(Layered-Client-Cache-Stateless-Server,LC$SS)
远程会话(Remote Session,RS)(FTP)
远程数据访问(Remote Data Access,RDA)(sql)
移动代码风格(Mobile Code Styles)
虚拟机(Virtual Machine,VM)
远程求值(Remote Evaluation,REV)
按需代码(Code on Demand,COD)
分层-按需代码-客户-缓存-无状态-服务器(Layered-Code-on-Demand-Client-Cache-Stateless-Server,LCODC$SS)
移动代理(Mobile Agent,MA)
点对点风格(Peer-to-Peer Styles)
基于事件的集成(Event-based Integration,EBI)
C2
分布式对象(Distributed Objects,DO)
被代理的分布式对象(Brokered Distributed Objects,BDO)
以上就是REST推导过程,简单的说,REST要求
客户端和服务器结构
连接协议具有无状态性
能够利用Cache机制增进性能
层次化的系统
统一接口规范分层交互
随需代码 - Javascript (可选)
根据以上的描述,我们其实发现HTTP是一种典型的REST风格,这也难怪,在1994年提出REST风格时,REST被称作“HTTP对象模型”,但是那个名称常常引起误解,使人们误以为它是一个HTTP服务器的实现模型。这个名称“表述性状态转移”是有意唤起人们对于一个良好设计的Web应用如何运转的印象。
反过来看HTTP就是REST的具体实现。在一个REST风格中,我们能够感受到的就是统一接口的数据,这些数据包括
所以,当我们开发一个web服务时,比如一个网站,由于使用了HTTP(HTTPS)协议,其实就是一种REST风格,但是在这个REST风格中我们着重处理的是两点
1:URI,即所谓的资源,网站的uri设计