jsp页面间传递参数(转自网络)

  我想在几个jsp页面间接力传递一个LinkedList参数,这个参数在经过不同的页面时会发生变化。我在网络上发现了实现这种应用的两种方法,特地把它贴在这里备忘:

  第一种方法,使用jsp内置的Session对象来传递:(转自:http://www.7880.com/Info/Article-4616cf60.html)

JSP学习笔记(六)-----在多个JSP页面之间传递参数【大 中 小】【打印】【加入收藏】【关闭】 【收藏到新浪ViVi】【收藏到365KEY】 浏览字号:日期:2005-02-20 人气:4084 出处:CSDN

 

1.       怎么在多个JSP页面之间进行参数传递?需要使用JSP的内置作用域对象session。利用它的两个方法setAttribute(),getAttribute()

2.       下面的这个实例实现了把第一个JSP页面的参数传递给第三个页面的功能

3.       代码如下:1.jsp

<html>

       <form method=get action=2.jsp>

       what's your name<input type=text name=username>

       <input type=submit value=submit>

       </form>

</html>

 

4.       2.jsp

<html>

      

       <form method=post action="3.jsp?pass=11">

       <%

              String name=request.getParameter("username");

              session.setAttribute("username",name);

       %>

       Your name is:<%=request.getParameter("username")%>

       <br>what's your hobby<input type=text name=hobby>

       <input type=submit value=submit>

       </form>

</html>

 

5.       3.jsp

<html>

       your name is:<%=session.getAttribute("username")%>

       <br>

       your hobby is:<%=request.getParameter("hobby")%>

       <br>

       your password is:<%=request.getParameter("pass")%>

       <br>

       </form>

</html>

   第二种方法,利用JavaBean和JSP技术在Web页面中保存和传递数据,(转自:http://www.cnblogs.com/bjzhanghao/archive/2004/08/07/30950.html)

[翻译]JavaBean组件与JSP技术结合

Web架构师Brett McLaughlin向我们展示了怎样利用JavaBean和JSP技术在Web页面中保存和传递数据,以及如何设计可以得到更大的灵活性。

到目前为止,在JSP最佳实践系列里,我们已经讨论了相当一部分基础知识。在前面的两个章节里,你应该学会了如何使用JSP的include机制将网站以外的内容包含在页面或应用程序里。共有两种不同类型的include:静态的include命令和动态的jsp:include标记。

同时,我们还没有涉及到在父页面(在我们的例子中是网站的首页)和被包含内容之间的通信问题。而实际上这种情况是非常普遍的。当你开始建立一个真正的网站或者web应用程序时,通常你会需要这样的通讯机制,举个例子,你的网站可能会在首页产生一些标题一类的小段文字,这些文字要出现在页眉或页脚页面中。在这一部分里,你将学到如何在页面间传递数据,以及如何在被包含的页面中使用这些数据。

注:这部分的全部例子都基于JavaServer Pages技术,为了能运行它们,你需要建立一个JSP兼容的web容器,在你本地计算机或某个用于测试的服务器上都可以。同时,你还要有一个文本编辑器或者集成环境来编写你的JSP页面。

用于保存数据的JavaBean

让我们假想这样的一个网站,在这个网站里每个页面有一小句“口号”(例如“书:装满知识的容器”或者“唱片:值得一听”)和一个标题。父页面(有时也被称作主页面)决定了每一页的口号,但真正产生html输出这个口号的是页眉页面,它是被包含的。要实现这个目的,父页面必须能够把口号传递给页眉页面,页眉页面得到这个口号,将它以页面标题的形式输出。

首先我们需要某种对象来保存被传递的数据,恰好(这并非偶然)JavaBean组件就是这样一个合适的选择,它与JSP技术配合得天衣无缝,简单的使用取值方法和赋值方法就可以控制你要的数据。稍有java编程经验的读者可能已经想到,get()就是一个取值方法,因为它读取数据;而set()是一个赋值方法,因为它改变数据。

列表1展示了我们所需要的一个JavaBean的代码,PageHeaderinfo包含了网站页眉信息。

<![CDATA[

package com.newInstance.site.beans;

import java.io.Serializable;

public class PageHeaderInfo implements Serializable {

     /** The title of the page */

     private String pageTitle;

     /** The slogan of the page */

     private String pageSlogan;

     public String getPageTitle() {

       return pageTitle;

     }

     public void setPageTitle(String pageTitle) {

       this.pageTitle = pageTitle;

     }

     public String getPageSlogan() {

       return pageSlogan;

     }

     public void setPageSlogan(String pageSlogan) {

       this.pageSlogan = pageSlogan;

     }

}

]]>

作为第一个练习,将这个文件保存为PageHeaderInfo.java并编译它。接下来,把得到的class文件PageHeaderInfo.class放在你的web应用程序的WEB-INF/classes目录下。请确保目录包含了包的结构,例如:

$<TOMCAT-ROOT>/webapps/$<WEB-APP-NAME>/WEB-INF/classes/com/newInstance/  site/beans/PageHeaderInfo.class

你可以使用类似这样的路径安排web应用程序中用到的类。按以上步骤做到这里,下面就可以向PageHeaderInfo里存入数据然后在不同的JSP页面中获取了。

传递已保存的数据

在我们的网站里,页眉页面包含向不同页面传递不同口号的代码。查看前面的章节就会发现,页眉页面(header.jsp)是通过jsp:include标记被包含的文件。列表2展示了网站首页如何通过标记把数据传递给header.jsp文件。

<![CDATA[

<%@ page language="java" contentType="text/html" %>

<html>

<head>

     <title>newInstance.com</title>

     <meta http-equiv="Content-Type"

       content="text/html; charset=iso-8859-1" />

     <link href="/styles/default.css" rel="stylesheet" type="text/css" />

</head>

<body>

<jsp:include page="header.jsp" flush="true">

     <jsp:param name="pageTitle" value="newInstance.com"/>

     <jsp:param name="pageSlogan"

       value="Java and XML :: Turning theory into practice" />

</jsp:include>

<%@ include file="/navigation.jsp" %>

<jsp:include page="bookshelf.jsp" flush="true" />

<jsp:include page="/mt-blogs/index.jsp" flush="true" />

<%@ include file="/footer.jsp" %>

</body>

</html>

]]>

可以看出,标题是被传递过去作为口号的。

你可能已经注意到了,在你建立页面的时候,不一定需要JavaBean组件实际存在。我总是先写好JavaBean,有一个很好的理由:JSP参数名必须与JavaBean属性名匹配,先完成JavaBean可以保证你在编写JSP页面时使用合适的参数名称。

获得数据

当你完成了JSP参数和JavaBean属性的编码,一旦数据被传递给header.jsp,这个页面就可以开始获取数据了。列表3展示了header.jsp页面。它的大部分内容是html,请注意里面的JSP脚本,在你研究过这些代码后我会在后面向你解释。

<![CDATA[

<!-- Begin header section -->

<%@ page language="java" contentType="text/html" %>

<jsp:useBean id="pageHeaderInfo"

class="com.newInstance.site.beans.PageHeaderInfo">

     <jsp:setProperty name="pageHeaderInfo" property="*" />

</jsp:useBean>

<table width="100%" border="0" cellspacing="0" cellpadding="0">

     <tr>

       <td width="91" height="50" align="right" valign="top"

           bgcolor="#330066"><font color="#FFFFFF"><img

           src="/images/header-lions.gif"

           width="90" height="60"></font></td>

       <td colspan="3" align="left" valign="top"

           bgcolor="#000000"><table width="100%" height="60" border="0"

           cellpadding="0" cellspacing="0">

           <tr>

             <td width="261" rowspan="2"><img

               src="/images/header-title.gif" width="261" height="60"></td>

             <td class="pagetitle" width="249" height="55" align="right"

               valign="bottom"><jsp:getProperty name="pageHeaderInfo"

               property="pageSlogan"/></td>

             <td width="10" height="55"> </td>

           </tr>

           <tr>

             <td height="5"><img src="/images/spacer.gif" width="1"

               height="5"></td>

             <td height="5"><img src="/images/spacer.gif" width="1"

               height="5"></td>

           </tr>

         </table></td>

       <td width="141" bgcolor="#000000">

         <font color="#FFFFFF"> </font>

       </td>

     </tr>

<!-- End header section -->

]]>

第一行代码标识了该页面为一个JSP页面,然后通过jsp:useBean标记声明需要访问PageHeaderInfo这个JavaBean,id属性为这个bean指定了一个名称,通过该名称可以在JSP页面中使用bean;class属性指定了JavaBean类的全名。相邻的jsp:setProperty标记说明了JavaBean(通过id属性标识)的所有属性都以请求数据赋值,也就是说,为这个bean里的每个属性(例如pagetitle和pageslogan)寻找名称对应的请求参数来赋值。这些请求参数可以来自客户端的浏览器,也可以来自包含这一页的其他JSP页面。在这种情况下,唯一的请求数据是由父页面创建的。对于我们的网站,首页(index.jsp)发送pagetitle和pageslogan,其值分别为“newinstance.com”和“Java and XML: Turning theory into practice”。

一旦bean的属性被赋值后,页面就可以使用这些数据了。对于header.jsp,在后面的代码里可以看到,通过jsp:getProperty标记使用了这些数据。Jsp;getProperty标记通过name参数标识从哪个对象取数据,通过property参数标识取对象的哪一个属性。取得的数据值自动插入到页面的输出,也就是输出到父页面里,从而得到一个无缝的、动态的页面口号,在JSP页面间传递数据就是这么简单!你可以为一个JSP页面增加任意多的bean,每一个bean都可以有任意多的属性,足以应付任何复杂的请求数据。

处理需求变化

改变是软件开发者最大的烦恼,你写好了你的bean,在JSP页面里也写好了使用它们的代码,这时web应用程序的需求似乎不可避免的会发生变化。如果这个改变要求更多的属性(大多数情况都是如此),你不得不改写你的JavaBean源代码,重新编译它,还要确定JSP页面能够正确访问新生成的bean类。有些情况下,你可以不必对bean进行处理,如果保存或获取属性页面不再使用了(也就是说,即使那个页面还在站点的目录里,但你不再使用该页面),这时你可以不用去管原来的代码即可。实际上,我就遇到过这种情况!

我的个人网站的页眉页面header.jsp用于生成html的头部,以前有一段时间里,这一页向我的其他页面头部里的title标记里插入一个标题,后来我做了修改,在header.jsp里不再使用页面标题了。但我并没有从PageHeaderInfo里把pageTitle移除;实际上,我甚至在大部分JSP页面里连jsp:param标记都没有移除,这个标记的作用本来是为页面设置标题的。我认为花这些工夫不值得,因为我确信保留这些数据不会带来任何坏的影响(也许某一天我还会重新用到呢!)。因此,如果你遇到同样的情况,不用浪费时间了--有处理这些琐事的时间不如用来为你的web应用程序增加些新的、有趣的、实用的功能。

下一次

当你熟练掌握了在JSP页面间传递数据的方法后,试着自己写一些有用的JavaBean并且看看能不能把它们用在你的站点里。通过和这些bean的接触,还有jsp:useBean、jsp:param以及jsp:get/setProperty的使用,你应该能够做出一些很酷的功能了!在下次的最佳实践里,我将向你展示使用JSP向站点增加外部内容的方法,JSTL标记和我们熟悉的include标记差不多,它使得JSP更灵活和更高效。在这之前,请用功准备,到时再见!

(这篇文章是一年前翻译的,当时想找翻译的活做,也是未果。请参考英文原文。)

posted on 2004-08-07 10:40 八进制 阅读(935) 评论(1)  编辑 收藏 收藏至365Key

 

learning it by using it in my common life

  Learn it as playing.It's only a tool-a tool that I am interesting in.

  For example:visit english website,read english book,see english film.promote listening and talking ability.

  On the other hand,write english diary persistly.Quality is the first,and the quantity the second.

So,I will write diary only in this goal and few other goals rather than in all goals like I did in before days.

千万不要打开显示器的后盖去接近里面的部件

  今天,因为我的显示器里面打火,间或的有轻微的啪啪声发出,伴随屏幕的轻微抖动。我打开后盖,在显示器工作的时候,用手用胶布包扎高压包旁边的一根线。伴随着手指的剧烈电击,啪啪的电火花在高压包和我的手指间闪烁。吓得我心里嘭嘭直跳。所以,我劝告那些喜欢自己动手的朋友们,如果您不是专业人士,显示器的后盖开不得。里面的高压达几十万伏!就是关掉电源同样存在在一些部件中!

  本来我是知道有这么一回事的,但今天就是鬼使神差的去亲自证实了一下,虽然我找到了显示器里面打火的地方所在,贴了一块绝缘胶布在高压包打火的地方就解决问题了。但是,显示器里面的高温会不会引燃胶布,我不知道,所以,明天还是把它抱到修理店去处理一下。前几天花了20元,结果没作用,原因是修理人员没找到打火的地方。虽然我找到了,但毕竟是拿生命在开玩笑,一点不划算!Sigh!

  

提高学习日记导航能力的思路

  下面是我对导航系统提高的思路,希望大家能够指出其中的问题并告诉我,让我少走弯路,您有什么意见和建议和问题也可以提出来。

  我会持续把我对导航系统的思考过程记录在这里。

  以前曾经就这个问题有个设想如下(http://www.learndiary.com/disDiaryContentAction.do?goalID=558):

  “4、改善系统的导航功能:

    关于保持访问路径的方法,我想了一点方法,仅供参考:用一个LinkedList对象保存访问路径字符串,其中的每一个元素是当前路径的字符串,在LinkedList中通过添加元素、查找元素、删除元素可以实现路径的跳转和回溯。”

  然后,我前些天作了一些思考,已记录在开源社区的cvs库中,其中的想法我已经初步认识是不可行的,但为了记录思路的过程,我也把它贴在这里:

  

  1.The key of this modifing is to keep the parents information of the current page.

  1).keep the information of where the goal come from:

  For example,a goal,it is maybe in "All Goals List(indexAction.do?pageNum=1),the abbreviation is 'AGL'",

"Processing Goals List(processGoalAction.do?pageNum=1,the abbreviation is 'PGL')",

"Quited Goals List(quitedGoalAction.do?pageNum=1,the abbreviation is 'QGL')",

"Finished Goals List(finishedGoalAction.do?pageNum=1,the abbreviation is 'FGL')",

"Searched Goals List(goalResultAction.do;jsessionid=4A629DA49B39A0C426F31B6DAB2FC0A3?pageNum=1),the abbreviation is 'SGL'".

So,when we click to view the content or the diaries list of a goal,we should record where

this goal come from,the item is among AGL,PGL,QGL,FGL and SGL;and,the page number "pageNum" is needed to record too.

  2).how to return to goals list when open different low level items in different windows:

  For example,when we click to view the goal content(disGoalContentAction.do?goalID=36) in

page "indexAction.do?pageNum=1",then,we click to view the same goal content(disGoalContentAction.do?goalID=36) in

page "processGoalAction.do?pageNum=1".When we want return to goals list in page "disGoalContentAction.do?goalID=36",

which goals list should we return?AGL or PGL?My answer is:return the lastest goals list,for example,if you visit

AGL before PGL,we will return to page PGL.

  3.ok,I have got a new idea,I should build a Navigator class,it will keep the all needed information concerning

navigation,and it will be transfered to it's low level page as a implicit parameter. 

  4.All paths list:

  1)all goals

  2)all goals->display goal's content

  3)all goals->display goal's content->comment goal

  昨天,我把动网的导航系统看了一下,其中的搜索帖子功能也不如我意:在查看搜索结果帖子的内容页面中点击下一篇帖子,得到的是帖子所在版块的下一篇帖子,而不是搜索到的帖子的下篇帖子。

  而且,在帖子提交、编辑等功能页面的导航可能均需要特殊的考虑。

  实际上,系统的查看帖子和搜索帖子功能总的说来都是搜索功能。导航的根本是把经历过的页面的搜索参数保留下来。

