无聊人士

搬家==》www.soapui.cn

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

2006年3月2日 #

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)编辑 收藏