基于WADE平台的WEB应用开发指南.doc_第1页
基于WADE平台的WEB应用开发指南.doc_第2页
基于WADE平台的WEB应用开发指南.doc_第3页
基于WADE平台的WEB应用开发指南.doc_第4页
基于WADE平台的WEB应用开发指南.doc_第5页
已阅读5页,还剩102页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

联创科技长沙研发中心产品研发开发指南1 环境搭建1.1 开发所需工具 WEB服务器(Weblogic、Tomcat、Resin、Jetty等); 开发工具(Eclipse、Jcreator、Jbuilder等) 版本控制(WinCvs、TortoiseCVS等) 编译打包(Ant,Eclipse等开发工具已内置Ant工具)1.2 运行QuickStart应用1、 运行WinCvs,点“登陆”,输入版本控制服务器信息2、 从版本控制服务器上,检出模块(这里检出quickstart应用)3、 运行Ant编译打包应用进入quickstart/build目录,在dos窗口敲入ant命令 或 在集成了Ant工具的开发工具中运行ant4、 源码目录结构+-etc 配置文件+-build 编译脚本+-src 源文件+com.linkage.quickstart.bean 业务逻辑+com.linkage.quickstart.view 页面逻辑+com.linkage.quickstart.util 工具文件+- web 页面文件+- component 公共文件(来自component项目中)5、 配置Web服务器 配置连接池数据库地址:50数据库名称:bosscrm2用户名/密码:sd_crm1/sdcrm1abc 配置JNDIJNDI必须与WEB-INF/classes/application.xml中配的JNDI一致 部署应用6、 运行QuickStart应用2 开发文档编码格式约束 如果是用JDBC实现的数据逻辑,必须需要DAO(关注具体sql的写法)和Bean(关注业务逻辑)文件 代码中不能使用try catch 方法,每个方法原形上写上throws Exception 将异常抛出,由框架统一管理异常 不能使用System.out.println打印输出调试信息,必须用内置的log.debug,log.warn,.log.error输出调试信息 提交版本规范,需要按/*$Id: VipInfo.java,v 1.9 2006/08/02 04:21:35 zhangc Exp $*/这种方式提交 方法需要写注释 每个页面的头文件中,将不再出现 等文件,通过在Body中指定自定义的wade:Body对象2.1.1 搭建新项目1、 复制quickstart应用目录,删掉与新项目无关的文件,留下主要的配置文件2、 目录结构、文件说明+-src 源文件 +-com.linkage.xxx.bean 业务逻辑源文件(xxx目录为新项目目录) +-com.linkage.xxx.view 页面逻辑源文件 +-com.linkage.xxx.util 辅助工具源文件 +-com.linkage.xxx.jwcs 组件类源文件+-web 页面、资源文件 +-styles 样式文件(.css) +-scripts 脚本文件(.js) +-component 公用页面、资源文件 +-WEB-INF +-classes+-lib +-web.xml 需要更改Tapestry的ApplicationServlet的应用名字 +-xxx.application Tapestry配置文件,文件名必须和web.xml配置的ApplicationServlet名字一致+-build 编译脚本文件+-etc 配置文件 +-export 导入、导出配置文件 +-application.xml 应用配置文件注:需要更改project/name的值,保持和web.xml中的配置一样;更改database/jndi, database/username的值,例如: /设置默认的连接名3、 运行ant,安装应用相关组件资源文件4、 在weblogic启动脚本(startWebLogic.cmd)的java 命令中加上参数:-Dorg.apache.tapestry.disable-caching=true -Dorg.apache.tapestry.enable-reset-service=true禁止Tapestry缓存功能,这样修改Html文件后运行程序能够直接生效。5、在服务器Domain下建立目录:upload/attach:存放上传附件upload/image:存放上传图片upload/export:存放定制导出文件upload/import:存放导入失败文件upload/temp:存放临时文件2.1.2 功能实现说明1. 需要的资源1、 业务逻辑类(JAVA) 注:如果业务逻辑是通过JDBC实现的,需要在bean目录新建DAO,Bean文件2、 页面逻辑类(JAVA) 注:衔接页面与业务逻辑,需要建立与页面对应的Java文件3、 页面文件(HTML)4、 页面配置文件(PAGE)衔接页面逻辑类与页面文件的配置文件,主要定义页面逻辑类的路径,以及页面需要使用的数据源,该文件与页面文件同名并存放在同一个目录例如:!-定义数据源,该数据源需要在页面逻辑类中定义5、 将页面配置到Tapestry应用中在application文件中定义页面的路径,如:这样,通过定义的page名字访问页面逻辑类2. 实现一个功能的步骤1、 在.application文件中注册页面的路径2、 编写ScheduleList.page文件3、 在page文件同目录下编写同名HTML文件,如ScheduleList.html4、 根据page文件中指定的文件路径编写java文件5、 编写后台逻辑(如果是JDBC逻辑,需编写Bean和Dao文件,如果调用Tuxedo,需要编写后台程序)6、 配置菜单,在Sidebar.html新增菜单,如:日程管理3. 具体实现功能1. 新增信息 HTML写法(参考quickstart/web/util/ScheduleList.html)说明:icon:图标路径 redirectTo:调用页面(component.util.ScheduleEdit)的方法(querySchedule) JAVA(PAGE)写法(参考quickstart/src/./util/ScheduleEdit.java)public void createSchedule(IRequestCycle cycle) throws Exception PageData pd = getPageData();ScheduleBean bean = new ScheduleBean();bean.createInfo(pd, pd.getData(); /将页面中获取的数据提交给bean的createSchedule方法/如果是从查询界面新开页面,不用考虑传递参数pd.setTransferData(“cond”); /传递一组参数/如果是从查询界面新开页面,只需要设置参数一提示信息,需要跳转的页面和方法不需写redirectToMsg(新增成功, SCHEDULE_LIST, querySchedules); /跳转到页面(SCHEDULE_LIST)的方法(querySchedules)或redirectToMsg(新增成功,选择【继续新增】跳转到日程新增页面,选择【查看详情】跳转到日程详情页面,选择【返回查询】跳转到日程查询页面, new String getPageName(), getPageName(), ITEM_LIST , new String inputItem, queryItem, setQueryCondition , new String 继续新增, 查看详情, 返回查询 ); /成功后根据按钮跳转指定页面 JAVA(BEAN)写法(参考quickstart/src/./util/ScheduleBean.java) public void createSchedule(PageData pd, IData data) throws Exception UtilDAO dao = new UtilDAO(pd); data.put(SCHE_ID, dao.getSequence(SEQ_UTIL_SCHEDULE); /获取SEQUENCE data.put(SCHE_CRSTAFF, pd.getContext().getStaffId(); /获取登陆员工号 data.put(SCHE_CRTIME, common.getSysTime(); /获取当前时间 dao.insert(TF_DM_SCHEDULE, data); /将数据插入表(UTIL_SCHEDULE)中注:所有的数据都是以文本方式导入数据集中,包括时间(可以直接写成yyyy-MM-dd HH:mm:ss这种格式的字符形式)2. 修改信息 HTML写法(参考quickstart/web/./util/ScheduleList.html)说明:跳转页面并传递定义的参数,将会将source指定的对象解析成url传递 JAVA(PAGE)写法(参考quickstart/src/./util/ScheduleEdit.java)public void updateSchedule(IRequestCycle cycle) throws Exception PageData pd = getPageData();UtilBean bean = new UtilBean();bean.updateSchedule(pd, pd.getData();或/主要考虑同一个页面如果打开多次,或者有多个人同时访问,而在你更新之前已有人删除或修改过信息的状态,这样就需要传递目前获取的关键数据列,如主键,状态来识别信息是否能够修改,假如删除了,或者状态已被变更过则不能删除if (bean.updateSchedule(pd, pd.getData(), new String pd.getParamter(“SCHE_ID”), pd.getParameter(“SCHE_STATUS”) common.error(“修改失败,信息在此前已被操作过”);/如果是从查询界面新开页面,不用考虑传递参数pd.setTransferData(“cond”);redirectToMsg(修改成功, SCHEDULE_LIST, querySchedules); JAVA(BEAN)写法(参考quickstart/src/./util/ScheduleBean.java)写法一:根据页面获取的data数据更新表public void updateSchedule(PageData pd, IData data) throws Exception UtilDAO dao = new UtilDAO(pd); dao.update(TF_DM_SCHEDULE, data); /从data中的数据更新至表(UTIL_SCHEDULE)中或dao.save(TF_DM_SCHEDULE, data); /从data中的数据更新至表(UTIL_SCHEDULE);写法二:根据获取的data数据,以及能够识别能否修改的关键列值匹配表中是否有此记录,如果有返回true,否则返回false public boolean updateSchedule(PageData pd, IData data, String values) throws Exception UtilDAO dao = new UtilDAO(pd); if (!dao.update(UTIL_SCHEDULE, data, new String “SCHE_ID”,”SCHE_STATUS, values) return false; /从data中的数据更新至表(UTIL_SCHEDULE)中或if (!dao.save(UTIL_SCHEDULE, data, new String “SCHE_ID”,”SCHE_STATUS, values) return false; /从data中的数据更新至表(UTIL_SCHEDULE);return true;注:1、按主键和指定主键列修改如果,表UTIL_SCHEDULE没有主键或者有多个主键,但希望指定相应的列对数据更新,可以在update、save方法后面加上参数new String “SCHE_ID”, “SCHE_STATE” ,程序将会将根据绑定的列名和值对数据更新,默认没有这个参数的话,是根据表结构主键进行更新如dao.save(UTIL_SCHEDULE, data, new String “SCHE_ID”, “SCHE_STATE” );按SCHE_ID和SCHE_STATE更新data中的数据2、save和update的区别update会将data中的所有数据更新,如果表字段原有的信息在data中没有指定,则这些信息会被清空,而save则会先去查出原记录的所有信息,再将需要更新的数据覆盖后更新通常,如果只是部分更新表字段的数据,则必须用save方法,除非data中的数据已经包含所有需要修改的信息,则用update方法,这样效率会高些3. 删除信息 HTML写法(参考quickstart/web/./util/ScheduleEdit.html) JAVA(PAGE)写法(参考quickstart/src/./util/ScheduleEdit.java)public void deleteSchedule(IRequestCycle cycle) throws Exception PageData pd = getPageData();UtilBean bean = new UtilBean();bean.deleteSchedule(pd, pd.getParameter(sche_id);或/主要考虑同一个页面如果打开多次,或者有多个人同时访问,而在你更新之前已有人删除或修改过信息的状态,这样就需要传递目前获取的关键数据列,如主键,状态来识别信息是否能够修改,假如删除了,或者状态已被变更过则不能删除if (bean.deleteSchedule(pd, pd.getParamter(“SCHE_ID”), pd.getParameter(“SCHE_STATUS”) common.error(“删除失败,信息在此前已被操作过”);/如果是从查询界面新开页面,不用考虑传递参数pd.setTransferData(“cond”);redirectToMsg(删除成功, SCHEDULE_LIST, querySchedules); JAVA(BEAN)写法(参考quickstart/src/./util/ScheduleBean.java)写法一:删除数据 public void deleteSchedule(PageData pd, String sche_id) throws Exception UtilDAO dao = new UtilDAO(pd); IData data = new DataMap(); data.put(SCHE_ID, sche_id); dao.delete(UTIL_SCHEDULE, data); /通过将data中录入的主键数据删除表(UTIL_SCHEDULE)中对应的记录写法二:根据获取的主键数据,以及能够识别能否删除的关键列值匹配表中是否有此记录,如果有返回true,否则返回true public boolean deleteSchedule(PageData pd, String sche_id, String sche_status) throws Exception UtilDAO dao = new UtilDAO(pd); IData data = new DataMap(); data.put(SCHE_ID, sche_id);data.put(SCHE_STATUS, sche_status); if (!dao.delete(UTIL_SCHEDULE, data, new String “SCHE_ID”, “SCHE_STATUS”) return false; /删除记录的同时和传递过来的指定数据列匹配,避免数据已经被修改过状态或已删除注:同修改信息中可以绑定指定列进行删除,如dao.delete(TF_DM_SCHEDULE, data, new String “SCHE_ID”, “SCHE_STATE” );4. 批量操作数据 HTML写法(参考quickstart/web/./util/ScheduleList.html) JAVA(BEAN)写法(参考quickstart/src/./util/UtilBean.java) 1、批量新增public void createSchedules(PageData pd, IDataset dataset) throws Exception UtilDAO dao = new UtilDAO(pd); / 给结果集列表添加数据 for (int i=0; idataset.size(); i+) IData data = (IData) dataset.get(i); data.put(SCHE_ID, dao.getSequence(SEQ_SCHE_ID); data.put(SCHE_STATUS, SCHE_STATUS_NONOTIFY); data.put(CREA_STAFF, pd.getContext().getStaffId(); data.put(CREA_TIME, common.getSysTime(); dao.insert(TF_DM_SCHEDULE, dataset); /指定表名将数据列表批量新增 2、批量删除 public void deleteSchedules(PageData pd, String sches) throws Exception UtilDAO dao = new UtilDAO(pd); /将数组转成结果集列表 IDataset dataset = new DatasetList(); for (int i=0; isches.length; i+) IData data = new DataMap(); data.put(SCHE_ID, schesi); dataset.add(data); dao.delete(TF_DM_SCHEDULE, dataset); /指定表名将数据列表批量删除 5. 查看信息 HTML写法(参考quickstart/web/./util/ScheduleHtml.html) JAVA(PAGE)写法(参考quickstart/src/./util/ScheduleEdit.java)public void querySchedule(IRequestCycle cycle) throws Exception PageData pd = getPageData();UtilBean bean = new UtilBean();IData info = (bean.querySchedule(pd, pd.getParameter(sche_id); /通过获取主键值将查询的数据放入数据源(info)中if (info = null) common.error(“您要查看的数据已不存在”); /如果数据已不存在,需要提示,避免数据已在此前被删除过提示报错setInfo(info); /如果是从查询界面新开页面,不用考虑传递参数pd.setTransferData(“cond”); JAVA(BEAN)写法(参考quickstart/src/./util/ScheduleBean.java) public IData querySchedule(PageData pd, String inst_id) throws Exception UtilDAO dao = new UtilDAO(pd); IData data = new DataMap(); data.put(SCHE_ID, inst_id); return dao.queryByPK(UTIL_SCHEDULE, data); /通过将data中录入的主键数据查询表(UTIL_SCHEDULE)中对应的记录唯一记录注:同修改信息中可以绑定指定列进行查询唯一记录,如dao.queryByPK(UTIL_SCHEDULE, data, new String “SCHE_ID”, “SCHE_STATE” );6. 查询数据 HTML写法(参考quickstart/web/./util/ScheduleList.html) JAVA(PAGE)写法(参考quickstart/src/./util/ScheduleBean.java)public void querySchedules(IRequestCycle cycle) throws Exception PageData pd = getPageData();UtilBean bean = new UtilBean();IDataset dataset = bean.querySchedules(pd, pd.getData(condition, true), pd.getPagination(); /查询出结果集setInfos(dataset); /将结果集放入数据源(infos)中setCondition(pd.getData(“cond”); JAVA(BEAN)写法(参考quickstart/src/./util/ScheduleBean.java)public IDataset querySchedules(PageData pd, IData param, Pagination pagination) throws Exception UtilDAO dao = new UtilDAO(pd);return dao.querySchedules(param, pagination); JAVA(DAO)写法(参考quickstart/src/./util/ScheduleDAO.java)写法一: public IDataset querySchedules(IData param, Pagination pagination) throws Exception param.put(CREA_STAFF, pd.getContext().getStaffId(); SQLParser parser = new SQLParser(param); parser.addSQL(select sche.* from TF_DM_SCHEDULE sche where 1 = 1);parser.addSQL( and to_char(sche.SCHE_TIME, yyyy-mm-dd) = :START_DATE);parser.addSQL( and to_char(sche.SCHE_TIME, yyyy-mm-dd) = :END_DATE); parser.addSQL( and sche.SCHE_STATUS = :SCHE_STATUS);parser.addSQL( and sche.SCHE_TYPE = :SCHE_TYPE);parser.addSQL( and sche.CREA_STAFF = :CREA_STAFF);parser.addSQL( and sche.SCHE_SUBJECT like % | :SCHE_SUBJECT | %);parser.addSQL( order by sche.SCHE_STATUS,sche.CREA_TIME desc);return queryList(parser, pagination);注意:like 的 %必须与变量分开,否则无法正确解析变量写法二: public IDataset querySchedules(IData param, Pagination pagination) throws Exception param.put(CREA_STAFF, pd.getContext().getStaffId(); StringBuffer sql = new StringBuffer(); sql.append(select sche.* from TF_DM_SCHEDULE sche); sql.append ( where sche.CREA_STAFF = :CREA_STAFF); sql.append ( and sche.SCHE_STATUS = :SCHE_STATUS);sql.append ( and sche.SCHE_TYPE = :SCHE_TYPE);sql.append ( order by sche.SCHE_STATUS,sche.CREA_TIME desc);return queryList(sql.toString(), param , pagination);写法三:public IDataset querySchedules(String sche_id, Pagination pagination) throws Exception StringBuffer sql = new StringBuffer(); sql.append(select sche.* from UTIL_SCHEDULE sche);sql.append( where sche.SCHE_STATUS = ? );sql.append( order by sche.SCHE_STATUS,sche.SCHE_CRTIME desc);return queryList(sql.toString(),new Object sche_id , pagination);说明:1、编写sql并执行,注意,这里的sql中的动态数据都是用预处理sql形式,这样可以减少数据库解析sql的时间,以提高运行效率2、pd.getPagination()为获取的分页模型,用来解析分页sql3、在DAO和Bean代码重尽量不要使用pd.getParameter,pd.getData,pd.getPagination等方法,该类数据最好只在page类中使用,如果DAO,Bean中需要使用,需要以方法参数的方式使用,如:bean.queryList(PageData pd, IData param, Pagination pagination);4、如果参数是固定的,建议使用问号形式解析sql,否则建议使用冒号形式5、在展现表格数据时,如果需要用到rowIndex实现表格间隔行的效果,在page中定义7. 导入数据 HTML写法(参考quickstart/web/./util/ScheduleImport.html) 设置form对象属性设置enctype=multipart/form-data /以文件流形式提交服务器,这样服务器可以取到文件流 /选择文件 注:file_name是下载导出模板的名称,file_path是模板文件所在路径 XML配置文件写法1、导入需要的配置文件(参考quickstart/etc/./import/ScheduleList.xml)注:需要关注导入的excel列的输入格式,如最大输入长度,是否必填,日期、金额的格式等(参考quickstart/etc/./export/ScheduleImport.xml)2、导入失败的数据,需要配置的文件注:1、由于失败的数据需要和输入前的保持一致,故最好将所有列的配置设为type=1,将所有的数据生成时不做转换都生成为文本格式,比如:如果设置了type=3(时间类型),并设置了format=yyyy-MM-dd HH:mm,如果导入的数据填的是2007-03-01,但由于指定了类型和格式,导出会将数据转换为2007-03-01 00:00形式,这样就丢失了数据的原有形式。2、导出的配置不需要设定格式 JAVA(PAGE)写法(参考quickstart/src/./util/ScheduleImport.java)public void importSchedules(IRequestCycle cycle) throws Exception PageData pd = getPageData();IDataset dataset = ExcelParser.importExcel(pd, util/ScheduleList.xml, pd.getUploadFile(FILE_PATH).getStream()0; /通过指定的配置文件,以及页面指定的excel导入数据文件取出数据集,如果excel中有多个单元表,则可以通过数据集数组获取数据集注:如果要用到datasrc数据源校验,importExcel方法必须有pd参数/* 执行导入并获取错误的数据 */UtilBean bean = new UtilBean();IDataset failds = bean.importSchedules(pd, dataset);/* 将失败的数据生成excel */if (failds.size() != 0) String file_id = ExcelParser.writeExcelByImport(pd, util/ScheduleImport.xml, new IDataset failds );/* 导入情况汇总,并下载导入失败的数据 */redirectToMsgByPopup(日程批量导入情况:共导入 + dataset.size() + 条,成功 + (dataset.size() - failds.size() + 条,失败 + failds.size() + 条,请击 + ExcelParser.getFailedLinkByImport(file_id, 日程批量导入失败列表.xls) + 下载

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论