一、学习日记导航路径列举:

  总的说来,本系统存在下列几种导航路径:

  1、用户查看所有目标及其日记的导航:含有下列路径:

    1)所有目标列表->相关日记列表;(目标ID)

    2)所有目标列表->相关日记列表->显示日记内容;(日记ID)

    3)所有目标列表->相关日记列表->编辑日记内容;(日记ID)

    4)所有目标列表->相关日记列表->显示日记内容->撰写评论;

    5)所有目标列表->相关日记列表->显示日记内容->编辑评论;(评论ID)

  2、用户查看目标的内容及提交对目标的评论的导航:含有下列路径:

    1)所有目标列表->查看目标内容; (目标ID)

    2)所有目标列表->查看目标内容->撰写对目标的评论;(目标ID)

    3)所有目标列表->查看目标内容->编辑对目标的评论; (评论ID)

    3、您的进行中目标中的导航路径:

       1)目标内容:

     (1)所有目标列表-》进行中的目标列表; (用户ID)

     (2)所有目标列表-》进行中的目标列表-》查看目标内容;

     (3)所有目标列表-》进行中的目标列表-》查看目标内容->撰写对目标的评论;

     (4)所有目标列表-》进行中的目标列表-》查看目标内容->编辑对目标的评论;

    2)所有日记:

     (5)所有目标列表-》进行中的目标列表-》所有日记列表;(目标ID) 

     (6)所有目标列表-》进行中的目标列表-》所有日记列表->显示日记内容;              

     (7)所有目标列表-》进行中的目标列表-》所有日记列表->编辑日记内容;              

     (8)所有目标列表-》进行中的目标列表-》所有日记列表->显示日记内容->撰写评论;  

     (9)所有目标列表-》进行中的目标列表-》所有日记列表->显示日记内容->编辑评论;  

    3)您的日记:  

     (10)所有目标列表-》进行中的目标列表-》您的日记列表;(目标ID,用户ID) 

     (11)所有目标列表-》进行中的目标列表-》您的日记列表->显示日记内容;              

     (12)所有目标列表-》进行中的目标列表-》您的日记列表->编辑日记内容;              

     (13)所有目标列表-》进行中的目标列表-》您的日记列表->显示日记内容->撰写评论;  

     (14)所有目标列表-》进行中的目标列表-》您的日记列表->显示日记内容->编辑评论;

    4)写作日记:

     (15)所有目标列表-》进行中的目标列表-》写作日记;(目标ID)

       1》当提交日记后转到:查看您刚才提交的日记 ,路径为:3)-》(11)所有目标列表-》进行中的目标列表-》您的日记列表->显示日记内容;     

      2》当提交日记后转到:继续撰写下一篇日记  ,路径为:1)-》(1)所有目标列表-》进行中的目标列表;

      3》当提交日记后转到:查看当前目标的您的日记列表 ,路径为:3)-》(10)所有目标列表-》进行中的目标列表-》您的日记列表;    

      4》当提交日记后转到:查看当前目标的所有日记列表  ,路径为:2)-》(5)所有目标列表-》进行中的目标列表-》所有日记列表; 

    4、您的已退出的目标中的导航路径:

       1)目标内容:

     (1)所有目标列表-》已退出的目标列表; (用户ID)

     (2)所有目标列表-》已退出的目标列表-》查看目标内容;

     (3)所有目标列表-》已退出的目标列表-》查看目标内容->撰写对目标的评论;

     (4)所有目标列表-》已退出的目标列表-》查看目标内容->编辑对目标的评论;

    2)所有日记:

     (5)所有目标列表-》已退出的目标列表-》所有日记列表;(目标ID) 

     (6)所有目标列表-》已退出的目标列表-》所有日记列表->显示日记内容;              

     (7)所有目标列表-》已退出的目标列表-》所有日记列表->编辑日记内容;              

     (8)所有目标列表-》已退出的目标列表-》所有日记列表->显示日记内容->撰写评论;  

     (9)所有目标列表-》已退出的目标列表-》所有日记列表->显示日记内容->编辑评论;  

    3)您的日记:  

     (10)所有目标列表-》已退出的目标列表-》您的日记列表;(目标ID,用户ID) 

     (11)所有目标列表-》已退出的目标列表-》您的日记列表->显示日记内容;              

     (12)所有目标列表-》已退出的目标列表-》您的日记列表->编辑日记内容;              

     (13)所有目标列表-》已退出的目标列表-》您的日记列表->显示日记内容->撰写评论;  

     (14)所有目标列表-》已退出的目标列表-》您的日记列表->显示日记内容->编辑评论;

    5、您的已完成的目标中的导航路径:

       1)目标内容:

     (1)所有目标列表-》已完成的目标列表; (用户ID)

     (2)所有目标列表-》已完成的目标列表-》查看目标内容;

     (3)所有目标列表-》已完成的目标列表-》查看目标内容->撰写对目标的评论;

     (4)所有目标列表-》已完成的目标列表-》查看目标内容->编辑对目标的评论;

    2)所有日记:

     (5)所有目标列表-》已完成的目标列表-》所有日记列表;(目标ID) 

     (6)所有目标列表-》已完成的目标列表-》所有日记列表->显示日记内容;              

     (7)所有目标列表-》已完成的目标列表-》所有日记列表->编辑日记内容;              

     (8)所有目标列表-》已完成的目标列表-》所有日记列表->显示日记内容->撰写评论;  

     (9)所有目标列表-》已完成的目标列表-》所有日记列表->显示日记内容->编辑评论;  

    3)您的日记:  

     (10)所有目标列表-》已完成的目标列表-》您的日记列表;(目标ID,用户ID) 

     (11)所有目标列表-》已完成的目标列表-》您的日记列表->显示日记内容;              

     (12)所有目标列表-》已完成的目标列表-》您的日记列表->编辑日记内容;              

     (13)所有目标列表-》已完成的目标列表-》您的日记列表->显示日记内容->撰写评论;  

     (14)所有目标列表-》已完成的目标列表-》您的日记列表->显示日记内容->编辑评论;

  6、添加新目标的导航:

    1) 

     (1)所有目标列表-》添加新目标;

    2)提交新目标后的选择:

     (2)转到:查看您刚才提交的目标:导航为:所有目标列表-》进行中的目标列表-》查看目标内容;

     (3)转到:撰写日记 :导航为:所有目标列表-》进行中的目标列表;

  7、搜索功能中的导航:

    1)搜索:

     (1)所有目标列表-》检索页面;

    2)检索目标:

     (2)所有目标列表-》检索页面-》搜索结果目标列表;(条件字符串,已经存储在全局Session中)

     (3)所有目标列表-》检索页面-》搜索结果目标列表->查看目标内容;

     (4)所有目标列表-》检索页面-》搜索结果目标列表->查看目标内容->撰写对目标的评论;

     (5)所有目标列表-》检索页面-》搜索结果目标列表->查看目标内容->编辑对目标的评论;

     目标的日记的导航:

     (6)所有目标列表-》检索页面-》搜索结果目标列表->相关日记列表;(目标ID)

     (7)所有目标列表-》检索页面-》搜索结果目标列表->相关日记列表->显示日记内容;

     (8)所有目标列表-》检索页面-》搜索结果目标列表->相关日记列表->编辑日记内容;

     (9)所有目标列表-》检索页面-》搜索结果目标列表->相关日记列表->显示日记内容->撰写评论;

     (10)所有目标列表-》检索页面-》搜索结果目标列表->相关日记列表->显示日记内容->编辑评论;

    3)检索日记:

     (10)所有目标列表-》检索页面-》搜索结果日记列表;(条件字符串,已经存储在全局Session中)

      (11)所有目标列表-》检索页面-》搜索结果日记列表->显示日记内容;

      (12)所有目标列表-》检索页面-》搜索结果日记列表->编辑日记内容;

      (13)所有目标列表-》检索页面-》搜索结果日记列表->显示日记内容->撰写评论;

      (14)所有目标列表-》检索页面-》搜索结果日记列表->显示日记内容->编辑评论;

     日记所在目标的导航:

     (15)所有目标列表-》检索页面-》搜索结果日记列表->查看目标内容;(目标ID))

     (16)所有目标列表-》检索页面-》搜索结果日记列表->查看目标内容->撰写对目标的评论;

     (17)所有目标列表-》检索页面-》搜索结果日记列表->查看目标内容->编辑对目标的评论;

     日记所在目标所有日记的导航:

      (18)所有目标列表-》检索页面-》搜索结果日记列表->相关日记列表; (目标ID)

      (19)所有目标列表-》检索页面-》搜索结果日记列表->相关日记列表->显示日记内容;

      (20)所有目标列表-》检索页面-》搜索结果日记列表->相关日记列表->编辑日记内容;

      (21)所有目标列表-》检索页面-》搜索结果日记列表->相关日记列表->显示日记内容->撰写评论;

      (22)所有目标列表-》检索页面-》搜索结果日记列表->相关日记列表->显示日记内容->编辑评论;

            

