Java堂  


Maven2部署构件到Nexus时出现的Failed to transfer file错误

Filed under: Architecture,JavaPlateform — Jet @ 12:45 下午
Tags: ,
原文出处: Maven2部署构件到Nexus时出现的Failed to transfer file错误
作者: Jet Mah from Java堂
声明: 可以非商业性任意转载, 转载时请务必以超链接形式标明文章原始出处、作者信息及此声明!

具体怎样使用deploy命令部署构件到nexus服务器上可以参考经典的《Maven Definitive Guide》(Maven操作指南),书中的16.7节里面讲解的非常详细。假设我们在项目pom.xml文件中对maven服务器的设置信息如下:

  1. <distributionManagement>
  2.       <repository>
  3.           <id>nexus-releases</id>
  4.           <name>Local Nexus Repository</name>
  5.           <url>http://192.168.1.99:8081/content/repositories/releases</url>
  6.       </repository>
  7.       <snapshotRepository>
  8.           <id>nexus-snapshots</id>
  9.           <name>Local Nexus Repository</name>
  10.           <url>http://192.168.1.99:8081/content/repositories/snapshots</url>
  11.       </snapshotRepository>
  12.   </distributionManagement>

这里我要说的是在使用的过程中遇到的几个都是“Failed to transfer file”错误,错误信息如下格式:

Error deploying artifact: Failed to transfer file:… Return code is:4xx

也就是说前面错误的信息都是一样的,只是后面返回的HTTP状态数字不同。

1. Return code is: 405
这个问题害我查了两个多小时才发现错误的根源,简单的错误就是在Maven执行到上传文件到服务器的时候出现一个HTTP 405错误。开始的时候总以为是Maven本身的问题,所以在这个上面浪费了不少时间。后来仔细查了405错误的含义是“用来访问本页面的 HTTP 方法不被允许”,最后终于发现是因为前面repository的地址写错了,或者是端口写错,或者是地址中的某个单词拼错了,反正原因就是repository的地址写错了

2. Return code is: 401或者Return code is: 403
其实403错误就是“禁止访问”的含义,所以问题的根源肯定在授权上面。Maven在默认情况下会使用deployment帐号(默认密码deploy)登录的系统,但是关键的Nexus中Releases仓库默认的Deployment Policy是“Disable Redeploy”,所以无法部署的问题在这个地方,方法是将其修改为“Allow Redeploy”就可以了。

到这里还没有结束,因为如果直接按照上面的设置的话会有一个安全问题,那就是这样所有的开发人员都可以将构件部署到Nexus的releases仓库中了,时间长了会导致这个仓库中非常乱,这也应该是nexus为什么默认情况下将Release仓库的发布权限关闭的原因了。解决这个问题的整体思路就是在部署构件的时候需要使用用户名和密码登录,操作如下:
(1) 首先将Releases仓库默认的Deployment Policy修改为“Allow Redeploy”;
(2) 然后在右边的Security下面的Users中,修改deployment帐号的密码,方法是在帐号上右键,然后选择“Set Password”(PS:这个操作我找了好久,后来无意中右键才找到,呵呵~~);

(3) 这个时候如果直接执行 mvn deploy 命令的话就又会出现401错误,还有一步就是将密码设置到Maven settings.xml中。打开settings.xml文件(${user.home}/.m/settings.xml或%{m2_home}/conf/settings.xml),找到<servers>,然后修改信息如下:

  1. <server>
  2.       <id>nexus-releases</id>
  3.       <username>deployment</username>
  4.       <password>deploydv89</password>
  5.     </server>
  6.  
  7.     <server>
  8.       <id>nexus-snapshots</id>
  9.       <username>deployment</username>
  10.       <password>deploydv89</password>
  11.    </server>

这里需要特别说明一句的是里面的id必须和你在项目pom.xml文件中distributionManagement下面设置的仓库id一致!当然了,这个里面你也可以设置admin帐号,或者参照deployment的权限手动添加新的帐号等等都是可以的。

