使写作日记更方便的具体改动

为了鼓励用户交流,鼓励发帖,特别的进行easy to write diary的改进。按实现的重要性排序:

1、当用户撰写成功一个目标的第一篇日记时,就加入了这个目标。以后在写这个目标下的日记时就不必再次加入这个目标了;

2、如果用户在已经退出或完成的目标中写日记完成后,目标自动转为进行中的目标;

3、既要提供用户专门写日记的链接,更要提供用户在相应的帖子中写日记的选择:

1)、在菜单栏中单独建一个最醒目的链接,文字提示为:今天我要写日记。里面为单独写日记的地方,如果一个用户没有加入任何目标,则提示他在主页上加入目标或者创建目标。怎么样判断一个用户没有加入任何目标呢?有两种方法来进行判断:

  (1)、在usergoal表中检测是否有这个用户的进行中的目标项;

  (2)、在user表中添加3个字段,分别为:进行中、退出的、完成的目标数目;

决定采用第(2)种方法,这里需要把userGoal表中的数据转到user表中的上面的3个字段。

2)、在目标的内容上加入添加日记的链接;

3)、在目标的所有日记列表中加入添加日记的链接;

4)、在目标的我的日记列表中加入添加日记的链接;

5)、在日记的内容上加入添加同类日记的链接;

4、完善用户添加目标的过程,新加一页名为:readyToAddGoal.jsp并且把它加入页面类型常量,建议先进行搜索目标的过程,如果用户点击先进行目标的搜索则在同一页进行目标的搜索同时在导航条中保留“准备添加新目标”的链接;如果用户点击“直接撰写新目标”,则正式撰写新目标。

Common conversation-life-food

faint

What do you say to dinning with me at reastaraunt?

Waiter,is there a vacant table?

waiter,bring us the menu.

Do you wish a regular meal or to order from menu?

What will you have to eat?

I am not sure what do your sugguect?

Well,their double cheesebulger is great.

How do you want your sneak?

Menium,please.

加入通过电子邮件取回密码和MD5加密密码的功能

  首先祝大家圣诞节快乐!祝大家天天快乐!

  学习日记开发小组(LDDG)在本着用户至上的原则,在V0.9.0.4的基础上,学习日记又有新功能如下:

  一、忘记密码的用户可以通过注册时填写的邮件地址获得重设密码的信件,然后根据这个信件中提供的用户ID和标记重设密码。流程如下:

  1、用户忘记密码,请求重置密码;

  2、检测用户是否在72小时内请求过重置密码,若是,给出提示消息,中止;否则继续;

  3、系统发一封包括用户ID和随机产生的8位Token到用户注册时留下的信箱,同时记下发送邮件的时间;

  4、系统每隔1小时检测取回密码的用户的邮件发送时间,如果没有超过72小时,则继续检测;如果超过72小时,则删除用户重置密码的记录,用户需要重新请求发送密码;

  5、用户收到重置密码的邮件,点击重置密码的链接,登录到重置密码的页面,用户输入新密码两遍;

  6、如果用户在重置密码页面输入的用户ID和Token都正确并且两次新密码一致,则系统接受新密码,并经MD5加密后,存入数据库,新密码生效,引导用户转往用户登录页面,同时,删除用户重置密码的记录;

  7、如果用户在重置密码页面输入的用户ID和Token有误或两次密码不一致或者密码字符非法,返回重置密码的页面,提示用户错误和重新输入新密码,直到用户输入正确或取消重置密码的过程;

  二、用户在数据库中的密码经过了MD5加密,任何人都无法知道您的密码,使您对自己的帐户安全问题更放心。  

  三、添加游客测试帐户(guest),使游客可以使用注册用户现有的全部功能(但是为了拥有自己的目标体系,建议注册自己的帐号,以后的注册用户会有更多的权限,具体内容暂时保密:))

  四、最新源码下载:

  1、单独的取回密码模块:使用“argouml+eclipse+struts+strutstestcase+junit(测试驱动)”的开发模式,下载地址:

