三、具体实现过程: 具体的设计分析过程
我已经在进行的过程中记录在日记中了,所以,如果你要详细的了解
我的分析设计过程的话,可以去看这两篇日记:
第一篇日记:“提高学习日记导航能力的思路”(http://www.learndiary.com/disDiaryContentAction.do?searchDiaryID=&goalID=1128&naviStr=a10a2506ah1167 ),主要记录的是
我在对层次导航部分的分析设计过程;
第二篇日记:“分析学习日记横向导航及开几个窗口的思路”(http://www.learndiary.com/disDiaryContentAction.do?searchDiaryID=&goalID=1167&naviStr=a10a2506ah1128 ),主要记录的是
我在对“上一条”和“下一条”导航部分的分析与设计过程。
当然,细节总是太烦琐和令人不愉快的,
我把大概的设计过程总结如下:
1、层次导航的实现过程:
1)列出导航功能需求列表,看都有哪些导航路径,例如:
(5)所有目标列表->相关日记列表->显示日记内容->编辑评论;
(14)所有目标列表->进行中的目标列表->您的日记列表->显示日记内容->编辑评论;
(21)所有目标列表->检索页面->搜索结果日记列表->相关日记列表->显示日记内容->撰写评论;
全部列表请见
我上面提到的第一篇日记中的“一、学习日记导航路径列举:”(您可以在页面中搜索位置,前后的双引号除外,下同 )。
2)分析定位特定类型的页面所需的参数(这样,就可以根据页面类型和参数唯一的确定一个页面了 ):
经过分析,唯一定位一个页面所需要的参数变为:
1》页面类型;
2》参数ID;
其中参数ID分为下面几种情况:
1》列表:需要列表的parentID;
2》单个条目:需要它的ID;
3》用户的进行、完成等目标列表:什么都不需要,用户ID在Session中;
4》用户的进行、完成等目标的用户日记列表;目标ID,所需的用户ID在Session中;
5》搜索列表:什么都不需要,因为搜索条件字符串已保留在全局Session中了;
具体的分析过程请见
我上面提到的第一篇日记中的“(2 )、如何唯一的定位一个特定的页面呢? ”
3)确定层次导航的实现方法:
当点击一个新的页面时,就把定位这个页面所需的参数加入到层次导航的参数链表中(链表的一个节点储存的是一个新的页面的定位参数 ),这时链表变长;当点击一个在链表中已经存在这种类型的页面(例如:显示一篇日记的内容的页面 )时,就把在导航链表中这个节点及后面的节点删除,再加上这个点击的页面的定位参数。
实现这种层次导航的需求有两种方法:
(1)、为每条导航路径在session中设置一个层次导航所需的属性,在这条路径上导航链表的增长和缩短信息就由这个属性来维持;
(2)、把这个链表封装成字符串,这个字符串在访问不同的页面时,会根据上面的思路不断增长和缩短。把这个封装的字符串连同用户新请求的页面的定位参数节点字符串一起传给请求这个页面前的Struts的action,形成新的页面上导航条所需的编码字符串,然后把这个编码字符串保存在request中,供请求的页面中的下一个链接使用;并同时由action把这个形成的编码导航字符串解码处理成用户请求的页面上需要的导航字符串。
经过分析,
我决定采用第(2 )种方法来实现层次导航。
具体的分析过程请见
我上面提到的第一篇日记中的“
我知道有2种方法可以解决这个问题 ”。
4)进行层次导航系统的设计:
(1)、进行页面节点导航封装字符串格式的设计:
分隔符(用a作分隔符 )+页面节点类型(用一位字符代表,封装成一个页面类型常量类,用字符1-9,英文字符b-z和A-Z表示 )+页面参数ID(如显示目标的日记列表所需的目标ID,显示日记内容所需的日记ID )。如显示一篇日记的页面类型常量为字符:‘h’,那么,显示“解决:
jsp页面中文显示问题”这篇日记内容(ID为292 )这一页面的封装字符串为:ah292;
(2)、页面完整导航字符串的设计:
在下面的讨论中会用到的相关源文件:
负责封装学习日记所需导航的页面的类型常量(/WEB-INF/src/com/learndiary/website/PageTypeConsts.
java );
负责导航字符串封装的方法(/WEB-INF/src/com/learndiary/website/util/Pager.
java中的public static String encodeNaviStr(String naviStr, char toPageType, String parameter) );
当用户提出一个新的页面请求,把当前页面中的完整的导航封装字符串和新的页面的类型和新请求页面的参数ID传给处理新页面显示前的Struts中的Action中,由Action调用一个方法,负责把这些参数组装成下一新页面所需的导航字符串。如:当前正显示的页面是“系统导航:所有目标>>
我进行中的目标>>目标:一起学习Struts(MVC)
我的日记列表”中的“目标:一起学习Struts(MVC)
我的日记列表”(图例:http://
java.chinaitlab.com/UploadFiles_8734/200511/20051128145654849.gif ),你可以看到当点击显示日记“解决:
jsp页面中文显示问题 (0篇) ”的URL中的导航字符串为:“naviStr=a10a60a0167”(图例中左下方红圈中 ),把这个字符串和请求的显示日记的页面类型(日记为:‘h’ )和显示这篇日记所需的ID(292 )传给显示日记内容前的Action中(disDiaryContentAction.do,源文件为:/WEB-INF/src/com/learndiary/website/action/disgoal/DisGoalContentAction.
java ),由负责导航字符串封装的方法(源文件为:/WEB-INF/src/com/learndiary/website/util/Pager.
java中的public static String encodeNaviStr(String naviStr, char toPageType, String parameter) )进行处理,处理流程为:以显示日记这个页面的类型ID为‘h’搜索已有导航字符串,没有相同的页面,于是就把这个页面导航字符串节点(ah292 )加到完整的导航字符串(a10a60a0167)后面得到新的导航字符串(a10a60a0167ah292 ),见例图:(http://
java.chinaitlab.com/UploadFiles_8734/200511/20051128145655638.gif ),你可以看到当点击“日记:解决:
jsp页面中文显示问题”这篇日记中的“
我要评论”的URL中的导航字符串为:“naviStr=a10a60a0167ah292”(图例中左下方红圈中 );
当点击当前页面中的回到上级导航节点的链接时,如:“系统导航:所有目标>>
我进行中的目标>>目标:一起学习Struts(MVC)
我的日记列表”中的“
我进行中的目标”,这时显示“
我进行中的目标”页面的类型代码是‘6’,参数ID是“0”,那么以新页面的节点字符串(a60 )的类型代码‘6’搜索已有导航字符串,已经存在相同的类型代码,于是,就把导航字符串中这个节点和后面的所有节点删除得到字符串“a10”,再加上新页面的节点字符串为“a60”,得到显示“
我进行中的目标”页面的导航字符串为“a10a60”,见例图:(http://
java.chinaitlab.com/UploadFiles_8734/200511/20051128145657932.gif ),你可以看到当点击“一起学习Struts(MVC) (19篇)”这篇目标的URL中的导航字符串为:“naviStr=a10a60”(图例中左下方红圈中 );