continue reading hover preload topbar hover preload widget hover preload

APPFUSE wiki中文文档问题解决了

Categories: Appfuse  |   Comments(6)

原来appfuse wiki上的中文文档编辑有问题,保存以后重新编辑发现所有的字符都回变成unicode,后来连显示都有问题了,凡是使用了inner link的地方使用了中文就会在页面上直接显示Unicode,但是在我自己机器上测试JSPWiki一切正常。前天把自己的配置文件提交到appfuse的 Issue Tracker 。今天Matt说明是encoding配置有问题,原来是没有使用UTF – 8,所以又重新把自己翻译的文档整理好了。现在可以正常浏览了。不过 Rock Sun翻译的我没有原文无法修改,Matt 联系他作相应的更新,以后大家应该可以自由的在Appfuse Wiki上面编辑中文了。:)

播客和博客

Categories: web 2.0  |   No Comments

  
发现播客(podcast)也有点意思,用音频和视频记录自己的观点倒是个不错的主意,起码使用起来方便简单,呵呵。有一点我们也许不用打字写博客了,用
录音笔就好了,那样速度还快。那些名人外出演讲、报告、讲座也可以直接录下来发布共享。不过播客肯定还是无法取代博客的,就像电视/广播无法取代传统纸媒
体一样。纸媒体有更高的可选择性,因而拥有更高的阅读效率。

    我发现播客的一个好处是可以用来练习英语听力。天天都会更新,而且有共同的主题,可选择范围很宽。呵呵~~还有专门的播客RSS工具Juice 供使用,可以自动下载最新的视频/音频,要是能直接在线收听就更好了。

    发现MicroSoft的live.com有个wmradio的小插件(gadget)支持在线收听播客,可以一边上网一边收听,很不错!~~其实MicroSoft的live.com的可用性还是不错的,顺便推荐一下,有机会介绍一下。

    

美味书签的mp3收藏功能

Categories: web 2.0  |   No Comments

发现美味书签一个巨好用的功能,如果收藏的url链接带有媒体信息,包括mp3,wav等格式,美味书签会自动为它加上相对应类型的标签,之后直接点击书签的播放按钮收听,没有新的窗口和应用程序跳出,非常方便。^_^

/>

无法通过Test-canoo的问题解决方案

Categories: Appfuse, Java/J2EE  |   Comments(17)

无法通过Test-canoo的问题解决方案

内容提要

在appfuse 1.8.2安装后,运行ant test-canoo或者ant test-jsp会发现无法通过测试。本文说明如何解决这个问题。

目录

*       [1] 问题描述
*       [2] 解决办法一
*       [3] 解决办法二

