Hi平台HowTo手册.docx
- 文档编号:23239652
- 上传时间:2023-05-15
- 格式:DOCX
- 页数:21
- 大小:28.16KB
Hi平台HowTo手册.docx
《Hi平台HowTo手册.docx》由会员分享,可在线阅读,更多相关《Hi平台HowTo手册.docx(21页珍藏版)》请在冰豆网上搜索。
Hi平台HowTo手册
Hi平台HowTo手册
(hibernate/webwork/jsp)
Version:
1.0
修改历史
日期
修改版
修改说明
作者
07/7/24
1.0
创建文档
张昊
10/4/21
添加业务层8,表现层19
白长安
目录
前言4
数据访问层(hiberante)5
1.如何填写手写的hql语句5
2.如何得到hibernate的Session5
3.如何调用存储过程5
业务层6
1.如何得到当前用户信息6
2.如何增加过滤器(Filter)信息6
3.如何增加排序器(Sorter)信息7
4.如何增加自己的权限过滤器(SecurityFilter)信息7
5.如何得到枚举信息7
6.如何将扩展生成的业务组件,加入手写方法代码7
7.如何在业务层新建一个POJO对象并保存8
8.如何生成业务编号8
表现层(webwork)8
1.如何在页面调用java代码8
2.如何改变查询列表页中记录的数量8
3.如何增加自己的action配置9
4.如何新增一个查询项9
5.如何为枚举型增加多选效果9
6.如何将lookup改为下拉显示9
7.如何将lookup的url增加动态参数值9
8.如何自动生成记录列表及查找,排序功能10
9.如何在生成的页面上加上自已手写的动作,如一个按钮10
10.如何在编辑页中将一栏目变成“必须填写栏”11
11.如何作级联菜单12
12.如何将一栏目加入查找输入(lookup)功能12
13.如何自动将页面的临时数据传入我自己定义的动作类(action)中12
14.如何增加自己记录级的权限过滤规则13
15.如何判断页面提交的数据与数据库中的记录是否一制,即数据是否改变13
16.如何在列表页面设置最大限记录数13
17.如何设置列表页面中每页显示的记录数14
18.如何实现上传附件功能14
19.如何添加子菜单15
生成器16
前言
本文档是对在应用Hi平台开发过程中遇到的常见问题与解决用例的汇总。
因此它不是那学习教材,在查询与阅读该文档时我们假定您已经对Hi平台有一定的了解,而且比较熟练的掌握几个常用的开源框架。
再次强调本文档仅是一本问题速查手册,不参与对平台运行原理及设计思想的介绍。
如果希望获得这方面的相关信息请参见《Hi平台设计思想》一文。
如果对Hi平台一无所知并且对java及部分开源框架有所了解,请参见《Hi平台入门指南》一文。
总的来说,平台分为底层运行支撑框架与代码生成器两部分,而支撑框架从技术层面上又分为数据访问层、业务层及表现层这三个层次。
因此本文档的划分如下四个部分:
1.数据访问层:
主要是解决关系型数据库与面向对象的ORMapping过程所遇到的问题。
平台可以支持多种ORM的开源框架,对于不同框架间的差别文档会特别标注。
2.业务层:
对于业务层平台主要依赖于Spring,但对于Spring的相关问题已经越过了本文档的能力。
因此这部分我们只能列举平台与Spring相结合的问题,及平台业务层扩展功能的问题。
3.表现层:
表现层涉及的功能点比较多,比较杂,不同框架之间的差异(如webwork/sturs…),不同渲染文件之间的差异(jsp/vm/ftl/pdf…)因为我们在列这一部分时会分为不同的框架与渲染的模块化文档。
4.生成器:
因为生成器是完全自主开发的,所以在生成配置文件中会有一些平台本身的规则,这一部分会列举手动修改配置文件与生成时可能遇到的问题及解决方法
如果您遇到的问题没在本档中找到答案,请访问hi平台社区论坛,也欢迎您能过MSN机器人、论坛将您碰到的问题与平台的bug及时的反馈给我们。
最后,Hi平台是一个套件系统,欢迎您了解我们基于平台开发的其它产品。
数据访问层(hiberante)
1.如何填写手写的hql语句
hql只有hibernate才能识别,因此所有的hql语句都应该写在XXXDAOHibernate.
1)在XXXDAOHibernate写一个方法
publicListgetMethod(){
StringqueryString;//hql语句
returnthis.getHibernateTemplate().find(queryString)
}
2)在XXXDAO中声明该方法
3)在XXXManagerImpl调用XXXDOA的方法如:
((XXXDAO)getDAO).getMethod();
2.如何得到hibernate的Session
this.getHibernateTemplate().getSessionFactory().getCurrentSession()
3.如何调用存储过程
注意:
不推荐实用存储过程调用,虽然存储过程要比ORM快很多,但存储过程没有可移植性。
如果您选择使用存储过程也就意味着与数据库绑定在一起。
1)在数据库中定义一个存储过程batchUpdateStudent()
createorreplaceprocedurebatchUpdateStudent(p_ageinnumber)as
begin
updateSTUDENTsetAGE=AGE+1whereAGE>p_age;
end;
2)在XXXDAOImpl中实现调用该存储过程
publicvoidupdateProcedure()throwsSQLException{
Sessionsession=this.getHibernateTemplate().getSessionFactory().getCurrentSession();
Transactiontx=session.beginTransaction();
Connectioncon=session.connection();
Stringprocedure="{callbatchUpdateStudent(?
)}";
CallableStatementcstmt=con.prepareCall(procedure);
cstmt.setInt(1,0);//把年龄参数设为0
cstmt.executeUpdate();
mit();
}
3)通过Manager调用DAO中的方法
具体操作参见如何填写手写的hql语句
业务层
1.如何得到当前用户信息
平台将当前用户所有信息都保存在UserContext类中,该对象主要包括当前用户(部门)、当前户所拥有的权限、角色、角色组等
平台为了开发人员更速度访问该对象,专为该类提供了一个助手类UserContextHelper,该类中的所有成员方法均是静态的,您可以很方便的获得当前用户相关内容。
如:
UserContextHelper.getUser()//得到当前用户的相关信息
UserContextHelper.getOrg()//得到当前用户所在部门的信息
UserContextHelper.getUserId//得到当前用户的ID值
2.如何增加过滤器(Filter)信息
Filterfilter=FilterFactory.getSimpleFilter(propertyName,val,Filter.OPERATOR_EQ);
filter.addCondition(propertyName1,val1,op1,relation1);
首先所有的过滤器都必须由FilterFactory(过滤器工厂)创建,过滤器可以通过addCondition方法累加过滤条件。
也可以通过addFilter方法将两个过滤器连接合并在一起
name:
POJO的属性名的字符串,可以通过.级联如(org.id);
val:
待过滤的过滤值
op:
操作符,提供多种操作符,具体参见javadoc
relation:
关系符,两个过滤器之间的关系,如与/或/NOT
Filter举例:
如果要在以有的pageinfo的基础之上加自己的过滤信息可以在PageInfoUtil.populate(pageInfo)方法之后加上自己的Filter,
//在PageInfo的基础上新增自己的filter
pageInfo=pageInfo==null?
newXXXPageInfo():
pageInfo;
PageInfosarchPageInfo=PageInfoUtil.populate(pageInfo);
//新建一个filter,过滤条件为name=”马超”
Filterfilter=FilterFactory.getSimpleFilter("name","马超");
//在原有的filter上加自己的filter,跟以有的filter的关系为“或”关系
sarchPageInfo.getFilter().addFilter(filter,Filter.RELATION_OR);
如果是“与”关系则可以省略“Filter.RELATION_OR”参数,变为sarchPageInfo.getFilter().addFilter(filter);
如果要自己新建一个filter则可以这样写,比如需要查姓名叫“马超”或者叫“赵虎”的人
XXXPageInfopageInfo=newXXXPageInfo();
Filterfilter=FilterFactory.getSimpleFilter("name","马超",Filter.OPERATOR_EQ);//Filter.OPERATOR_EQ表示“=”
filter.addCondition("name","赵虎",Filter.OPERATOR_EQ,Filter.RELATION_OR);
pageInfo.setFilter(filter);
list=XXXMgr.getXXXList(pageInfo);
如果对null或非null做过滤
FilterFactory.getSimpleFilter(propertyName,null,Filter.OPERATOR_EQ);
FilterFactory.getSimpleFilter(propertyName,null,Filter.OPERATOR_NOT_EQ);
如果做包含(IN)做过滤
FilterFactory.getInFilter(propertyName,coll);
其中coll是java.util.Collection接口的对象
3.如何增加排序器(Sorter)信息
Sortersorter=SorterFactory.getSimpleSort(propertyName,Sorter.ORDER_DESC);1
Sorter.addSort(properyName1,Sorter.ORDER_ASC);
首先所有的排序器都必须由SorterFactory(过滤器工厂)创建,排序器可以通过addSort方法累加。
也可以通过addSort方法将两个排序器连接合并在一起
4.如何增加自己的权限过滤器(SecurityFilter)信息
首先明确一个事实SecurityFilter接口及其子孙类,均是提供数据级的权限过滤。
原理是系统会自动前置拦截在Manager中的get***List方法,然后能过调用SecurityFilter.getSecurityFilter()方法将该Filter注入到PageInfo中。
对于数据级权限过滤平台提供两种实现方式:
1.全部覆盖倒平台提供的权限过滤规则,使用我自己的规则
✓自己写一个实现SecurityFilter接口的类,在该类加入你的数据过滤规则
✓在平台配置文件APP_HOME/web/WEB-INF/config/hiFrameworkConfig.properties中的hi.pageinfo.securityfilterclass配置项对应的值加入您自己实现类的全限定名
2.我只想某一个或几个get***List方法不采用平台提供的数据级过滤规则
✓在指定的***ManagerImpl实现getList(PageInfopageInfo,FiltersecurityFilter),其中securityFilter就是您的数据级过滤规则的过滤器,该过滤器仅要求您实现Filter接口没有其它规则
✓在action类中调用该Manager中的带Filter参数的getList()方法
5.如何得到枚举信息
平台提供EnumerationHelper助手类,该类中的所有成员方法均是静态的,您可以很方便的获得指定的枚举实体或枚举值,如:
EnumerationHelper.getEnumerationValue(enumName)
//通过给定枚举实体名,得到该枚举实体对应的枚举值List集合
EnumerationHelper.getEnumerationValue(enumerationValueId)
//通过枚举值的ID值,得到枚举值对象信息
6.如何将扩展生成的业务组件,加入手写方法代码
比如,要在订单Order中手写加入一个计算订单明细的方法:
1.在生成的mode/original/OrderAbstract.java文档中加入
publicdoublegetTotalAmount();
如:
publicclassOrderextendsBaseObjectimplementsSerializable{
publicdoublegetTotalAmount();
}
2.在生成的mode/Order.java文档中加入业务逻辑
publicclassOrderextendsOrderAbstract
{
publicdoublegetTotalAmount()
{
try
{
//加入业务逻辑
returnamount;
}
catch(Exceptione)
{
return0;
}
}
}
3.编译后即成。
7.如何在业务层新建一个POJO对象并保存
8.如何生成业务编号
生成业务编号:
例如C-0001,D-20100410-0001等有一定业务含义的流水号。
在BizNumberUtil.gerNumber(arg1,arg2,…………args)
该类是用于生成业务编号的工具类,所谓业务编号指如订单编号、出/入库单编号.一般来说对些类编号均为前缀+流水号+后缀,大多数前缀是日期或是定死的大字母
表现层(webwork)
1.如何在页面调用java代码
2.如何改变查询列表页中记录的数量
您可以有两种方式改变查询列表页中记录的数量
1)通过修改配置文件APP_HOME/web/WEB-INF/config/hiFrameworkConfig.properties中的hi.pageinfo.pagesize=10,如果修改该值则所有列表页面的显示记录数都会随之改变
2)为URL增加参数项,如在***List.action?
pageInfo.pageSize=20,如果这样设置则仅对当前页面的记录数有影响
3.如何增加自己的action配置
为了避免系统生成的配置文件会覆盖您手写的,对于手动增加配置文件的步骤如下
1)新建的一个配置文件,命名规则为xwork-order[服务名]-customer.xml
2)在新建的配置文件中增加继承包信息
3)在新建的配置文件添加您的action配置信息
4)将您的配置文件引入到xwork.xml文件中
4.如何新增一个查询项
如果是lookup型:
searchname="pageInfo.f_customer.fullName"cssClass="searchText"/> 如果是枚举型: searchname="pageInfo.f_status"emu="orderStatus"needSelect="false"/> 关于JSP标签的更多信息参见《Hi平台入门指南》 5.如何为枚举型增加多选效果 首先如果是多选的枚举值,那么该字段在数据库应该varchar,POJO中域的类型应为String。 在页面上可以是多选下拉/复选框/单选框,如 selectemu="orderSource"name="order.source"type="checkbox"multiple="true"/> type的值有: [select下拉]checkbox复选框radio单选框 注意: 如果枚举为单选,则数据库字段应为int,POJO中域的类型应为Integer.如果是复选则不提供查询功能,数据库对应的字段应为varcher,POJO中域的类型应为String. 关于JSP标签的更多信息参见《Hi平台入门指南》 6.如何将lookup改为下拉显示 entitySelectname="order.area.id"entityName="com.cubby.sysinfo.model.CityArea"isAll="true"key="id"title="areaName"/> 其中name: 待封装对象的域名entityName: lookup实体的的java类全限定名 isAll: 是否在列表中有”全部”这个选项,如果选取该项,实际上对应的值为null key: 要带回的值对应实体的域名title: 在列表中显示的信息对应实体的域名 关于JSP标签的更多信息参见《Hi平台入门指南》 7.如何将lookup的url增加动态参数值 当点击lookup按钮时系统会调用相应的.js文件的JSON,url参数决定弹出页面的地址。 "url": "patternTagList.action? lookup=1&pageInfo.customer.f_orgNum=${document.getElementById('orderForm.orgNum').value}" 其中${}区间内的内容是动态执行部分。 相当于javascript中的eval方法。 JSON(JavaScriptObjectNotation)一种简单的数据格式,比xml更轻巧。 JSON是JavaScript原生格式,这意味着在JavaScript中处理JSON数据不需要任何特殊的API或工具包.对象是一个无序的“‘名称/值’对”集合。 一个对象以“{”(左括号)开始,“}”(右括号)结束。 每个“名称”后跟一个“: ”(冒号);“‘名称/值’对”之间使用“,”(逗号)分隔.具体细节参考http: //www.json.org/json-zh.html 以如下代码为例,对平台的SON做业务分析 varorderForm_lookup={ "product": { "url": "patternTagList.action? lookup=1", "domain": "orderFormDetail", "arrayName": "orderForm.orderFormDetails", "mapping": [{"b": "id","t": "product.id"}, …… varorderForm_lookupJSON变量名称,规则为实体名_lookup,其值为当前实体中全部lookup其它实体的集合。 其元素均为当前实体所要查找带回的其它实体的相关信息 url当在页面上点击”查找带回”图标时,所要链接的URL地址 domain表单元素的前缀名(单一) arrayName表单元素的前缀名(多个,如作为子表) mappingPOJO的属性与页面表单元素名称的映射关系。 b为POJO的属性名称,t为查到的信息放置在页面表单元素的名称 8.如何自动生成记录列表及查找,排序功能 所有生成的列表将自动拥有排序功能(上序,或下序切换)。 如: title表id的排序 sortBy('id')"id="title_id"> 9.如何在生成的页面上加上自已手写的动作,如一个按钮 比如,我们需要在订单页面中加一个按钮,完成一个动作“订单作废”: 订单作废的动作由在生成的orderedit.jsp中加上一个按钮“订单作废” 1.在生成的OrderEdit.jsp中加上一按钮“订单作废” orderDestroy()"> 2.写一个orderDestroy脚本将“订单作废”动作action提交到服务器上。 functionorderDestroy() { document.saveForm.action="OrderDestroy.action"; document.saveForm.submit(); } 1.写一个action类,名叫OrderDestroyAct,继承生成的BaseAction类 publicclassOrderDestroyActextendsBaseAction { privateOrderorder; publicStringexecute()throwsException{ //得到处理订单的Manager OrderManagerorderMgr=(OrderManager)SpringContextHolder.getBean(Order.class); //删除订单使订单作废 orderMgr.removeOrderById(order.getId()); returnSUCCESS; } publicOrdergetOrder(){ returnorder; } publicvoidsetOrder(Orderorder){ this.order=order; } } 2.在你的webwork配置文件xwork-order-customer.xml中加入 class="com.cubby.order.action.webwork.customer.OrderDestroyAct">
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Hi 平台 HowTo 手册