一、开发工具的使用
推荐使用Red Hat Jboss Developer Studio
注:使用时将\\SHIJI-SERVER\share\Software\Development\Java\JBoss代码格式 文件夹下的代码样式下载下来,导入到eclipse里。(用户名:Administrator密码:Iloveshiji4321),doc版位于 \\SHIJI-SERVER\share\document\Trainning\Java基础培训
bookmark.xml
kongur.cleanup.xml
kongur.codetemplates.xml
kongur.formatter.xml
注意:为防止打包出现401 Unthorization 异常;需要将附件中的settings.xml文件和settings-security.xml 放入当前用户的m2目录 如:
注意如果m2目录已经存在settings文件并且修改过路径等,需要手动合并settings文件内容;
二、代码书写格式
(一)类和方法的命名规范
类的名字必须由大写字母开头,单词中的其他字母均为小写。 如果类名称由多个单词组成,则每个单词的首字母均应为大写例如TestPage 。如果类名称中包含单词缩写,则这个缩写的单词每个字母均大写,如:XMLExample。还有一个命名技巧就是由于类是设计用来代表对象的,所以在命名类时尽量选择名词。 方法的名字的第一个单词以小写字母作为开头,后面的单词则用大写字母开头,可以是动词或者动词+名词组合。 设置、获取某个值得方法应该遵循setV/getV规范。 返回长度的方法,应该命名为length。 验证某个布尔值的方法,应该命名为isV。 将对象转换为某个指定类型的方法应该命名为toF。
变量名:
1.普通变量命名应该采用首字母小写,其他字母首字母大写的方式。 2.final static 变量的名字应该都大写,并且指出完整含义。如果一个常量名称由多个单词组成,则应该用下划线来分割这些单词如:NUM_DAYS_IN_WEEK 3.如果需要对变量名进行缩写,一定要注意整个代码中缩写规则的一致性: 1.Context = ctx;
2.Message = msg;
(二)通过在结尾处放置一个量词,就可创建更加统一的变量
First(一组变量中的第一个)
Last(一组变量中的最后一个)
Next(一组变量中的下一个变量)
Prev(一组变量中的上一个) Cur(一组变量中的当前变量)
1.无论什么时候,均提倡应用常量取代数字、固定字符串。
也就是说,程序中除了0、1以外,尽量不应该出现其他数字。
2.索引变量:i、j、k等只作为小型循环索引变量。
3.逻辑变量:避免用flag来命名状态变量,用is来命名逻辑变量。
if( isClosed ) { dosomeworks; return; }
数组 总是使用以下方式定义数组:
int[] arr = new int[10] ;
禁止使用c语言的形式:
int arr[] = new int[10];
集合 数组或者容器推荐命名方式为名词+s的方式,列如:
List<Person> persons = getPerson(); for (Person person : persons){ dosomeworks; }
泛型
应该尽量简明扼要(最好是一个字母),以利于与普通的class或者interface区分 Container中的Element应该用E表示,
Map里的key用K表示,
value用V,
Type用T表示,
异常用X表示。
如果需要接受多个Type类型的参数,应该用邻近T的大写字母来依次表示,当然也可以用T1,T2 这样的方式:
public class HashSet<E> extends AbstractSet<E>{ ...} public class HashMap<K,V> extends AbstractMap<k,V>{ ...} public class ThreadLocal<T> {...} 7. 8.public interface Functor<T,X> extends Throwable {T val() throws X; }
(三)推荐的命名
1.当要区别接口和实现类的时候,可以在类的后面加上“Impl”。
interface container class ContainerImpl
2.Exception类最好能用“Exception”作为类命名的结尾
DataNotFoundExcption InvalidArgumentException
3.抽象类最好能用“abstract”作为类名字的开头
AbstractBeanDeifinition AbstractBeanFactory
4.Test类最好能用“Test”做为类命名的结尾
ContainerTest
- 简称与缩写(不推荐使用)
1.cp代表colorPoint 2.buf代表buffer 3.off代表offset 4.len代表length
6.除非是在循环中,否则一般不推荐使用单个字母作为变量名
1.b代表byte 2.c代表char 3.d代表double 4.e代表Exception 5.f代表float 6.i,j,k代表整数 7.l代表long 8.o代表Object 9.s代表String 10.v代表某些类型的特定值
代码风格
花括号
花括号统一采用以下格式:
if( bool expression ){ dosomework; }
除非花括号中为空,不然任何情况下不能省略花括号,并且花括号必须换行,例如:
if( i == 0 ) { return; } while( true ){}
以下写法禁止出现:
if( i!= 0 ) return; if ( i! = 0 ) {return;}
括号 括号的前,后一个字符不需要空格,例如:
Person p = new Person("Jack", 16, "China");
空格 1.逗号之后紧跟一个空格。
Person p = new Person("Jack", 17);
2.二元操作符前后跟空格。
int i = a + b - c * d;
3.一元操作符前后跟空格。
for( int i = 0;I < 10; i++ ) { dosomework; }
类
1.类的定义结构按照顺序为:
1) 常量
2) 成员变量
3) 构造函数
4) 成员函数
5) get和set方法
各个部分之间流出一个空行。
例如:
规范类模板:
class Person{ private final static int MAX_AGE =100; private String firstname = "Jack"; public Person(){} public Person(String firstname){ this.firstname = firstname; }
public void doExercise(){ dosomeworks; run(); } private void run(){ dosomeworks; } public getFirstname(){ retrun firstanme; } public setFirstname(String firstname){ this.firstname = firstanme; }
2.构造函数
1) 参数为空的构造函数出现在最上方
2) 有调用关系的构造函数相邻
3) 参数尽量由少到多从上到下排序
3.使用成员变量
在类的方法内引用成员变量为了防止冲突以外,不使用this。
非特殊情况在类的方法内都不使用get和set方法存取成员变量。
4.get和set方法,
所有需要公开的成员变量都要符合良好的java bean规范,提供get和set方法,尽量使用IDE工具自动生成。
开发时注意事项:
- 增加字段,要注意旧数据的初始化。(增加前先与组长沟通)
- 在parameterSettingInfo表增加新属性需要在java开发群里通知一声,并且在初始化脚本中写insert语句。
- 涉及大的改动,需求的变更要在update.txt里更新。
- 数据库改动后需要增加bundle的版本。
Javadoc注解:
在每个程序的最开始部分,一般都用javadoc注解对程序的总体描述以及版权信息,之后在主程序中可以为每个类、接口、方法、字段添加javadoc注解,每个注解的开头部分先用一句话概括该类、接口、方法、字段所完成的功能,这句话应单独占据一行以突出其概括作用,在这句话后面可以跟随更加详细段落。在描述段落之后还可以跟随一些以javadoc注释标签开头的特殊段落,例如@auther和@version,这些段落将在生成文档中特定方式显示。
三、JDK1.8
1.本机安装jdk1.8.0_91以上版本
2.熟悉jdk1.8常用的API
3.了解Java8新特性
四、Wildfly10
- 本机部署配置wildfly10
- 熟悉wildfly10结构
- 熟悉wildfly10常用配置
- 总结遇到的问题
- 配置SSL(了解)
- 石基trac
五、Java EE Java EE 7 API JSF
1.JSF生命周期
- Facelets
- EL表达式
- Primefaces(了解功能,具体使用时查阅官方示例)
- 转换器,监听器,验证器
- AJAX
2.EJB
- CDI
- Annotation
- Alternative
- Decorator
- Inject
- Interceptors
- 自定义注解
- JSON处理
- Java持久化(Java持久化API)
- Bean验证
- JPQL
- JMS
- ActiveMQ
- 同步、异步
- 事务
- 安全与权限(Keycloak)
- WebService
- RESTful WebService (JAX-RS) (石基trac)
- XML WebService (JAX-XS)
- SOAP传输协议
- WSDL
- 具体内容请看《Java EE 7 权威指南》 具体示例与JavaEE 7官方文档链接
请参考
Web Service技术
Web Service 实现有多种方式,比如最常用的是 axis框架 xfire框架 ,通过该框架可以发布wsdl接口,也可以实现web service客户端,目前eclipse都有集成的插件,可以根据wsdl文件生成web servicce客户端调用接口。 但是这样部署的时候必须依赖框架的jar包,有时候可能因为环境等等原因,我们仅仅需要wsdl中的某一个接口,这时候可以通过http接口或者socket接口直接发送xml数据,来调用服务端web service服务,其实web service底层还是发送xml数据,只是这些框架封装了对xml数据进行 序列化和反序列化操作 。 项目中具体应用位置在 \Kongur\trunk\kunlun-kiosk\server\kunlun-kiosk-new\src\main\java\cn\shijinet\kunlun\kiosk\ws\service\ 目录下。
Seam框架(了解) Seam是基于Java EE平台的开源的,用于开发Web应用的平台。Seam整合了AJAX(Asynchronous JavaScript and XML),JSF(JavaServer Faces),JPA(Java Persistence),EJB3.0(Enterprise Java Bean)以及BPM(Business Process Management)。
Seam是为了降低架构和API复杂度而设计的,它可以让开发者使用Java注解,多样化的UI组件和少量的XML配置构建Web应用。
Seam还支持会话和声明式状态管理,可以在提供丰富的用户使用体验的同时减少传统Web应用可能产生的bug。官方网站 以及中文介绍 。
注:由于Redhat已经停止更新Seam,后续项目基本不会使用Seam框架。
六、PostgreSQL数据库
1.安装并配置PostgreSQL
2.连接本地的数据库
3.熟悉PostgreSQL的基本使用方法
4.详情见PostgreSQL使用手册以及教程
七、SVN版本控制器
1.安装并配置SVN
2.Checkout项目源码
3.了解使用SVN
4.详情见SVN使用手册及教程
5.提交代码时写commit信息以方便其他人查看
八、SoapUI
1.安装并配置SoapUI
2.配置cia,kiosk和opera的接口
3.熟悉SoapUI的基本使用方法
4.详情见SoapUI使用手册以及教程
九、Maven软件项目管理工具
Maven安装配置
项目中的pom.xml文件解析
(一)什么是pom
Project Object Model项目对象模型。通过 xml形式 保存的pom.xml文件,作用类似ant的bulid.xml文件,功能更强大。该文件用于管理: 源代码,配置文件,开发者的信息和角色,问题追踪系统,组织信息,项目授权,项目的url,项目的依赖关系 等等。 一个完整的pom.xml文件、放置在项目的根目录下。
(二)maven的属性
是值的占位符,类似EL,类似ant的属性,比如$ { X },可用于pom文件任何赋值的位置,有以下分类:
- env.X:操作系统环境变量,比如${env.,PATH}
- project.X:pom文件中的属性,比如:
<project><version>1.0</version></project>
引用方式:${project.version}
- settings.X:settings.xml文件中的属性,比如:<settings><offline>false</offline></sttings>,引用方式${settings.offline}。
- java system prperties:java.lang.system.getProperties()中的属性。
build中的主要标签:resources和plugins。
Resources:用于排除或包含某些资源文件。
注意:maven配置按照本地要求进行配置,在项目打包和项目发布的时候要记住要先进行mvn clean之后再mvn package。详情请参考maven手册。
十、项目分析 Kunlun-kiosk-new
(一)Kunlun-Kiosk-New是北京石基昆仑软件有限公司开发的,
通过使用自助机客户端来辅助完成入住和离店的接口服务的后台系统。目前有查询预订、CheckIn 、预付费抛帐、账单查询和CheckOut 等功能。
(二)主要使用http通讯协议、接口使用SOAP协议。
(三)主要使用Java EE,JSF技术。
(四)样式使用Primefaces样式。
(五)Mybatis技术。项目使用位置: \Kongur\trunk\kunlun-kiosk\server\kunlun-kiosk-new\src\main\java\cn\shijinet\kunlun\kiosk\mybatis\
(六)Hibernate JPA技术,用于实体管理和持久化。
(七)项目具体分析请见Kunlun-Kiosk设计文档及接口文档
(八)主要功能模块介绍
- opera-kiosk-client项目
opera-kiosk-client项目是将Opera Kiosk Web Service(后面用Opera服务代替)所用的元数据封装成Java类,是Kiosk项目与Opera服务沟通的媒介。与Opera服务沟通时,通过JAXB将Java对象映射成 XML格式 ,提供给Opera服务 OperaKioskInterfaceSoap 是对Opera服务所提供的所有接口的描述。 OperaKioskInterface 类用于生成Opera服务代理对象。
- cn.shijinet.kunlun.kiosk.bizmodel包
bizmodel包包含所有kiosk业务层的类,包括Opera服务返回的元数据转换成的业务类,业务处理时所需要的类,以及对外开放的服务的元数据所转换的类。将bizmodel层的对象转化成opera-kiosk-client包的对象。
- cn.shijinet.kunlun.kiosk.metadatamodel包
metadatamodel包包含对对外开放服务所需要的元数据的类,客户端在调用Kiosk Web Service(后面用Kiosk服务代替)前需要将元数据对象转换成bizmodel层的对象metadatamodel包的类与bizmodel包对应名称的类基本是相同的,只是应用场景不同。
- cn.shijinet.kunlun.kiosk.producer包
producer包是用来初始化客户端设备信息用于身份验证和初始化Opera服务代理对象的。
- cn.shijinet.kunlun.kiosk.ws.service包
service包即相对于客户端而言,包含: KunlunKioskService 接口描述Kiosk服务所有对外开放的接口。 KunlunKioskServiceImpl 类是对KunlunKioskService 的实现。 Metadata2BizModelConverter类是将客户端传来的元数据对象转化为bizmodel对象的 转换器 。 Biz2MetadataModelConverter类是将bizmodel层的业务对象转化为metadatamodel层的元数据对象,以便返回给客户端。
- cn.shijinet.kunlun.kiosk.ws.client包
client是相对于Opera服务来说的。 Kiosk调用Opera服务,则Kiosk为client。 client包里包括PmsKioskServiceBeanInterface 接口以及 OperaKioskWsClientBean 和 OperaV4KioskWsClientBean 两个实现。 OperaKioskWsClientBean 是针对Opera V5 版本的接口调用实现,OperaV4KioskWsClientBean是针对Opera V4版本的接口调用实现。用于适配不同的Opera版本。OperaV4KioskWsClientBean继承OperaKioskWsClientBean ,当 V4 调用需要做特殊处理时会覆盖父类方法。 OperaKioskWsClientBean 类有OperaKioskInterfaceSoap 的代理对象,因此可以直接调用Opera服务。OperaKioskWsClientBean 的方法将Opera服务返回的结果(opera-kiosk-client对象)做相应的数据整合,转化成bizmodel层Result对象,供 KioskServiceBizImpl 使用。
- cn.shijinet.kunlun.kiosk.biz包
biz包包括KioskServiceBiz 接口,以及其实现KioskServiceBizImpl ,作用是具体实现KunlunKioskServiceImpl 的方法。 KioskServiceBizImpl 类有PmsKioskServiceBeanInterface 的实例,因此可以简单的看成由KioskServiceBizImpl 实现KunlunKioskService 并负责调用Opera服务。
KioskServiceBizImpl 中实现Kiosk具体业务,实现流程为调用OperaKioskWsClientBean 的方法,将返回结果做相应业务处理,返回给KunlunKioskServiceImpl 使用
- cn.shijinet.kunlun.cia.biz.!KioskForCiaBizImpl类则是为kunlun-cia-rest定义的服务的实现,供kunlun-cia调用。
(九)开发Web Service示例,
该示例演示如何将Opera服务包装成Kiosk服务以及客户端调用的流程。以getArrivingReservation()为例:
- 在opera-kiosk-client项目中
com.micros.webservices.kiosk.OperaKioskInterfaceSoap 接口查找Opera服务的描述:
/** * * @param getArrivingReservation * @return * returns com.micros.webservices.kiosk.ReservationFoundResult */ @WebMethod(operationName = "GetArrivingReservation" , action = "http://webservices.micros.com/kiosk/3.0/GetArrivingReservation") @WebResult(name = "GetArrivingReservationResult", targetNamespace = "http://webservices.micros.com/kiosk/3.0/") @RequestWrapper(localName = "GetArrivingReservation", targetNamespace = "http://webservices.micros.com/kiosk/3.0/", className = "com.micros.webservices.kiosk.GetArrivingReservation") @ResponseWrapper(localName = "GetArrivingReservationResponse", targetNamespace = "http://webservices.micros.com/kiosk/3.0/", className = "com.micros.webservices.kiosk.GetArrivingReservationResponse") public ReservationFoundResult getArrivingReservation( @WebParam(name = "GetArrivingReservation", targetNamespace = "http://webservices.micros.com/kiosk/3.0/") GetArrivingReservationType getArrivingReservation);
- 在metadata包添加相关类:
!GetArrivingReservation类,供客户端请求Kiosk getArrivingReservation()。 !GetArrivingReservationResult类,用于将Kiosk服务结果返回给客户端。
- 在bizmodel包添加相关类:
!GetArrivingReservation类,客户端请求Kiosk getArrivingReservation()服务的metadata对象所转化的bizmodel对象。 !GetArrivingReservationResult类,用于将Opera服务结果返转化为Kiosk可用的类。
- 在Metadata2BizModelConverter增加convertGetArrivingReservation
public GetArrivingReservation convertGetArrivingReservation(cn.shijinet.kunlun.kiosk.metadatamodel.GetArrivingReservation getArrivingReservation) { if (getArrivingReservation != null) { GetArrivingReservation reservation = new GetArrivingReservation(); reservation.setConfirmationNumber(getArrivingReservation.getConfirmationNumber()); reservation.setFirstName(getArrivingReservation.getFirstName()); reservation.setLastName(getArrivingReservation.getLastName()); reservation.setMemberNumber(getArrivingReservation.getMemberNumber()); reservation.setReservationNumber(getArrivingReservation.getReservationNumber()); return reservation; } else { return null; } }
- 在!KioskServiceBiz接口添加getArrivingReservation()方法定义,并在KioskServiceBizImpl中写空实现(步骤8补充):
GetArrivingReservationResult getArrivingReservation(GetArrivingReservation getArrivingReservation);
@Override public GetArrivingReservationResult getArrivingReservation(GetArrivingReservation getArrivingReservation, Holder<KioskSoapHeader> holder) { getArrivingReservationEvent.fire(getArrivingReservation); GetArrivingReservationResult metadataResult = biz2MetadataModelConverter.convertGetArrivingReservationResult(getKioskServiceBiz(holder) .getArrivingReservation( metadata2BizModelConverter.convertGetArrivingReservation(getArrivingReservation))); GetArrivingReservationResultWithHeader getArrivingReservationResultWithHolder = new GetArrivingReservationResultWithHeader(); getArrivingReservationResultWithHolder.setGetArrivingReservationResult(metadataResult); getArrivingReservationResultWithHolder.setStationId(holder.value.getStationId()); reservationResultEvent.fire(getArrivingReservationResultWithHolder); return metadataResult; }
- 在PmsKioskServiceBeanInterface增加getArrivingReservation()方法定义:
GetArrivingReservationResult getArrivingReservation(GetArrivingReservation getArrivingReservation);
- 在OperaKioskWsClientBean增加实现:
@Override public GetArrivingReservationResult getArrivingReservation(GetArrivingReservation getArrivingReservation) { initialize(); ReservationFoundResult microsResult = operaKioskInterfaceSoap.getArrivingReservation(bizModel2MicrosConvert .convertGetArrivingReservation(getArrivingReservation)); if ( microsResult.getResultType().compareTo(ReservationResultType.RESERVATION_ERROR) == 0 ) { ErrorLog errorLog = new ErrorLog("getArrivingReservation", microsResult.getError().getNumber(), microsResult.getError().getText()); errorLog.setConfirmationNumber(getArrivingReservation.getConfirmationNumber()); errorLog.setReservationNumber(getArrivingReservation.getReservationNumber()); errorLog.setLastName(getArrivingReservation.getLastName()); KioskExceptionThrowFactory.throwPmsException(errorLog.toString()); } GetArrivingReservationResult bizModelResult = new GetArrivingReservationResult(); List<ArrivingReservation> bizModelArrivingReservations = new ArrayList<ArrivingReservation>(); List<Reservation> microsReservations = microsResult.getReservationList().getReservation(); for ( Reservation microsReservation : microsReservations ) { GetArrivingReservationType microsType = new GetArrivingReservationType(); microsType.setReservationNumber(microsReservation.getNumber()); GetGuestMessagesType microsGetGuestMessagesType = new GetGuestMessagesType(); microsGetGuestMessagesType.setReservationNumber(microsReservation.getNumber()); GetGuestMessagesResult microsMessagesResult = operaKioskInterfaceSoap.getGuestMessages(microsGetGuestMessagesType); if ( microsMessagesResult.getResultType().compareTo(GetGuestMessagesResultType.GET_GUEST_MESSAGES_ERROR) == 0 ) { ErrorLog errorLog = new ErrorLog("getGuestMessages", microsMessagesResult.getError().getNumber(), microsMessagesResult.getError().getText()); errorLog.setGuestNumber(microsReservation.getNumber().toString()); KioskExceptionThrowFactory.throwPmsException(errorLog.toString()); } ArrivingReservation bizModelArrivingReservation = new ArrivingReservation(); fetchBaseReservationInfo(microsReservation, microsMessagesResult.getGuestMessagesList(), bizModelArrivingReservation); fetchReservationGuestInfo(microsReservation, bizModelArrivingReservation); fetchAccompanyGuests(microsReservation, bizModelArrivingReservation); fetchShareGuests(microsReservation, bizModelArrivingReservation); fetchBreakfastFromRateDetails(microsReservation, bizModelArrivingReservation); fetchDailyDetails(microsReservation, bizModelArrivingReservation); fetchFixedChargeRate(microsReservation, bizModelArrivingReservation); fetchTransportAndETCAndRTC(microsReservation, bizModelArrivingReservation); filterPreference(bizModelArrivingReservation); bizModelArrivingReservations.add(bizModelArrivingReservation); } bizModelResult.setArrivingReservation(bizModelArrivingReservations); return bizModelResult; }
其中需要将bizmodel层的GetArrivingReservation 转化成opera-kiosk-client包里的GetArrivingReservationType ,用于调用Opera服务时传递参数:
protected GetArrivingReservationType convertGetArrivingReservation(GetArrivingReservation getArrivingReservation) {
GetArrivingReservationType microsGetArrivingReservationType = new GetArrivingReservationType(); microsGetArrivingReservationType.setConfirmationNumber(getArrivingReservation.getConfirmationNumber()); String reservationNumber = getArrivingReservation.getReservationNumber(); if ( StringUtils.isNotEmpty(reservationNumber) ) { microsGetArrivingReservationType.setReservationNumber(BigInteger.valueOf(Long.valueOf(reservationNumber))); } microsGetArrivingReservationType.setLastName(getArrivingReservation.getLastName()); microsGetArrivingReservationType.setMemberNumber(getArrivingReservation.getMemberNumber()); microsGetArrivingReservationType.setGetList(true); return microsGetArrivingReservationType; }
convert方法为protected,便于OperaV4KioskWsClientBean覆盖。 OperaKioskWsClientBean 的方法将Opera服务返回的结果(opera-kiosk-client对象)做相应的数据整合,转化成bizmodel层GetArrivingReservationResult 对象,供KioskServiceBizImpl 使用。
- 在!KioskServiceBizImpl中实现getArrivingReservation()方法,实现流程为调用!OperaKioskWsClientBean的方法,将返回结果做相应业务处理,返回给KunlunKioskServiceImpl使用:
@Override @KioskExceptionHandler public GetArrivingReservationResult getArrivingReservation(GetArrivingReservation getArrivingReservation) { validateCheckInTime(); initKioskServiceBean(); GetArrivingReservationResult result = new GetArrivingReservationResult(); if (config.getRetrieveReservationTypes().contains(RetrieveReservationType.OTANumber)) { for ( Verification v : fetchVerification(getArrivingReservation) ) { GetArrivingReservationResult result1 = new GetArrivingReservationResult(); GetArrivingReservation g = new GetArrivingReservation(); g.setConfirmationNumber(v.getConfirmationNumber()); try { result1 = bean.getArrivingReservation(g); } catch ( Exception e ) { e.printStackTrace(); } result.setArrivingReservation(result1.getArrivingReservation()); } } else { result = bean.getArrivingReservation(getArrivingReservation); }... ...
- 在Biz2MetadataModelConverter中添加convertGetArrivingReservationResult()方法,将bizmodel层的!GetArrivingReservationResult转化为metadata层的GetArrivingReservationResult,返回给客户端。
- 在KunlunKioskServiceImpl类添加getArrivingReservation()方法的实现:
@Override public GetArrivingReservationResult getArrivingReservation(GetArrivingReservation getArrivingReservation, Holder<KioskSoapHeader> holder) { getArrivingReservationEvent.fire(getArrivingReservation); GetArrivingReservationResult metadataResult = biz2MetadataModelConverter.convertGetArrivingReservationResult(getKioskServiceBiz(holder) .getArrivingReservation( metadata2BizModelConverter.convertGetArrivingReservation(getArrivingReservation))); GetArrivingReservationResultWithHeader getArrivingReservationResultWithHolder = new GetArrivingReservationResultWithHeader(); getArrivingReservationResultWithHolder.setGetArrivingReservationResult(metadataResult); getArrivingReservationResultWithHolder.setStationId(holder.value.getStationId()); reservationResultEvent.fire(getArrivingReservationResultWithHolder); return metadataResult; }
(十)KIOSK前端和后台结合实例
1.例如在前端中添加定时删除天数配置项。
2.首先找到在前端需要添加配置项的页面,加入样式代码。
3.如: kunlun-kiosk-new/src/webapp/module/setting/basic/misc.xhtml ,考虑适当的页面布局,添加下面的样式代码:
<p:spacer width="20"/> <h:outputLabel value="Periodically Delete:" for="Periodically"> <h:outputLabel value="*" style="color:red"/> </h:outputLabel > <p:spinner id="Periodically" required="true" value="#{basicSettingsAction.periodically}" min="0" stepFactor="1" />
4.之后在cn./shijinet/kunlun/kiosk/module/setting/BasicSettingsAction 目录下添加对应的属性与其关联。代码如下:
private String periodically; private void savePeriodically(){ updateData(ParameterSettingInfo.PERIODICALLY_DELETE,periodically); config.setPeriodically(periodically); } public String getPeriodically() { return periodically; } public void setPeriodically(String periodically) { this.periodically = periodically; }
5.在cn/shijinet/kunlun/kiosk/model/ParameterSettingInfo 实体中添加对应字段。
public static final String PERIODICALLY_DELETE = "periodically.delete";
6.在cn/shijinet/kunlun/kiosk/util/PmsConfig 初始化方法中添加初始化对象。
private String periodically; periodically = getValue(ParameterSettingInfo .PERIODICALLY_DELETE);
- 在cn.shijinet.kunlun/kiosk/module/setting/BasicSettingsAction中的save方法中引用savePeriodically()方法.
Kunlun-cia-rest
(一)kunlun-cia-rest项目定义kunlun-cia的功能和所需要的metadatamodel。
具体的实现在kunlun-cia项目中。该项目还包括异常处理功能。该项目是kunlun-cia和kunlun-kiosk-new的项目依赖,随kunlun-cia和kunlun-kiosk-new一起打包。
(二)接口使用Restful Web Service。
(三)主要使用Java EE技术。
(四)Hibernate JPA技术,用于实体管理和持久化。
(五)主要功能模块介绍 cn.shijinet.kunlun.cia.rest.metadata包包含对外的metadata类。
cn.shijinet.kunlun.cia.biz.CiaBiz接口定义了kunlun-cia-rest的功能和必要的方法。 cn.shijinet.kunlun.cia.rest.KunlunCiaRestService接口定义对外开放的服务。 cn.shijinet.kunlun.cia.rest.KunlunCiaRestServiceImpl是对接口的实现,其包含!CiaBiz的实例。
Kunlun-cia
(一)Check In @ Anywhere 是北京石基昆仑软件有限公司开发的,通过使用移动客户端来辅助完成入住的服务系统。其通过调用Kiosk服务实现查询预订、CheckIn、预付费抛帐、账单查询和!CheckOut等功能。
(二)主要使用http通讯协议、接口使用Restful Web Service。
(三)主要用Java EE,JSF技术。
(四)样式使用Primefaces样式。
(五)Hibernate JPA技术,用于实体管理和持久化。
(六)项目具体分析请见!CheckInAnywhere接口文档
(七)主要功能模块介绍
- cn.shijinet.kunlun.cia.biz.!CiaBizImpl类,实现!CiaBiz接口,主要是根据服务类型请求对应的服务。请求Kiosk服务时,则实现在kunlun-kiosk-new项目的!KioskForCiaBizImpl类。
- cn.shijinet.kunlun.cia.container.dashboard.!DashboardDataManager类展示入店和离店成功与失败的统计