问题描述[#1]

安装运行自己的应用以后,运行ant test-canoo出现下面的错误:
   
C:\myfile\myapp>ant test-canoo
Buildfile: build.xml
 
ping-tomcat:
     [echo] Verifying that tomcat is running...
      [get] Getting: http://localhost:8080/myapp
 
init:
 
prepare:
     [echo] Preparing target directory 'C:\myfile\myapp/build/myapp'
 
db-load:
   [dbunit] Executing operation: CLEAN_INSERT
   [dbunit]           on   file: C:\myfile\myapp\metadata\sql\sample-data.xml
   [dbunit]           with format: xml
 
test-canoo:
   [delete] Deleting: C:\myfile\myapp\build\test\data\web-tests-result.xml
     [echo] Testing with locale 'zh'
 
Login:
 
BUILD FAILED
C:\myfile\myapp\build.xml:542: The following error occurred while executing this
 line:
Test step verifytitle (C:\myfile\myapp\test\web\login.xml:3: )  named "<unknown>
" failed with message "Wrong document title found! Expected "AppFuse ~ Login" bu
t got "AppFuse ~ 登录""
 
Total time: 18 seconds

解决办法一[#2]

第一个方法是针对英文运行单元测试: 修改test/web目录下面的config.xml文件第四行,把
    <header name="Accept-Language" value="${user.language}"/>
改成:
    <header name="Accept-Language" value="en"/>

解决办法二[#3]

第二个方法可以测试中文修改test/web目录下面的web-test.xml文件第11行
    <property file="web/WEB-INF/classes/ApplicationResources.properties"/>
改成:
    <property file="web/WEB-INF/classes/ApplicationResources_zh_CN.properties"/>
注意:使用中文测试需要正确修改 ApplicationResources_zh_CN.properties 并对其转码。默认的转码是在运行 ant deploy 发布时调用 copy-resources 任务通过native2ascii进行转码。

 
 

web 2.0的春秋时代 —— 新兴势力的兴起

Categories: web 2.0  |   No Comments

服务商的春秋时代

—— 新兴势力的兴起

      那些切实注重用户体验、贯彻用为中心的服务理念,高举web 2.0的旗号,向传统服务商开战了。看看这些新时代的新兴力量吧:

     实际上,每个新兴网站都是贴着web 2.0的标签走上舞台的。这个阶段只会是web 2.0时代的序幕,未来一段时期会有更多新兴势力走上舞台,各种新思想力、新服务、新模式还会接踵而来。而且我们欣喜地看到,似乎互联网又回到了2000年第一轮高潮时期,一时间群雄并起,各显神通,争在新时代暂居一席之地,整个互联网出现了空前繁荣群雄混战的春秋时代。

       在这样一个时代,我们要做的就是好好享受更多的优质服务,根据我们的喜好来决定各路诸侯的生死存亡。

享受web 2.0的时代

Categories: web 2.0  |   No Comments

享受web 2.0 时代

        互联网上从来不缺乏新概念。web 2.0应该是目前热门的名词了,有人鼓吹,有人怀疑,有人观望。说起来,即时是那些web 2.0的忠实fans也没法提供一个清晰明了的解释,大量的定义与其说在定义不过是种解释。web 1.0的清晰明了之处在于它建立在一种全新的技术之上,开创了可以堪与二次工业革命相提并论数字信息时代,伴随着互联网的发展创造了一系列全新的市场,改变了传统领域的商业模式,其作用和意义让人一目了然。相对而言,web 2.0应该算的上是一次改造,一次提高而不是一种完整意义上的产业革命。所谓质变导致量变,提高和改造的程度决定了是否有一个新时代的到来,就目前的应用而言,这个2.0的时代肯定不如1.0出现那样有划时代的意义,对人类社会生活产生深远的影响,是否能够算作一个独立的互联网新时代还有待历史沉淀和考验。

        就目前看来,web 2.0是一种态度、一种观念,表现了未来的方向,现阶段不是web 2.0的成熟期,仅仅是萌芽期。这种概念和观念主要包括强调以个人用户为中心。网络的服务以个人为中心,开放型、群众参与性和互动性将进一步强化。未来服务深入挖掘用户需求。网络信息提供商最终提供的是一种服务,和传统行业一样,只有深入挖掘用户需求并且满足用户需求的服务才能带来企业增殖,从这个意义上讲web 2.0比web 1.0 更理性。此外现在更注重用户体验。现在的以blog、wiki、google、美味书签为代表web 2.0网站在使用上强调用户使用的便捷性,谁能提供更便捷的服务,谁就将会获得更多的用户支持从而获得更多的商业回报。

      所以,就我们这些普通网民来说。未来的互联网会提供更简洁、更开放的服务。从用户的角度而言,我们不需要关心那些新名词的含义和背后的技术,只需要好好享受web 2.0的新时代

使用AppFuse1.8.2遇到的问题

Categories: Appfuse  |   Comments(2)

使用AppFuse1.8.2遇到的问题

内容提要

这个部分将说明使用AppFuse1.8.2遇到的问题以及如何解决这些问题。

我会用这种格式说明我在 实际过程 中的操作。

目录

  • [1] 导入Eclipse以后无法编译
  • [2] 运行ant setup-db无法正确创建数据库
  • [3] 使用ant deploy无法发布应用
  • [4] 中文乱码问题
我实际使用的是webwork+spring+ hibernate遇到的,可能有些地方与默认的struts+spring+hibernate不一样,有些问题是使用了webwork引出的。使用本文提供的例子需要在创建自己的应用后运行ant install-webwork。

导入Eclipse以后有无法编译 [#1]

在Eclipse中将新创建的Myapp工程导入(import)后,Eclipse提示struts.jar和struts-el.jar两个包找不到。需要手工在Eclipse中把工程对这两个包的引用移除掉。
另外webwork相关的包引用没有添加到工程中,需要手工加入。至此Eclipse可以正常编译整个工程。
如果想彻底解决这个问题,应该考虑修改install-webwork任务。这个问题对使用影响不大,所以我就没有研究了。:-)

运行ant setup-db无法正确创建数据库[#2]

会出现app_user表无法创建的错误:

[schemaexport] (hbm2ddl.SchemaExport                167 ) Unsuccessful: create table app_user
(username varchar(20) not null, version integer not null, password varchar(255) not null,
first_name varchar(50) not null, last_name varchar(50) not null, address varchar(150), city
varchar(50) not null, province varchar(100), country varchar(100), postal_code varchar(15) not
null, email varchar(255) notnull unique, phone_number varchar(255), website varchar(255),
password_hint varchar(255), enabled bit, primary key (username))
[schemaexport] (hbm2ddl.SchemaExport                168 ) Specified key was too long. Max key
length is 500

具体错误和解决办法可以参考AppFuse实践一——配置安装

AppFuse 1.8.1因为DBUnit的关系也会出现无法创建表的问题,这个问题在1.8.2已经改过来了。

使用ant deploy无法发布应用[#3]

运行ant setup-db创建数据库,运行ant setup-tomcat正确配置Tomcat以后,运行ant deploy发布应用会碰到下面的问题:

BUILD FAILED
C:\Myapp\build.xml:285: xdoclet.XDocletException: Couldn't find template:
 C:\Myapp\metadata\templates\struts_form.xdt

检查build.xml 285行,发现下面的的关于gen-forms的ant任务定义

    <!-- Generate ActionForms from POJOs -->
    <target name="gen-forms" depends="prepare" unless="webdoclet.uptodate"
        description="Generates ActionForms from POJOs">
        <taskdef name="xdoclet" classname="xdoclet.DocletTask"
            classpathref="xdoclet.classpath"/>

        <!-- generate struts forms -->
        <xdoclet destdir="${build.dir}/web/gen"
            excludedtags="@version,@author"
            addedtags="@xdoclet-generated at ${TODAY}"
            force="${xdoclet.force}"
            mergedir="metadata/web">
            <fileset dir="src/dao"/>

            <!-- generate struts forms -->
            <actionform templateFile="metadata/templates/struts_form.xdt">
                <packageSubstitution packages="model"
                    substituteWith="webapp.form"/>
            </actionform>
        </xdoclet>
    </target>

这个任务是使用struts用到的,使用webwork不需要用,去掉compile-web任务对gen-forms的引用,把build.xml文件中的的296行

<target name="compile-web" depends="package-service,stage-web,gen-forms" description="Compile web module">

修改成

<target name="compile-web" depends="package-service,stage-web" description="Compile web module">

然后再运行ant deploy,出现好多错

compile-web:
     [echo] Compiling web...
    [mkdir] Created dir: C:\myfile\Myapp\build\test\web\classes
    [javac] Compiling 23 source files to C:\myfile\Myapp\build\web\classes
    [javac] C:\myfile\Myapp\src\web\com\vicfuture\webapp\action\BaseAction.java:
21: package com.opensymphony.webwork does not exist
    [javac] import com.opensymphony.webwork.ServletActionContext;
    [javac]                                 ^
    [javac] C:\myfile\Myapp\src\web\com\vicfuture\webapp\action\BaseAction.java:
22: package com.opensymphony.xwork does not exist
    [javac] import com.opensymphony.xwork.ActionSupport;
    [javac]                               ^
    [javac] C:\myfile\Myapp\src\web\com\vicfuture\webapp\action\BaseAction.java:
37: cannot resolve symbol
    [javac] symbol  : class ActionSupport
    [javac] location: class com.vicfuture.webapp.action.BaseAction
    [javac] public class BaseAction extends ActionSupport {
    [javac]                                 ^
    [javac] C:\myfile\Myapp\src\web\com\vicfuture\webapp\action\FileUploadAction
.java:11: package com.opensymphony.webwork does not exist
    [javac] import com.opensymphony.webwork.ServletActionContext;
    [javac]                                 ^
    [javac] C:\myfile\Myapp\src\web\com\vicfuture\webapp\action\FileUploadAction
.java:12: package com.opensymphony.xwork does not exist
    [javac] import com.opensymphony.xwork.ValidationAware;
    [javac]                               ^
    [javac] C:\myfile\Myapp\src\web\com\vicfuture\webapp\action\FileUploadAction
.java:14: cannot resolve symbol
    [javac] symbol  : class ValidationAware
    [javac] location: class com.vicfuture.webapp.action.FileUploadAction
    [javac] public class FileUploadAction extends BaseAction implements Validati
onAware {
    [javac]                                                             ^
    [javac] C:\myfile\Myapp\src\web\com\vicfuture\webapp\action\ReloadAction.jav
a:16: package com.opensymphony.webwork does not exist
    [javac] import com.opensymphony.webwork.ServletActionContext;
    [javac]                                 ^
    [javac] C:\myfile\Myapp\src\web\com\vicfuture\webapp\action\SignupAction.jav
a:13: package com.opensymphony.webwork does not exist
    [javac] import com.opensymphony.webwork.ServletActionContext;
    [javac]                                 ^
    [javac] C:\myfile\Myapp\src\web\com\vicfuture\webapp\action\UserAction.java:
19: package com.opensymphony.webwork does not exist
    [javac] import com.opensymphony.webwork.ServletActionContext;
    [javac]                                 ^
    [javac] C:\myfile\Myapp\src\web\com\vicfuture\webapp\interceptor\ExceptionHa
ndlerInterceptor.java:11: package com.opensymphony.webwork does not exist
    [javac] import com.opensymphony.webwork.ServletActionContext;
    [javac]                                 ^
    [javac] C:\myfile\Myapp\src\web\com\vicfuture\webapp\interceptor\ExceptionHa
ndlerInterceptor.java:12: package com.opensymphony.xwork does not exist
    [javac] import com.opensymphony.xwork.ActionInvocation;
    [javac]                               ^
    [javac] C:\myfile\Myapp\src\web\com\vicfuture\webapp\interceptor\ExceptionHa
ndlerInterceptor.java:13: package com.opensymphony.xwork.interceptor does not ex
ist
    [javac] import com.opensymphony.xwork.interceptor.Interceptor;
    [javac]                                           ^
    [javac] C:\myfile\Myapp\src\web\com\vicfuture\webapp\interceptor\ExceptionHa
ndlerInterceptor.java:24: cannot resolve symbol
    [javac] symbol  : class Interceptor
    [javac] location: class com.vicfuture.webapp.interceptor.ExceptionHandlerInt
erceptor
    [javac] public class ExceptionHandlerInterceptor implements Interceptor {
    [javac]                                                     ^
    [javac] C:\myfile\Myapp\src\web\com\vicfuture\webapp\interceptor\ExceptionHa
ndlerInterceptor.java:51: cannot resolve symbol
    [javac] symbol  : class ActionInvocation
    [javac] location: class com.vicfuture.webapp.interceptor.ExceptionHandlerInt
erceptor
    [javac]     public String intercept(ActionInvocation invocation)
    [javac]                             ^
    [javac] C:\myfile\Myapp\src\web\com\vicfuture\webapp\interceptor\UserRoleAut
horizationInterceptor.java:9: package com.opensymphony.webwork does not exist
    [javac] import com.opensymphony.webwork.ServletActionContext;
    [javac]                                 ^
    [javac] C:\myfile\Myapp\src\web\com\vicfuture\webapp\interceptor\UserRoleAut
horizationInterceptor.java:10: package com.opensymphony.xwork does not exist
    [javac] import com.opensymphony.xwork.ActionInvocation;
    [javac]                               ^
    [javac] C:\myfile\Myapp\src\web\com\vicfuture\webapp\interceptor\UserRoleAut
horizationInterceptor.java:11: package com.opensymphony.xwork.interceptor does n
ot exist
    [javac] import com.opensymphony.xwork.interceptor.Interceptor;
    [javac]                                           ^
    [javac] C:\myfile\Myapp\src\web\com\vicfuture\webapp\interceptor\UserRoleAut
horizationInterceptor.java:24: cannot resolve symbol
    [javac] symbol  : class Interceptor
    [javac] location: class com.vicfuture.webapp.interceptor.UserRoleAuthorizati
onInterceptor
    [javac] public class UserRoleAuthorizationInterceptor implements Interceptor
 {
    [javac]                                                          ^
    [javac] C:\myfile\Myapp\src\web\com\vicfuture\webapp\interceptor\UserRoleAut
horizationInterceptor.java:27: cannot resolve symbol
    [javac] symbol  : class ActionInvocation
    [javac] location: class com.vicfuture.webapp.interceptor.UserRoleAuthorizati
onInterceptor
    [javac]     public String intercept(ActionInvocation invocation) throws Exce
ption {
    [javac]                             ^
    [javac] C:\myfile\Myapp\src\web\com\vicfuture\webapp\interceptor\ValidationI
nterceptor.java:5: package com.opensymphony.webwork does not exist
    [javac] import com.opensymphony.webwork.ServletActionContext;
    [javac]                                 ^
    [javac] C:\myfile\Myapp\src\web\com\vicfuture\webapp\interceptor\ValidationI
nterceptor.java:6: package com.opensymphony.xwork does not exist
    [javac] import com.opensymphony.xwork.Action;
    [javac]                               ^
    [javac] C:\myfile\Myapp\src\web\com\vicfuture\webapp\interceptor\ValidationI
nterceptor.java:7: package com.opensymphony.xwork does not exist
    [javac] import com.opensymphony.xwork.ActionContext;
    [javac]                               ^
    [javac] C:\myfile\Myapp\src\web\com\vicfuture\webapp\interceptor\ValidationI
nterceptor.java:8: package com.opensymphony.xwork does not exist
    [javac] import com.opensymphony.xwork.ActionInvocation;
    [javac]                               ^
    [javac] C:\myfile\Myapp\src\web\com\vicfuture\webapp\interceptor\ValidationI
nterceptor.java:9: package com.opensymphony.xwork.interceptor does not exist
    [javac] import com.opensymphony.xwork.interceptor.AroundInterceptor;
    [javac]                                           ^
    [javac] C:\myfile\Myapp\src\web\com\vicfuture\webapp\interceptor\ValidationI
nterceptor.java:10: package com.opensymphony.xwork.validator does not exist
    [javac] import com.opensymphony.xwork.validator.ActionValidatorManager;
    [javac]                                         ^
    [javac] C:\myfile\Myapp\src\web\com\vicfuture\webapp\interceptor\ValidationI
nterceptor.java:17: cannot resolve symbol
    [javac] symbol  : class AroundInterceptor
    [javac] location: class com.vicfuture.webapp.interceptor.ValidationIntercept
or
    [javac] public class ValidationInterceptor extends AroundInterceptor {
    [javac]                                            ^
    [javac] C:\myfile\Myapp\src\web\com\vicfuture\webapp\interceptor\ValidationI
nterceptor.java:19: cannot resolve symbol
    [javac] symbol  : class ActionInvocation
    [javac] location: class com.vicfuture.webapp.interceptor.ValidationIntercept
or
    [javac]     protected void after(ActionInvocation dispatcher, String result)
 throws Exception {
    [javac]                          ^
    [javac] C:\myfile\Myapp\src\web\com\vicfuture\webapp\interceptor\ValidationI
nterceptor.java:22: cannot resolve symbol
    [javac] symbol  : class ActionInvocation
    [javac] location: class com.vicfuture.webapp.interceptor.ValidationIntercept
or
    [javac]     protected void before(ActionInvocation invocation) throws Except
ion {
    [javac]                           ^
    [javac] C:\myfile\Myapp\src\web\com\vicfuture\webapp\action\BaseAction.java:
39: cannot resolve symbol
    [javac] symbol  : method getClass ()
    [javac] location: class com.vicfuture.webapp.action.BaseAction
    [javac]     protected transient final Log log = LogFactory.getLog(getClass()
);
    [javac]                                                           ^
    [javac] C:\myfile\Myapp\src\web\com\vicfuture\webapp\action\BaseAction.java:
90: cannot resolve symbol
    [javac] symbol  : variable ServletActionContext
    [javac] location: class com.vicfuture.webapp.action.BaseAction
    [javac]         return ServletActionContext.getRequest();
    [javac]                ^
    [javac] C:\myfile\Myapp\src\web\com\vicfuture\webapp\action\BaseAction.java:
98: cannot resolve symbol
    [javac] symbol  : variable ServletActionContext
    [javac] location: class com.vicfuture.webapp.action.BaseAction
    [javac]         return ServletActionContext.getResponse();
    [javac]                ^
    [javac] C:\myfile\Myapp\src\web\com\vicfuture\webapp\action\FileUploadAction
.java:27: cannot resolve symbol
    [javac] symbol  : variable ServletActionContext
    [javac] location: class com.vicfuture.webapp.action.FileUploadAction
    [javac]             ServletActionContext.getServletContext().getRealPath("/r
esources") +
    [javac]             ^
    [javac] C:\myfile\Myapp\src\web\com\vicfuture\webapp\action\FileUploadAction
.java:63: cannot resolve symbol
    [javac] symbol  : variable SUCCESS
    [javac] location: class com.vicfuture.webapp.action.FileUploadAction
    [javac]         return SUCCESS;
    [javac]                ^
    [javac] C:\myfile\Myapp\src\web\com\vicfuture\webapp\action\FileUploadAction
.java:67: cannot resolve symbol
    [javac] symbol  : variable INPUT
    [javac] location: class com.vicfuture.webapp.action.FileUploadAction
    [javac]         return INPUT;
    [javac]                ^
    [javac] C:\myfile\Myapp\src\web\com\vicfuture\webapp\action\PasswordHintActi
on.java:41: cannot resolve symbol
    [javac] symbol  : method getText (java.lang.String)
    [javac] location: class com.vicfuture.webapp.action.PasswordHintAction
    [javac]             args.add(getText("user.username"));
    [javac]                      ^
    [javac] C:\myfile\Myapp\src\web\com\vicfuture\webapp\action\PasswordHintActi
on.java:42: cannot resolve symbol
    [javac] symbol  : method getText (java.lang.String,java.util.List)
    [javac] location: class com.vicfuture.webapp.action.PasswordHintAction
    [javac]             addActionError(getText("errors.required", args));
    [javac]                            ^
    [javac] C:\myfile\Myapp\src\web\com\vicfuture\webapp\action\PasswordHintActi
on.java:43: cannot resolve symbol
    [javac] symbol  : variable INPUT
    [javac] location: class com.vicfuture.webapp.action.PasswordHintAction
    [javac]             return INPUT;
    [javac]                    ^
    [javac] C:\myfile\Myapp\src\web\com\vicfuture\webapp\action\PasswordHintActi
on.java:58: cannot resolve symbol
    [javac] symbol  : method getText (java.lang.String)
    [javac] location: class com.vicfuture.webapp.action.PasswordHintAction
    [javac]             String subject = getText("webapp.prefix") + getText("use
r.passwordHint");
    [javac]                              ^
    [javac] C:\myfile\Myapp\src\web\com\vicfuture\webapp\action\PasswordHintActi
on.java:58: cannot resolve symbol
    [javac] symbol  : method getText (java.lang.String)
    [javac] location: class com.vicfuture.webapp.action.PasswordHintAction
    [javac]             String subject = getText("webapp.prefix") + getText("use
r.passwordHint");
    [javac]                                                         ^

    [javac] The system is out of resources.
    [javac] Consult the following stack trace for details.
    [javac] java.lang.OutOfMemoryError

BUILD FAILED

肯定是编译路径中没有加入webwork相关包的引用!手工修改Myapp目录下面properties.xml文件,加入webwork相关包的引用,在properties.xml文件第146行后面加上新的一行

<fileset dir="${webwork.dir}" includes="*.jar"/>

然后运行ant deploy 还是出错

BUILD FAILED
C:\myfile\Myapp\build.xml:54: C:\myfile\Myapp\build\web\gen not found.

去掉build.xml第54行

<srcfiles dir="${build.dir}/web/gen" includes="**/*.java"/>

还有第320行

<fileset dir="${build.dir}/web/gen"/>
实际上把这两句注释掉就可以了,这个是前面那个gen-forms任务用到的输出目录。

运行ant deloy,启动tomcat,可以正常工作了!

中文乱码问题 [#4]

界面上可以看到中文字符无法正常显示,有很多“?”。
怀疑是ApplicationResources_zh_CN.properties文件有问题,用eclipse打开编辑(在web\WEB-INF\classes目录下),果然看到是乱码。把早期版本的文件内容copy过来覆盖重新发布,一切正常了!