专题资料(2021-2022年)Recruitment项目搭建与开发指南V2.doc
RecruitmentRecruitment 项目搭建项目搭建与开发指南与开发指南HP RestrictedPage 2 of 20 Copyright 2009 Hewlett-Packard Development Company,L.PValid agreement required.Document 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 4thchapter contentNote:Template revision history is available below as hidden text.Template Revision HistoryhVer.No.Ver.DatePreparedByReviewed By Approved ByAffected Section&Summary of ChangeHP RestrictedPage 3 of 20 Copyright 2009 Hewlett-Packard Development Company,L.PValid agreement required.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 Framework.74.1Architect Convention.74.2CRUD.74.3API doc.84.4核心类图.84.5数据库分页开发.124.6Struts convention 插件实践.134.7单元测试实践.174.8Checkstyle 查检代码.184.9Sonar 平台使用.19HP RestrictedPage 4 of 20 Copyright 2009 Hewlett-Packard Development Company,L.PValid agreement required.1 1总述总述这个 Project 完全基于开源软体 springside3.3.4(http:/)的环境搭建。开发涉及到的技术有 Spring 3+Hibernate 3+Struts 2.1+JSP 2.0+JQuery+JAX-WS2(by Apache CXF)+JAX-RS(byJersey)+SpringSecurity 3.0。“SpringSide是以是以Spring Framework为核心,用主流的技术选型、为核心,用主流的技术选型、Pragmatic的编程实践来开的编程实践来开发发JavaEE企业级应用的总结与演示企业级应用的总结与演示。”摘自 springside 首页。Recruitment 系统是一个 Maven2 风格的 Project。1.1介绍介绍本文档为 Recruitment(暂定暂定)系统系统开发人员搭建开发环境与开发参考所用。1.2结构结构本文档章节结构如下。2thchapter 开发环境搭建3thchapter 开发调试4thchapter Framework 介绍1.3参考文档参考文档SpringSide 官方网站:http:/在 Eclipse 中调试 Maven 项目:http:/ 简介:http:/ 技术参考手册:http:/ SpringSide3 开发 Web 项目的全过程:http:/ svn plugin无Ant1.8.1$recuritmenttoolsantapache-ant-1.8.1Maven3.0.3$recuritmenttoolsmavenapache-maven-3.0.3Mysqljdbc:mysql:/16.173.244.228/interview_system?useUnicode=true&characterEncoding=utf-8项目 Recruitment SVNsvn:/16.173.244.228/svndata/interview_system/03.CodeSonar(代码质量管理平台)http:/16.173.244.228:9000单元测试报告http:/16.173.244.228:8080/recruitment/report/html/index.htmlRedmine(项目管理工具*论坛*)http:/16.173.244.228:3000/projects/recruitmentNexus(管理 maven 仓库的 server)http:/16.173.244.228:8080/nexusHP RestrictedPage 5 of 20 Copyright 2009 Hewlett-Packard Development Company,L.PValid agreement required.Psp/tsp无Recuritment 系统(Ourproject)http:/16.173.244.228:8080/recruitment2 2搭建开发环境搭建开发环境2.1Recruitment 项目项目项目的 SVN 地址:svn:/16.173.244.228/svndata/interview_system/03.CodeRun recruitment_start.bat 脚本:脚本会通过 maven 从 nexus server 上http:/16.173.244.228:8080/nexus/content/groups/public 下载第三方依赖到本机,目录在 C:Users用户名.m22.2Windows 环境下工具安装环境下工具安装2.2.1开发工具开发工具JDK1.6(设置 JAVA_HOME)Eclipse3.5 及以上版本,需要安装 SVN 插件。Recruitment 项目 tools 目录自带了 Ant 以及 Maven(2.2/3.0)oAnt(设置 Path)一些 bat 档利用 Ant 做些 Task:初始化数据库、项目部署 tomcat7.0oMaven(设置 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=rootHP RestrictedPage 6 of 20 Copyright 2009 Hewlett-Packard Development Company,L.PValid agreement required.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialectMysql 脚本位置:2.2.3部署工具部署工具recuritment 开发环境选用的部署工具是 tomcat7 或 tomcat6。3 3开发调试开发调试3.1.1导入导入 Eclipse 项目项目从 SVN server checkout 代码到 eclipse 的 workspace:1)设置设置 classpath variables为了保证 recruitment 项目编译成功,需要设置 classpath variables:HP RestrictedPage 7 of 20 Copyright 2009 Hewlett-Packard Development Company,L.PValid agreement required.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.2Tomcat 调试设置调试设置请参考 http:/m2eclipse.sonatype.org/3.1.3项目项目部署部署正式环境部署:请参照 build.xml 与 linux.deploy.readme.txt 文件。4 4初探初探 SpringSideSpringSide FrameworkFramework4.1Architect Convention请参考 http:/ http:/ RestrictedPage 8 of 20 Copyright 2009 Hewlett-Packard Development Company,L.PValid agreement required.4.3API 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.ObjectHP RestrictedPage 9 of 20 Copyright 2009 Hewlett-Packard Development Company,L.PValid agreement required.封装 Hibernate 原生 API的 DAO 泛型基类.可在 Service层直接使用,也可以扩展泛型 DAO 子类使用,见两个构造函数的注释.参考 Spring2.5自带的Petlinc例子,取消了 HibernateTemplate,直接使用 Hibernate原生 API.Author:calvinConstructor SummarySimpleHibernateDao()用于 Dao层子类使用的构造函数.SimpleHibernateDao(org.hibernate.SessionFactory sessionFactory,java.lang.Class entityClass)用于用于省略 Dao层,在 Service 层直接使用通用 SimpleHibernateDao 的构造函数.Method Summaryint batchExecute(java.lang.String hql,java.util.Map values)执行 HQL 进行批量修改/删除操作.int batchExecute(java.lang.String hql,java.lang.Object.values)执行 HQL 进行批量修改/删除操作.org.hibernate.Criteria createCriteria(org.hibernate.criterion.Criterion.criterions)根据 Criterion 条件创建 Criteria.org.hibernate.Query createQuery(java.lang.String queryString,java.util.Map values)根据查询 HQL 与参数列表创建 Query 对象.org.hibernate.Query createQuery(java.lang.String queryString,java.lang.Object.values)根据查询 HQL 与参数列表创建 Query 对象.void delete(PK id)按 id删除对象.void delete(T entity)删除对象.org.hibernate.Criteria distinct(org.hibernate.Criteria criteria)为 Criteria 添加 distinct transformer.org.hibernate.Query distinct(org.hibernate.Query query)为 Query 添加 distinct transformer.java.util.List find(org.hibernate.criterion.Criterion.criterions)按 Criteria 查询对象列表.HP RestrictedPage 10 of 20 Copyright 2009 Hewlett-Packard Development Company,L.PValid agreement required.java.util.List find(java.lang.String hql,java.util.Map values)按 HQL 查询对象列表.java.util.List find(java.lang.String hql,java.lang.Object.values)按 HQL 查询对象列表.java.util.List findBy(java.lang.String propertyName,java.lang.Object value)按属性查找对象列表,匹配方式为相等.T findUnique(org.hibernate.criterion.Criterion.criterions)按 Criteria 查询唯一对象.X findUnique(java.lang.String hql,java.util.Map values)按 HQL 查询唯一对象.X findUnique(java.lang.String hql,java.lang.Object.values)按 HQL 查询唯一对象.T findUniqueBy(java.lang.String propertyName,java.lang.Object value)按属性查找唯一对象,匹配方式为相等.void flush()Flush 当前 Session.java.util.List get(java.util.Collection ids)按 id列表获取对象列表.T get(PK id)按 id获取对象.java.util.List getAll()获取全部对象.java.util.List getAll(java.lang.String orderByProperty,boolean isAsc)获取全部对象,支持按属性行序.java.lang.String getIdName()取得对象的主键名.org.hibernate.Session getSession()取得当前 Session.org.hibernate.SessionFactory getSessionFactory()取得 sessionFactory.void initProxyObject(java.lang.Object proxy)初始化对象.HP RestrictedPage 11 of 20 Copyright 2009 Hewlett-Packard Development Company,L.PValid agreement required.boolean isPropertyUnique(java.lang.String propertyName,java.lang.Object newValue,java.lang.Object oldValue)判断对象的属性值在数据库内是否唯一.void save(T entity)保存新增或修改的对象.void setSessionFactory(org.hibernate.SessionFactory sessionFactory)采用Autowired 按类型注入 SessionFactory,当有多个SesionFactory 的时候在子类重载本函数.2.public class HibernateDaoextends SimpleHibernateDao封装 SpringSide扩展功能的 Hibernat DAO 泛型基类.扩展功能包括分页查询,按属性过滤条件列表查询.可在 Service层直接使用,也可以扩展泛型DAO 子类使用,见两个构造函数的注释.Author:calvinConstructor SummaryHibernateDao()用于 Dao层子类的构造函数.HibernateDao(org.hibernate.SessionFactory sessionFactory,java.lang.Class entityClass)用于省略 Dao 层,Service 层直接使用通用 HibernateDao 的构造函数.Method Summaryjava.util.Listfind(java.util.List filters)按属性过滤条件列表查找对象列表.java.util.ListfindBy(java.lang.String propertyName,java.lang.Object value,PropertyFilter.MatchType matchType)按属性查找对象列表,支持多种匹配方式.Page findPage(Page page,org.hibernate.criterion.Criterion.criterions)按 Criteria 分页查询.Page findPage(Page page,java.util.List filters)按属性过滤条件列表分页查找对象.Page findPage(Page page,java.lang.String hql,java.util.Map values)按 HQL 分页查询.HP RestrictedPage 12 of 20 Copyright 2009 Hewlett-Packard Development Company,L.PValid agreement required.Page findPage(Page page,java.lang.String hql,java.lang.Object.values)按 HQL 分页查询.Page getAll(Page page)分页获取全部对象.4.5数据库分页开发数据库分页开发举例举例:cvList 的分页的分页1)创建公共的创建公共的 Page 类,文件位置如下:类,文件位置如下:2)创建公共有创建公共有 js 文件,文件位置如下:文件,文件位置如下:3)点击点击 CV List,访问是访问是 src/main/java 里里 com.hp.interview.web.action.CvAction.java,代码如下:代码如下:page=new Page();page.setCapacity(10);/每页要显示的条数是 10 条page.setPageNo(1);/访问的是第 1 页page=candidateService.getAllCv(page);4)最终访问的是最终访问的是 src/main/java 里里 com.hp.interview.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 里里 com.hp.interview.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)HP RestrictedPage 13 of 20 Copyright 2009 Hewlett-Packard Development Company,L.PValid agreement required.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.6Struts 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 结尾的类:.example.actions.products.display(implements com.opensymphony.xwork2.action)pany.details.showcompanydetailsaction命名空间。从定义的.package.locators 标示开始到包结束的部分,就是命名空间。举个例子:com.ustb.web.user.useraction 的命名空间是:”/user”。com.ustb.web.user.detail.useraction 的命名空间是:”/user/detail”convention 通过如下规则确定 url 的具体资源部分:去掉类名的 action 部分。然后将将每个分部的首字母转为小写,用-分割,你可以设置 struts.convention.action.name.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 和结果模版的映射关系:HP RestrictedPage 14 of 20 Copyright 2009 Hewlett-Packard Development Company,L.PValid agreement required.以上的内容来自struts2 的文档http:/struts.apache.org/2.1.6/docs/convention-plugin.html当然,简单的通过默认的方式来进行配置不能完全满足实际项目的需要。所幸,convention 的零配置是非常灵活的。通过通过action 注释注释对如下例子:1.package com.example.web;3.import com.opensymphony.xwork2.action;4.import com.opensymphony.xwork2.actionsupport;6.public class helloaction extends actionsupport 7.action(action1)8.public string method1()9.return success;10.12.action(/user/action2)13.public string method2()14.return success;15.16.通过action注释后方法名方法名action 注释后调用路径注释后调用路径action 注释注释 后映射路径后映射路径method1/action1!method1.action./web-inf/content/action1.jspmethod1/user/action2!method2.action/web-inf/content/user/action2.jsp通过通过actions 注释注释1.package com.example.web;3.import com.opensymphony.xwork2.actionsupport;4.import org.apache.struts2.convention.annotation.action;5.import org.apache.struts2.convention.annotation.actions;7.public class helloaction extends actionsupport 8.actions(9.action(/different/url),10.action(/another/url)urlresultfile that could matchresult type/hellosuccess/web-inf/content/hello.jspdispatcher/hellosuccess/web-inf/content/hello-success.htmdispatcher/hellosuccess/web-inf/content/hello.ftlfreemarker/hello-worldinput/web-inf/content/hello-world-input.vmvelocity/test1/test2/helloerror/web-inf/content/test/test2/hello-error.htmldispatcherHP RestrictedPage 15 of 20 Copyright 2009 Hewlett-Packard Development Company,L.PValid agreement required.11.)12.public string method1()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 注释后,只是多了一种调用方式,而不是说覆盖了原来的调用方式。比如对于如下例子:package com.example.web;3.import com.opensymphony.xwork2.actionsupport;4.import org.apache.struts2.convention.annotation.action;5.import org.apache.struts2.convention.annotation.actions;7.public class helloaction extends actionsupport 8.action(/another/url)9.public string method1()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.package com.example.web;3.import com.opensymphony.xwork2.actionsupport;4.import org.apache.struts2.convention.annotation.action;5.import org.apache.struts2.convention.annotation.actions;6.namespace(/other)7.public class helloworld extends actionsupport 9.public string method1()10.return“error”;11.12.action(url)13.public string method2()14.return“error”;15.16.17.action(/different/url)18.public string method3()19.return“error”;20.21.HP RestrictedPage 16 of 20 Copyright 2009 Hewlett-Packard Development Company,L.PValid agreement required.通过/other/hello-world!method1.action 访问 method1 方法。通过/other/url!method2.action 访问 method2 方法通过/different/url!method3.action 访问 method3 方法与action 注释不同的是,该注释覆盖了默认的 namespace(这里是/),此时再用hello!method1.action已经不能访问 method1 了.results 和和result1 全局的(全局的(global)。)。全局 results 可以被 action 类中所有的 action 分享,这种 results 在 action 类上使用注解进行声明。1.package com.example.actions;3.import com.opensymphony.xwork2.actionsupport;4.import org.apache.struts2.convention.annotation.action;5.import org.apache.struts2.convention.annotation.actions;6.import org.apache.struts2.convention.annotation.result;7.import org.apache.struts2.convention.annotation.results;9.results(10.result(name=failure,location=/web-inf/fail.jsp)11.)12.public class helloworld extends actionsupport 13.public string method1()14.return“failure”;15.16.action(/different/url)17.public string method2()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.jsp2 本地的(local)。本地 results 只能在 action 方法上进行声明。1.package com.example.actions;3.import com.opensymphony.xwork2.actionsupport;4.import org.apache.struts2.convention.annotation.action;5.import org.apache.struts2.convention.annotation.actions;HP RestrictedPage 17 of 20 Copyright 2009 Hewlett-Packard Development Company,L.PValid agreement required.6.import org.apache.struts2.convention.annotation.result;7.import org.apache.struts2.convention.annotation.results;8.9.public class helloworld extends actio