当然,问题到这里已经得到了比较完美的解放,但是如果有人还要较真的话会想到帐号的密码直接放到配置文件里面不是很安全。其实只要这里不建议放admin帐号,而deployment是无法登录的。如果非要更安全一些的话,也可以使用Maven 2.1.0之后所提供的密码加密功能,操作的步骤如下:
(1) 使用“mvn –encrypt-master-password xxx”或“mvn –emp xxx”创建一个主密钥,后面的xxx就是你所要设置的密钥的内容,这个密钥主要用于后面加密密码来用的;命令执行之后会产生一个类似{jSMOWnoPFgsHVpMvz5VrIt5kRbzGpI8u+9EF1iFQyJQ=}形式的字符串。
(2) 在${user.home}/.m/目录下创建一个名为settings-security.xml文件,我们将刚刚产生的主密钥放到这个文件中,文件的内容如下:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <settingsSecurity>
  3.     <master>{jSMOWnoPFgsHVpMvz5VrIt5kRbzGpI8u+9EF1iFQyJQ=}</master>
  4. </settingsSecurity>

注意,这个settings-security.xml文件一定要放在${user.home}/.m/目录下面,而不能放在${m2_home}/conf目录下!
(3) 使用“mvn –encrypt-password xxx”或“mvn –ep xxx”命令对帐号的密码进行加密,后面的xxx就是帐号的密码,加密之后依然会产生一个“{xxx}”形式的字符串,将这个字符串替换上面settings.xml文件中的server下面的password节点内容即可。
还有一种更安全的方式,就是将主密钥放到U盘里面,具体的操作可以看下面的参考资料。

3. Return code is: 400
400错误的含义是“错误的请求”,在这里的原因是往往是没有部署到nexus的仓库中。nexus的repository分三种类型:Hosted、Proxy和Virtual,另外还有一个repository group(仓库组)用于对多个仓库进行组合。部署的时候只能部署到Hosted类型的仓库中,如果是其他类型就会出现这个400错误。

还有一种情况也会出现400错误,就是默认情况下部署构件到Releases仓库中有时也会出现400错误,这个原因就像上面提到的那样,Nexus中Releases仓库默认的Deployment Policy是“Disable Redeploy”,所以无论你在settings.xml文件中将server的username设置为deployment还是使用admin都是无法部署的,就会出现这个400错误。这个问题也困扰了我好长时间,而且我还看到网上有人说admin没有部署构件的权限,这个是不对的。修改的方法可以参考上面第2条的做法。

参考资料:
maven 中 部署构件至Nexus(mvn deploy)
Maven2中需要注意的问题
maven deploy到nexus私服出错问题
Maven Tips and Tricks: Encrypting Passwords
Maven – Password Encryption

Subversion和Apache的安装使用指南

Filed under: JavaPlateform,Web&Server — Jet @ 5:21 上午
原文出处: Subversion和Apache的安装使用指南
作者: Jet Mah from Java堂
声明: 可以非商业性任意转载, 转载时请务必以超链接形式标明文章原始出处、作者信息及此声明!

虽然Subversion(SVN)直接可以注册为服务程序,但是最方便的还是使用SVN+Apache的方式,因为可以无防火墙限制、方便直接使用浏览器对代码进行浏览等等。下面我就将自己在Windows下安装Subversion(SVN)和Apache的方法记录一下:

1. 从Apache网站上下载Apache的安装包进行安装,这个过程比较简单。需要注意Apache的版本,本文采用2.2,当然也可以使用2.0版本。假定Apache的安装目录为D:\apache2。

2. http://subversion.tigris.org/官方下载Subversion的Windows下面与Apache的配合版本,这里需要注意Apache的版本,2.0和2.2的是不一样的,不要下载错了。

PS:最新的下载地址更新为:http://alagazam.net/,并且都是基于Apache2.2的,不在提供2.0版本的支持。

然后将下载下来的zip包解压缩到一个目录,比如D:\svn-win32-1.6.6。

3. 将svn安装目录的bin目录下面的mod_authz_svn.so和mod_dav_svn.so两个文件拷贝到Apache安装目录的modules目录下面,然后修改Apache的配置文件httpd.conf,将下面两行的注释去掉:

LoadModule dav_fs_module modules/mod_dav_fs.so
LoadModule dav_module modules/mod_dav.so

同时在下面增加两行:

LoadModule dav_svn_module modules/mod_dav_svn.so
LoadModule authz_svn_module modules/mod_authz_svn.so

4. 接下来就是对SVN进行配置了,配置文件(包含每条的含义)如下:

