在参考了admin和jw的意见之后,对改进导航能力有初步构思如下:
以下内容为添加的部分:
1,在具体某一日记中,添加两个链接“本目标的上一篇日记”和“本目标的下一篇日记”。
2,在具体某个“显示目标内容”中,添加“查看该目标日记”和“返回目标列”。
以下内容为修改的部分:
1,从目标列打开“显示目标内容”,由原来的在新浏览器窗口改为在当前窗口打开
这只是在原先基础上的小修小补,一方面是因为这是探索性的试探,另一方面也有我自身能力的原因
各位有什么看法都来说说。
正在关注 Linux 、开源、IT 的个人博客。
在参考了admin和jw的意见之后,对改进导航能力有初步构思如下:
以下内容为添加的部分:
1,在具体某一日记中,添加两个链接“本目标的上一篇日记”和“本目标的下一篇日记”。
2,在具体某个“显示目标内容”中,添加“查看该目标日记”和“返回目标列”。
以下内容为修改的部分:
1,从目标列打开“显示目标内容”,由原来的在新浏览器窗口改为在当前窗口打开
这只是在原先基础上的小修小补,一方面是因为这是探索性的试探,另一方面也有我自身能力的原因
各位有什么看法都来说说。
DAO-数据访问对象(Data Access Object),是将业务逻辑层与持久性数据层解耦的一个集成层模式,它处理与持久性数据(关系数据库、面向对象数据库、纯文件、集成时遇到的遗产或者异类系统)的事务性交互,生成VO-值对象(Value Object)并将其返回给业务逻辑层。这样,业务逻辑层就不需要了解持久性数据的具体操作,而是直接操作值对象。(JSP页面里不会再有Connection conn = DriverManager.getConnection……什么的了)
这样,DAO模式中的四个参与角色就很明白了:
业务对象Business Object
数据访问对象Data Access Object
数据源Data Source
值对象Value Object
DAO模式实际上是一种代理模式,使对象(资源)的访问具有间接性,分类资源层和其他层客户端,如业务层或者表示层。
一个典型的 DAO 实现有以下组件:
一个 DAO 工厂类
一个 DAO 接口
一个实现了 DAO 接口的具体类
数据传输对象(有时称为值对象)
具体的 DAO 类包含访问特定数据源的数据的逻辑。
以上是从Core J2EE Patterns书中DAO一节以及一些网上资料中摘录的,Hibernate作为一个ORM的实现,分离出了持久层的操作,所以也是DAO模式。参照DAO的基本组件构架和“与猫同乐”的那个简单的例子,来分析一下Hibernate的基本构架和关键类。
DAO接口:net.sf.hibernate.Session接口,获取实例的方法SessionFactory.openSession();
Session接口是Hibernate应用的主要接口,一个Session实例是轻量级的,可以轻易的创建和销毁,由于应用程序在调用Hibernate时,会经常性的创建和销毁Session实例,所以Session实例必须是轻量级的。同时,Session不是线程安全的,一个session能并只能被一个线程调用。
Session处理对象的各种持久性操作,如存储、重新载入等,ses.save(princess);
DAO工厂类:net.sf.hibernate.SessionFactory类,生成方法
sessionFactory = new Configuration().configure().buildSessionFactory();
由于Hibernate的配置信息存放在xml里,所以由一个net.sf.hibernate.cfg.Configuration类来完成配置,它的configure()方法将读取hibernate.cfg.xml里的内容,Configuration是使用Hibernate需要的第一个类,以后使用的SessionFactory和Session等多为接口。具体的配置过程参见Configuration类的protected Configuration doConfigure(org.dom4j.Document doc) throws HibernateException;方法。
SessionFactory接口向应用程序提供Session实例,SessionFactory不是轻量级的,所以最好被所有的应用共享,通常为每个数据源创建一个SessionFactory。SessionFactory会处理各个ORM配置XML(Cat.hbm.xml),在它的实现类的构造函数里就载入所有的Mapping配置,见net.sf.hibernate.impl.SessionFactoryImpl的构造函数。
我使用eclipse阅读learndiaryV0.9的时候,遇到了一些问题,我会陆续写出来和需要的人分享。
今天中午,征对程序设计队的5个功能模块提了一点自己以前的思路,仅供朋友们参考。
晚上,在网上下载了“项目开发计划”的模板,写了引言和项目概述两部分。回复了网友的一些日记。
23日收到jw的邮件,获悉自己的任务如下:
4)改善系统的导航功能:目前的系统导航能力太差,以www.javaresearch.org为样板改善系统的导航功能;
功能完成者:poemco 时间7天(3天设计)
我在做分析的时候,有几点疑惑 :
1,什么是导航?
2,改善导航意味着我可以做什么改动?“以www.javaresearch.org为样板”意味着我不能做什么?
对于这两个问题,我也有自己的看法,但是为避免理解偏差,和各位沟通一下,
1,导航是指页面的跳转,链接是其实现手段。导航不是简单的后退。
我认为网站资源(页面)是一个层次关系,比如在“您的目标”的页面中,我看以看到“进行中的目标”,“已完成的目标”,“已退出的目标”。然后我在“进行中的目标”页面中,我可以看到“精读《jsp2.0技术手册》”和“学习日记.......”这两个目标。那么我在子层次页面中可以点击按钮返回到上级层次中,这是上级层次和子层次间的导航,如果我在某个目标下查看某一篇日记,那么我也可以不必返回到上级层次-目标,就可以通过点击链接,看到下一篇或上一篇日记,这是同层次间的导航。
2,对于第二个问题,也是我对自己权限的疑问。
比如,按照我的构想,当用户登陆以后,在第一个页面,他应该可以看到“您的目标”,“所有目标”,“控制面板”三个栏目。如果这样的话,我需要把给我写信,帐号管理等归在新创建的“控制面板”去。但是这样的话,我怕整个项目会乱套了。
参考了大兴的意见
http://www.learndiary.com/disDiaryContentAction.do?goalID=33
http://www.learndiary.com/disDiaryContentAction.do?goalID=67
增加订阅邮件的功能分析设计如下:
(1)把订阅的链接放在“显示目标内容” 这个页面上,功能为设计两个:"订阅目标" "退订目标"
(2)保存订阅信息: 在数据库中单独建一个表(名为usermailgoal)保存“用户ID---目标ID”的订阅关系,涉及到的属性还有订阅的时间,如果用户退订了,则在数据库中删除这条记录;
(3)用户提交日记:用户提交日记后,一方面把日记存入数据库,另一方面则向订阅了对应目标的用户发出电子邮件;过程应该是这样的: 以目标ID为关键搜索usermailgoal表,搜索到用户ID,再根据用户ID得到对应的邮件地址,生成发送邮件地址列表,这样就可以把邮件 发出去了;然后,把发送情况告知写日记的用户,再按原来的流程回到日记列表页面;
第(3)个是大兴的意见,我个人的设计是这样的: 用户提交日记后,把日记存入数据库后就回到日记列表页面,发出电子邮件则由后台线程来处理,而不是等到邮件发出去了才回到日记列表页面,因为如果要发送很多,例如十几到几十封邮件(即使是只有几封)都是很费时的,这样用户会觉得系统得很慢,另外发送邮件过程对于用户来讲透明为好,如果想知道给哪些人发了邮件,则可通过"检索"看哪些用户订阅了这个目标.发送情况如有错误则写入错误日志文件.
请大家多提意见.
我认为,现阶段开发这5个目标有下列目的:完善学习日记开发小组的开发交流平台,增进开发小组成员
之间的协作能力,熟悉学习日记模型的现有运作方式,减轻新版学习日记实施阶段的负担。
我对这5个目标的一些思考,仅作参考:
**********************************************
1、解决learndiaryV0.9的重复提交问题:现有的学习日记不能完全防止用户无意的和熟练者的故意重复
提交,只要用户清除了程序中的“havePosted”提交标志,重复提交的缺口就打开了。效率的考虑,不能用查
数据库记录的方式解决。我在网上找到一篇相关资料仅供参考(我还没有弄懂):
“http://www.softhouse.com.cn/html/200410/2004102516370600001323.html”
**************************************
2、添加开发小组内部成员查看成员资料功能:新的目标,还没有思考过。
**************************************
3、改善系统的登录方式:
我的一点思路:
可以设置cookie在用户机器上保存密码,用户可以选择记住密码,下次访问不必重新输入密码。而且,输
入一个url可以直接以自己的帐号进入。即在页面上部显示用户名和发帖数。
没有登录的用户输入url也可以直接进入指定的页面查看内容,只不过在页面上部显示登录提示框。当用户登录后,就在相
同的位置显示登录欢迎信息和用户的发帖数等等。
可以参照www.delphibbs.com的登录方式实现。
我原先的一点思考(但是基本上还是封闭的作法,不可取,可以参考一下其中的一部分):
http://www.learndiary.com/disDiaryContentAction.do?goalID=73
*************************************
4、改善系统的导航功能:
关于保持访问路径的方法,我想了一点方法,仅供参考:用一个LinkedList对象保存访问路径字符串,其
中的每一个元素是当前路径的字符串,在LinkedList中通过添加元素、查找元素、删除元素可以实现路径的跳
转和回溯。
****************************************
5、增加订阅邮件的功能:
我在先前的一点思考:
http://www.learndiary.com/disDiaryContentAction.do?goalID=33
http://www.learndiary.com/disDiaryContentAction.do?goalID=67
我找到的一点资料:
http://blog.csdn.net/bromon/archive/2004/06/22/22645.aspx
另外一点想法:
保存邮件的集合可以用Set,剔除一个人多个帐号而形成的重复邮件地址;
邮件发送成功后,可以返回报告给哪些人发了邮件;
使用smtp验证。
*********************************************
以上的资料仅供参考,有的方法正确性有待验证。
为了大家交流方便,请大家尽量有详细的注释。能形成文档的东西尽量形成文档。
1.按大兴的包结构建立com.learndiary.website包,把原文件到了进去。资源文件放在了该包下。
2。struts-config.xml中改为<message-resources parameter="com.learndiary.website.application"/>
3.把index.jsp另存为login.jsp。index.jsp中内容全部改动。
4。struts-config.xml中改为
<action path="/logoutAction" type="com.learndiary.website.action.account.LogoutAction">
<forward name="logout" path="/login.jsp" />
又到了工作日,时间变得紧了起来,晚上终于抽出了些时间,完成这个struts程序的测试工作,
既然一起都ok了,大就打开web服务器吧,呵呵 如我所料,尽管在技术路线阶段,已经独立测试了!
STRUTs下还是会出错!找不见路径,访问被拒绝!!呵呵,我想改写一大堆,println()的时候了,尽管
你可以采用apache的log包,可是我还是习惯于这古老的方法!哦! 看问题出来了问题出自
文件名方法用错,改正execute()方法:
FormFile file = fileloadForm.getFile();
String fname=file.getFileName();
现在在运行,一切ok!
如果你在运行这些代码!请记住,在数据库里建立相应的test表!且各列属性和xls文件对应!
看看我们的测试数据!test.xls
主叫 被叫 通话类型 时长 次数 费率 费用 入中继 时间
85752500 88559318 TH003 27 1 0.1 0.1 65535 20040930145557
85752500 88559318 TH003 141 3 0.1 0.3 65535 20040930145207
85752500 83214163 TH003 12 1 0.1 0.1 65535 20040930134052
85752500 83130000 TH003 42 1 0.1 0.1 65535 20040930112756
85752500 13152046566 TH011 30 1 0 0 65535 20040930112940
85752500 013892428846 TH001 48 1 0.3 0.3 65535 20040930112632
85752500 013891019821 TH001 40 1 0.3 0.3 65535 20040930111452
20040930114350 20040930114350 20040930114350 20040930114350 20040930114350 20040930114350 20040930114350 20040930114350 20040930114350
85752500 06632226858 TH001 23 1 0.3 0.3 65535 20040929172140
数据默认时会从第二行读起
一切噢可了吗? 显然没有 别指望只有英文字母和数字的文件就是工作的结束! 还要做什么? 验证中文!
好 先把名称改了,test.xsl ==> 中文.xsl 一切ok!(我们好像忘了一件事,一直都没有累加id,显然id,是自动加上的
,所以在没有关注这问题前,不得不删除表格里的书据,为了下一次录入)!
呵呵在实施改一下数据
主叫 被叫 通话类型 时长 次数 费率 费用 入中继 时间
85752500 88559318 TH003 27 1 0.1 0.1 65535 20040930145557
85752500 88559318 限额是 141 3 0.1 0.3 65535 20040930145207
85752500 83214163 测试1 12 1 0.1 0.1 65535 20040930134052
85752500 83130000 TH003 42 1 0.1 0.1 65535 20040930112756
85752500 13152046566 TH011 30 1 0 0 65535 20040930112940
85752500 013892428846 TH001 48 1 0.3 0.3 65535 20040930112632
看的到数据中出现了两窜中文! 在运行! 呵呵 god 终于不愿站在我这边了,埃! 数据库了的中文数据变成了问号! 呵呵 怎么办! 用各简单的方法吧! 把我们的数据成数据库存储的编码方式!
现在改改我们的read()方法!
case HSSFCell.CELL_TYPE_STRING :
type = "STRING";
valuestr=cell.getStringCellValue();
//valuestr=new String(newstr.getBytes("GB2312"),"UTF-8");
try{
valuestr=new String(valuestr.getBytes("GB2312"),"ISO8859_1");
}
catch(Exception e){}
break;
呵呵 看的到就添加了一句,在运行实施,当然一切噢可了!!!
呵呵 可以睡觉去了!
把名单公布在了公告中。程序设计队的工作已经展开了。而需求分析设计队的工作还在准备中。我们得加油了。
给jw和肖七各发了一封商量工作的信。