无聊人士

搬家==》www.soapui.cn

  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  32 随笔 :: 0 文章 :: 60 评论 :: 0 Trackbacks

2005年11月18日 #

struts 2.0.6GA开始试螃蟹,照着struts2的tag文档写成<@s.datetimepicker/>,结果老是报错
211672 [http-8080-Processor25] ERROR freemarker.runtime  - 
on line 
7, column 17 in admin/index.ftl s.datetimepicker not found.
The problematic instruction:
----------
==> user-directive s.datetimepicker [on line 7, column 17 in admin/index.ftl]
----------

Java backtrace for programmers:
----------
freemarker.core.InvalidReferenceException: on line 
7, column 17 in admin/index.ftl s.datetimepicker not found.

试着google一下,正好有人也提交了这个bug,改成 <@s.dateTimePicker />,问题解决

The fix is as follows:

In struts2-core-
2.0.6:
org.apache.struts2.views.freemarker.tags.StrutsModels

has a method
getDateTimePicker()

Which should be re-named:
getDatetimepicker()

to match with the naming convention.


hello,struts2.jpg
posted @ 2007-04-20 10:26 mmwy 阅读(2582) | 评论 (0)编辑 收藏

来自:http://www.javaworld.com.tw/jute/post/print?bid=11&id=166588

3.Re:BIRT報表工具的問題 [Re: uxa]     Copy to clipboard
Posted by: uxa
Posted on: 
2006-09-15 15:28

經過幾次的失敗後~~小弟終於試出來了
不過感覺它似乎只是support xls file format並沒有excel的一些功能> <

1. download eclipse plugin BIRT,小弟抓的是birt-report-designer-all-in-one-2_1_0.zip
將其解開後把eclipse\plugins和eclipse\features這兩個目錄放到eclipse的目錄底下
現在將eclipse打開,您已經可以開始設計報表了。

2. BIRT預設有支援HTML和PDF的格式,以下說明如何支援xls格式
a. download xls-emitter-bin_2
.1.0.zip,解開後將plugins複製到eclipse\plugins下
b. download poi-bin-
3.0-alpha2-20060616.zip,解開後將jar檔複製到eclipse\plugins\ org.uguess.birt.report.engine.emitter.xls_2.1.0.200607031206\lib
c. xls-emitter-bin_2
.1.0.zip解開後有個path的目錄,
(
1) 將org.eclipse.birt.report.designer.ui目錄下的檔案複製到eclipse\plugins\org.eclipse.birt.report.designer.ui.preview_2.1.0.*.jar
(
2)將org.eclipse.birt.report.viewer目錄下的檔案複製到eclipse\plugins\ org.eclipse.birt.report.viewer_2.1.0.*\birt\WEB-INF\lib\viewservlets.jar
(
3)將org.eclipse.birt.report.engine目錄下的檔案複製到eclipse\plugins\org.eclipse.birt.report.engine_2.1.0.*.jar

完成後啟動eclipse可看到在view report的按鈕上多了xls和ppt兩種格式

BIRT下載位置:http://download.eclipse.org/birt/downloads/
Tribix下載位置:https://sourceforge.net/projects/tribix
ps:請注意版本的問題,BIRT2
.1.0請搭配Tribix XLS Emitter 2.1.0版本,在置換檔名的部份也請注意路徑是否正確

posted @ 2007-04-08 15:42 mmwy 阅读(1612) | 评论 (2)编辑 收藏

条码显示,在birt中最常见的有两种方法:1、使用条码字体(对pdf无效);2、用barcode的开源包,生成barcode,然后在报表里用动态地址去取图片。

今晚看birt文档(第 23 章 使用 Java 编写事件处理程序),例子中用java实现了一个LabelEventAdapter的适配器,对标签元素进行事件控制。脑子里灵光一现,似乎条码有着落了。

我的测试例子很简单,继承ImageEventAdapter类,重载onCreate方法,以进行条形码处理

 1 package cn.ynzc.common.birt.test;
 2 
 3 import java.io.File;
 4 import java.io.FileOutputStream;
 5 
 6 import jbarcodebean.Code128;
 7 import jbarcodebean.JBarcodeBean;
 8 
 9 import org.apache.commons.codec.digest.DigestUtils;
10 import org.eclipse.birt.report.engine.api.script.IReportContext;
11 import org.eclipse.birt.report.engine.api.script.eventadapter.ImageEventAdapter;
12 import org.eclipse.birt.report.engine.api.script.instance.IImageInstance;
13 
14 public class MyLabelClass extends ImageEventAdapter {
15 
16   public void onCreate(IImageInstance image, IReportContext reportContext) {
17     try {
18       //实际应用中,可以使用image.getRowData().getColumnValue("columnname")获得字段值
19       String code = "ABCDEF123-2222";
20       //似乎windows文件名中不允许使用“-”等符号,干脆将code进行md5散列处理
21       File file = new File(System.getProperty("java.io.tmpdir"), DigestUtils.md5Hex(code));
22       //避免每次都进行条码文件生成
23       if (!file.exists()) {
24         JBarcodeBean bb = new JBarcodeBean();
25         bb.setCodeType(new Code128());
26         bb.setShowText(true);
27         bb.setBarcodeHeight(45); //条码高度
28         bb.setCode(code);
29         bb.gifEncode(new FileOutputStream(file));
30       }
31       image.setFile(file.getAbsolutePath());
32     }
33     catch (Exception e) {
34       e.printStackTrace();
35     }
36   }
37 
38 }
39 

测试用的birt报表文件简单得要死,就往上面扔了个image元素,设置其Event Handler Class为刚才写好的java类,最终得到的rptdesign文件内容如下:
 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <!-- Written by Eclipse BIRT 2.0 -->
 3 <report xmlns="http://www.eclipse.org/birt/2005/design" version="3.2.6" id="1">
 4     <property name="createdBy">Eclipse BIRT Designer Version 2.1.2.v20070205-1728 Build &lt;20070205-1728></property>
 5     <property name="units">in</property>
 6     <page-setup>
 7         <simple-master-page name="Simple MasterPage" id="2"/>
 8     </page-setup>
 9     <body>
10         <image id="4">
11             <property name="eventHandlerClass">cn.ynzc.common.birt.test.MyLabelClass</property>
12         </image>
13     </body>
14 </report>

运行测试,条形码出来了
birt.jpg

遗留问题:
这次是调用org.eclipse.birt.report.engine.api.script.instance.IImageInstance.setFile()来解决问题,从javadoc可以看到,IImageInstance有很多方法可以调用,其它方法分别有什么作用?比如我尝试了半天的setData(byte[])方法,一开始以为是用这个方法直接把图形数据set进去就ok,结果未成功。


posted @ 2007-04-07 03:37 mmwy 阅读(4190) | 评论 (4)编辑 收藏

birt的IRunAndRenderTask接口提供了addScriptableJavaObject(java.lang.String jsName, java.lang.Object obj)方法,利用这个方法,在直接调用birt api操作处理报表的时候,我们可以将任何java对象通过addScriptableJavaObject("xxx",Object)加进birt去,然后在birt脚本中直接调用xxx.method()进行操作。

我的测试是在一个webwork+spring+hibernate的webapp应用中进行的,进行报表处理的代码参照http://wiki.eclipse.org/index.php/Servlet_Example编写,在代码中,写了一句
task.addScriptableJavaObject("ctx",
WebApplicationContextUtils.getWebApplicationContext(sc));

birt中定义了一个scripts datasource,然后定义一个data set,在dataset的open方法中编写脚本

infoManager=ctx.getBean("infoManager");
infos=infoManager.loadAll();
...
posted @ 2007-04-06 15:39 mmwy 阅读(2047) | 评论 (3)编辑 收藏

在apache网站上已经有很详细的介绍
http://tomcat.apache.org/connectors-doc/reference/iis.html

有几点注意的:
1、除了照文档的例子在注册表"HKEY_LOCAL_MACHINE\SOFTWARE\Apache Software Foundation\Jakarta Isapi Redirector\1.0"建相应键值外,还可以在isapi_redirect.dll所在的目录建“isapi_redirect.properties”文件。

2、extension_uri=/jakarta/isapi_redirect.dll
这个extension_uri写成什么路径,就得在iis站点中建相应名字的虚拟目录(执行权限),以保证/jakarta/isapi_redirect.dll能被正常访问到。

3、除文档上介绍的几大步(注册表、网站、虚拟路径等)以外,win2003 iis上还得做下面这个步骤