http://www.learndiary.com/download/learndiary_login.zip

  2、在cvs库中下载最新源码:

  1)单独的取回密码模块:

  cvs -d :pserver:learndiary@cvs.tigris.org:/cvs login(密码:123456)

  cvs -d :pserver:learndiary@cvs.tigris.org:/cvs checkout -P learndiary/find_a_way/login

  2)全部完整的网站源码: 

  cvs -d :pserver:learndiary@cvs.tigris.org:/cvs login(密码:123456)

  cvs -d :pserver:learndiary@cvs.tigris.org:/cvs checkout -P learndiary/old

  

  五、本次更新主要参与者:ppig,dashing_meng(全部开发小组成员参见:http://learndiary.tigris.org/servlets/ProjectMemberList)

根据用户提供的rss地址同步更新用户在其它网站的帖子或

  因为大家在网上发帖和写blog多是为了有同道者加入进来讨论。但是学习日记目前没有几个人加入进来,这就形成一个恶性循环-人越少就越没有人。为了解决这个问题,可以提供把日记绑定到用户其它blog或帖子中的功能。也就是说,只要用户在其它网站上发了帖,我们通过定时检验rss地址,可以把用户的帖子复制过来。

  因为这是用户自愿的,所以应该不会侵权,但是,如果,其它网站禁止用户把文章绑到这里来那是用户与其它网站之间的事,与我们无关。

  这种形式,网上好像已经有了。像有个trans系统的雷达新闻系统就是,还有专门抓取其它网站文章的这种网站。

  要实现这个功能的前提是必须引入RSS技术,并且为了兼容于现在的两种主流rss技术,也许应该两种rss标准都要使用。当然,可以先实现大家使用最多的。

这个星期日的任务

游客帐号可以作为一个公用的注册帐号使用

http://www.learndiary.com/disDiaryContentAction.do?goalID=1321

http://learndiary.tigris.org/issues/show_bug.cgi?id=8

现在写日记不大方便,应该使这个主要的功能变方便

http://www.learndiary.com/disDiaryContentAction.do?goalID=1322

http://learndiary.tigris.org/issues/show_bug.cgi?id=9

(转帖)Struts资源文件:Struts Message Resources

转自:http://www.javafan.net/article/20040430102526725.html

 

页面功能  【加入收藏】 【推荐给朋友】 【字体:大 中 小】 【关闭】   

  

 

Struts Message Resources

作者:Nick Heudecker    来自:未知

总览

许多刚刚学习Struts的程序员在使用Struts的MessageResources特性的时候会遭遇很多困难。本文将试图阐述MessageResources特性的优点并给出了具体的例子说明它的用法。

作者: Nick Heudecker, System Mobile Inc.

概述

类MessageResources可以使开发者方便地支持多语言,包括支持多时间格式和数字格式。使用资源包的另一个好处是允许开发者将标签字符串集中存储在一个位置,而不是分散在不同的JSP页面里。例如,对于每个用户的名字的标签"First Name" ,我们可以将它写在资源包中,在适当的地方通过Struts标签简单的进行引用:

<bean:write key="label.first.name"/>

这样做将会让你对程序的更改变的简单容易,你不必在每一个JSP页面里更改标签的内容了。

用法

使用消息资源包需要你做下面的事情:

1. 为你想要支持的地方创建一个消息资源包。

2. 配置WEB应用,加载消息资源包。

3. 使用相应的JSP标签加载资源或者...

4. ...在一个Action类中加载资源。

创建资源包

MessageResources 类的默认的实现是一个包含"key=value" 对的文件,下面的一个消息资源包文件的例子。

label.username=Username

label.password=Password

label.first.name=First Name

label.last.name=Last Name

label.email=Email Address

label.phone.number=Phone Number

label.welcome=Welcome back {0} {1}!

error.min.length=The input must be at least {0} characters in length.

error.max.length=The input cannot be longer than {0} characters in length.

大括号包围的整数是对java.text.MessageFormat 类的支持,程序员可以向value字符串中传递参数,对每个value字符串你最多可以传递4个参数。

配置

有两种途径通知Struts你的资源包的位置:web.xml 文件或者struts-config.xml 文件。首先来看web.xml 文件的配置:

<servlet>

<servlet-name>action</servlet-name>

<servlet-class>

    org.apache.struts.action.ActionServlet

</servlet-class>

<init-param>

<param-name>

    application

</param-name>

<param-value>

    com.systemmobile.example.ApplicationResources

</param-value>

</init-param>

</servlet>

这个配置说明你的资源包的名字是ApplicationResources.properties,它位于com.systemmobile.example 包中。后缀".properties" 是隐含的,你不必显式地写出来。如果你还有另一个资源文件在相同的包中,例如ApplicationResources_fr.properties ,用来支持法语,你只需要象上面定义的那样列出文件名字即可。

定义资源文件的第二中方法(上面已经提到),是在struts-config.xml 文件中配置:

<message-resources parameter="com.systemmobile.example.ApplicationResources"/>

属性parameter 是必须的。和在web.xml文件中配置一样, 需要注意的是文件在包中的位置。

使用struts-config.xml 文件来配置消息资源文件是推荐的做法,因为它更有可扩展性,更灵活。

你可以使用message-resources 标签从不同的资源文件取不同的消息,前提是在配置的时候为不同的资源文件给出不同的key 属性的值。例如: <message-resources key="myResources" parameter="com.systemmobile.example.ApplicationResources"/>

<message-resources key="moreResources" parameter="com.systemmobile.example.MoreApplicationResources"/>

然后你必须这样使用bean:message 标签: <bean:message bundle="moreResources" key="some.message.key"/>

设置属性null 的值为"false" 后,如果某个资源字符串不存在将返回???key??? 而不是仅仅显示null。这样很容易在JSP页面中看到你没有定义的资源,使得内部测试的速度更快。(关于如何从资源文件中获得消息的详细内容参见国际化 一节) <message-resources parameter="com.systemmobile.example.ApplicationResources" null="false"/>

另外,message-resources 标签允许你使用自己实现的MessageResourcesFactory 接口,这不在本文的讨论范围。

资源文件放在哪里

关于资源文件最常见的问题是将资源文件放在WAR文件的哪里。简单的回答是该文件必须放在你的classpath下面,这意味着将资源文件放在一个JAR 文件中,或者放在/WEB-INF/classes 目录极其子目录下。下表给出了资源文件的位置,在message-resources 标签中"parameter" 属性的值以及简短的说明。

Resources Location parameter Value Description

/WEB-INF/classes/ApplicationResources.properties ApplicationResources 文件放在classes 目录下, 该目录在web应用的classpath中.

/WEB-INF/classes/resources/ApplicationResources.properties resources.ApplicationResources 该文件放在"resources" 目录下, 所以包名也就是路径名要给出。

In the app.jar file, in the com.systemmobile.example package/directory. com.systemmobile.example.ApplicationResources 文件在JAR文件中的全路径。

Tags

最常用Struts 标签是bean:message 标签。使用这个标签的"key" 可以从资源文件中读特定的消息资源。你还可以传入四个参数中的一个或全部:

<bean:message key="label.password"/>

<bean:message key="error.min.length" arg0="6"/>

<bean:message key="label.welcome" arg0="Ralph" arg1="Nader"/>

html:message 可以让你向用户显示错误信息(默认)或消息信息,而html:errors 只显示错误信息。很明显,错误信息或消息信息一定要保存在request里,否则就什么也不会显示。这里有一个显示消息信息的例子:

<logic:messagesPresent message="true">

  <html:messages id="msg" message="true">

    <div class="success">

      <bean:write name="msg"/>

    </div><br/>

  </html:messages>

</logic:messagesPresent>

还有一些标签也有限地支持消息资源,比如html:link。html:link标签通过定义"titleKey" 属性来显示标题文本。许多html 使用 "altKey" 属性从资源文件里获得alternate(替代)文本。

Actions

你还可以在Action 类中使用消息资源文件。Action 类有两个方法得到一个MessageResource 类的实例:

// 返回一个request里的资源文件

protected MessageResources getResources(HttpServletRequest request);

// 返回一个request里的资源文件,

// 该资源文件的标志上<message-resources/> 元素的内容

protected MessageResources getResources(javax.servlet.http.HttpServletRequest request, java.lang.String key);

MessageResources类可以让你从资源文件中得到本地化的消息。The API for MessageResources 可以在资源中找到。比较常用的方法有:

// these methods load a resources key for the given locale

public String getMessage(java.util.Locale locale, java.lang.String key);

public String getMessage(java.util.Locale locale, java.lang.String key,

       java.lang.Object arg0);

public String getMessage(java.util.Locale locale, java.lang.String key,

       java.lang.Object[] args);

public String getMessage(java.util.Locale locale, java.lang.String key,

       java.lang.Object arg0, java.lang.Object arg1)

public String getMessage(java.util.Locale locale, java.lang.String key,

       java.lang.Object arg0, java.lang.Object arg1, java.lang.Object arg2);

public String getMessage(java.util.Locale locale, java.lang.String key, java.lang.Object arg0,

       java.lang.Object arg1, java.lang.Object arg2, java.lang.Object arg3);

// these methods load a resources key for the locale retrieved

// from the HttpServletRequest

public String getMessage(java.lang.String key);

public String getMessage(java.lang.String key, java.lang.Object arg0);

public String getMessage(java.lang.String key, java.lang.Object[] args);

public String getMessage(java.lang.String key, java.lang.Object arg0,

       java.lang.Object arg1);

public String getMessage(java.lang.String key, java.lang.Object arg0,

       java.lang.Object arg1, java.lang.Object arg2);

public String getMessage(java.lang.String key, java.lang.Object arg0,

       java.lang.Object arg1, java.lang.Object arg2, java.lang.Object arg3);

这些返回的字符串可以被设置成request 或 session 的参数并串会表现层。你可能注意到了一些重载方法getMessage(...) 选择了参数Object,而另外一些采用了参数arg0...arg3。这和 bean:message arg0...arg3 属性等价。

除了MessageResources 类,还有一些类使用了资源文件。ActionMessage类被用来从action 向JSP之间传递消息资源中的keys 。消息被用来作为bean 的属性。ActionError, ActionMessage的子类,使用消息资源中的keys 存储验证失败后的错误信息。

国际化

从资源文件中提取一个本地化信息可以由类MessageResources 来处理,或者由它的直接子类PropertyMessageResources类处理。既然类PropertyMessageResources 等经常地被用到,那么我们就来看看它是怎样使用getMessage(Locale, String) 方法来从资源文件中读取消息的。

举例说明:

1. 如果你在ApplicationResources_pt_br.properties (Brazilian Portuguese)中没有发现消息的定义,系统将在ApplicationResources_pt.properties 文件中找,如果ApplicationResources_pt.properties 文件不存在或者也没有该消息,那就去ApplicationResources.properties 文件里查找了。

2. 如果消息找到了,它就被加到本地化的缓存中并返回java.lang.String型数据。

3. 如果消息没有找到,此时如果returnNull 属性被为默认的true,将返回 null。 否则将返回类似 ???key??? 的字符串,key 就是那个被传递的参数。

JSTL

JSTL (JavaServer Pages Standard Tag Library) 的fmt标签最近开始流行起来,用来向JSP中显示资源文件的信息。它能很好地和Struts结合在一起。使用它非常简单,只要下载JSTL 的jar 文件和TLDs 并把它们拷贝到你的应用的正确的位置,然后在web.xml文件中加入下面的内容:

<context-param>

  <param-name>javax.servlet.jsp.jstl.fmt.localizationContext</param-name>

  <param-value>ApplicationResources</param-value>

</context-param>

上面的配置是假定你的ApplicationResources.properties文件是放在/WEB-INF/classes 目录下的。 参见above 更多情况。

然后将这个标签库直接放在你的JSP中:

<%@ taglib prefix="fmt" uri="http://java.sun.com/jstl/fmt" %>

最后,下面的标签将显示资源文件的内容:

<fmt:message key="label.first.name"/>

还有一个使用fmt 标签获得资源的例子。(注意: 该段程序取自Jakarta JSTL examples。)

// loading a resource from a specific bundle and populating a parameter

<fmt:message key="currentTime" bundle="${deBundle}">

 <fmt:param value="${currentDateString}"/>

</fmt:message>

// using the forEach iterator to populate paramters

<fmt:message key="serverInfo" bundle="${deBundle}">

 <c:forEach var="arg" items="${serverInfoArgs}">

  <fmt:param value="${arg}"/>

 </c:forEach>

</fmt:message>

结论

在向JSP文件方便地传递消息的同时,Struts使用消息资源文件还帮助我们创建国际化的Web应用。我们既可以使用正在快速发展中的JSTL标签,也可以使用Struts标签,或直接在action中得到一条具体的消息。我希望这篇文章为您阐明了一些Struts中常用的但有时会混淆的东西。

关于作者

Nick Heudecker 是一位软件开发人员,具有6年的企业应用的开发经验。 他所在的公司, System Mobile, Inc.,专门从事应用集成,定制软件开发和无线应用。 他还是Sun认证JAVA程序员,现在居住在Ann Arbor, Michigan。

资源

下面的资源也许对您了解更多的关于Struts资源文件有帮助:

JavaDoc for the classes of interest:

java.util.ResourceBundle

java.util.Locale

org.apache.struts.util.MessageResources

org.apache.struts.action.ActionError

org.apache.struts.action.ActionMessage

Ted Husted's Struts Tips: Very handy advice, especially for resource bundle usage.

Struts Home Page

Struts-User Mailing List Archive: Many people use Struts, so there is a very good chance that your question has be answered already. Please use all available resources before asking your question on the mailing list.

JSTL Homepage and the Jakarta JSTL Implementation

注意事项

Packages are just directory structures used to avoid naming conflicts. If you put a message bundle in a directory named resources under /WEB-INF/classes, this is the equivalent of putting the file in a package named resrouces. While basic, this point seems to trip up many new programmers.

 

 

  

 

页面功能  【加入收藏】 【推荐给朋友】 【字体:大 中 小】 【关闭】    

 

 

Copyright © 2003 - 2005 JavaFan.NET All Rights Reserved

慎用setActionForm() 在使用strutstestcase测试struts程序时

setActionForm()方法会调用ActionForm里的reset()方法清掉你传入actionForm中的测试数据。

如:

   EmailResetPsdForm form = new EmailResetPsdForm();

  form.setUserName("ppig");

  setActionForm(form);

在这里,测试数据userName="ppig"不会被传入使用这个form bean的action中。

应该使用替代的方法来传递测试数据:

addRequestParameter("userName", "ppig");

下面是strutstestcase里的文档对setActionForm方法的说明。

    /*

     * setActionForm

     * public void setActionForm(ActionForm form)Sets an ActionForm instance to be used in this

     * test. The given ActionForm instance will be stored in the scope specified in the Struts

     * configuration file (ie: request or session). Note that while this ActionForm instance

     * is passed to the test, Struts will still control how it is used. In particular, it

     * will call the ActionForm.reset() method, so if you override this method in your

     * ActionForm subclass, you could potentially reset attributes in the form passed

     * through this method.

     *

     * Parameters:

     * form - the ActionForm instance to be used in this test.

     *

     */