# 表示访问SVN的地址,形式为http:///svn
<Location /svn>
# 告诉Apache哪个模块负责服务像那样的URL--在这里就是Subversion模块
DAV svn
# 在Subversion 1.3及更高版本中,这个指示器使得Subversion列出由SVNParentPath指定的目录下所有的版本库
SVNListParentPath on
# 下面制定SVN仓库的位置,有两种选择:
# (1) 单库:一个Apache下面只有一个SVN仓库,这样的话就使用SVNPath来指定唯一的仓库位置,访问仓库的方式是http:///svn
# (2) 多库:一个Apache下面可以有多个SVN仓库,这样的话就使用SVNParentPath来指定所有仓库所在的主目录,访问仓库的方式是http:///svn/仓库1、http:///svn/仓库2等等
SVNPath “D:\Data\SVNData\repository”
#SVNParentPath “D:\Data\SVNData\repository”

# 当一个验证对话框弹出时,告诉用户这个验证是用来做什么的
AuthName “Subversion repositories”
# 启用基本的验证,比如用户名/密码对,通常来做这样做就已经足够了。
AuthType Basic
# 指定密码文件的位置,密码文件中存放了用来验证用户的用户名和密码信息。这个文件的生成方式在后续步骤中会介绍
AuthUserFile “D:\Data\SVNData\config\passwd”
# 对版本库和人员进行权限分配,后面会进行详细的设置和介绍。
AuthzSVNAccessFile “D:\Data\SVNData\config\svnaccessfile”

# 限定用户只有输入正确的用户名及密码后才能访问这个路径
Require valid-user
# 如果想匿名读取的话使用下面的方式
#<LimitExcept GET PROPFIND OPTIONS REPORT>
#Require valid-user
#</LimitExcept>
</Location>

5. 接下来使用Apache中的htpasswd.exe命令来生成密码文件,也就是上面AuthUserFile 设置项所指向的文件,切换到Apache安装目录的bin目录下,指向下面的命令:

# 后面的参数c表示新建文件,在第一次执行的时候使用
htpasswd -c D:\Data\SVNData\config\passwd <username>
# 如果是追加新用户或修改原有用户密码,命令后面不加参数c
htpasswd D:\Data\SVNData\config\passwd <username>

每次执行命令之后会提示输入两遍密码

6. 这个时候如果重启Apache的话会出现一个错误提示,这个是因为svn所使用的一些dll文件apache还无法获取,解决的方法可以将svn安装目录的bin目录下面的dll文件拷贝到系统的system32目录下面,但最好的方式是将bin目录加入到path环境变量中。

7. 这个时候如果访问http:///svn的话,应该会出现一个登录框,输入用户名/密码之后就可以看到SVN仓库的内容了。不过常见下面的几个错误:
(1) 出现“403 Forbidden”错误
出现这个错误的原因有很多种,比如Apache2.2相对于之前的版本来说增强了安全性,默认情况下目录是禁止访问的,将“<Directory />”修改如下:

<Directory />
Options FollowSymLinks
AllowOverride None
Order deny,allow
Allow from all
</Directory>

如果这样还不行的话那就是“多库还是单库”的问题了。上面讲过,在对SVN进行配置的时候,使用SVNParentPath设置所有库的根目录,在根目录下面存放多个SVN的库,那这样的话直接访问父目录是没有权限的,只能通过http:///svn/project1来访问对应的项目仓库;如果使用SVNPath设置为单库的话则不会出现这个错误了。

(2) 出现“<m:human-readable errcode=”720003″>Could not open the requested SVN filesystem</m:human-readable>”错误
出现这个错误是告诉你你所指定的SVN仓库的位置并不是一个合法的SVN仓库,解决的方法是首先创建一个空目录,然后使用“svnadmin create”命令来创建SVN库:

# 首先进入 D:\Data\SVNData\repository 目录下
md project1
svnadmin create D:\Data\SVNData\repository\project1

8. 最后安装SVN客户端就可以访问啦,Eclipse集成的客户端推荐使用Subclipse,Visual Studio集成的客户端推荐使用ankhsvn,系统集成的客户端推荐使用TortoiseSVN

更新by 3/27/2012
如果操作系统为64位的话,因为没有提供基于64为的Subversion Server(包括VisualSVN都只有32位版本),所以无法使用64位的Apache,只能使用32位的Apache程序配合上面的SVN Server使用。

