JSP Website (maven webapp) using Apache Derby (embedded) Hibernate JPA JUnit Tomcat7 JSP/Servlet实验总结 代码说明 代码使用 TODO: 配置说明: 难(keng)点: 对JPA的理解: 未解决的问题,使用了略麻烦的方式解决: 两种存储方式的对比: 从meta-data change to database的迁移过程: 引用:

使用的技术 Apache Derby 10.6 & Hibernate 3 & JPA. Test with JUnit with log4j & Run on Apache Tomcat 7

MediaVault-pantynopants-github

Mark一下内容以防忘记:
实验一为静态页
实验二为使用xml(.nfo)格式存储媒体信息,将此信息(meta-data)文件和源文件一起上传,解析
实验三为使用database替换xml,并继续完善

结构图与开发流程图

Created with Raphaël 2.1.0
Created with Raphaël 2.1.0Create htmlCreate htmlchange to jspchange to jspdesign service/servlet according to neededdesign service/servlet according to neededSeparate out header/footer/...form to entity
Show Pages:
jsp(TVshow.jsp)
|
servlet(UploadTVServlet)
|
getAlbum/addAlbum(TVDAO)
|
module class(TVshow)

DB得到的数据直接作为bean的属性,可在jsp页面直接调用,显示

Upload*.jsp:

jsp->createAlbum(servlet) 写入类的属性中
        ->createMedia 文件的链接写入类的属性中
            ->DAO(Media location and metaData)类写入DB

!!!上传文件后, 实际存储位置是eclipse的工程目录

代码说明

package myapp.model中为数据库表结构
为方便管理,抽象出了AllResource作为媒体库进行管理
package myapp.service中的InitResource.java为初始数据

代码使用

  1. project -> R click -> add external jars. Then add jdom.jar/smartupload.jar/…, which is in /WenContent/WEB-INF/lib , to it.

  2. maven update. If error occurred, delete local maven folder and retry.

  3. Run as -> run configurations -> tomcat7 -> classpath -> add projects. Then add this project. It can ensure the entitymanager can be used in our project.

TODO:

清理css 修改样式
修改上传路径, 实现上传至服务器
修改upload页使之针对不种类的upload反应不同(session实现)
404页面

(em 指entitymanager)

配置说明:

  1. project->r click->add external jars Then add jdom/smartupload/… to it
  2. run config -> tomcat7运行时配置本工程为依赖库(添加maven的jar包,才能在servlet上使用em
  3. maven刷新。若 失败:删除c盘默认全局jar包存放地址并重新刷新
    以上之后一般即可运行. 不能运行时
  4. .classpath .project 与原文件进行对比-》class即为build path
  5. presist.xml web.xml可以一直不动
    更详细配置见github
    MediaVault-pantynopants-github

难(keng)点:

  • Derby embedded配置
  • pom.xml 错误的id会导致eclipse一直报错无法启动
  • 不要使用eclipse的自带浏览器,每次运行都有缓存,即为上一次的页面。需啊刷新才行
  • em可以传递全局,即指entitymanagerfactory的持有对象会在运行后一直存在
  • web.xml中:<load-on-startup>1 </load-on-startup>的servlet的默认调用方法是无参构造方法
    <load-on-startup>是servlet标签的属性,避免错误使用
  • web.xml的位置不需要再.classpath .project中指定。应该与tomcat配置有关。未遇到问题
  • 注意实体的状态。manager.getTransaction().begin();之后不能出现第二个begin

对JPA的理解:

将对象映射到表里,@OneToMany等annotation表示外键关系,主键由@Id @GeneratedValue(strategy=GenerationType.IDENTITY)生成
更新表通过DAO类来进行。可以把em看成一个set来理解,每次通过主键从这个set中取得表(实体)(entity)

未解决的问题,使用了略麻烦的方式解决:

  • jsp中<jsp:include page="/loadalbum?<%=aaa %>"></jsp:include> 失败的问题: 此处不能使用parameter,对于servlet的parameter应用不同的方式?
    这里使用session避免
    但会有session滥用和清空不及时的隐患

  • 泛型和反射没有写好,如可以把参数定为object类型,传入album track时调用不同的DAO
    以至于servlet过多

两种存储方式的对比:

nfo因为是对xml文件进行解析,因为对xml结构的不了解,这种方式更容易出现数组越界这类错误,且每一种model类需要不同的,而且是较复杂的XML解析文件(如xmlreader)
nfo文件较为固定,无法通过主键唯一标识一个实体,无法通过外键链接实体,只能通过链接/相对路径方式
优点是数据的储存结果可以直接从文件看到,但同时不利于保密

ORM因为直接对类model操作,更加直接方便
缺点是数据库中数据检查需要通过数据库管理软件,不太直观清楚,不方便调试

从meta-data change to database的迁移过程:

因为从新设计了数据结构,采用了不同的model类,因此基本是完全重构,较为困难
首先抛弃所有XML对应工具类,保留并更改了jsp作为view
对于文件上传部分保留
重构全部servlet, util(工具)类,model类

引用:

bootstrap
dropzone.js
Java Persistence (JPA) Tutorial With Hibernate
using hibernate with embedded derby
Hibernate basic example with Apache Derby and Maven
JAVA DERBY AND HIBERNATE 3.X CONFIGURATION USING ANNOTATIONS