2005年09月21日

tomcat5.5 中 JasperException: Failed to load or instantiate TagExtraInfo class:org.Apache.struts.taglib.html.MessagesTei

JasperException: Failed to load or instantiate TagExtraInfo class: com.acme.tag.IterateTEI

等等…

原因是 web-inf/lib/下出现了jsp-api.jar和,serverlet-api.jar,把它们删除,然后重新启动 web应用即可。

曾经见过有人给出的最蠢的一个做法,是在ActionForm里放了20个Formfile 类型的变量。
其实只需要下面一段代码即可。

        String dirPath = getServlet().getServletContext().getRealPath("/")
                         + "/upload";
        Hashtable fileh = actionForm.getMultipartRequestHandler().
                          getFileElements();
        for (Enumeration e = fileh.keys(); e.hasMoreElements(); ) {
            String key = (String) e.nextElement();
            try {
                FormFile formfile = (FormFile) fileh.get(key);
                String filename = formfile.getFileName().trim(); //文件名
                if (!"".equals(filename)) {
  //不同的浏览器传上的文件名可能有区别,有的是全路径的
//在这里保存文件
                    InputStream ins = formfile.getInputStream();
                    OutputStream os = new FileOutputStream(dirPath +
                            File.separatorChar
                            + filename);
                    int bytesRead = 0;
                    byte[] buffer = new byte[8192];
                    while ((bytesRead = ins.read(buffer, 0, 8192)) != -1) {
                        os.write(buffer, 0, bytesRead);
                    }
                    os.close();
                    ins.close();

                }
            } catch (Exception ex) {
                logger.debug("出错了", ex);
            }
        }

2005年09月06日

java.lang.SecurityException: Unsupported keysize or algorithm parameters
            at javax.crypto.Cipher.init(DashoA6275)
的解决

在使用 bouncycastle的时候,会遇到

java.lang.SecurityException: Unsupported keysize or algorithm parameters
            at javax.crypto.Cipher.init(DashoA6275)

这个错误信息,是keysize长度被限制的缘故。

需要下载下面的文件了;来更新jdk的策略文件。

http://java.sun.com/j2se/1.4.2/download.html

Java Cryptography Extension (JCE)
Unlimited Strength Jurisdiction Policy Files 5.0

jce_policy-1_4_2.zip

Java Cryptography Extension (JCE)
Unlimited Strength Jurisdiction Policy Files 1.4.2

http://java.sun.com/j2se/1.5.0/download.jsp

jce_policy-1_5_0.zip


具体可以参考:
http://www.bouncycastle.org/specifications.html

2005年08月23日

如果配置文件如下:

log4j.rootLogger=ERROR,CONSOLE

log4j.logger.com.lizongbo=DEBUG,CONSOLE

# 应用于控制台
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=%d %-5p %c{1} %x – %m%n

这样就会导致在控制台 输出两次.

连续输出两遍的感觉很不爽,其实只要把

log4j.rootLogger=ERROR,CONSOLE

这行注释掉即可.

相关讨论可以参考:

http://matrix.foresee.cn/blogs/neo/archives/001282.html

2005年08月16日

在google中搜索 delphi xmlprc,找到的结果几乎没什么价值,

网页  约有13,300项符合delphi xmlrpc的查询结果,以下是第1-10项。 (搜索用时 0.06 秒) 

经过多次搜索查找,终于找到了用delphi写的开源的  xmlrpc client 的库.

原来需要用 delphi xml-rpc作关键字才找得到,特意在此作一下下记录:

http://www.google.com/search?hl=zh-CN&inlang=zh-CN&newwindow=1&q=delphi+xml-rpc&lr=

http://sourceforge.net/projects/delphixml-rpc/

http://prdownloads.sourceforge.net/delphixml-rpc/dxmlrpc-2.0.0.zip?download

xmlrpctypes , xmlrpccommon 也是可选的关键字,呵呵

2005年08月15日

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<TITLE> test</TITLE>
</HEAD>

<BODY>
<script>
  function mysubmit()
  {
  alert("test");
    document.demoActionForm.submit();
  }
  </script>