参考资料:
[翻译] windows安装基于Apache的SVN服务器(包括SSL配置)
基于svnserve的服务器,权限文件authz配置的常见问题及解答
Forbidden access or bad repository ?
Subversion for Windows 安裝指南

在Eclipse WTP中加入Resin server adapter

Filed under: JavaPlateform — Jet @ 6:01 上午
原文出处: 在Eclipse WTP中加入Resin server adapter
作者: Jet Mah from Java堂
声明: 可以非商业性任意转载, 转载时请务必以超链接形式标明文章原始出处、作者信息及此声明!

目前Eclipse的WTP用来开发JavaEE的功能越来越强大了,再配合上Maven和Ant,完全可以将MyEclipse丢到垃圾桶了。但是在使用WTP进行Server配置的时候发现竟然不支持Resin,后来Google了一下,找到两个解决的方法:
1. Amateras 这个是一个日本人写的Eclipse插件,可以绑定Resin到WTP中,不过他支持的Eclipse和Resin的版本都比较低,而且好久都没有更新了,不推荐使用。

2. The Resin Eclipse plugin 这个是在Resin的官方WIKI上发现的一个Eclipse插件,比较稳定也比较活跃,是Resin官方推荐使用的插件,Eclipse Update地址是:http://caucho.com/eclipse,安装之后就会在Server Adapter里面出现Resin Server了。

参考资料:
IDE-CauchoWiki
WTP扩展(1):增加Resin Server Runtime Environments

Windows下手动安装JRE和Tomcat出现的错误

Filed under: JavaPlateform — Jet @ 5:39 上午
Tags:
原文出处: Windows下手动安装JRE和Tomcat出现的错误
作者: Jet Mah from Java堂
声明: 可以非商业性任意转载, 转载时请务必以超链接形式标明文章原始出处、作者信息及此声明!

我通常不喜欢在系统中使用安装程序来安装JDK,而是直接做一个拷贝,然后指定JAVA_HOME和CLASSPATH环境变量。另外Tomcat的安装我也是喜欢下载zip包的形式,然后解压缩到一个目录下面,启动的时候直接运行bin/startup.bat就可以了。

可是使用bin/service.bat 将Tomcat安装成Windows Service(Windows服务)程序的时候会出现“[Tomcat]Failed creating java ….\jvm.dll”的提示,后来Google了一下,原来是JRE的bin目录下有一个msvcr71.dll文件在启动的时候需要依赖,所以可以将这个文件拷贝到%SystemRoot%\system32下面,也可以拷贝到Tomcat的bin目录下面,当然你可以将%JRE_HOME%\bin加入到path环境变量中,总之要让系统或Tomcat找到这个dll文件。这里比较推荐的方式是使用最后一种,毕竟有可能不仅仅是Tomcat会使用到这个dll文件,也不一定只会用到这一个dll文件。 :)

参考资料:[Tomcat]Failed creating java D:\jre6\bin\client\jvm.dll的解决

使用Jacob时出现的另一个UnsatisfiedLinkError错误:jacob.dll already loaded in another classloader

Filed under: JavaPlateform — Jet @ 12:00 上午
Tags:
原文出处: 使用Jacob时出现的另一个UnsatisfiedLinkError错误:jacob.dll already loaded in another classloader
作者: Jet Mah from Java堂
声明: 可以非商业性任意转载, 转载时请务必以超链接形式标明文章原始出处、作者信息及此声明!

之前文章中已经说过Jacob在windows2003环境下使用的时候会出现UnsatisfiedLinkError错误,解决的方法是需要下载Redistributable Package安装即可。

但如果在JavaEE项目中使用Jacob的时候还会出现另外一个UnsatisfiedLinkError错误:jacob.dll already loaded in another classloader,错误往往会出现在Web容器重启之后。后来查到下面的相关资料:

Java API表明:JVM只允许一个默认的ClassLoader来load native library,同时并不提供专门的API来unload一个loaded native library,因此无法在我们的重启Web应用的代码中来手工清除已经load的jacob。

原因找到了,这是因为在重启Web容器的时候并不会自动结束上一次对dll的加载,解决问题的关键在于重启Web程序之后要确保不要再次加载jacob.jar包,有一个方法就是不要将jacob.jar包放在web程序中,而是将jacob.jar包放在Web容积自身的lib目录下面就可以了。

参考资料:
jacob.dll already loaded in another classloader