二、学习日记导航功能实现思路探索:        

 例如:在下面的导航中:

  1、所有目标导航:

    (1)所有目标列表->相关日记列表;

    (2)所有目标列表->相关日记列表->显示日记内容;

    (3)所有目标列表->相关日记列表->编辑日记内容;

    (4)所有目标列表->相关日记列表->显示日记内容->撰写评论;

    (5)所有目标列表->相关日记列表->显示日记内容->编辑评论;

 中,有如下问题:

  (1)点击"所有目标列表"或"相关日记列表"是回到列表的第一页呢,还是回原来的页数呢?是使用默认的排序方式还是使用用户选定的排序方式呢?如果回到原来的页数,这时假设在这期间又有无数帖子提交了,结果是回不到原来帖子所在的那个页面的。

我看了看动网和JAVA资源网的方式,都是回到列表的第一页,所以我会采用回到第一页的做法,并且使用用户选定的排序方式-用户选定的排序方式储存在程序的Session中;

  (2)、如何唯一的定位一个特定的页面呢?

  如:如何定位”相关日记列表“呢?需要3个参数:

   1》目标ID;

   2》排序方式;

   3》每页条目数和当前页数;

  其中,2》中的排序方式已经存储在全局的Session中了,3》中每页的条目数已经定了,当前页数不用考虑,因为经过我们如(1)的分析,我们总是回到第一页中去;

  又如:如何定位显示日记内容呢?显然,仅需要这条日记的ID而已;

  现在,我把导航系统中定位每一个页面所需要的参数标在“一”中的各个导航路径后面。

  可以看到,定位一个页面需要的参数分为5种:

   1》列表:需要列表的parentID;

   2》单个条目:需要它的ID;

   3》用户的进行、完成等目标列表:需要用户ID;

   4》用户的进行、完成等目标的用户日记列表;需要用户ID和目标ID;

   5》搜索列表:什么都不需要,因为搜索字符串已保留在全局Session中了;

   然后,因为用户的ID已经存储在全局的Session中了,所以上面需要的参数进一步减为:

   1》列表:需要列表的parentID;

   2》单个条目:需要它的ID;

   3》用户的进行、完成等目标列表:什么都不需要,用户ID在Session中;

   4》用户的进行、完成等目标的用户日记列表;目标ID,所需的用户ID在Session中;

   5》搜索列表:什么都不需要,因为搜索字符串已保留在全局Session中了;

   这样,唯一定位一个页面所需要的参数变为:

   1》页面类型;

   2》参数ID;

   然后,在页面上显示url需要的参数为:

   1》标题:如一个目标的日记列表的标题应该是:“目标‘学习英语’的所有日记列表”,或者是:“目标‘学习英语’您的日记列表”,而显示一页日记的标题应该是:“日记‘今天我背了10个单词’”,等等;

   2》页面的url地址,如显示一页日记的url是:http://www.learndiary.com/disdiary.do?diaryID=10

      在页面上显示url需要的参数均可以由上面的定位页面所需的两个参数产生出来(即页面类型,参数ID);

      于是,可以考虑用一个链表保留定位页面所需的参数,把这两个参数封装为一个导航节点类:

      public class PageNavNode {

        private int typeID;

        private int parameter;

     

        public PageNavNode(int typeID,int parameter){}

        public setTypeID(){}

        ...

      }

     

      当点击一个url时,就把这个url所需的节点加入到一个链表中,这时链表变长;当在页面的导航链中点击上一个层次的链接时,就把这个节点后面的节点删除;

     也就是说,把这个链表作为一个request的参数传给页面,每一个页面中都有一个导航的链表参数在这个页面的生存周期中起作用;

     为了得到页面所需的html字符串,这个链表参数应该传入进入页面前的action中,由action负责将这个链表转变为页面导航所需要的字符串参数,为了分隔功能,可以在Pager类中设置一个方法,名称是:pageNaviGenerate(LinkedList naviLinker);

     但是,怎么保证这个链表能够继续下传下去呢?

     我知道有2种方法可以解决这个问题:

     1、把这个链表放在Session中,多个页面可以共享,并且可以修改这个链表,供下面的页面使用。但是,由于同个页面可以出现在不同的链表中,而且,系统有几个不同的链接路径,随着系统的成长,这样的链接路径还会不断增加。每一个链接路径都需要一个Session中的链表来保持这条路径的导航信息。

     比如,在“所有目标”这条路径查看某一篇日记就应该保存在“所有目标”这条链接路径中,而在“我的目标”这条路径查看同一篇日记就应该保存在“我的目标”这条路径中,显然,这在Session中需要不同的条目来保存。而且,为了识别日记页面是位于哪条路径上,打开这个页面前的action中需要上一个页面传来一个路径类别参数。这样,系统才能在Session中找到对Session中哪个链表进行修改。

    

     2、把这个链表封装成字符串,这个字符串在不同的页面间经过,然后不断的改变。把这个封装的字符串连同客户请求的url一起传给请求url前的action,由action解封并处理成下一个页面需要的导航字符串。

     今天,我尝试用第二种方法来实现。

     第一步:封装字符串传给action->action结合请求的页面和接受的封装字符串得到下一个请求页面的封装字符串并把这个封装字符串传给下一个页面,使下一个页面可以接力把这个封装字符串再传到再下一个请求页面前的action中->

     把请求页面封装的字符串转变为请求页面所需的导航字符串,并存入request中,供下一页面显示导航字符串提取使用。

    

                                                  2005年10月19日

     

     

     昨天,对导航系统的设计思路作了一下验证,基本可行。

     在设计中的选择:

     1、当前页面的导航条目灰化,主要是导航条目的页码总是第一页,当前的页面可能不是第一页,会引起混乱,而且,惯例是当前页面的导航条目灰化。

     2、设计中用到的方法:

     1)、接收来自request的导航封装编码字符串,和将要显示的页面的类型,得到将要显示的页面所需的导航封装编码字符串。

     实现方法,封装字符串采用的格式:页面类型(1位数字)+页面参数(如显示目标的日记列表所需的目标ID,显示日记内容所需的日记ID)+分隔符(我采用字符"a")

     如字符串1025,表示:所有目标-》目标:“建设“学习日记””的日记列表;

     得到将要显示的页面所需的导航封装编码字符串的方法:

     将显示页面类型ID在字符串中从前向后检索,1》如果检索到相同的类型,就把检索到的节点字符串后面的字符串截掉:

     如当前页面是查看日记内容,假设保持的编码字符串是:10a25a373,表示:所有目标-》目标:“建设“学习日记””的日记列表─》日记:用cookie保存用户密码登录流程

     这时,我点击“目标:“建设“学习日记””的日记列表”,它的类型ID是2,于是,就把25后面的字符串“a373”截掉。查看日记列表的导航封装字符串变为:10a25。

     2》如果没有检索到相同的类型,就把新的节点字符串加到现在的字符串中:

     如当前页面是查看日记内容,假设保持的编码字符串是:10a25a373,表示:所有目标-》目标:“建设“学习日记””的日记列表─》日记:用cookie保存用户密码登录流程

    这时,我点击了评论日记链接,它的类型ID是4,于是,就在后面加上:a473,评论日记的页面对应的导航封装字符串变为:10a25a373a473 