<form name="demoActionForm" action="">
 <input type="button" name="submit" value="提交aaa" onclick="mysubmit();" /> 所产生的冲突
 <input type="submit" name="submitaaaaaa" value="提交" /> 所产生的冲突

<!– <html:submit property="submit" value="添加"/>  –>
</form>
</BODY>
</HTML>

点“提交aaa”按钮,

出错消息内容: 对象不支持此属性或者方法。

解决办法:

表单中不要出现name为"submit"的元素。

2005年06月15日


首先是要打上jbuilder 2005的 update4补丁,才能够支持设置Jboss4.0.x的Server.

但是设置好server之后,在jbuilder2005里无法直接编译jsp,

因此还需要在工程中再添加

D:\jboss-4.0.2\server\default\deploy\jbossweb-tomcat55.sar\下的

commons-el.jar,commons-modeler.jar,jasper-compiler.jar,jasper-compiler-jdt.jar,

然后还要把Jbuilder自带的lib ant 加入。这下就可以编译jsp了。

估计等jbuilder2005 的update5出来就会解决这个问题了。

jaxb 2.0
 
1.下载
jwsdp-1.5中包含的jaxb是1.0版本,最新的版本需要在https://jaxb.dev.java.net/下载:
当前版本的下载地址为:
https://jaxb.dev.java.net/files/documents/51/15728/jaxb_ri_20050606.jar
https://jaxb.dev.java.net/jaxb20-ea/jaxb_ri_20050407.jar
源代码为:
https://jaxb.dev.java.net/files/documents/51/15174/jaxb_ri_src_20050407.jar
2.安装
jaxb_ri_20050606.jar所在的目录下,进入命令行,
命令行下运行:java -jar jaxb_ri_20050606.jar’
然后会弹出授权协议窗口,必须把协议拉到底部,才可以点accept。
点accept之后上列出所有解压出来的文件名字。
此时,在当前目录下会有一个叫jaxb-ri-20050606的目录,里面有jaxb的jar文件和api文档。
3.根据schema文件xsd生成java文件的命令如下:

e:\javalibs\xmllibs\jaxb-ri-20050606\bin>xjc -d "e:\jb\jaxbdemo\src"  -p "com.lizongbo.jaxbdemo"  "e:\jb\jaxbdemo\jaxbtest.xsd"
由于jaxb2.0中生成的java文件使用的是jdk1.5的语法特性:
 