Jacob出现UnsatisfiedLinkError错误的解决方法

Filed under: JavaPlateform — Jet @ 5:13 上午
Tags:
原文出处: Jacob出现UnsatisfiedLinkError错误的解决方法
作者: Jet Mah from Java堂
声明: 可以非商业性任意转载, 转载时请务必以超链接形式标明文章原始出处、作者信息及此声明!

Jacob是一个非常常用的用于在Java中连接COM组件的包,它底层使用JNI进行实现,简化了直接使用JNI调用COM组件的繁琐过程。

但是最新的Jacob在Windows 2003系统下使用的时候总是出现UnsatisfiedLinkError的提示,而在XP系统下使用正常。后来在Jacob官方论坛上面查到了解决方法,原来Jacob从1.13之后使用的开发工具是VC++ 2005,如果在旧的系统下运行程序出现UnsatisfiedLinkError错误的时候是因为系统中没有安装Redistributable Package,只要到微软的官方网站上下载这个文件安装之后就可以正常使用了。

参考资料:
can’t run jacob in win server 2003

修改Spark的默认字体大小

Filed under: JavaPlateform — Jet @ 5:56 上午
Tags:
原文出处: 修改Spark的默认字体大小
作者: Jet Mah from Java堂
声明: 可以非商业性任意转载, 转载时请务必以超链接形式标明文章原始出处、作者信息及此声明!

Spark是目前使用最多的Jabber客户端,最新的版本中已经提供了简体中文语言包,但是因为默认情况下Spark中使用的字号为11,所以中文汉字显示的非常难看。
spark默认界面

如果显示正常的话就需要将字号低于12的修改为12。首先在Spark源代码中查找 new Font 关键词,将所有设置为12以下的修改为12;然后打开 org.jivesoftware.Spark ,将其中的

  1. SyntheticaLookAndFeel.setFont("Dialog", 11);

修改为

  1. SyntheticaLookAndFeel.setFont("Dialog", 12);

重新编译之后就显示正常了。
显示正常的Spark

使用DWR出现“例外被抛出且未被接住”错误的原因和解决办法

Filed under: DynamicLanguage,JavaPlateform,RIA — Jet @ 8:19 上午
Tags:
原文出处: 使用DWR出现“例外被抛出且未被接住”错误的原因和解决办法
作者: Jet Mah from Java堂
声明: 可以非商业性任意转载, 转载时请务必以超链接形式标明文章原始出处、作者信息及此声明!

DWR提供了两个js文件:engine.js和util.js,通常来说我们都是动态来引用这两个js文件,在官方的例子中也是这样做的(其中dwr是mapping时的路径):

  1. <script type="text/javascript" src="/dwr/engine.js"></script>
  2. <script type="text/javascript" src="/dwr/util.js"></script>

但是根据页面优化原则,我们如果将所有的js文件进行压缩整合在一起的话将会极大的减少页面加载的时间。但是当我们将上面的两个js文件下载下来然后跟其他js文件整合压缩之后,访问页面的时候会出现一个“例外被抛出且未被接住”的脚本错误。

用百度搜索了一下基本只搜到一篇名为《dwr应用时请注意(初学者)》的文章,文章中建议使用他在附件中所提供的dwr.jar包。但是作者所提供的dwr版本有些低,另外作者并没有在文章中说明造成问题的原因。

后来将异常转换为英文 Exception thrown and not caught 在google中搜索了一下,得知是因为没有在页面中动态引用engine.js,因为dwr在运行的时候需要动态控制这个文件。

但是这样的话就达不到压缩engine.js文件的目的了,我无意中在官方看到一篇专门讲解怎样缓存engine.js文件的文章,下面我就将作者建议的做法说明如下:

首先使用动态加载engine.js文件,然后将该文件下载下来。打开下载下来的engine.js文件,然后将第226到242行之间的文字剪切下来,然后将dwr.jar包中的org/directwebremoting/engine.js文件内容删除,然后粘贴到该文件中并替换dwr.jar包中原来的engine.js文件,内容大致如下:

  1. dwr.engine._origScriptSessionId = "${scriptSessionId}";
  2. dwr.engine._sessionCookieName = "${sessionCookieName}";
  3. dwr.engine._allowGetForSafariButMakeForgeryEasier = "${allowGetForSafariButMakeForgeryEasier}";
  4. dwr.engine._scriptTagProtection = "${scriptTagProtection}";
  5. dwr.engine._defaultPath = "${defaultPath}";
  6. dwr.engine._pollWithXhr = "${pollWithXhr}";

