版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、 TOC o 1-5 h z HYPERLINK l bookmark1 o Current Document 网络相册开发(1)开发环境、功能设计2 HYPERLINK l bookmark24 o Current Document 网络相册开发(2)Spring,SPA,Hibernate 框架4 HYPERLINK l bookmark278 o Current Document 网络相册开发(3)测试驱动开发(TDD) 13 HYPERLINK l bookmark372 o Current Document 网络相册开发(4) Spring中配置JPA19 HYPERLINK l b
2、ookmark540 o Current Document 网络相册开发(5)标注、Spring的零配置”24 HYPERLINK l bookmark661 o Current Document 网络相册开发(6)ant自动生成数据库27网络相册开发(1) 发环境、功能设计这个网络相册是我第一次使用Flex练手之作,我将把我的设计思路和制作过程 整理出来,算是一个备忘录吧,希望能抛砖引玉得到各位的指正。所使用的技术:Flex, cairngorm, LCDS, Java, Spring, Hibernate, JPA开发环境:MyEclipse6.5Tomcat6.0jdk1.6Mysql
3、Server5.1Flex Builder3.0 无法在 Eclipse3.4、EclipseJEE 等版本上运行LCDSFlash player10 debug 版Cairngorm基础功能1、登录用户新建相册上传照片:实现多相片上传浏览自己的相册、照片:提供多种浏览方式浏览好友相册设置相册权限:私密,好友,开放2、未登录用户浏览开放相册flex设计参考cairngorm中文文档Views:Login-登陆校验Menu-菜单ToolBar-菜单按钮MyAlbumList-我的相册FriendList-好友列表AlbumList-相册列表(开放相册分类列表)PhotoTile-照片预览NewA
4、lbumWindow -新建相册对话框ShowPhotoWindow -欣赏照片UploadPhotoWindow-上传照片对话框Even:DisplayMyAlbumEvenDisplayFriendsAlbumEvenDisplayNewOpenAlbumEvenDisplayOpenAlbumByCatageEvenAddAlbumEvenShowPhotosEvenChangeDisplayEven-改变浏览方式ChangeAuthorityEvenFront Controller:AlbumControllerCommand:DisplayMyAlbumCommandDisplayF
5、riendsAlbumCommandDisplayNewOpenAlbumCommandDisplayOpenAlbumByCatageCommandShowPhotosCommandChangeDisplayCommandChangeAuthorityCommandDelegates:AlbumDelegatePhotoDelegateServices:AlbumServicePhotoServiceSpring+SPA 设计domain:AlbumPhotodao :AlbumDAOPhotoDAO service :AlbumManagerPhotoManger servlet : Fi
6、leUploadServlet搭建基本框架细节参考Flex + LCDS + Java入门教程1、File-New-Flex project2、MyEclipse-Add Web Capabilities3、MyEclipse-Add Spring Capabilitiescairngorm.swc 放入 WEB-INF/flex/user_classes 目录引用类库:commons-lang-2.4.jarcommons-pool-1.4mysql-connector-java-5.1.6.jarSpring和Hibernate共用的一些jar文件发生了版本冲突,删除 WEB-INF/li
7、b/asm-2.2.3.jar网络相册开发(2)pring,SPA,Hibernate框架搭建java代码框架-沸 &rcj 田 net.swtji albumffi dao 由 domain ffi service ffi dao tg domain ffi servicetr servlet ffi utii玄? applicationContext.xml引入辅助类和基类-srcj Q netsw、田 albumj 田 basej tg dao-a jpa! J G&nericDaoJpa.javab Jj GenericDao.javaj t2 domaint Jj BaseDomai
8、njavaj 由 service-田 impl* E GenericManagerJmpljavat 7| G en eri cM a n a g er.j ava田 servlet田utilt E PKgen.javaPKgen 为PKgen为PK生成器Java代码一.PKgen 为PKgen为PK生成器Java代码一.Java代码1. package net.sw.util;2.import java.text.SimpleDateFormat;import java.util.Date;import java.util.HashMap;import java.util.Map;impor
9、t java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock;9. TOC o 1-5 h z /*用来生成唯一的PK*该PK生成器生成19位的唯一 long值,精确到万分之一秒,*最后一位为尾数,用来在集群环境下保证PK的唯一性。*该PK生成虽然依赖于时间,但是在运行过程中改变时间不会影响PK,*但是如果将系统时间后调,然后重新启动,有可能造成PK重复。*该PK生成器不依赖于数据库,相比依赖数据表的PK生成器,速度快, 而且值可读* author Young Yang*/23.public
10、class PKgen (25./* PK生成锁,用来限定同一时刻只有一个线程进入PK生成计算*/privatefinal Lock LOCK = new ReentrantLock();/*初始化时的毫秒数,因为该时间会随系统时间的改变而改变,*所以计算方法为该时间加上通过nanoTime计算出来的时间 差*/private final static Long startMilli = System.currentTimeMi llis();/*初始化时的纳秒数,用来计量时间差,nanoTime不会随着系统时 间的修改而改变*/private final static long startN
11、ano = System.nanoTime();/*记录上一次生成的PK,如果新生成的PK和上次相等,则需要再次生成3.private volatile long lastPK = -1;/private final static SimpleDateFormat dateFormat = new Si mpleDateFormat(/ yyyyMMddHHmmssSSS);private final static SimpleDateFormat dateFormat = new Simp leDateFormat(8./*返回的long PK的尾数,尾数可以用来在集群环境中判断该PK 由哪
12、一个节点产生49.52.*/private int suffix = 0;private static final Map instanceMap = new HashMap();2.public synchronized static PKgen getInstance() ( return getInstance(0);/*单机环境下,应该保证用相同的suffix*在集群环境中,不同的机器必须提供不同的suffix来保证生成 的ID的唯一性4.65.66.唯一标识好*/public synchronized static PKgen getInstance(int suffix) (5.7
13、6.if (!instanceMap.containsKey(suffix) ( pkgen = new PKgen(suffix);instanceMap.put(suffix, pkgen);else (pkgen = instanceMap.get(suffix);return pkgen;77./*78.*返回下一个long 型 PK, format: 2006111423361344491 79.* yyyyMMddHHmmssSSS + Macro Seconds + suffix80.* return long PK81.*/82.public long nextPK() (83
14、.LOCK.lock();84.try (85.long newPK;86.do (87.long pastNano = System.nanoTime() - startNano;/纳秒时间差88.long milliTime = pastNano / 1000000; / 取得毫秒差89.long macroTime = (pastNano / 100000) % 10; /取得微秒第一位,90./计算出来的long PK,精度到万分之一秒(百微妙),加上尾数,一共19位,这是Long.MAX_VALUE的最大位数了91.newPK = Long.parseLong(dateFormat.
15、format(new Date(startMilli92.+ milliTime)93.+ macroTime + suffix);94.95.while (lastPK = newPK); /如果生成的相同,则再次计算96.lastPK = newPK; / 设置 lastPK97.return newPK;98.99.finally (100.LOCK.unlock();101.102.103.public static void main(String args) throws Exception 008.109.110.illis()111.int i = 0;long now = S
16、ystem.currentTimeMillis();while (i+ 10) (System.out.println(pkg.nextPK();System.out.println(Time: + (System.currentTimeM -now);112.如注释所述该PK生成器生成19位的long值,java中的Long在Flex中将转 换为Numbero Flex的Nubmer类型能精确处理的数据只有17位,所以注意43 到46行,我在此处做了一点改动屏蔽了年的前两位,这样生成的PK实际上位 17位。BaseDomainJava代码_package net.sw.base.domain
17、;2.import java.util.Date;4.import javax.persistence.Column;import javax.persistence.Id;import javax.persistence.MappedSuperclass;8.import mons.lang.builder.ToStringBuilder;10.import mons.lang.builder.ToStringStyle;11. TOC o 1-5 h z /*领域对象基类* author vyyv*/18.SuppressWarnings(serial)MappedSuperclasspu
18、blic abstract class BaseDomain implements java.io.Serializabl e 22.public BaseDomain() (/对象有可能是在客户端由flex生成,不会执行这个构造方法,所以不 能在此处添加ID/this.id = PKgen.getInstance(0).nextPK();this.id=new Long(0);28.29. TOC o 1-5 h z /*领域对象编码*/IdColumnLongid;36./*领域对象名称*/ColumnString name;42./*领域对象描述*/ColumnString descri
19、ption;48./*领域对象创建时间*/ColumnDate createtime;54.(setter getter 略)57.GenericDaoJava代码_package net.sw.base.dao;2.import java.io.Serializable;import java.util.List;5./* author vyyv* param *atypevariable* param *the primary key for that type TOC o 1-5 h z */public interface GenericDao (15./*获取所有对象实例* retu
20、rn由所有对象实例组成的List*/List getAll();21.22./*获取一个对象实例*如果不存在抛出 ObjectRetrievalFailureException*param id 对象 ID*return 一个对象实例*see org.springframework.orm.ObjectRetrievalFailureException TOC o 1-5 h z */T get(PK id);31./*判断对象实例是否存在*param id 对象 ID* return - 存在返回true, 不存在返回false*/boolean exists(PK id);38./*保存对
21、象实例-新建或更新*param object需要保存的对象*return保存之后的对象(保存的动作可能会修改对象,例如:ID, createtime) TOC o 1-5 h z */T save(T object);45./*删除对象实例* param id*/void remove(PK id);51.GenericManagerJava代码_package net.sw.base.service;2.import java.io.Serializable;import java.util.List;5./* author vyyv* param *a type variable* par
22、am *the primary key for that type TOC o 1-5 h z */public interface GenericManager (15./*获取所有对象实例* return由所有对象实例组成的List*/List getAll();21./*根据ID获取一个对象实例*paramid 对象 ID*return一个对象实例*/T get(PK id);28./*判断对象实例是否存在*param id 对象 ID* return - 存在返回true,不存在返回false*/boolean exists(PK id);35./*保存对象实例-新建或更新*param
23、 object需要保存的对象*return保存之后的对象(保存的动作可能会修改对象,例如:ID, createtime) TOC o 1-5 h z */T save(T object);42./*删除对象实例* param id*/void remove(PK id);大小:大小:18.5 KB大小: 大小: 28.4 KB网络相册开发(3)则试驱动开发(TDD)测试驱动开发的理论已经提出好多年了,在这里关于他的原理和优势我就不多说 了,我将大略的写一下我在实际中运用TDD的过程。补一个 jar: commons-pool-1.4.jar过程1、搭建测试用例运行环境2、编写接口类3、针对接口
24、类编写测试用例4、实现接口类,编写对应的功能代码5、运行测试6、如不通过,修改直至通过7、循环完成其他功能搭建测试用例运行环境spring采用的依赖注射技术带来的一个主要好处就是你的代码对容器的依赖性 比传统的J2EE开发小得多。配合spring提供的测试框架Spring TestContext Framework,搭建测试用例运行环境变得非常容易。Spring TestContext Framework的详细用法参考Spring2.5参考手册的8.3.7章。BaseTest.javaJava代码_package net.sw;2.import org.springframework.test
25、.context.junit4.AbstractTransact ionalJUnit4SpringContextTests;4.import org.springframework.test.context.ContextConfiguration;6.ContextConfiguration(locations = classpath:applicationContex t.xml )public class BaseTest extends AbstractTransactionalJUnit4Spring ContextTests (public static final int Mo
26、doleSize = 100; 其他测试用例需要继承BaseTest编写接口类 编写接口类同时也明确了需要完成的功能。,田 albumj 由 ciao i AlbumDao.java PhotoDao.javaj 心 domain Tj Al bum java i Photo javaffi service s AlbumManager.java ijj PhotoMan a gerjava bgAlbumDao.javaJava代码_package net.sw.album.dao;2.import net.sw.album.domain.Album;import net.sw.base.d
27、ao.GenericDao;5.public interface AlbumDao extends GenericDao (7.8.AlbumManager.javaJava代码_package net.sw.album.service;2.import net.sw.album.domain.Album;import net.sw.base.service.GenericManager;5.public interface AlbumManager extends GenericManager (7. TOC o 1-5 h z /*设置相册访问权限*paramid 相册 ID*parama
28、uthority 权限值*/public void setAuthority(Long id,int authority);14.针对接口类编写测试用例j ;:5 test* 田 netsw rjj album由而口、T| Al b u m Da oTest.j ava jj PhotoDaoT&stjavaj .jj service :T| AlbumManagerTetjava、jj Ph oto M a n a g erTest.j ava j Sas&T&stjavaAlbumDaoTest.javaJava代码_package net.sw.album.dao;2.import ne
29、t.sw.BaseTest;import net.sw.album.domain.Album;5.import junit.framework.Assert;7.import org.junit.Before;import org.junit.Test;10.import org.springframework.beans.factory.annotation.Autowired;11.12.public class AlbumDaoTest extends BaseTest(14.private Album album;Autowiredprivate AlbumDao albumDao;1
30、8.Beforepublic void init() (this.album = new Album();23.Testpublicvoid testCRUD() (this.album.setName(first photo box);Album newAlbum = this.albumDao.save(this.album);Assert.assertEquals(this.album.getName(), newAlbum.getN ame();29.this.album.setName(first photo box2);Album newAlbum2 = this.albumDao
31、.save(this.album);Assert.assertEquals(this.album.getName(), newAlbum2.get Name();33.Album newAlbum3 = this.albumDao.get(this.album.getId() ;Assert.assertEquals(this.album.getName(), newAlbum3.get Name();36.this.albumDao.remove(this.album.getId();Assert.assertEquals(false,this.albumDao.exists(this.al
32、b um.getId();40.实现接口类,编写对应的功能代码实现的过程及功能代码下几章再讲述。test :it netsw由 albumEH dm。t-旧 serviceJ; BaseTestJava大小:14.2 KB17) AlbumPhoto Daoj :己 domainjj Al bum JavaJj Photo.java4 昌 serviceL Al bum Manager Java大小: 19.4 KB,5 test出 netw* 田 album恒毋dad Albu仕 PotoDaoTesljwa jB serviceJ; Albu mM anager?e5t.ja.vaJ Pi
33、bp-ta Ma nsgerTestjavaJj BaseT叫与3何大小:21.6 KB网络相册开发(4) pring中配置JPA在 src/META-INF 下添力口 persistence.xmlXml代码拿org.hibernate.ejb.HibernatePersistence9.在 Spring 的配置文件 applicationContext.xml 中添加Xml代码吃com.mysql.jdbc.Driverjdbc:mysql:/localhost/sw?c reateDatabaseIfNotExist=true&useUnicode=true&characterE nco
34、ding二utf-8rootmysql7.9.19.这不是唯一一种写法,网络上提供的方法可谓千差万别,我试过大多可用。建议详读 LocalContainerEntityManagerFactoryBean 的 API 文档GenericDaoJpa.javaJava代码_package net.sw.base.dao.jpa;2.import java.io.Serializable;import java.util.Date;import java.util.List;6.import javax.persistence.EntityNotFoundException;8.import ne
35、t.sw.base.dao.GenericDao;10.import net.sw.base.domain.BaseDomain;11.import net.sw.util.PKgen;12.13.import mons.logging.Log;14.import mons.logging.LogFactory;15.import org.springframework.orm.jpa.support.JpaDaoSupport;16.import org.springframework.transaction.annotation.Transactional717. TOC o 1-5 h
36、z /*这个类是所有DAO的基类,所有DAO必须继承这个类* author vyyv* param 对象类名* param 对象主键(ID)的类型*/Transactionalpublic class GenericDaoJpa extends JpaDaoSupport implementsGenericDao (31./* 日志文件使用方法 LogFactory.getLog(getClass()* 来源 Commons Logging*/protected final Log log = LogFactory.getLog(getClass();37.private Class pers
37、istentClass;39. TOC o 1-5 h z /*inheritDoc*/44.public GenericDaoJpa(final Class persistentClass) (this.persistentClass = persistentClass;48./* (inheritDoc*/SuppressWarnings(unchecked)public List getAll() (return getJpaTemplate().find(from + this.persistentClass.getName();2.* inheritDoc */pu
38、blic T get(PK id) (* inheritDoc */id);T entity = getJpaTemplate().find(this.persistentClass,id);0.71.return entity;79.return entity != null;if (entity = null) (String msg = Uh oh, + this.persistentClass+ object with id + id + not found.log.warn(msg);throw new EntityNotFoundException(msg);
39、TOC o 1-5 h z 73./* (inheritDoc*/public boolean exists(PK id) (T entity = getJpaTemplate().find(this.persistentClass,id); TOC o 1-5 h z 81./* (inheritDoc*/85.public T save(T object) (87.if (object.getId()=0) (object.setId(PKgen.getInstance(0).nextPK();object.setCreatetime(new Date();getJpaTemplate()
40、.persist(object);else(getJpaTemplate().merge(object); TOC o 1-5 h z returnobject;/* (inheritDoc TOC o 1-5 h z */public void remove(PK id) (getJpaTemplate().remove(this.get(id);103.注意第88行,一般我们应该在构造方法中添加ID、CreateTime,但是由Flex 生成并传递过来的对象不会走Java的构造方法,所以我改在这里添加。AlbumDaoJpa.javaJava代码_package net.sw.album.
41、dao.jpa;2.import java.util.Date;4.import net.sw.album.domain.Album;import net.sw.album.dao.AlbumDao;import net.sw.base.dao.jpa.GenericDaoJpa;import net.sw.util.PKgen;9.10.import org.springframework.transaction.annotation.Transactional ;11. TOC o 1-5 h z /*相册数据访问实现* author vyyv*/Repository(albumDao)T
42、ransactionalpublic class AlbumDaoJpa extends GenericDaoJpa impl ements AlbumDao (21.public AlbumDaoJpa() (super(Album.class);24.26.Transactional必须要标注,如果缺少事务,JPA将不能提交数据。网络相册开发(5)标注、Spring的零 配置先让我们复习一下常用的标注用于描述hibernate映射关系的标注,告别*.hbm.xmlEntity(name = “*)IdColumn下面四个标注用来定义bean,自动根据bean的类名生成一个首字母小写的 beanComponent 标注普通的 Spring Bean 类Controller标注控制器组件类Service标注业务逻辑组件类Repository标注一个DAO组件类Autowired则是自动注入依赖的类,它会在类路径中找成员对应的类/接口的 实现类,我们在BaseTest.java中使用过的ContextConfiguration用来管理事务的Transactional为保证标记可以运行,进一步修改ApplicationContext.xmlXml代码.菱.mysql.jdbc.Driverjdbc:m
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026山东济南职业学院引进高技能人才2人备考题库附答案详解(突破训练)
- 2026江苏扬州市通享出行服务有限公司职业经理人招聘1人备考题库及答案详解(名校卷)
- 2026陕西北元化工集团股份有限公司供应商招募备考题库及参考答案详解1套
- 2026四川峨眉山市新世纪人才教育投资有限公司招聘机关事业单位编外人员25人备考题库(含答案详解)
- 2026重庆万州区长滩镇非全日制公益性岗位招聘2人备考题库附答案详解(b卷)
- 2026中共西林县委员会社会工作部招聘编外聘用人员8人备考题库参考答案详解
- 2026西安市鄠邑区南关初级中学银龄讲学教师招聘备考题库(8人)及答案详解(基础+提升)
- 2026浙江城建融资租赁有限公司第二次社会招聘4人备考题库附答案详解(突破训练)
- 2026福建南平市大武夷绿谷食品贸易有限公司招聘2人备考题库附答案详解
- 2026贵州省茅台学院招聘1人备考题库附答案详解
- 国家事业单位招聘2025国家药品监督管理局医疗器械技术审评中心招聘4人笔试历年参考题库典型考点附带答案详解(3卷合一)2套试卷
- 免疫失衡纠正机制与治疗策略
- 2025年温州理工学院辅导员考试真题
- DB4404-T 51-2023 软土地区基坑工程周边环境影响控制技术及管理规范
- 针刀医学的四大基本理论培训课件
- 2025年华三硬件笔试题及答案
- 2025年新高考全国一卷政治真题及答案解析(山东、广东等)
- 2025广东广州黄埔区云埔街道办事处面向社会招聘政府聘员、专职网格员及党建组织员15人考试参考试题及答案解析
- 用友U8(V10.1)会计信息化应用教程 (王新玲)全套教案课件
- 2025年招标采购人员专业能力评价考试(招标采购专业实务初、中级)综合练习题及答案一
- 2025年陪诊师考试考试格式试题及答案
评论
0/150
提交评论