generics for type safe collections
enum type for binding of simple type with enumeration facets
better support for xml schema types using datatypes in jaxp 1.3
leveraging jaxp 1.3 validation for smaller footprint
more compact binding based on constraining facets defined in schema
(from http://weblogs.java.net/blog/sekhar/archive/2005/03/jaxb_20_early_d.html )
由于使用了j2se5.0的特性,jaxb2.0生成的java代码比jaxb1.0生成的要简洁得多了。
jbuilder在编译这些java文件的时候需要设置工程的jdk为1.5,并且编译语法也必须是1.5。
不过jbuilder好像有bug,有些无法生成class文件,于是只好在命令行下手工编译:
e:\javalibs\xmllibs\jaxb-ri-20050606\bin>javac -classpath "e:\jb\jaxbdemo\classes;e:\javalibs\javamail-1.3.2\mail.jar;e:
\javalibs\jaf-1.0.2\activation.jar;e:\javalibs\xmllibs\jaxb-ri-20050606\lib\jaxb1-impl.jar;e:\javalibs\xmllibs\jaxb-ri-2
0050606\lib\jaxb-api.jar;e:\javalibs\xmllibs\jaxb-ri-20050606\lib\jaxb-impl.jar;e:\javalibs\xmllibs\jaxb-ri-20050606\lib
\jaxb-xjc.jar;e:\javalibs\xmllibs\jaxb-ri-20050606\lib\jaxb-xjc.jar;e:\javalibs\xmllibs\jaxb-ri-20050606\lib\jsr173_1.0_
api.jar;d:\jdk1.5.0_02\jre\lib\ext\sunjce_provider.jar;d:\jdk1.5.0_02\jre\lib\ext\sunpkcs11.jar;d:\jdk1.5.0_02\jre\lib\e
xt\dnsns.jar;d:\jdk1.5.0_02\jre\lib\ext\localedata.jar;d:\jdk1.5.0_02\jre\lib\im\indicim.jar;d:\jdk1.5.0_02\jre\lib\im\t
haiim.jar;d:\jdk1.5.0_02\jre\lib\jce.jar;d:\jdk1.5.0_02\jre\lib\charsets.jar;d:\jdk1.5.0_02\jre\lib\deploy.jar;d:\jdk1.5
.0_02\jre\lib\javaws.jar;d:\jdk1.5.0_02\jre\lib\jsse.jar;d:\jdk1.5.0_02\jre\lib\plugin.jar;d:\jdk1.5.0_02\jre\lib\rt.jar
;d:\jdk1.5.0_02\lib\dt.jar;d:\jdk1.5.0_02\lib\htmlconverter.jar;d:\jdk1.5.0_02\lib\jconsole.jar;d:\jdk1.5.0_02\lib\tools
.jar;d:\jdk1.5.0_02\sample\jnlp\servlet\jardiff.jar;d:\jdk1.5.0_02\sample\jnlp\servlet\jnlp-servlet.jar;d:\jdk1.5.0_02\s
ample\jnlp\servlet\jnlp.jar;d:\jdk1.5.0_02\demo\jfc\codepointim\codepointim.jar;d:\jdk1.5.0_02\demo\jfc\java2d\java2demo
.jar;d:\jdk1.5.0_02\demo\plugin\jfc\codepointim\codepointim.jar;d:\jdk1.5.0_02\demo\plugin\jfc\java2d\java2demo.jar"  -d
 e:\jb\jaxbdemo\classes "e:\jb\jaxbdemo\src\com\lizongbo\jaxbdemo\onlineusers.java"
 
 
4.一个简单的测试代码:
 
package com.lizongbo.jaxbdemo;
 
import javax.xml.bind.jaxbcontext;
import javax.xml.bind.jaxbexception;
import javax.xml.bind.marshaller;
import java.util.list;
 
public class testjaxb {
  public testjaxb() {
    super();
  }
 
  public static void main(string[] args) {
    objectfactory objf = new objectfactory();
    onlineusers ous = objf.createonlineusers();
    onlineusers.onlineuser ou = objf.createonlineusersonlineuser();
    ou.setsessionid("lizongbo");
    ou.setusername("http://www.donews.net/lizongbo/");
    ous.getonlineuser().add(ou);
    //system.out.println(ous.getonlineuser().size());
    try {
      jaxbcontext jc = jaxbcontext.newinstance("com.lizongbo.jaxbdemo");
      marshaller m = jc.createmarshaller();
      m.setproperty(marshaller.jaxb_encoding, "utf-8");
      m.setproperty(marshaller.jaxb_formatted_output, boolean.true);
      //m.setproperty(marshaller.jaxb_schema_location, "c:/testnoschema.xsd");
      //m.setproperty(marshaller.jaxb_no_namespace_schema_location, "c:/test.xsd");
      //m.setproperty(marshaller.jaxb_fragment, boolean.true); 以xml片断形式输出
      m.marshal(ous, system.out);
    }
    catch (jaxbexception je) {
    }
  }
}

 
5.如果需要在输出的xml中包含<?xml-stylesheet type=’text/xsl’ href=’foobar.xsl’ ?>
采取的做法是:
system.out.println("<?xml version=’1.0′?>");//<?xml version="1.0" encoding="utf-8" standalone="yes"?>
        system.out.println("<?xml-stylesheet type=’text/xsl’ href=’foobar.xsl’ ?>");       
        marshaller m = context.createmarshaller();
        m.setproperty(marshaller.jaxb_fragment, boolean.true);//设置为片断输出的方式
        m.marshal(poe,system.out);

 6.由于jaxb2.0生成的java代码不再在代码中内置实现schem校验,因此需要单独的指定schema来进行校验。
 
jaxbcontext jc = jaxbcontext.newinstance("com.lizongbo.jaxbdemo");
      system.setproperty("jaxp.debug", "1");
      marshaller m = jc.createmarshaller();
      javax.xml.validation.schemafactory sf = javax.xml.validation.
          schemafactory.newinstance("http://www.w3.org/2001/xmlschema");
      schema schema = sf.newschema(new file("e:/jb/jaxbdemo/jaxbtest.xsd"));
      m.setschema(schema);
因此在限制元素出现的个数(例如minoccurs="0" maxoccurs="2")方面,没有jaxb1.0方便,
也没有castor那样方便(castor也是在生成的代码内置支持)。
 
尤其是想借助schema来生成让某些元素个数不同的java文件时,还是cator比较好。
 
 
参考资料:
https://jaxb.dev.java.net/jaxb20-ea/
使用 xmlbeans 进行编程
xmlbeans 如何引发数据绑定的巨大变革
 http://www-128.ibm.com/developerworks/cn/xml/x-beans1/index.html
java 中的 xml: 文档模型,第一部分:性能
研究 java 中 xml 文档模型的特性和性能

http://www-128.ibm.com/developerworks/cn/xml/x-injava/index.html
 数据绑定专题

http://www-128.ibm.com/developerworks/cn/xml/theme/x-pracdb.html
java 中的 xml: 数据绑定,第 1 部分:代码生成方法 — jaxb 及其它
根据 dtd 或模式生成数据类
http://www-128.ibm.com/developerworks/cn/xml/x-databdopt/part1/index.html
java 中的 xml: 数据绑定,第 2 部分:性能
经过了第 1 部分对数据绑定框架的介绍后,现在对其进行测试
http://www-128.ibm.com/developerworks/cn/xml/x-databdopt/part2/index.html
xml 与 java 技术: 用 castor 进行数据绑定
使用开放源代码项目 cator 进行 java 的 xml 数据绑定
http://www-128.ibm.com/developerworks/cn/xml/x-bindcastor/index.html
 
实用数据绑定: 涉入现实世界
数据绑定实用入门
http://www-128.ibm.com/developerworks/cn/xml/x-pracdb1.html
实用数据绑定: 考察 jaxb,第 1 部分
往返和 xml 到 java 的转换
http://www-128.ibm.com/developerworks/cn/xml/x-pracdb2.html
实用数据绑定: 深入考察 jaxb,第 2 部分
进一步考察 jaxb 的往返能力
http://www-128.ibm.com/developerworks/cn/xml/x-pracdb3.html
 
实用数据绑定: 使用 jaxme 转换 xml
编组和解组
http://www-128.ibm.com/developerworks/cn/xml/x-pracdb5.html
 
实用数据绑定: 谁在使用这个东西,结果如何?
在应用程序中有效地插入数据绑定框架
http://www-128.ibm.com/developerworks/cn/xml/x-pracdb6.html
 
 

2005年06月13日

jboss数据源的jndi名字为:"java:/MySqlDS"

<sql:setDataSource dataSource="java:/MySqlDS"  var="mydb" scope="application"/>

死活找不到数据源。

不得已,只好如下写:


<%@ page import="java.sql.*, javax.sql.DataSource, javax.naming.InitialContext" %>

<%
InitialContext JNDI_Context = new InitialContext();

//JNDI查找数据源

DataSource myds = (DataSource) JNDI_Context.lookup("java:/MySqlDS");
%>
<c:set var="mydb" value="<%=myds%>" scope="application"/>

一下子就ok了。

环境配置为: jstl1.1 (jakarta-taglibs-standard-1.1.2), jboss4.02.

2005年06月08日

windows操作系统可以通过修改注册表来在user agent里添加自己的扩展标志:
下面是例子:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings\User Agent]

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings\User Agent\Post Platform]
"MyIE2"="IEAK"
"lizongbo"="IEAK"
"Googlebot"="IEAK"

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings\User Agent\UA Tokens]
@=""
"MSN 2.0"=""
"MSN 2.5"=""

Flashget也可以设置下载时的user-agent.

操作如下 : 主菜单->工具->选项->协议–>用户代理->选择用户自定义。

通过设置useragent,在调试一些web程序的时候非常方便。