这样就可以将下载下来的engin.js文件同其他文件进行压缩合并了,但是在页面中还必须动态引用engine.js:

  1. <script type="text/javascript" src="/dwr/engine.js"></script>

这样一来即压缩了engine.js文件中静态的部分,又使用了engine.js中的动态部分,并且最重要的是“例外被抛出且未被接住”异常也不会再出现了。

参考资料:
Caching engine.js

如何使用DWR2.0的注解功能

Filed under: DynamicLanguage,JavaPlateform,RIA — Jet @ 8:56 上午
Tags: ,
原文出处: 如何使用DWR2.0的注解功能
作者: Jet Mah from Java堂
声明: 可以非商业性任意转载, 转载时请务必以超链接形式标明文章原始出处、作者信息及此声明!

DWR2.0新增加了JDK5的注解(Annotation)功能,使用注解功能之后可以从很大程度上简化了原来的dwr.xml的配置,使用起来非常的方便。

一、配置DWR使用注解功能

如果让dwr使用注解功能需要在web.xml进行如下配置:

  1. <servlet>
  2.         <servlet-name>dwr-invoker</servlet-name>
  3.         <servlet-class>org.directwebremoting.servlet.DwrServlet</servlet-class>
  4.         <init-param>
  5.             <param-name>debug</param-name>
  6.             <param-value>true</param-value>
  7.         </init-param>
  8.         <!-- 将设定注解的域对象和业务实现类放在下面列表中,中间使用逗号间隔 -->
  9.         <init-param>
  10.             <param-name>classes</param-name>
  11.             <param-value>
  12.                 com.javatang.domain.Book,
  13.                 com.javatang.bank.Bank,
  14.                 com.javatang.dao.BookDao
  15.             </param-value>
  16.         </init-param>
  17.     </servlet>
  18.     <servlet-mapping>
  19.         <servlet-name>dwr-invoker</servlet-name>
  20.         <url-pattern>/scripts/ajax/*</url-pattern>
  21.     </servlet-mapping>

这样设置之后就可以在dwr中使用注解了,非常的方便。

二、DWR提供的注解类型
经常用到的注解主要有:@RemoteProxy、@RemoteMethod、@DataTransferObject和@RemoteProperty。

1. @RemoteProxy和@RemoteMethod
@RemoteMethod对应于原来dwr.xml文件中的create标签,用于创建DWR所提供的远程方法;而@RemoteMethod对应于create标签中的 <include method=”"/>,用来指定所要暴露的方法名称。我们举例来说明:

  1. @RemoteProxy(name="bankFunctions")
  2. public class  Bank {
  3.  
  4.     @RemoteMethod
  5.     public void buy() {
  6.         // ...
  7.     }
  8. }

从上面可以看出,@RemoteProxy表示这个类将用于远程方法,而使用@RemoteMethod指定所要暴露的方法,没有使用@RemoteMethod的方法将不会显示在客户端。
上面的注释使用dwr.xml表示如下:

  1. <!DOCTYPE dwr PUBLIC
  2.     "-//GetAhead Limited//DTD Direct Web Remoting 2.0//EN"
  3.     "http://getahead.ltd.uk/dwr/dwr20.dtd">
  4. <dwr>
  5.     <allow>
  6.         <create creator="new" javascript="bankFunctions">
  7.             <include method="buy" />
  8.         </create>
  9.     </allow>
  10. </dwr>

如果使用Spring中的DAO活逻辑层则需要进行如下的设置:

  1. // BookDao
  2. @RemoteProxy(creator = SpringCreator.class,
  3.     creatorParams = @Param(name = "beanName", value = "bookDao"),
  4.     name="bookFunctions")
  5. public class  BookDao {
  6.  
  7.     @RemoteMethod
  8.     public void addBook(Book book) {
  9.         // ...
  10.     }
  11. }

通过指定@RemoteProxy中的creator类型为SpringCreator,然后在creatorParams指定对应的beanName名称。对应的dwr.xml文件如下:

  1. <!DOCTYPE dwr PUBLIC
  2.     "-//GetAhead Limited//DTD Direct Web Remoting 2.0//EN"
  3.     "http://getahead.ltd.uk/dwr/dwr20.dtd">
  4. <dwr>
  5.     <allow>
  6.         <create creator="spring" javascript="bookFunctions">
  7.             <param name="beanName" value="bookDao" />
  8.             <include method="addBook" />
  9.         </create>
  10.     </allow>
  11. </dwr>

2. @DataTransferObject和@RemoteProperty
@DataTransferObject对应于原来dwr.xml文件中的convert标签,用于转换Java对象;@RemoteProperty则对应于convert标签中的 <param name=”include” value=”" />。

举例说明一下:

  1. @DataTransferObject
  2. public class Book {
  3.     @RemoteProperty
  4.     private int id;
  5.  
  6.     @RemoteProperty
  7.     private String name;
  8.  
  9.     public Book() {
  10.     }
  11.  
  12.     public int getId() {
  13.         return id;
  14.     }
  15.  
  16.     public void setId(int id) {
  17.         this.id = id;
  18.     }
  19.  
  20.     public String getName() {
  21.         return name;
  22.     }
  23.  
  24.     public void setName(String name) {
  25.         this.name = name;
  26.     }
  27. }

@RemoteProperty可以放在JavaBean中的私有变量上面,也可以放在getXXX方法上面。另外如果想将JavaBean中所有的属性都暴露出来的话,不需要在任何属性上面添加@RemoteProperty注释就可以了。

上面的注释对应的dwr.xml文件如下:

  1. <!DOCTYPE dwr PUBLIC
  2.     "-//GetAhead Limited//DTD Direct Web Remoting 2.0//EN"
  3.     "http://getahead.ltd.uk/dwr/dwr20.dtd">
  4. <dwr>
  5.     <allow>
  6.         <convert converter="bean"
  7.             match="com.javatang.domain.Book">
  8.             <param name="include" value="id, name" />
  9.         </convert>
  10.         <!-- 或者用下面的方式也可以
  11.         <convert converter="bean" match="com.javatang.domain.Book" />
  12.         -->
  13.     </allow>
  14. </dwr>

关于具体每个注释使用的方法已经所包含的参数可以参考Java Doc。使用DWR2.0的注解极大的简化了原来dwr.xml的配置,非常的方便。

参考资料:
DWR Annotations
[原创]DWR Annotations and Spring
DWR Annotations 使用 SpringCreator

Spring+Velocity中模板路径的问题

Filed under: JavaPlateform — Jet @ 1:54 下午
原文出处: Spring+Velocity中模板路径的问题
作者: Jet Mah from Java堂
声明: 可以非商业性任意转载, 转载时请务必以超链接形式标明文章原始出处、作者信息及此声明!

在Spring中使用Velocity进行视图渲染的时候需要注意一个路径的设置问题。Spring本身提供了一个用于对Velocity进行设置的类,我们做如下设置:

  1. <bean id="velocityConfig" class="org.springframework.web.servlet.view.velocity.VelocityConfigurer">
  2.         <property name="configLocation" value="/WEB-INF/velocity.properties" />
  3.         <property name="resourceLoaderPath" value="/WEB-INF/templates" />
  4.     </bean>

使用configLocation属性设置了velocity配置文件的路径及文件名,而resourceLoaderPath设置了模板文件所在的位置。这里我们看到,所有的设置路径都是基于网站根目录的。

这个时候对于velocity.properties中用于设置宏文件的velocimacro.library选项而言,他所对应的目录就是前面resourceLoaderPath中设置的目录了,比如我们可以设置如下:

  1. velocimacro.library = macro.vm

并且对于模板文件中#parse指令所包含的文件也是基于resourceLoaderPath中所设置的目录。

如果我们将resourceLoaderPath设置为网站跟目录,而模板文件放在了/WEB-INF/template下,这个时候velocimacro.library和#parse指令所包含的文件路径就是基于网站根目录了,例如有个section.vm文件放在了/WEB-INF/template目录下,这个时候在模板文件中必须写成#parse(“/WEB-INF/template/section.vm”)才可以,可以看出这样非常的麻烦。

因此我们不能想当然的将resourceLoaderPath设置为网站的根目录,而是直接指向模板文件所在的目录。或许你认为我这么说有些可笑,但是有的时候我们往往在这些看似不经意的问题上浪费时间。

« 上一页下一页 »