没有平台化思想设计的项目开发,其低水平重复开发的工作量是难以估计的,openjweb平台v1.6版本实现了通过平台创建弹出选择窗口的功能,具体介绍如下:
在项目开发中会遇到大量的弹出选择窗口的开发,因数据量大的表不适合做成下拉选择的方式,所以在录入数据的时候需要用弹出选择窗口来选择要输入的内容,例如采购入库填写入库单时录入物料编码等。OpenJWeb平台实现了弹出式选择窗口自动生成功能,在项目开发中大大节约了弹出选择窗口的开发时间。
在图2-4的功能定义列表页面中,点击“生成代码”的连接后,除了生成列表和编辑页面外,还生成了弹出选择窗口,例如人力资源的”hr_resume”表,点“生成代码”后,在struts-hr.xml中自动增加了以下配置:
<action name="popupHrResume" class="org.openjweb.core.action.HrResumeAction" >
<result>/WEB-INF/jsp/hr/popupHrResume.jsp</result>
</action>
生成的弹出选择窗口即上面配置的result,下面是生成的弹出选择窗口的外观:
图2-10 平台生成的简历的弹出选择窗口
打开popupHrResume.jsp,找到 <input type="hidden" name="popNameField" />,
因为平台没有定义弹出窗口的哪个字段是作为名称字段返回给父亲窗口的,例如商品名称,所以需要在popupHrResume.jsp生成后,打开此文件,将<input type="hidden" name="popNameField" />,改为
<input type="hidden" name="popNameField" value="<s:property value="empName"/>"/>
这样修改是为了选择列后,返回给上级窗口一个人员名称。其中empName对应的是hr_resume表的emp_name字段。(因为目前尚未确定在平台的什么地方来设置弹出窗口的名称字段,所以暂时手工来添加popNameField对应的值)。
那么父亲窗口如何调用弹出窗口呢?见下面的代码:
<td><input type="text" name="codeField"/><input type="text" name="nameField"/>
<image src="<%=request.getContextPath()%>/images/icon.gif" onclick="window.open('<%=request.getContextPath()%>/hr/popupHrResume.action?codeField=codeField&nameField=nameField');"/>
</td>
其中codeField和nameField分别对应代码字段和名称字段,父亲窗口需要把代码字段名和名称字段名作为参数传递给弹出窗口,这样弹出窗口的数据行被选择后,关闭窗口可自动将代码和名称带到父亲窗口的对应字段。
在弹出窗口中肯定不能硬性指定window.opener对应的父窗口的元素,否则弹出窗口就不通用了,下面是弹出窗口中向父窗口返回代码和名称的页面程序代码:
window.opener.document.getElementsByName("<%=codeField%>")[0].value=document.getElementsByName("pkId")[i].value;
window.opener.document.getElementsByName("<%=nameField%>")[0].value=document.getElementsByName("popNameField")[i].value;