/**

* receive the encoding navigation string come from request and the type id of the page which we are going to and the parameter of the page which we are going to(it is articleID generally),

* get the encoding navigation string which it will be used in the page we are going to.

* @param naviStr the encoding navigation string come from request.

* @param toPageType the type id of the page which we are going to.

* @param parameter the parameter of the page which we are going to(it is articleID generally).

* @return the encoding navigation string which it will be used in the page we are going to.

*/

public static String encodeNaviStr(String naviStr, String toPageType, String parameter) {

String newNaviStr = naviStr;

int searchResult = naviStr.indexOf("a" + toPageType);

if (searchResult == -1) {

newNaviStr = newNaviStr.concat("a").concat(toPageType).concat(parameter);

} else {

newNaviStr = newNaviStr.substring(0, searchResult).concat("a").concat(toPageType).concat(parameter);

}

return newNaviStr;

}

public static void main(String[] args){

System.out.println( encodeNaviStr("a10a25a337", "4", "73"));

System.out.println( encodeNaviStr("a10a25a337", "2", "35"));

}

                                                                                               2005年10月20日

     

      昨天,完成了导航过程中封装字符串处理方法,今天,继续完成把封装的字符串转化为下一个页面显示导航条所需要的字符串的方法。

      如何把封装字符串“a10a25a337”转化为页面导航显示所需要的字符串:

      系统导航:<a href="http://www.learndiary.com/indexAction.do?pageNum=1">所有目标</a>-》<a href="http://www.learndiary.com/toDiaryAction.do?goalID=5&naviStr=a10>目标:“建设“学习日记””的日记列表</a>─》<a href="http://www.learndiary.com/disDiaryContentAction.do?goalID=73&naviStr=a10a25>日记:用cookie保存用户密码登录流程</a>->撰写评论(当前页面的导航条目灰化,不加超链接)

      ?

      显示这个字符串的要点:

      1、页面的类型:根据参数页面类型查找;

      2、标题:根据页面参数确定;

      3、第一个节点总是所有目标,最后一个节点不加超链接。

     

      实现方法分析:

      把“参数”和“页面标题”的对应关系做成一个map,用时在map里面查找。

      通过LearndiaryDB.getArtInfoByID(int articleID, int htmlFlag)得到页面导航所需的标题。

      为了方便处理,把每一个节点读入一个PageNavNode对象,然后用一个LinkedList来容纳这些对象。这样就可以自由处理其中的内容了。

     

      public String

     

      /**

* receive the encoding navigation string and get the navigation string which will be displayed in the page which we are going to.

* @param naviStr the encoding navigation string will be keeped in the request for the page which we are going to.

* @return the navigation string which will be displayed in the page which we are going to.

*/

