JSP/Servlet实验总结
使用的技术 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,并继续完善
结构图与开发流程图
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为初始数据
代码使用
project -> R click -> add external jars. Then add jdom.jar/smartupload.jar/…, which is in /WenContent/WEB-INF/lib , to it.
maven update. If error occurred, delete local maven folder and retry.
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)
配置说明:
- project->r click->add external jars Then add jdom/smartupload/… to it
- run config -> tomcat7运行时配置本工程为依赖库(添加maven的jar包,才能在servlet上使用em
- maven刷新。若 失败:删除c盘默认全局jar包存放地址并重新刷新
以上之后一般即可运行. 不能运行时 - .classpath .project 与原文件进行对比-》class即为build path
- 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