已阅读5页,还剩14页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Recruitment项目搭建与开发指南19 / 19Document Revision HistoryVer. No.Ver. DatePrepared ByAffected Section & Summary of Change1.02011-07-08EricLiu()Draft of new document structure & content.2.02011-08-30Eric/Amy/RitaRevise/add 4th chapter contentNote: Template revision history is available below as hidden text. Template Revision HistoryhVer. No.Ver. DatePrepared ByReviewed ByApproved ByAffected Section & Summary of Change Table of Contents1总述41.1介绍41.2结构41.3参考文档41.4软件包42搭建开发环境52.1Recruitment项目52.2Windows环境下工具安装52.2.1开发工具52.2.2数据库工具52.2.3部署工具63开发调试63.1.1导入Eclipse项目63.1.2Tomcat调试设置73.1.3项目部署74初探SpringSide Framework74.1Architect Convention74.2CRUD74.3API doc84.4核心类图84.5数据库分页开发124.6Struts convention插件实践134.7单元测试实践174.8Checkstyle查检代码184.9Sonar平台使用191 总述 这个Project完全基于开源软体springside3.3.4()的环境搭建。开发涉及到的技术有Spring 3 + Hibernate 3 + Struts 2.1 + JSP 2.0 + JQuery + JAX-WS2 (by Apache CXF) + JAX-RS(by Jersey)+ SpringSecurity 3.0。“SpringSide是以Spring Framework为核心,用主流的技术选型、Pragmatic的编程实践来开发JavaEE企业级应用的总结与演示。”摘自springside首页。Recruitment系统是一个Maven2风格的Project。1.1 介绍本文档为Recruitment(暂定)系统开发人员搭建开发环境与开发参考所用。1.2 结构本文档章节结构如下。2th chapter 开发环境搭建3th chapter开发调试4th chapter Framework介绍1.3 参考文档SpringSide官方网站:在Eclipse中调试Maven项目:/entry/debugging-with-maven-jetty-plugin-in-eclipse.htmlMave2简介: /developerworks/cn/education/java/j-mavenv2/section2.htmlSpringSide3技术参考手册:/display/springside3/Reference使用SpringSide3 开发Web项目的全过程:/youxia/archive/2009/07/19/287376.html1.4 软件包第三方软件地址Eclipse3.5+(junit4.0)无Eclipse svn plugin无Ant1.8.1$recuritmenttoolsantapache-ant-1.8.1Maven3.0.3$recuritmenttoolsmavenapache-maven-3.0.3Mysqljdbc:mysql:/ 28/interview_system?useUnicode=true&characterEncoding=utf-8项目Recruitment SVNsvn:/28/svndata/interview_system/03.CodeSonar(代码质量管理平台)28:9000单元测试报告28:8080/recruitment/report/html/index.htmlRedmine(项目管理工具*论坛*)28:3000/projects/recruitmentNexus(管理maven仓库的server)28:8080/nexusPsp/tsp无Recuritment系统(Our project)28:8080/recruitment2 搭建开发环境2.1 Recruitment项目项目的SVN地址:svn:/28/svndata/interview_system/03.CodeRun recruitment_start.bat脚本:脚本会通过maven从nexus server 上28:8080/nexus/content/groups/public下载第三方依赖到本机,目录在C:Users用户名.m22.2 Windows环境下工具安装2.2.1 开发工具 JDK1.6(设置JAVA_HOME) Eclipse3.5及以上版本,需要安装SVN插件。 Recruitment项目tools目录自带了Ant以及Maven(2.2/3.0)o Ant(设置Path)一些bat档利用Ant做些Task:初始化数据库、项目部署tomcat7.0o Maven(设置Path)利用此工具做library管理、项目生命周期管理。2.2.2 数据库工具 开发环境及正式环境均选用mysql数据库。jdbc.driver=com.mysql.jdbc.Driverjdbc.url=jdbc:mysql:/localhost/interview_system?useUnicode=true&characterEncoding=utf-8jdbc.username=rootjdbc.password=roothibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect Mysql脚本位置:2.2.3 部署工具 recuritment开发环境选用的部署工具是tomcat7或tomcat6。3 开发调试3.1.1 导入Eclipse项目 从SVN server checkout 代码到eclipse 的workspace: 1) 设置classpath variables 为了保证recruitment项目编译成功,需要设置classpath variables:Set M2_REPO Classpath var,它的值是Maven默认仓库目录(vista系统 C:Users用户名.m2repository)。2) Mysql驱动设置将C:Userstaliu.m2repositorymysqlmysql-connector-java5.1.15 mysql-connector-java-5.1.15放到tomcat的lib目录下。3.1.2 Tomcat调试设置 请参考/3.1.3 项目部署正式环境部署:请参照build.xml与linux.deploy.readme.txt 文件。4 初探SpringSide Framework4.1 Architect Convention请参考/display/SpringSide3/Architect+Convention+Overview4.2 CRUD请参考/display/SpringSide3/CRUD/display/SpringSide3/Hibernate+Tools4.3 API doc 官网未提供,可以参考源码。1) 在springside-3.3.4modulescoresrc 下2) maven仓库有打包好的如下图 springside3-core-3.3.4-sources.jar 透过javadoc.exe生成了SpringSide3.3.4_API_DOC.zip 文档,可以参考。4.4 核心类图1.public class SimpleHibernateDaoextends java.lang.Object封装Hibernate原生API的DAO泛型基类. 可在Service层直接使用, 也可以扩展泛型DAO子类使用, 见两个构造函数的注释. 参考Spring2.5自带的Petlinc例子, 取消了HibernateTemplate, 直接使用Hibernate原生API. Author: calvin Constructor SummarySimpleHibernateDao() 用于Dao层子类使用的构造函数.SimpleHibernateDao(org.hibernate.SessionFactorysessionFactory, java.lang.ClassentityClass) 用于用于省略Dao层, 在Service层直接使用通用SimpleHibernateDao的构造函数.Method SummaryintbatchExecute(java.lang.Stringhql, java.util.Mapvalues) 执行HQL进行批量修改/删除操作.intbatchExecute(java.lang.Stringhql, java.lang.Object.values) 执行HQL进行批量修改/删除操作.org.hibernate.CriteriacreateCriteria(org.hibernate.criterion.Criterion.criterions) 根据Criterion条件创建C.hibernate.QuerycreateQuery(java.lang.StringqueryString, java.util.Mapvalues) 根据查询HQL与参数列表创建Query对象.org.hibernate.QuerycreateQuery(java.lang.StringqueryString, java.lang.Object.values) 根据查询HQL与参数列表创建Query对象.voiddelete(PKid) 按id删除对象.voiddelete(Tentity) 删除对象.org.hibernate.Criteriadistinct(org.hibernate.Criteriacriteria) 为Criteria添加distinct .hibernate.Querydistinct(org.hibernate.Queryquery) 为Query添加distinct transformer.java.util.Listfind(org.hibernate.criterion.Criterion.criterions) 按Criteria查询对象列表. java.util.Listfind(java.lang.Stringhql, java.util.Mapvalues) 按HQL查询对象列表. java.util.Listfind(java.lang.Stringhql, java.lang.Object.values) 按HQL查询对象列表.java.util.ListfindBy(java.lang.StringpropertyName, java.lang.Objectvalue) 按属性查找对象列表, 匹配方式为相等.TfindUnique(org.hibernate.criterion.Criterion.criterions) 按Criteria查询唯一对象. XfindUnique(java.lang.Stringhql, java.util.Mapvalues) 按HQL查询唯一对象. XfindUnique(java.lang.Stringhql, java.lang.Object.values) 按HQL查询唯一对象.TfindUniqueBy(java.lang.StringpropertyName, java.lang.Objectvalue) 按属性查找唯一对象, 匹配方式为相等.voidflush() Flush当前Session.java.util.Listget(java.util.Collectionids) 按id列表获取对象列表.Tget(PKid) 按id获取对象.java.util.ListgetAll() 获取全部对象.java.util.ListgetAll(java.lang.StringorderByProperty, booleanisAsc) 获取全部对象, 支持按属性行序.java.lang.StringgetIdName() 取得对象的主键名.org.hibernate.SessiongetSession() 取得当前S.hibernate.SessionFactorygetSessionFactory() 取得sessionFactory.voidinitProxyObject(java.lang.Objectproxy) 初始化对象.booleanisPropertyUnique(java.lang.StringpropertyName, java.lang.ObjectnewValue, java.lang.ObjectoldValue) 判断对象的属性值在数据库内是否唯一.voidsave(Tentity) 保存新增或修改的对象.voidsetSessionFactory(org.hibernate.SessionFactorysessionFactory) 采用Autowired按类型注入SessionFactory, 当有多个SesionFactory的时候在子类重载本函数.2.public class HibernateDaoextends SimpleHibernateDao封装SpringSide扩展功能的Hibernat DAO泛型基类. 扩展功能包括分页查询,按属性过滤条件列表查询. 可在Service层直接使用,也可以扩展泛型DAO子类使用,见两个构造函数的注释. Author: calvin Constructor SummaryHibernateDao() 用于Dao层子类的构造函数.HibernateDao(org.hibernate.SessionFactorysessionFactory, java.lang.ClassentityClass) 用于省略Dao层, Service层直接使用通用HibernateDao的构造函数.Method Summaryjava.util.Listfind(java.util.Listfilters) 按属性过滤条件列表查找对象列表.java.util.ListfindBy(java.lang.StringpropertyName, java.lang.Objectvalue, PropertyFilter.MatchTypematchType) 按属性查找对象列表,支持多种匹配方式.PagefindPage(Pagepage, org.hibernate.criterion.Criterion.criterions) 按Criteria分页查询.PagefindPage(Pagepage, java.util.Listfilters) 按属性过滤条件列表分页查找对象.PagefindPage(Pagepage, java.lang.Stringhql, java.util.Mapvalues) 按HQL分页查询.PagefindPage(Pagepage, java.lang.Stringhql, java.lang.Object.values) 按HQL分页查询.PagegetAll(Pagepage) 分页获取全部对象.4.5 数据库分页开发举例:cvList的分页1) 创建公共的Page类,文件位置如下:2) 创建公共有js文件,文件位置如下:3) 点击CV List,访问是src/main/java里erview.web.action.CvAction.java,代码如下:page=new Page();page.setCapacity(10);/每页要显示的条数是10条page.setPageNo(1); /访问的是第1页page = candidateService.getAllCv(page);4) 最终访问的是src/main/java里erview.web.dao.CandidateDao.java.代码如下:public Page getAllCv(Page page)throws ExceptionList list=null;Query query=null;query =getSession().createSQLQuery(ALLCV_STRING).addEntity(Candidate.class);page.setTotalRows(query.list().size();int firstResult=page.getOffset(); /从第几条开始访问int maxResults=page.getCapacity();/访问多少条list=query.setFirstResult(firstResult).setMaxResults(maxResults).list();page.setValue(list);/返回的集合做为page对象返回return page;5) 首次返回页面interview/cv.jsp,页面的代码如下:/*showPageStrNum(总页数,当前是第几页,可以显示的数字数量,请求地址,请求参数)*/showPageStrNum($page.totalPages, 1, 5, ajax/cv.action,);6) 当点击分页后,访问src/main/java里erview.ajax.web.action.CvAction.java,代码如下:public String list() throws Exception page=new Page();page.setCapacity(10);page.setPageNo(pageNo);page = candidateService.getAllCv(page);if(page.getValue().size()=0)pageNo=pageNo-1;if(pageNo=0) pageNo=1;page.setPageNo(pageNo);page = candidateService.getAllCv(page);return SUCCESS;7) 返回到的页面是ajax/cv.jsp,页面代码如下:showPageStrNum($page.totalPages, $page.pageNo, 5, ajax/cv.action,);4.6 Struts convention插件实践举例:convention-plugin的约定:1. 默认所有的结果页面都存储在web-inf/content下,你可以通过设置struts.convention.result.path这个属性的值来改变到其他路径。如: 则将路径配置到了web-inf/page 下。 默认包路径包含action,actions,struts,struts2的所有包都会被struts作为含有action类的路径来搜索。你可以通过设置struts.convention.package.locators属性来修改这个配置。如: 则定义了在项目中,包路径包含web和action的将被视为action存在的路径来进行搜索。com.ustb.web.*/com.ustb.action.*都将被视为含有action的包路径而被搜索。 接着,convention从前一步找到的package以及其子package中寻找 com.opensymphony.xwork2.action 的实现以及以action结尾的类:1.ducts.display(implementscom.opensymphony.xwork2.action)3.pany.details.showcompanydetailsaction 命名空间。从定义的.package.locators标示开始到包结束的部分,就是命名空间。举个例子:com.ustb.web.user.useraction的命名空间是:”/user”。com.ustb.web.user.detail.useraction的命名空间是:”/user/detail”convention通过如下规则确定url的具体资源部分:去掉类名的action部分。然后将将每个分部的首字母转为小写,用-分割,你可以设置.separator 如:还是举个例子:useraction-user userdetailaction -user-detail。结合上面的。对于com.ustb.web.user.detail.userdetailaction,映射的 url就是/web-inf/content/user/detail/user-detail.jspstruts支持.jsp .html .htm .vm格式的文件。下面是action和结果模版的映射关系:url result file that could match result type /hellosuccess/web-inf/content/hello.jspdispatcher/hellosuccess/web-inf/content/hello-success.htm dispatcher/hellosuccess/web-inf/content/hello.ftl freemarker/hello-worldinput/web-inf/content/hello-world-input.vmvelocity/test1/test2/helloerror/web-inf/content/test/test2/hello-error.htmldispatcher以上的内容来自struts2的文档/2.1.6/docs/convention-plugin.html 当然,简单的通过默认的方式来进行配置不能完全满足实际项目的需要。所幸,convention的零配置是非常灵活的。通过action注释 对如下例子:1.packagecom.example.web;3.importcom.opensymphony.xwork2.action;4.importcom.opensymphony.xwork2.actionsupport;6.publicclasshelloactionextendsactionsupport7.action(action1)8.publicstringmethod1()9.returnsuccess;10.12.action(/user/action2)13.publicstringmethod2()14.returnsuccess;15.16.通过action注释后 方法名 action注释后调用路径 action注释 后映射路径 method1 /action1!method1.action. /web-inf/content/action1.jsp method1 /user/action2!method2.action /web-inf/content/user/action2.jsp 通过actions注释 1.packagecom.example.web;3.importcom.opensymphony.xwork2.actionsupport;4.importorg.apache.struts2.convention.annotation.action;5.importorg.apache.struts2.convention.annotation.actions;7.publicclasshelloactionextendsactionsupport8.actions(9.action(/different/url),10.action(/another/url)11.)12.publicstringmethod1()13.return“error”;14. 我们可以通过:/different/url!method1.action 或 /another/url!method1.action 来调用method1 方法。对应的映射路径分别是/web-inf/content/different/url-error.jsp; /web-inf/content/another/url-error.jsp 可能误导了大家,一个方法被action注释后,只是多了一种调用方式,而不是说覆盖了原来的调用方式。比如对于如下例子:packagecom.example.web;3.importcom.opensymphony.xwork2.actionsupport;4.importorg.apache.struts2.convention.annotation.action;5.importorg.apache.struts2.convention.annotation.actions;7.publicclasshelloactionextendsactionsupport8.action(/another/url)9.publicstringmethod1()10.return“error”;11. 1.我们调用method1方法可以通过两种方式:/hello!method1.action 映射 url:/web-inf/content/hello-error.jsp /another/url!method1.action 映射 url:/web-inf/content/another/url-error.jsp 可见,两种方式均可对method1方法进行调用,唯一的区别就是,两种调用的映射是不一样的,所以,想跳转到不同的界面,这是一个非常好的选择。通过namespace 注释1.packagecom.example.web;3.importcom.opensymphony.xwork2.actionsupport;4.importorg.apache.struts2.convention.annotation.action;5.importorg.apache.struts2.convention.annotation.actions;6.namespace(/other)7.publicclasshelloworldextendsactionsupport9.publicstringmethod1()10.return“error”;11.12.action(url)13.publicstringmethod2()14.return“error”;15.16.17.action(/different/url)18.publicstringmethod3()19.return“error”;20.21.通过 /other/hello-world!method1.action 访问method1 方法。通过 /other/url!method2.action 访问method2 方法通过 /different /url!method3.action 访问method3 方法 与action 注释不同的是,该注释覆盖了默认的namespace(这里是/),此时再用hello!method1.action 已经不能访问method1 了.results和result 1 全局的(global)。 全局results可以被action类中所有的action分享,这种results在action类上使用注解进行声明。1.packagecom.example.actions;3.importcom.opensymphony.xwork2.actionsupport;4.importorg.apache.struts2.convention.annotation.action;5.importorg.apache.struts2.convention.annotation.actions;6.importorg.apache.struts2.convention.annotation.result;7.importorg.apache.struts2.convention.annotation.results;9.results(10.result(name=failure,location=/web-inf/fail.jsp)11.)12.publicclasshelloworldextendsactionsupport13.publicstringmethod1()14.return“failure”;15.16.action(/different/url)17.publicstringmethod2()18.return“failure”;19.20.21.当我们访问 /hello -world !method1.action 时,返回 /web-inf/fail.jsp 当我们访问 /hello -world !method2.action 时,返回 /web-inf/fail.jsp 当我们访问 /different/url!method2.action 时,返回 /web-inf/fail.jsp 2 本地的(local)。 本地results只能在action方法上进行声明。1.packagecom.example.actions;3.importcom.opensymphony.xwork2.actionsupport;4.importorg.apache.struts2.convention.annotation.action;5.importorg.apache.struts2.convention.annotation.actions;6.importorg.apache.struts2.convention.annotation.result;7.importorg.apache.struts2.convention.annotation.results;8.9.publicclasshelloworldextendsactionsupport10.action(value=/other/bar,results=result(name=error,location=,type=redirect)11.publicstringmethod1()12.return“error”;13.14. 当我们调用 /he
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 城市景观提升改造工程经济效益和社会效益分析报告
- 2025山东广饶经济开发区所属国有公司招聘13人笔试历年典型考点题库附带答案详解试卷3套
- 2025安徽安庆市潜山市潜润国有资本投资运营集团有限公司招聘(第二批)综合笔试历年常考点试题专练附带答案详解试卷3套
- 污水处理厂尾水深海排放工程环境影响报告书
- 输电线路迁改项目环境影响评估方案
- 老旧小区改造及城市更新工程节能评估报告
- 2025中国出口信用保险公司校园招聘100人笔试历年备考题库附带答案详解试卷3套
- 丰城市公务员考试熊熙试题及答案
- 法律硕士参加公务员考试试题及答案
- 2025年及未来5年市场数据中国小儿退热口服液行业市场深度调查及发展前景研究预测报告
- 糖尿病患者饮食指导及健康宣教
- 电气开关知识培训课件
- 人工智能+智慧环保水质监测与分析系统研究报告
- “泰山杯”山东省网络安全职业技能竞赛理论试题及答案
- 印刷安全培训课件
- 2025年及未来5年中国家政服务市场运行态势及行业发展前景预测报告
- 掌控安全培训课件
- 老年病的中西医结合治疗
- 2024郑州工业安全职业学院教师招聘考试真题及答案
- DB65T 3321-2011 沙冬青栽培技术规程
- 长津湖电影课件
评论
0/150
提交评论