public static String decodeNaviStr(String naviStr){

String navigation ="系统导航:";

String[] strArray = naviStr.split("a");

PageNaviNode[] nodesArray = new PageNaviNode[strArray.length()-1];

for (i=1;i<strArray.length();i++) {

  nodeArray[i-1] = strToPageNode(strArray[i]);

if (nodeArray.length()==1){

  navigation = navigation.concat("所有目标");

}

return navigation;

}                                                                   

  关于导航能力改进的代码,今天向http://learndiary.tigris.org中的cvs库作了第一次代码的提交。页面上基本上没有什么反映。

                                                                                 2005年10月21日

a little cartoon fan

  About three weeks ago,wife bought some cartoon vcd for daughter,includes:Cat Fish,White Snow Princess,伊索allegory,etc..Soon,daughter became a real cartoon fan,she always sees a same vcd again and again.This makes us feel worried.Because watch TV too long time will hurt her eyes!We must restrict her the time of watching cartoon.

  We can feel daughter's goodness when she watch the cartoon.When she saw the crocodile will eat the dog,she would worry to shed tears.Although we told her that wasn't in real world,she took about a week time to understand our meaning.Now,she doesn't act too worry when she see the same cartoon.

 

intall the floppy disk

A very low level mistake,today,I even couldn't intall the floppy disk correctly.There are two plugin at the end near by disk,I intalled the floppy disk with the middle plugin,of course,compter couldn't find my floppy driver.I even doubted the power.At last,I changed the plugin at the tail of the floppy data line,it's ok!