新建应用程序扩展
在IIS管理器左侧网站下面选中Web服务扩展,添加一个新的Web服务扩展,扩展名为jakarta,添加要求得文件为D:\Tomcat5.0\bin\jakart\isapi_redirect.dll,并设置扩展状态为允许。
(注:来自 http://www.cnrui.cn/blog/article.asp?id=179




posted @ 2007-03-19 15:39 mmwy 阅读(1821) | 评论 (2)编辑 收藏



选中table的detail行,切换到script标签,在onPrepare事件中输入
 
count=1;

在onCreate事件中输入
1count++;
2this.getStyle().backgroundColor=(count%2==0?"red":"blue");

或是直接打开xml source,在相应的detail位置上修改源码为
                <detail>
                  
<row id="66">
                    .
                    
<method name="onPrepare"><![CDATA[count=1;]]></method>
                    
<method name="onCreate"><![CDATA[count++;this.getStyle().backgroundColor=(count%2==0?"red":"blue");]]></method>
                    ..

xxxxx.jpg

posted @ 2006-11-24 01:04 mmwy 阅读(1867) | 评论 (0)编辑 收藏

定义报表参数:

3.jpg



解决方法一:

1.jpg


2.jpg



解决办法二:

在报表空白处点击一下,然后切换到script标签,选择beforeFactory。

4.jpg


posted @ 2006-11-23 01:48 mmwy 阅读(3274) | 评论 (0)编辑 收藏

笔记一下:

设hibernate.hbm2ddl.auto为update/create-drop/create后,在classpath中扔一个/import.sql进去,hibernate启动时就会执行import.sql的内容。

11860 [main] INFO  org.hibernate.tool.hbm2ddl.SchemaExport  - Running hbm2ddl schema export
11860 [main] DEBUG org.hibernate.tool.hbm2ddl.SchemaExport  - import file not found: /import.sql
11875 [main] INFO  org.hibernate.tool.hbm2ddl.SchemaExport  - exporting generated schema to database
posted @ 2006-10-31 00:32 mmwy 阅读(5753) | 评论 (2)编辑 收藏

使用的安装包:
 1 cronolog-1.6.2.tar.gz                              
 2httpd-2.0.59.tar.gz                                
 3instantclient-basic-linux32-10.2.0.2-20060331.zip  
 4instantclient-sdk-linux32-10.2.0.2-20060331.zip    
 5libmcrypt-2.5.7.tar.gz                             
 6mhash-0.9.7.1.tar.gz                               
 7mysql-3.23.58.tar.gz                               
 8php-4.4.4.tar.gz    

参考文档

  1. 为 Linux 和 Windows 安装 PHP 和 Oracle 10g Instant Client
  2. Connecting to Oracle10g from PHP using OCI-8 (Linux)
与文档有出处的地方
  1. otn上只能下到zip格式的oracle 10g instant client basic和sdk包。解压缩后,全部放到instantclient_10_2目录下。
    [root@localhost sdk]# ls -l ..
    total 
    115948
    -r--r--r--  
    1 root root  1594191 Feb  5  2006 classes12.jar
    -rwxrwxr-x  
    2 root root 18774535 Feb  5  2006 libclntsh.so
    -rwxrwxr-x  
    2 root root 18774535 Feb  5  2006 libclntsh.so.10.1
    -r-xr-xr-x  
    1 root root  5623929 Feb  5  2006 libnnz10.so
    -rwxrwxr-x  
    1 root root  1398088 Feb  5  2006 libocci.so.10.1
    -rwxrwxr-x  
    1 root root 70690282 Feb  5  2006 libociei.so
    -r-xr-xr-x  
    1 root root   119919 Feb  5  2006 libocijdbc10.so
    -r--r--r--  
    1 root root  1540457 Feb  5  2006 ojdbc14.jar
    drwxr-xr-x  
    4 root root     4096 Oct 17 04:27 sdk
    [root@localhost sdk]# ls -l
    total 
    324
    drwxr-xr-x  
    2 root root   4096 Oct 17 04:27 demo
    drwxr-xr-x  
    2 root root   4096 Oct 17 04:27 include
    -r-xr-xr-x  
    1 root root    346 Oct 17 04:27 ott
    -rw-r--r--  
    1 root root 298274 Oct 17 04:27 ottclasses.zip
  2. php4.4.4已经提供了--with-oci8-instant-client参数的支持,同时修复了相关补丁,因此,文档中为php打补丁、重建“configure”脚本的步骤可以省略。
环境变量:
  1. 在LD_LIBRARY_PATH中添加oracle 10g instant client的路径。
    export LD_LIBRARY_PATH=/www/server/instantclient_10_2/:${LD_LIBRARY_PATH}
  2. 设置TNS_ADMIN为oracle tnsname.ora文件所在目录。
    export TNS_ADMIN=/u01/app/oracle/product/10g/network/admin/
编译脚本
./configure \
--prefix
=/www/server/php-4.4.4 \
--with-apxs2
=/www/server/httpd-2.0.59/bin/apxs \
--with-mysql
=/www/server/mysql-3.23.58 \
--with-mcrypt
=/www/server/libmcrypt-2.5.7 \
--with-mhash
=/www/server/mhash-0.9.7.1 \
--with-gd --with-zlib \
--with-oci8-instant-client
=/www/server/instantclient_10_2
注:需要使用ln命令为libclntsh.so.10.1创建一个名为libclntsh.so的连接,否则在configure过程中将会出现error:Link xxxx not found的错误。(http://forums.oracle.com/forums/thread.jspa?messageID=1203218&#1203218

测试
  1. 安装成功的话,在phpinfo()信息中可以看到相应信息
    OCI8 Support                  enabled
    Revision                      $Revision: 
    1.183.2.18.2.3 $
    Oracle Version               
    10.1
    Compile-time ORACLE_HOME      /www/server/instantclient_10_2
    Libraries Used                no value
  2. 测试代码
     1 <?php 
     2 $conn = OCILogon("username", "password", "//127.0.0.1:1521/sid");
     3 $query = 'select table_name from user_tables';
     4 $stid = OCIParse($conn, $query);
     5 OCIExecute($stid, OCI_DEFAULT);
     6 
     7 while ($succ = OCIFetchInto($stid, $row)) {
     8     foreach ($row as $item) {
     9         echo $item." ";
    10         }
    11     echo "<br>\n";
    12  }
    13 OCILogoff($conn);
    14 ?>


posted @ 2006-10-15 02:46 mmwy 阅读(1324) | 评论 (1)编辑 收藏

最近在“玩”hibernate Annotation,弄了个Attachment保存进数据库的测试,附件内容保存在content属性里面。
  @Lob
  @Column(columnDefinition 
= "LongBlob")
  
public byte[] getContent() {
    
return content;
  }
一开始,配置mysql jdbc url如下
jdbc.url            =    jdbc:mysql://localhost/test\
                            ?useUnicode
=true\
                            &characterEncoding
=gbk
一测试,报错
Caused by: java.sql.BatchUpdateException: Syntax error or access violation message from server: "You have an error in your SQL syntax near ''D0CF11E0A1B11AE1000000000000000000000000000000003E000300FEFF0900060000000000000' at line 1"
    at com.mysql.jdbc.PreparedStatement.executeBatch(PreparedStatement.java:
1540)
同样的语句,直接在mysql命令行下运行就没问题,偏偏jdbc上就有这臭毛病。换jdbc driver版本,改@Lob为 @Type(type = "org.springframework.orm.hibernate3.support.BlobByteArrayType"),改hibernate配置(比如hibernate.jdbc.use_streams_for_binary true),甚至是直接用jdbc来insert,乱七八糟折腾半天,问题照旧。最后只好用上“歪”招,把byte[]配成String,在保存的时候把byte[]保存成hex String格式,取的时候再解码回来。

歪招终归是歪招,这两天老为这东西心烦,晚上吃饭的时候无意中想起charset的问题,把代码捡回来再测试了一下,问题解决,哈哈!
jdbc.url            =    jdbc:mysql://localhost/mmwy_blog\
                            ?useUnicode
=true\
                            &characterEncoding
=utf-8
如果设成iso-8859-1、utf-8,保存一点问题都没有,换用gbk、gb2312、big5之类的字符集,问题就出来了。

posted @ 2006-10-12 15:54 mmwy 阅读(1753) | 评论 (1)编辑 收藏

最近开始尝试hibernate annotations,终于成功的将手上一个小应用转为annotations :)

1、spring orm support
与原来使用LocalSessionFactoryBean相比,变动不大(AnnotationSessionFactoryBean本来就是从LocalSessionFactoryBean类继承过来的嘛)
 1    <bean
 2         id="sessionFactory"
 3         class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"
 4         parent="AbstractSessionFactory">
 5         <property name="annotatedClasses">
 6             <list>
 7                 <value>xxx.xxx.xxx.domain.Account</value>
 8             </list>
 9         </property>
10     </bean>
11     <bean
12         id="AbstractSessionFactory"
13         class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"
14         abstract="true">
15         <property
16             name="dataSource"
17             ref="DataSource" />
18         <property name="hibernateProperties">
19             <props>
20                 <prop key="hibernate.dialect">${hibernate.dialect}</prop>
21                 <prop key="hibernate.show_sql">${hibernate.show_sql}</prop>
22                 <prop key="hibernate.hbm2ddl.auto">${hibernate.hbm2ddl.auto}</prop>
23                 <prop key="hibernate.cache.use_query_cache">${hibernate.cache.use_query_cache}</prop>
24                 <prop key="hibernate.cache.provider_class">${hibernate.cache.provider_class}</prop>
25             </props>
26         </property>
27         <property
28             name="lobHandler"
29             ref="DefaultLobHandler" />
30     </bean>
2、id的配置
非常简单,在id的getter上面加个“@Id”就可以了。此时采用的id策略是javax.persistence.GenerationType.AUTO,也可以再加上“@GeneratedValue(generator =GenerationType.IDENTITY|GenerationType.SEQUENCE|GenerationType.TABLE)”换成其它策略。
我的应用采用的是hibernate的uuid策略,就不得不在这儿使用hibernate的扩展了
  @Id
  @Column(length 
= 32)
  @GeneratedValue(generator 
= "system-uuid")
  @GenericGenerator(name 
= "system-uuid", strategy = "uuid")

3、级联策略
在ejb3-persistence.jar中只定义了ALL、MERGE、PERSIST、REFRESH、REMOVE,比较恶心的就是,删除对象的时候,并不会级联删除关联对象,而是用update xx set parent_id=null where parent_id=?这类语句把关系干掉了事。不得已,在这儿用了hibernate的DELETE_ORPHAN。
  @OneToMany(targetEntity = Attachment.class)
  @Cascade(value 
= {org.hibernate.annotations.CascadeType.DELETE_ORPHAN,
      org.hibernate.annotations.CascadeType.ALL})
  @JoinColumn(name 
= "info_id")
4、CACHE
ejb3-persistence.jar里面没有找到cache的配置,继续请出hibernate来干活
import org.hibernate.annotations.Cache;
import org.hibernate.annotations.CacheConcurrencyStrategy;

@Entity
@Table(name 
= "T_INFO")
@Cache(usage 
= CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
5、自定义字段类型
我的POJO中有一个private String content;的属性,按ejb3配成@Lob后,被处理成了text类型,text 64k的存储容量还是比较可怜了。
  @Lob
  @Column(columnDefinition 
= "LongText")

posted @ 2006-10-12 15:38 mmwy 阅读(4882) | 评论 (0)编辑 收藏

以如下字符串为例:
<h1>AVG Internet Security full license free of charge!</h1>
<p>GRISOFT
, the supplier of AVG security software, has released the Public Beta 2 version of the upcoming AVG 7.5 edition. Individual programs are now available for testing purposes to everyone. Why not participate in our AVG beta testing, complete the questionnaire about testing AVG 7.5 and get a free license? We will draw 100 participants from all of the received feedback forms. Winners will obtain a two-year license for AVG Internet Security 7.5 completely free of charge.</p>
使用RichTextEditor进行编辑时,产生的html有oFCKeditor_InfoEdit_model_content.Value = 'xxx'字样,由于字符串中包含单引号、双引号、换行符等字符,编辑器无法进行处理,浏览器控制台报js错误。

在freemarker中提供了一个StringUtil工具,在使用RichTextEditor前,应使用StringUtil.javaStringEnc()进行预处理。
posted @ 2006-09-25 12:05 mmwy 阅读(819) | 评论 (1)编辑 收藏

用webwork 2.2.4、sitemesh 2.2.1、freemarker 2.3.8,操作系统为winxp pro sp2.

web.xml配置大致如下:

 1      < filter >
 2          < filter-name > encodingFilter </ filter-name >
 3          < filter-class > com.yninfo.rules.web.util.CharacterEncodingFilter </ filter-class >
 4          < init-param >
 5              < param-name > encoding </ param-name >
 6              < param-value > UTF-8 </ param-value >
 7          </ init-param >
 8          < init-param >
 9              < param-name > forceEncoding </ param-name >
10              < param-value > true </ param-value >
11          </ init-param >
12      </ filter >
13      < filter >
14          < filter-name > webwork-cleanup </ filter-name >
15          < filter-class > com.opensymphony.webwork.dispatcher.ActionContextCleanUp </ filter-class >
16      </ filter >
17      < filter >
18          < filter-name > sitemesh </ filter-name >
19          < filter-class > com.opensymphony.webwork.sitemesh.FreeMarkerPageFilter </ filter-class >
20      </ filter >
21      < filter >
22          < filter-name > webwork </ filter-name >
23          < filter-class > com.opensymphony.webwork.dispatcher.FilterDispatcher </ filter-class >
24      </ filter >
25      < filter-mapping >
26          < filter-name > webwork-cleanup </ filter-name >
27          < url-pattern > *.ftl </ url-pattern >
28      </ filter-mapping >
29      < filter-mapping >
30          < filter-name > sitemesh </ filter-name >
31          < url-pattern > *.ftl </ url-pattern >
32      </ filter-mapping >
33      < filter-mapping >
34          < filter-name > encodingFilter </ filter-name >
35          < url-pattern > *.ftl </ url-pattern >
36      </ filter-mapping >
37      < filter-mapping >
38          < filter-name > webwork </ filter-name >
39          < url-pattern > *.ftl </ url-pattern >
40      </ filter-mapping >
41      < filter-mapping >
42          < filter-name > webwork </ filter-name >
43          < url-pattern > /webwork/* </ url-pattern >
44      </ filter-mapping >

xwork.xml配置如下:
1        <action
2            name="index"
3            class="com.opensymphony.xwork.ActionSupport">
4            <result
5                name="success"
6                type="freemarker">
7                <param name="location">/admin/index.ftl</param>
8            </result>
9        </action>
sitemesh 配置如下
1    <decorator
2        name="admin"
3        page="/admin/main.ftl">
4        <pattern>/admin/*.ftl</pattern>
5    </decorator>

在tomcat 5.1.17、resin 3.0.19上跑得顺顺利利的,一移到weblogic 8.1.5上就报错
 1####<2006-9-8 上午02时46分44秒 CST> <Error> <HTTP> <www-c1f900a12b2> <myserver> <ExecuteThread: '14' for queue: 'weblogic.kernel.Default'> <<WLS Kernel>> <> <BEA-101104> <Servlet execution in servlet context "ServletContext(id=2664121,name=rules,context-path=/rules)" failed, java.net.ProtocolException: Didn't meet stated Content-Length, wrote: '4949' bytes instead of stated: '4763' bytes..
 2java.net.ProtocolException: Didn't meet stated Content-Length, wrote: '4949' bytes instead of stated: '4763' bytes.
 3    at weblogic.servlet.internal.ServletOutputStreamImpl.ensureContentLength()V(ServletOutputStreamImpl.java:481)
 4    at weblogic.servlet.internal.ServletResponseImpl.ensureContentLength()V(ServletResponseImpl.java:1253)
 5    at weblogic.servlet.internal.ServletResponseImpl.send()V(ServletResponseImpl.java:1265)
 6    at weblogic.servlet.internal.ServletRequestImpl.execute(Lweblogic/kernel/ExecuteThread;)V(ServletRequestImpl.java:2771)
 7    at weblogic.kernel.ExecuteThread.execute(Lweblogic/kernel/ExecuteRequest;)V(ExecuteThread.java:224)
 8    at weblogic.kernel.ExecuteThread.run()V(ExecuteThread.java:183)
 9    at java.lang.Thread.startThreadFromVM(Ljava/lang/Thread;)V(Unknown Source)
10

折腾了好几天,各种方式试过,最后还是从sitemesh cvs上下了最新的源码重新编译解决问题。
posted @ 2006-09-13 17:52 mmwy 阅读(1946) | 评论 (1)编辑 收藏

感谢google,感谢"webwork2.2.2的富文本编辑器的不完美解决方法"一文,感谢李李。当然,最应该感谢的是开源(刨源代码刨出来的)。

1、解决/webwork/*的路径问题
解决办法见“http://www.blogjava.net/mmwy/archive/2006/08/18/64234.html
BTW:也可以象“不完美解决方法”一文中描述的一样,设webwork.serve.static=false,将static/下的东西拷至/webwork目录下。

2、重写(继承)DefaultRichtexteditorConnector类,解决无法在windows平台上创建目录的问题

 1 public   class  RichtexteditorConnector  extends  DefaultRichtexteditorConnector  {
 2    /**
 3    * 解决无法在windows平台上创建目录的问题
 4    * overriding methods
 5    * (non-Javadoc)
 6    *  @see  com.opensymphony.webwork.components.DefaultRichtexteditorConnector#calculateActualServerPath(java.lang.String, java.lang.String, java.lang.String)
 7     */

 8    protected  String calculateActualServerPath(String actualServerPath,
 9       String type, String folderPath)  throws  Exception  {
10     String path  =  StringUtils.replaceChars( " file:/// "
11          +  servletContext.getRealPath( " / "   +  actualServerPath),  ' \\ ' ' / ' );
12     makeDirIfNotExists(path);
13     path  =  path.endsWith( " / " )
14        ?  path
15       : path  +   " / " ;
16      return  path  +  type  +  folderPath;
17   }

18
19    private  ServletContext servletContext;
20
21    public   void  setServletContext(ServletContext servletContext)  {
22      this .servletContext  =  servletContext;
23   }

24 }

3、配置webwork.xml,解决上传路径自定义问题(actualServerPath参数,默认的使用DefaultRichtexteditorConnector类中protected String _actualServerPath = "/com/opensymphony/webwork/static/richtexteditor/data/";的定义),解决获取上传文件url路径问题(默认的使用AbstractRichtexteditorConnector类中String _serverPath = "/webwork/richtexteditor/data/";的定义)

 1      < package
 2          name ="richtexteditor-browse"
 3         extends ="webwork-default"
 4         namespace ="/webwork/richtexteditor/editor/filemanager/browser/default/connectors/jsp" >
 5          < action
 6              name ="connector"
 7             class ="com.mmwy.weblogic_sitemesh.util.RichtexteditorConnector"
 8             method ="browse" >
 9              < result
10                  name ="getFolders"
11                 type ="richtexteditorGetFolders"   />
12              < result
13                  name ="getFoldersAndFiles"
14                 type ="richtexteditorGetFoldersAndFiles"   />
15              < result
16                  name ="createFolder"
17                 type ="richtexteditorCreateFolder"   />
18              < result
19                  name ="fileUpload"
20                 type ="richtexteditorFileUpload"   />
21              < param  name ="actualServerPath" > /upload/ </ param >
22              < param  name ="serverPath" > /upload/ </ param >
23          </ action >
24      </ package >
25
26      < package
27          name ="richtexteditor-upload"
28         extends ="webwork-default"
29         namespace ="/webwork/richtexteditor/editor/filemanager/upload" >
30          < action
31              name ="uploader"
32             class ="com.mmwy.weblogic_sitemesh.util.RichtexteditorConnector"
33             method ="upload" >
34              < result  name ="richtexteditorFileUpload"   />
35              < param  name ="actualServerPath" > /upload/ </ param >
36              < param  name ="serverPath" > /upload/ </ param >
37          </ action >
38      </ package >

注意:serverPath路径必须有后面的"/"。

4、解决获取上传文件url只能使用80端口的问题
顺着源码一直跟进,首先是DefaultRichtexteditorConnector类:

1      protected  String calculateServerPath(String serverPath, String folderPath, String type)  throws  Exception  {
2          // return UrlHelper.buildUrl(serverPath, _request, _response, null, _request.getScheme(), true, true, true);
3          return  UrlHelper.buildUrl(serverPath + type + folderPath, _request, _response,  new  HashMap(), _request.getScheme(),  true true true );
4     }

再跟进UrlHelper.buildUrl方法

 1      public   static  String buildUrl(String action, HttpServletRequest request, HttpServletResponse response, Map params, String scheme,  boolean  includeContext,  boolean  encodeResult,  boolean  forceAddSchemeHostAndPort)  {
 2         StringBuffer link  =   new  StringBuffer();
 3
 4          boolean  changedScheme  =   false ;
 5
 6          int  httpPort  =  DEFAULT_HTTP_PORT;
 7
 8          try   {
 9             httpPort  =  Integer.parseInt((String) Configuration.get(WebWorkConstants.WEBWORK_URL_HTTP_PORT));
10         }
  catch  (Exception ex)  {
11         }

12
13          int  httpsPort  =  DEFAULT_HTTPS_PORT;
14
15          try   {
16             httpsPort  =  Integer.parseInt((String) Configuration.get(WebWorkConstants.WEBWORK_URL_HTTPS_PORT));
17         }
  catch  (Exception ex)  {
18         }

19

因此,解决这个问题的方法很简单,只要在webwork.properties中设webwork.url.http.port = 8080即可。

5、语言问题
RichTextEditor标记autoDetectLanguage默认值为true,在中文环境下使用/editor/lang/zh.js,显示繁体中文字符,而简体中文应该使用zh-cn.js,因此,应设置defaultLanguage="zh-cn"。

1              < @ww .richtexteditor
2                 theme ="simple"
3                 defaultLanguage ="zh-cn"
4                 width ="750"
5                 height ="500"
6                 name ="description4"   />

 



 

posted @ 2006-09-11 12:29 mmwy 阅读(2265) | 评论 (0)编辑 收藏

在网上google半天也没见人解决,还是看了FilterDispatcher的源码才解决,特地贴到blog上,备忘吧。


在com.opensymphony.webwork.dispatcher.FilterDispatcher中有以下代码
1             if ("true".equals(Configuration.get(WebWorkConstants.WEBWORK_SERVE_STATIC_CONTENT)) 
2                     && resourcePath.startsWith("/webwork")) {
3                 String name = resourcePath.substring("/webwork".length());
4                 findStaticResource(name, response);
5             } else {
6                 // this is a normal request, let it pass through
7                 chain.doFilter(request, response);
8             }
也就是说,只要webwork.properties文件中webwork.serve.static=true(系统默认),并且FilterDispatcher这个过滤器对/webwork/*这个url进行了处理的话,就不会发生使用ww2提供的datepicker时,找不到/webwork/*下所有的js、image等资源,不得不手工拷贝webwork.jar中/com/opensymphony/webwork/static为/webwork/*的情况。
 1     <filter>
 2         <filter-name>webwork</filter-name>
 3         <filter-class>com.opensymphony.webwork.dispatcher.FilterDispatcher</filter-class>
 4     </filter>
 5     <filter-mapping>
 6         <filter-name>webwork</filter-name>
 7         <url-pattern>*.action</url-pattern>
 8     </filter-mapping>
 9     <filter-mapping>
10         <filter-name>webwork</filter-name>
11         <url-pattern>/webwork/*</url-pattern>
12     </filter-mapping>

posted @ 2006-08-18 02:16 mmwy 阅读(1544) | 评论 (2)编辑 收藏

很简单,就几个jar包

1 groovy-all- 1.0 -jsr- 05 .jar
2 groovysoap-all- 20060503 .jar
3 activation.jar
4 log4j- 1.2.13 .jar
5 mail.jar

拿以前HelloXfire时的Echo接口做测试,代码少得可怜

 1 import  groovy.net.soap.SoapClient
 2
 3 class  HelloGroovy  {
 4
 5    static   void  main(args)  {
 6     def proxy  =   new  SoapClient( " http://localhost:8080/query/EchoService?wsdl " );
 7     System.out.println(proxy.sayHello());     
 8   }

 9
10 }

在Eclipse里面写完,一运行,出来个“HelloWorld”,顺利得让我简直不敢相信。
posted @ 2006-05-06 12:41 mmwy 阅读(583) | 评论 (1)编辑 收藏

受白衣同志的当,上了xfire的贼船,抛弃了axis,呜!

xfire 1.0终于final了,试用了一下,,感觉同1.0M6相比,使用变化不大。

看看user guide,照着examples下的例子,基本上hello xfire不成问题。

1、jar包

同以往一样,xfire user guide中的Dependency Guide.html还是说得不明不白,除了让人发晕,没有太大的实际意义。

SNAG-0000.jpg

注:
1)XmlSchema-1.0.jar、jakatra commons httpclient/codec只有在Dynamic Client中才需要用。
2)采用quick start、examples/book中用的service.xml配置方法时,xbean-spring与spring有兼容问题,我用1.2.7、2.0M2的spring时,总是报addPropertyValue(String,Object)之类的异常,换成1.2.6以后一切正常。用examples/spring例子中的配置方法时,没有出现这种情况。

2、quick start、examples/book

这种做法很简单,好象也不太合我的胃口,就没仔细折腾。
(1)在web.xml中配置一下

 1  <servlet>
 2    <servlet-name>XFireServlet</servlet-name>
 3    <display-name>XFire Servlet</display-name>
 4    <servlet-class>org.codehaus.xfire.transport.http.XFireConfigurableServlet</servlet-class>
 5  </servlet>
 6
 7  <servlet-mapping>
 8    <servlet-name>XFireServlet</servlet-name>
 9    <url-pattern>/servlet/XFireServlet/*</url-pattern>
10  </servlet-mapping>
11
12  <servlet-mapping>
13    <servlet-name>XFireServlet</servlet-name>
14    <url-pattern>/services/*</url-pattern>
15  </servlet-mapping>

(2)编码。这个不用说,呵呵
(3)在classpath中,建META-INF/xfire/services.xml配置文件,把刚才做好的webservices配置一下。

1<beans xmlns="http://xfire.codehaus.org/config/1.0">
2  <service>
3    <name>BookService</name>
4    <namespace>http://xfire.codehaus.org/BookService</namespace>
5    <serviceClass>org.codehaus.xfire.demo.BookService</serviceClass>
6  </service>
7</beans>

(4)然后就是deploy,访问http://ip:port/webapp name/BookService?WSDL之类的动作了。

3、examples/spring

xfire和spring勾搭得比较紧密啊,只需要简单配置一下,就可以把spring.xml中配置好的bean拿出来做web services了。
(1)折腾spring的东西(略)。
(2)在web.xml中配置一下(注意xfire那一段)

 1    <context-param>
 2        <param-name>contextConfigLocation</param-name>
 3        <param-value>/WEB-INF/applicationContext.xml classpath:org/codehaus/xfire/spring/xfire.xml</param-value>
 4    </context-param>
 5
 6    <listener>
 7        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
 8    </listener>
 9
10    <servlet>
11        <servlet-name>xfire</servlet-name>
12        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
13    </servlet>
14    <servlet-mapping>
15        <servlet-name>xfire</servlet-name>
16        <url-pattern>/*</url-pattern>
17    </servlet-mapping>

(3)在WEB-INF/xfire-servlet.xml中把spring bean同xfire webservices“关联”起来。这个xfire-servlet.xml实际上就是一个标准的spring.xml配置文件。

 1<?xml version="1.0" encoding="UTF-8"?>
 2<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
 3<beans>
 4    <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
 5        <property name="urlMap">
 6            <map>
 7                <entry key="/EchoService" value-ref="echo"/>
 8            </map>
 9        </property>
10    </bean>
11    
12    <bean id="echo" class="org.codehaus.xfire.spring.remoting.XFireExporter">
13        <property name="serviceFactory" ref="xfire.serviceFactory"/>
14        <property name="xfire" ref="xfire"/>
15        <property name="serviceBean" ref="echoBean"/>
16        <property name="serviceClass" value="org.codehaus.xfire.spring.example.Echo"/>>
17    </bean>
18</beans>

注:第16行,xfire 1.0M6中用serviceInterface,现在改成serviceClass了。

(4)然后就完工,用http://ip:port/webapp name/xfire/EchoService?WSDL可以看到WSDL内容。

4、客户端

按我的恶习,这类事情,肯定是直接开vs.net或者C# developer来显摆一下了。不得不承认,.net里面调web services就是方便啊!
SNAG-0001.jpg
至于java做client么,以前一般是用axis来生成client class,xfire也提供类似的工具,不过对于xfire来说,最简单的办法就是用Dynamic Client,几行代码搞定。

1    Service serviceModel = new ObjectServiceFactory().create(Echo.class);
2    Echo service = (Echo) new XFireProxyFactory().create(serviceModel,
3        "http://localhost:8080/xfire-examples/EchoService");
4    String result = service.echo("ok");


 

posted @ 2006-03-02 10:47 mmwy 阅读(11100) | 评论 (13)编辑 收藏

首先强烈遣责water ye同学不负责任的行为,那家伙在blog上贴了一段spring 2.0m2的test代码就了事,居然不测试一下,结果俺的spring groovy test代码折腾半天才过去。

测试代码俺就不贴了,spring的配置就够了
 1 <?xml version="1.0" encoding="GBK"?>
 2 <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" 
 3     "http://www.springframework.org/dtd/spring-beans.dtd">
 4 <beans>
 5     <bean class="org.springframework.scripting.support.ScriptFactoryPostProcessor" />
 6     <bean id="inlineMessenger" class="org.springframework.scripting.groovy.GroovyScriptFactory">
 7         <constructor-arg>
 8             <value>inline:
 9                     package spring.groovy;
10                     
11                     class GroovyInlineMessenger  implements Messenger{
12                         void sayHello(){
13                             System.err.println("Hello");
14                         }
15                     }
16             </value>
17         </constructor-arg>
18     </bean>
19     <bean id="messenger" class="org.springframework.scripting.groovy.GroovyScriptFactory">
20         <constructor-arg value="classpath:spring/groovy/GroovyMessenger.groovy" />
21         <property name="message" value="Hello World!" />
22     </bean>
23 </beans>

1、第5行的bean定义一定要有,估计是提前编译groovy脚本的(具体的可能啃一下源码就明白了)。
2、inlineMessenger这个bean的定义,inline一定要紧跟着<value>写,我为了美观,弄成下面两种写法都没过去。
 1     <bean id="inlineMessenger" class="org.springframework.scripting.groovy.GroovyScriptFactory">
 2         <constructor-arg>
 3             <value>
 4             inline:
 5                     package spring.groovy;
 6                     
 7                     class GroovyInlineMessenger  implements Messenger{
 8                         void sayHello(){
 9                             System.err.println("Hello");
10                         }
11                     }
12             </value>
13         </constructor-arg>
14     </bean>
1     <bean id="inlineMessenger" class="org.springframework.scripting.groovy.GroovyScriptFactory">
 2         <constructor-arg>
 3             <value>
 4             <![CDATA[inline:
 5                     package spring.groovy;
 6                     
 7                     class GroovyInlineMessenger  implements Messenger{
 8                         void sayHello(){
 9                             System.err.println("Hello");
10                         }
11                     }]]>
12             </value>
13         </constructor-arg>
14     </bean>
写成这样倒是过的
 1     <bean id="inlineMessenger" class="org.springframework.scripting.groovy.GroovyScriptFactory">
 2         <constructor-arg>
 3             <value><![CDATA[inline:
 4                     package spring.groovy;
 5                     
 6                     class GroovyInlineMessenger  implements Messenger{
 7                         void sayHello(){
 8                             System.err.println("Hello");
 9                         }
10                     }]]>
11             </value>
12         </constructor-arg>
13     </bean>
俺平时习惯让myeclipse对xml进行格式化,照这么看来,估计一不小心,按个ctrl+shift+F,好端端的spring groovy代码就过不去了,然后就慢慢找问题吧。

posted @ 2006-02-07 10:09 mmwy 阅读(934) | 评论 (0)编辑 收藏


1、webwork.properties

ww2.2.1默认的webwork.properties配置已经非常不错,i18n用utf-8,ioc用spring,fileup用jakarta。因此,我的webwork.properties就只剩两行
1 webwork.multipart.maxSize=209715200
2 webwork.action.extension=ftl #个人恶习,用freemarker做view,再加上不喜欢.action、.do的扩展名,就直接配成ftl了,用frontpage等软件时也比较方便

2、web.xml

ww2.1.7是配servlet的,为了与spring集成,还得加上一个listener
 1     <context-param>
 2         <param-name>contextConfigLocation</param-name>
 3         <param-value>classpath:beans.xml,classpath:com/yninfo/rules/spring.scheduling.xml</param-value>
 4     </context-param>
 5     <listener>
 6         <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
 7     </listener>
 8     <listener>
 9         <listener-class>com.opensymphony.xwork.spring.SpringExternalReferenceResolverSetupListener</listener-class>
10     </listener>
11     <servlet>
12         <servlet-name>webwork</servlet-name>
13         <servlet-class>com.opensymphony.webwork.dispatcher.ServletDispatcher</servlet-class>
14         <load-on-startup>1</load-on-startup>
15     </servlet>
16     <servlet-mapping>
17         <servlet-name>webwork</servlet-name>
18         <url-pattern>*.ftl</url-pattern>
19     </servlet-mapping>
ww2.2.1改成filter,也不需要配listener来处理spring

3、xwork.xml

原来的配置
 1 <xwork>
 2     <include file="webwork-default.xml" />
 3     <package name="default" extends="webwork-default"
 4         externalReferenceResolver="com.opensymphony.xwork.spring.SpringExternalReferenceResolver">
 5         <interceptors>
 6             <interceptor name="reference-resolver"
 7                 class="com.opensymphony.xwork.interceptor.ExternalReferencesInterceptor" />
 8             <interceptor-stack name="default-stack">
 9                 <interceptor-ref name="timer" />
10                 <interceptor-ref name="logger" />
11                 <interceptor-ref name="completeStack" />
12                 <interceptor-ref name="reference-resolver" />
13             </interceptor-stack>
14         </interceptors>
15 
16         <action name="rule" class="com.yninfo.rules.web.action.RuleAction">
17             <result name="success" type="freemarker">
18                 <param name="location">/rule.ftl</param>
19             </result>
20             <result name="error" type="freemarker">
21                 <param name="location">/rule_error.ftl</param>
22             </result>
23             <external-ref name="ruleManager">RuleManager</external-ref>
24         </action>
25     </package>
26 </xwork>
ww2.2.1以后的配置,去掉了上面旧配置中粗体部分
 1 <xwork>
 2     <include file="webwork-default.xml" />
 3     <package name="default" extends="webwork-default">
 4         <interceptors>
 5             <interceptor name="reference-resolver"
 6                 class="com.opensymphony.xwork.interceptor.ExternalReferencesInterceptor" />
 7             <interceptor-stack name="default-stack">
 8                 <interceptor-ref name="timer" />
 9                 <interceptor-ref name="logger" />
10                 <interceptor-ref name="completeStack" />
11             </interceptor-stack>
12         </interceptors>
13 
14         <action name="rule" class="com.yninfo.rules.web.action.RuleAction">
15             <result name="success" type="freemarker">
16                 <param name="location">/rule.ftl</param>
17             </result>
18             <result name="error" type="freemarker">
19                 <param name="location">/rule_error.ftl</param>
20             </result>
21         </action>
22     </package>
23 </xwork>

4、注意:

ww2.2.1中ioc使用spring,默认的是byName,要求spring的beans.xml配置文件中id与ww action中的名称完全相同,由于我个人的恶习,不习惯首字母小写的写法,因此,在action中定义private AccountManager accountManager;,在spring中定义bean id="AccountManager",结果spring不能将AccountManager这个bean注入action的accountManager中,抛出NPE的异常
posted @ 2006-02-04 16:46 mmwy 阅读(552) | 评论 (1)编辑 收藏

1、安装
从trutix 3.0的碟中,上传两个RPM文件DHCP_COM.RPM、DHCP_SER.RPM,然后使用rpm -ivh xxxx.rpm安装即可。

2、配置
root@trustix-v22-cvs-001 ~# cat /etc/dhcpd.conf
# Do not claim to rule this network.  You want to change this if you really
# want it to work.
not authoritative;

# Do not try to update DNS by default
ddns-update-style none;

#网络
subnet 61.138.209.0 netmask 255.255.255.0 {
        range 61.138.209.235 61.138.209.240;  #地址范围
        default-lease-time 600;                             #默认租期时间
        max-lease-time 3600;                               #用户可以获得的最长租期时间
        option subnet-mask 255.255.255.0;         #掩码
        option routers 61.138.209.1;                    #网关
        option domain-name-servers 61.166.150.101; #DNS地址
}
#为某个MAC地址绑定IP
host usr1{
        hardware ethernet 00:50:8D:5A:9C:E9;
        fixed-address 61.138.209.235;
}

posted @ 2005-12-29 18:07 mmwy 阅读(443) | 评论 (0)编辑 收藏

以前一直为KeepWatcher装的那台oracle服务器奇怪,中软Linux 3.1的系统,用了一年,发现/etc/hosts.deny里面写了近二十万条ALL:xxx.xxx.xxx.xxx记录。

这两天弄了台淘汰下来的服务器,准备装来做部门的cvs、bug、oracle服务器,想装oracle的时候省事省心,就装成中软的Linux 3.1,连上断掉再连,如此反复,最后发现自己上不去了,換台机器上去才发现自己被加进ipchains和/etc/hosts.deny里面去了。

开始怀疑是ipchains、iptables服务的问题,chkconfig --level 345 ipchains off以后,仍然如此。

打电话问情报所的吴兵,刚把现象一讲,他就直接说了,是hostsentry和portsentry两个进程做的怪,看了一下,在/etc/rc.d/rc3.d下,这两个东西都是S前缀的,停掉服务,终于OK。


posted @ 2005-12-27 12:30 mmwy 阅读(529) | 评论 (0)编辑 收藏

在刘冬的文章“ Java虚拟机的最大内存是多少 ”一文中
今天分析了当前比较流行的几个不同公司不同版本JVM的最大内存,得出来的结果如下:

公司     JVM版本     最大内存(兆)client     最大内存(兆)server
SUN     1.5.x     1492     1520
SUN     1.5.5(Linux)     2634     2660
SUN     1.4.2     1564     1564
SUN     1.4.2(Linux)     1900     1260
IBM     1.4.2(Linux)     2047     N/A
BEA     JRockit 1.5 (U3)     1909     1902

除非特别说明,否则JVM版本都运行在Windows操作系统下

附:如何获得JVM的最大可用内存

在命令行下用 java -XmxXXXXM -version 命令来进行测试,然后逐渐的增大XXXX的值,如果执行正常就表示指定的内存大小可用,否则会打印错误信息。

实际发现版本上有细微差别的JDK最大容许内存值都不尽相同,因此在实际的应用中还是要自己试验一下看到底内存能达到什么样的值。

通过这个表想说明的是,如果你的机器的内存太多的话,只能通过多运行几个实例来提供机器的利用率了,例如跑Tomcat,你可以多装几个Tomcat并做集群,依此类推。

我在新到的一台dell 2850服务器上做测试

1、使用sun jdk1.4.2_07,测试结果为
[root@localhost bin]# ./java -Xmx3710M -version
Error occurred during initialization of VM
Could not reserve enough space for object heap
[root@localhost bin]# ./java -Xmx3700M -version
java version "1.4.2_07"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.2_07-b05)
Java HotSpot(TM) Client VM (build 1.4.2_07-b05, mixed mode)
2、使用sun jdk 1.5.6,测试结果为
[root@localhost bin]# ./java -Xmx3700M -version
Error occurred during initialization of VM
Could not reserve enough space for object heap
Could not create the Java virtual machine.
[root@localhost bin]# ./java -Xmx3600M -version
java version "1.5.0_06"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_06-b05)
Java HotSpot(TM) Server VM (build 1.5.0_06-b05, mixed mode)

服务器的配置情况
[root@localhost bin]# top

top - 14:32:23 up 5 days, 21:06,  3 users,  load average: 0.00, 0.03, 0.00
Tasks: 114 total,   1 running, 113 sleeping,   0 stopped,   0 zombie
Cpu0  :  0.0% us,  0.0% sy,  0.0% ni, 100.0% id,  0.0% wa,  0.0% hi,  0.0% si
Cpu1  :  0.0% us,  0.0% sy,  0.0% ni, 100.0% id,  0.0% wa,  0.0% hi,  0.0% si
Cpu2  :  2.3% us,  0.0% sy,  0.0% ni, 97.7% id,  0.0% wa,  0.0% hi,  0.0% si
Cpu3  :  0.3% us,  0.0% sy,  0.0% ni, 99.7% id,  0.0% wa,  0.0% hi,  0.0% si
Mem:   4044816k total,  1810908k used,  2233908k free,    92088k buffers
Swap:  2555888k total,        0k used,  2555888k free,  1333328k cached

[root@localhost bin]# cat /proc/meminfo 
MemTotal:      4044816 kB
MemFree:       2234092 kB
Buffers:         92088 kB
Cached:        1333328 kB
SwapCached:          0 kB
Active:         671408 kB
Inactive:       939560 kB
HighTotal:           0 kB
HighFree:            0 kB
LowTotal:      4044816 kB
LowFree:       2234092 kB
SwapTotal:     2555888 kB
SwapFree:      2555888 kB
Dirty:               0 kB
Writeback:           0 kB
Mapped:         230684 kB
Slab:           148664 kB
Committed_AS:   642520 kB
PageTables:       6332 kB
VmallocTotal: 536870911 kB
VmallocUsed:    264596 kB
VmallocChunk: 536606195 kB
HugePages_Total:     0
HugePages_Free:      0
Hugepagesize:     2048 kB

[root@localhost bin]# cat /proc/cpuinfo 
processor       : 0
vendor_id       : GenuineIntel
cpu family      : 15
model           : 4
model name      :                   Intel(R) Xeon(TM) CPU 3.00GHz
stepping        : 3
cpu MHz         : 2992.789
cache size      : 2048 KB
physical id     : 0
siblings        : 2
fpu             : yes
fpu_exception   : yes
cpuid level     : 5
wp              : yes
flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm syscall nx lm pni monitor ds_cpl cid cx16 xtpr
bogomips        : 5931.00
clflush size    : 64
cache_alignment : 128
address sizes   : 36 bits physical, 48 bits virtual
power management:

processor       : 1
vendor_id       : GenuineIntel
cpu family      : 15
model           : 4
model name      :                   Intel(R) Xeon(TM) CPU 3.00GHz
stepping        : 3
cpu MHz         : 2992.789
cache size      : 2048 KB
physical id     : 3
siblings        : 2
fpu             : yes
fpu_exception   : yes
cpuid level     : 5
wp              : yes
flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm syscall nx lm pni monitor ds_cpl cid cx16 xtpr
bogomips        : 5980.16
clflush size    : 64
cache_alignment : 128
address sizes   : 36 bits physical, 48 bits virtual
power management:

processor       : 2
vendor_id       : GenuineIntel
cpu family      : 15
model           : 4
model name      :                   Intel(R) Xeon(TM) CPU 3.00GHz
stepping        : 3
cpu MHz         : 2992.789
cache size      : 2048 KB
physical id     : 0
siblings        : 2
fpu             : yes
fpu_exception   : yes
cpuid level     : 5
wp              : yes
flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm syscall nx lm pni monitor ds_cpl cid cx16 xtpr
bogomips        : 5980.16
clflush size    : 64
cache_alignment : 128
address sizes   : 36 bits physical, 48 bits virtual
power management:

processor       : 3
vendor_id       : GenuineIntel
cpu family      : 15
model           : 4
model name      :                   Intel(R) Xeon(TM) CPU 3.00GHz
stepping        : 3
cpu MHz         : 2992.789
cache size      : 2048 KB
physical id     : 3
siblings        : 2
fpu             : yes
fpu_exception   : yes
cpuid level     : 5
wp              : yes
flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm syscall nx lm pni monitor ds_cpl cid cx16 xtpr
bogomips        : 5980.16
clflush size    : 64
cache_alignment : 128
address sizes   : 36 bits physical, 48 bits virtual
power management:

posted @ 2005-12-05 14:36 mmwy 阅读(6398) | 评论 (5)编辑 收藏

白衣同志是个好同志,“刨虫”啊,俺现在用的O/R Broker就是白衣“刨”出来的!

今天准备睡觉,发现白衣同志blog上在推荐“Web Service Framework:XFire”( http://www.blogjava.net/calvin/archive/2005/12/04/22390.html).嘿嘿,受够了axis,终于解放了。

xfire的user's guide做得很漂亮,俺这种E盲都能看个半懂。quick start看完,直接跳到spring一章,顺带拿手上的一个测试工程做测试,HelloXfire。

xfire 要加的包一大堆,guide上“Dependency Guide”这一章纯粹是在糊弄人,我的工程是webwork2.1.7(freemarker2.3.4)+spring1.2.5+ hibernate3.0.5+oracle8.1.7的东西,原来的jar不算,新加了一堆进去,最后所有的包加进来有19MB,晕啊!
antlr-2.7.5H3.jar
aopalliance.jar
asm.jar
asm-attrs.jar
cglib-nodep-2.1_2.jar
classes12.jar
commons-codec-1.3.jar
commons-collections-3.1.jar
commons-dbcp-1.2.1.jar
commons-fileupload.jar
commons-io-1.1.jar
commons-lang-2.1.jar
commons-logging.jar
commons-pool-1.2.jar
concurrent-1.3.4.jar
cos-multipart.jar
dom4j-1.6.jar
freemarker.jar
groovy-all-1.0-jsr-04.jar
hibernate3.jar
javamail-1.3.2.jar
jaxen-1.1-beta-8.jar
jdom-1.0.jar

jencrypt.jar
jta.jar
log4j-1.2.9.jar
lucene-1.4.3.jar
nls_charset12.jar
ognl.jar
oscache-2.2.jar
oscore.jar
quartz-1.5.0.jar
quartz-oracle-1.5.0.jar
quartz-weblogic-1.5.0.jar
spring.jar
spring-xwork-integration.jar
stax-1.1.2-dev.jar
stax-api-1.0.jar
stax-utils-snapshot-20040917.jar

velocity-dep.jar
webflow-2.1.7.jar
webwork-2.1.7.jar
webwork2-spring.jar
xfire-all-1.0-M6a.jar
xwork.jar
activation-1.0.2.jar
commons-beanutils-1.7.0.jar
wsdl4j-1.5.1.jar


user's guide上说得比较清楚,下载下来的zip里面也有一个spring的example。
首先是在web.xml中做配置,除了原来spring、webwork的,加上
 1    <context-param>
 2        <param-name>contextConfigLocation</param-name>
 3        <param-value>classpath:beans.xml,classpath:org/codehaus/xfire/spring/xfire.xml</param-value>
 4    </context-param>
 5    <servlet>
 6        <servlet-name>xfire</servlet-name>
 7        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
 8    </servlet>
 9    <servlet-mapping>
10        <servlet-name>xfire</servlet-name>
11        <url-pattern>/xfire/*</url-pattern>
12    </servlet-mapping>


然后在WEB-INF下面放一个xfire-servlet.xml文件,实际上就是一个spring的配置文件
 1<?xml version="1.0" encoding="UTF-8"?>
 2<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
 3<beans>
 4    <!-- START SNIPPET: xfire -->
 5    <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
 6        <property name="urlMap">
 7            <map>
 8                <entry key="/echo" value-ref="echo" />
 9                <entry key="/HelloWorld" value-ref="HelloWorld" />
10                <entry key="/AccountManager" value-ref="AccountManager-xfire" />
11            </map>
12        </property>
13    </bean>
14    <bean id="echoBean" class="com.yninfo.rules.services.impl.EchoImpl" />
15    <!-- Declare a parent bean with all properties common to both services -->
16    <bean id="echo" class="org.codehaus.xfire.spring.remoting.XFireExporter">
17        <property name="serviceFactory" ref="xfire.serviceFactory" />
18        <property name="xfire" ref="xfire" />
19        <property name="serviceBean" ref="echoBean" />
20        <property name="serviceInterface" value="com.yninfo.rules.services.Echo" />
21    </bean>
22    <bean id="HelloWorld" class="org.codehaus.xfire.spring.remoting.XFireExporter">
23        <property name="serviceFactory" ref="xfire.serviceFactory" />
24        <property name="xfire" ref="xfire" />
25        <property name="serviceBean" ref="HelloService" />
26        <property name="serviceInterface" value="com.yninfo.rules.services.HelloWorld" />
27    </bean>
28    <bean id="AccountManager-xfire" class="org.codehaus.xfire.spring.remoting.XFireExporter">
29        <property name="serviceFactory" ref="xfire.serviceFactory" />
30        <property name="xfire" ref="xfire" />
31        <property name="serviceBean" ref="AccountManager" />
32        <property name="serviceInterface" value="com.yninfo.rules.services.AccountManager" />
33    </bean>
34    <!-- END SNIPPET: xfire -->
35</beans>
36
值得注意的是“serviceBean”,按user's guides上给的例子是“service”,结果是报错,大意说service这个属性没有setter。
 1public class ServiceBean
 2    implements InitializingBean, ApplicationContextAware
 3{
 4
 5    private Object service;
 6    /**
 7     * Gets the object which backs this service.
 8     * @return
 9     */

10    public Object getServiceBean()
11    {
12        return service;
13    }

14}

我做测试的三个例子,echo是抄xfire examples上的,HelloWorld是一个groovy的例子
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd" >
<beans>
    
<bean id="GroovyScriptFactory" class="org.springframework.beans.factory.script.groovy.GroovyScriptFactory">
        
<property name="expirySeconds" value="20" />
    
</bean>

    
<bean id="HelloService" factory-bean="GroovyScriptFactory" factory-method="create">
        
<constructor-arg index="0" value="classpath:com/yninfo/rules/services/impl/HelloWorldImpl.groovy" />
    
</bean>
</beans>
而AccountManager,则是标准的spring+hibernate的东西。
 1    <bean id="AccountManager" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
 2        <property name="transactionManager" ref="TransactionManager" />
 3        <property name="transactionAttributes">
 4            <props>
 5                <prop key="find*">PROPAGATION_REQUIRED,readOnly</prop>
 6                <prop key="load">PROPAGATION_REQUIRED,readOnly</prop>
 7                <prop key="*">PROPAGATION_REQUIRED</prop>
 8            </props>
 9        </property>
10        <property name="target">
11            <bean class="com.yninfo.rules.services.impl.AccountManagerImpl">
12                <property name="accountDAO" ref="AccountDAO" />
13            </bean>
14        </property>
15    </bean>

配置完成后,启动tomcat,用http://192.168.0.100:8080/rules/xfire/echo?wsdl可以看到wsdl的描述。

在vs2005里面,建了个j#的工程(略)。。。

注:手误,把图覆盖了,只好全部删掉

posted @ 2005-12-05 03:20 mmwy 阅读(7731) | 评论 (12)编辑 收藏

需求很简单,就是用js向后端请求,然后把请求的结果弄进一个select里面。一开始是用xmlrequest去请求后端一个groovy的url,得到一个xml,然后把xml的内容填进select里面去。做完老瞅着不顺眼,正好在看ajax的资料,拿dwr改造一下。

js是我一直很头疼的事了,尤其是对dom的操作上面,dwr感觉就是在直接调java接口,操作java对象,省事省心啊。

用dwr,先得在web.xml中配一下。

 1    <servlet>
 2        <servlet-name>dwr-invoker</servlet-name>
 3        <servlet-class>uk.ltd.getahead.dwr.DWRServlet</servlet-class>
 4        <init-param>
 5            <param-name>debug</param-name>
 6            <param-value>true</param-value>
 7        </init-param>
 8    </servlet>
 9    <servlet-mapping>
10        <servlet-name>dwr-invoker</servlet-name>
11        <url-pattern>/dwr/*</url-pattern>
12    </servlet-mapping>
13

然后就是配dwr.xml文件了。
dwr和spring贴得比较紧,不用折腾,直接让dwr去调spring中定义的bean了。
 1<?xml version="1.0" encoding="UTF-8"?>
 2<!DOCTYPE dwr PUBLIC "-//GetAhead Limited//DTD Direct Web Remoting 1.0//EN" "http://www.getahead.ltd.uk/dwr/dwr10.dtd" >
 3<dwr>
 4    <allow>
 5        <create javascript="ServerManager" creator="spring">
 6            <param name="beanName">ServerManager</param>
 7        </create>
 8    </allow>
 9</dwr>
10
我的project中,已经在web.xml中配了spring的listener,直接写beanName就行。

在ServerManager接口中定义了如下方法
  List<Server> loadAll(User manager, ServerStatus status, String order);
因此,在dwr中定义了三个convert(一开始没配,结果怎么调都不成功)。

1        <convert converter="bean" match="com.yninfo.sa.domain.Server" />
2        <convert converter="bean" match="com.yninfo.sa.domain.ServerStatus" />
3        <convert converter="bean" match="com.yninfo.sa.domain.User" />


loadAll方法中的manager参数,是用户登录成功后,session.setAttribute("user",user)存放的。在html里面,用js是无法读到的,因此,自己定义了一个java bean。
1public class Remote {
2  public User getUser(HttpSession session) {
3    return (User) session.getAttribute("user");
4  }

5}

6

同样的,在dwr中配了一下
1        <create javascript="Remote" creator="new">
2            <param name="class" value="com.yninfo.sa.web.ajax.Remote" />
3        </create>


所有配置完成后,js代码如下:
 1<script type='text/javascript' src='dwr/interface/Remote.js'></script>
 2<script type='text/javascript' src='dwr/interface/ServerManager.js'></script>
 3<script type='text/javascript' src='dwr/engine.js'></script>
 4<script type='text/javascript' src='dwr/util.js'></script>
 5<script>
 6    function init(){
 7        Remote.getUser(
 8            function(user){
 9                ServerManager.loadAll(user,null,null,load);
10            }
);
11    }

12    function load(data){
13        for (var i=0; i<data.length; i++{
14          document.DailyRecordAdd.elements["model.serverId"].options[i]=
15            new Option(data[i].name,data[i].id);
16        }

17    }

18    window.onload = function (){
19        init();
20    }

21</script>


最终的配置文件:
 1<?xml version="1.0" encoding="UTF-8"?>
 2<!DOCTYPE dwr PUBLIC "-//GetAhead Limited//DTD Direct Web Remoting 1.0//EN" "http://www.getahead.ltd.uk/dwr/dwr10.dtd" >
 3<dwr>
 4    <allow>
 5        <create javascript="ServerManager" creator="spring">
 6            <param name="beanName">ServerManager</param>
 7            <include method="add" />
 8            <include method="findByPrimaryKey" />
 9            <include method="loadAll" />
10        </create>
11        <create javascript="Remote" creator="new">
12            <param name="class" value="com.yninfo.sa.web.ajax.Remote" />
13        </create>
14        <convert converter="bean" match="com.yninfo.sa.domain.User" />
15        <convert converter="bean" match="com.yninfo.sa.domain.Server" />
16        <convert converter="bean" match="com.yninfo.sa.domain.ServerStatus" />
17    </allow>
18</dwr>
19

posted @ 2005-12-05 00:04 mmwy 阅读(6394) | 评论 (8)编辑 收藏

最近在RH 6.1、COSIX 3.1服务器上配置iptables,被ipchains弄得半死。

iptables需要加入ip_tables模块,但是由于ipchains从中作梗,每次都报错。
[root@cosix-31-oracle-01 /root]# iptables --list
/lib/modules/2.4.18-5smp/kernel/net/ipv4/netfilter/ip_tables.o: init_module: Device or resource busy
Hint: insmod errors can be caused by incorrect module parameters, including invalid IO or IRQ parameters
/lib/modules/2.4.18-5smp/kernel/net/ipv4/netfilter/ip_tables.o: insmod /lib/modules/2.4.18-5smp/kernel/net/ipv4/netfilter/ip_tables.o failed
/lib/modules/2.4.18-5smp/kernel/net/ipv4/netfilter/ip_tables.o: insmod ip_tables failed
iptables v1.2.5: can't initialize iptables table `filter': iptables who? (do you need to insmod?)
Perhaps iptables or your kernel needs to be upgraded.


开始以为是服务器上安装oracle8i时,降了gcc版本造成的,折腾好几天,无意中在google上用“init_module: Device or resource busy”做关键词google到某个maillist中的提示信息,恍然大悟

首先停掉ipchains服务
#chkconfig --level 345 ipchains off
# service ipchains stop
Flushing all chains: [  OK  ]
Removing user defined chains: [  OK  ]
Resetting built-in chains to the default ACCEPT policy:[  OK  ]
去掉ipchains的模块
# rmmod ipchains

使用vi编辑/etc/sysconfig/iptables文件(具体用哪个文件,要看/etc/rc.d/init.d/iptables脚本)。

# Firewall configuration written by redhat-config-securitylevel
# Manual customization of this file is not recommended.
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]
:RH-Firewall-1-INPUT - [0:0]
-A INPUT -j RH-Firewall-1-INPUT
-A FORWARD -j RH-Firewall-1-INPUT
-A RH-Firewall-1-INPUT -i lo -j ACCEPT
-A RH-Firewall-1-INPUT -p icmp -j ACCEPT
-A RH-Firewall-1-INPUT -p 50   -j ACCEPT
-A RH-Firewall-1-INPUT -p 51   -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp -s 192.168.0.0/24  -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp -s 61.138.209.0/24 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp -s 61.166.155.0/24 -j ACCEPT

-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 1521         -j ACCEPT

-A RH-Firewall-1-INPUT -p udp -s 61.138.209.0/24 -j ACCEPT

-A RH-Firewall-1-INPUT -j REJECT --reject-with icmp-host-prohibited
COMMIT

启动iptables服务
#service iptables start
Flushing all current rules and user defined chains: [  OK  ]
Clearing all current rules and user defined chains: [  OK  ]
Applying iptables firewall rules:
[  OK  ]
#chkconfig --level 345 iptables on



posted @ 2005-11-21 18:58 mmwy 阅读(1559) | 评论 (0)编辑 收藏

折腾了很久,还是 char 发现的问题。

在AS4 U2下,/etc/pam.d/ftp.vsftpd中如下定义

auth  required   /lib/security/pam_userdb.so   db=/etc/vsftpd/vsftpd.login

在使用db_load生成userdb文件时,应该使用

db_load -T -t hash -f ftpuser /etc/vsftpd/vsftpd.login.db

必须给定一个扩展名.db

posted @ 2005-11-18 18:50 mmwy 阅读(2125) | 评论 (0)编辑 收藏

使用ww2的validator,taglib就只能使用xhtml了。taglib我一向讨厌,再加上ww2 xhtml这套做得非常难看,自做主张的加一堆table、td之类的html标签进去。

看了一下xhtml的velocity模板,如果检验未通过,ww2将validators.xml中相应field检验失败的message是放进fieldErrors里面的。

checkbox.vm
#if( $fieldErrors.get($parameters.name) )
  #set ($hasFieldErrors = $fieldErrors.get($parameters.name))
  #foreach ($error in $fieldErrors.get($parameters.name))
    <tr>
        <td align="left" valign="top" colspan="2"><span class="errorMessage">$!error</span></td>
    </tr>
  #end
#end

<tr>
    <td valign="top" colspan="2">
#* Use an extra table so that the checkbox doesn't align with the other columns. *#
<table width="100%" border="0" cellpadding="0" cellspacing="0">
    <tr>
        <td valign="middle">#parse("/template/simple/checkbox.vm")</td>
        <td width="100%" valign="middle"><label #if ($parameters.id) for="$!webwork.htmlEncode($parameters.id)"#end#if ($hasFieldErrors) class="checkboxErrorLabel"#else class="checkboxLabel"#end>$!webwork.htmlEncode($parameters.label)</label></td>
    </tr>
</table>
#parse("/template/xhtml/controlfooter.vm")

我使用的模板引擎是freemarker,参照xhtml的vm代码,自己写了个marco。

<#macro validError local>
    <#if req.method=='POST'>
        <#if
            fieldErrors?has_content &&
            fieldErrors[local]?exists
        >
            <br>
            <font color="red">
                <#list fieldErrors[local] as error>
                    ${error}
                </#list>
            </font>
        </#if>
    </#if>
</#macro>

模板示例:
            <tr>
                <td width="80" align="right">登录密码:</td>
                <td>
                <input type="password" name="model.password"
                    value="${model.password?if_exists}" size="24">
                <@validError local="model.password"/>
                </td>
            </tr>
posted @ 2005-11-18 12:07 mmwy 阅读(1402) | 评论 (0)编辑 收藏

在FreeMarker中,session是一个Hash。
在处理hash类型时,我以前一直是用Session["xxxx"]来读取的,今天翻freemarker manual,发现有这么一个示例。

<#assign ages = {"Joe":23, "Fred":25} + {"Joe":30, "Julia":18}>
- Joe is ${ages.Joe}
- Fred is ${ages.Fred}
- Julia is ${ages.Julia} 

照此,修改了一下手上的nav.ftl模板

    <#if Session.user?exists>
        <p align="right">
        <a href="logout.ftl">注销[${Session.user.loginName}]</a>
        </p>
    </#if>
posted @ 2005-11-18 12:06 mmwy 阅读(3538) | 评论 (0)编辑 收藏