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程序的时候非常方便。

在JDK1.4中使用JAXP1.3
由于JDK1.5以上已经自带jaxp了,而jdk1.4以下版本需要自己添加jaxp库文件。
 
1。下载
因为jwsdp-1.5中带的jaxp是1.26版本,因此需要单独重新下载jaxp
https://jaxp.dev.java.net/files/documents/913/7831/JAXP_RI_20041025.class
 
参考:
https://jaxp.dev.java.net
http://java.sun.com/xml/jaxp/index.jsp
 
2.安装:
JAXP_RI_20041025.class所在的目录下,进入命令行,
运行:java -cp . JAXP_RI_20041025
然后屏幕上列出所有解压出来的文件名字。
此时,在当前目录下会有一个叫jaxp-1_3的目录,里面有jaxp的jar文件和api文档。
 
3.jaxp需要用到的jar为(都在jaxp-1_3目录下):
dom.jar,jaxp-api.jar,sax.jar,xalan.jar,xercesImpl.jar
 
4.接下来就可以根据自己需要来使用jaxp1.3了
 
5.由于sun默认使用的解析器是经过其包装后的(基于Xerces version 2.6.0 和 XSLTC version 2.5.2),比如:
com.sun.org.apache.xerces.internal.jaxp.SAXParserFactoryImpl(可查看javax.xml.parsers.SAXParserFactory 的源代码),
com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl(可查看javax.xml.transform.TransformerFactory 的源代码).
因此在需要使用其它解析器的时候,需要通过设置系统属性值的方式,
或者在$java.home/lib/jaxp.properties进行配置($java.home为System.getProperty("java.home")所得到的路径,具体可以查看javax.xml.parsers.FactoryFinder源代码中的 static Object find(String factoryId, String fallbackClassName) 方法)来选择具体的解析器实现。
jaxp.properties中支持以下属性.
 
示例文件如下(实际就是jaxp的默认值):
javax.xml.transform.TransformerFactory=com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl

javax.xml.parsers.SAXParserFactory=com.sun.org.apache.xerces.internal.jaxp.SAXParserFactoryImpl javax.xml.parsers.DocumentBuilderFactory=com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl

javax.xml.datatype.DatatypeFactory=com.sun.org.apache.xerces.internal.jaxp.datatype.DatatypeFactoryImpl
 
假如需要使用apache的解析器,那么如下操作 。
a.下载http://www.apache.org/dist/xml/xerces-j/Xerces-J-bin.2.6.2.zip
http://www.eu.apache.org/dist/xml/xalan-j/binaries/xalan-j_2_6_0-bin.zip
(均为当前最新版本)
b.解压获得相应的jar文件,放入classpath中。
3.配置jaxp.properties为:
javax.xml.transform.TransformerFactory=org.apache.xalan.xsltc.trax.TransformerFactoryImpl
#也可以使用
#javax.xml.transform.TransformerFactory=org.apache.xalan.processor.TransformerFactoryImpl
javax.xml.parsers.SAXParserFactory=org.apache.xerces.jaxp.SAXParserFactoryImpl
javax.xml.parsers.DocumentBuilderFactory=org.apache.xerces.jaxp.DocumentBuilderFactoryImpl
javax.xml.datatype.DatatypeFactory=org.apache.xerces.internal.jaxp.datatype.DatatypeFactoryImpl
 
 
 
 
 
6.需要关于jaxp的调试信息,设置系统属性jaxp.debug为1即可
   System.setProperty("jaxp.debug","1");
或者运行时的命令为: java -Djaxp.debug=1 com.lizongbo.TestJAXP
 
 
 
几篇非常好的资料:
 
JAXP 专述 Sun 的 Java API for XML 语法分析
http://www-128.ibm.com/developerworks/cn/xml/jaxp/index.html

JAXP 再述 Sun 的 Java API for XML Parsing,1.1 版

http://www-128.ibm.com/developerworks/cn/xml/jaxp1/index.html
 
JAXP 1.3 的新特性,第 1 部分
技术综述,考察解析 API 的变化和新的验证 API
http://www-128.ibm.com/developerworks/cn/xml/x-jaxp13a.html
JAXP 1.3 的新特性,第 2 部分
XPath 功能、支持名称空间的工具和其他改进
http://www-128.ibm.com/developerworks/cn/xml/x-jaxp13b.html
JAXP 全面介绍,第 1 部分
XML 处理工具包使解析和验证变得更容易
http://www-128.ibm.com/developerworks/cn/xml/x-jaxp/index.html
 
Factory模式和Abstract Factory模式
http://www.netbei.com/Article/jsp/jsp6/200409/2771.html
 

Java中关于XML的API一瞥

http://www.matrix.org.cn/article/1073.html
 
 
2005年06月07日
1。使用 WORD-WRAP: break-word样式来进行自适应换行。
例如:
div { word-wrap: break-word; word-break: break-all; }
<xmp style="WORD-WRAP: break-word;word-break: break-all;"></xmp>
其中表格换行
<table style=’table-layout:fixed’>
 
参考: http://www.delphibbs.com/delphibbs/dispq.asp?lid=1004292
 
css20.chm::/css20/c_wordwrap.html
 
css20.chm::/css20/c_tablelayout.html
 
2.禁止输入法,这样就可以限制不能够输入汉字
<input type=text style="ime-mode: disabled ; ">
see:http://www.duoluo.com/webdream/dlog/showlog.asp?cat_id=5&log_id=407
 
3.表格单元内容为空时也需要显示边框.
 <table border=1 style="border-collapse: collapse; " bordercolor=red>
<tr>
<td>lizongbo</td><td>lizongbo</td>
</tr>
<tr>
<td><!–注意这里内容为空,–></td><td>lizongbo</td>
</tr>
<tr>
<td>lizongbo</td><td>lizongbo</td>
</tr>
</table>
“empty-cells: hide;”这个设置并不能够产生效果,因为ie不支持:
参考:http://www.faridea.com/bbs/Announce/Announce.asp?BoardID=301&ID=4618
2005年06月06日

jsp预编译有以下好处:

1.省去第一次运行jsp时的编译所花费的时间,实现servlet一样,一步到位的运行。

2.有效的保护源代码,在产品发布的时候只需要提供依据编译好的class文件,不需要提供jsp源文件,对保护jsp源代码有好处,虽然class文件没有混淆,但是很少人愿意手工去把预编译jsp产生的class文件还原为jsp(目前还没发现有自动还原为jsp的工具)。

但是,也注意,如果为了享受第二个好处,那么也就注意,你需要为不同的servlet容器进行不同的预编译。

比如tomcat的是org.apache.jasper.JspC,而Weblogic的是weblogic.jspc

用Tomcat进行预编译的ant脚本如下:

build.properties的内容为:

tomcat.home=D:/jakarta-tomcat-5.5.9
webapp.path=E:/lizongbo/mywebapp

build.xml的内容为:

<project name="Webapp Precompilation" default="all" basedir=".">
<property file="build.properties"/>
  <target name="jspc">

    <taskdef classname="org.apache.jasper.JspC" name="jasper2" >
      <classpath id="jspc.classpath">
        <pathelement location="${java.home}/../lib/tools.jar"/>
        <fileset dir="${tomcat.home}/bin">
          <include name="*.jar"/>
        </fileset>
        <fileset dir="${tomcat.home}/server/lib">
          <include name="*.jar"/>
        </fileset>
        <fileset dir="${tomcat.home}/common/lib">
          <include name="*.jar"/>
        </fileset>
      </classpath>
    </taskdef>

    <jasper2 javaEncoding="UTF-8"
             validateXml="false"
             uriroot="${webapp.path}"
             webXmlFragment="${webapp.path}/WEB-INF/generated_web.xml"
             outputDir="${webapp.path}/WEB-INF/src" />

  </target>

  <target name="compile">

    <mkdir dir="${webapp.path}/WEB-INF/classes"/>
    <mkdir dir="${webapp.path}/WEB-INF/lib"/>

    <javac destdir="${webapp.path}/WEB-INF/classes"
           optimize="of"
           encoding="UTF-8"
           debug="on" failonerror="false"
           srcdir="${webapp.path}/WEB-INF/src"
    excludes="**/*.smap">
      <classpath>
        <pathelement location="${webapp.path}/WEB-INF/classes"/>
        <fileset dir="${webapp.path}/WEB-INF/lib">
          <include name="*.jar"/>
        </fileset>
        <pathelement location="${tomcat.home}/common/classes"/>
        <fileset dir="${tomcat.home}/common/lib">
          <include name="*.jar"/>
        </fileset>
        <pathelement location="${tomcat.home}/shared/classes"/>
        <fileset dir="${tomcat.home}/shared/lib">
          <include name="*.jar"/>
        </fileset>
        <fileset dir="${tomcat.home}/bin">
          <include name="*.jar"/>
        </fileset>
      </classpath>
      <include name="**" />
      <exclude name="tags/**" />
    </javac>
<jar jarfile="${webapp.path}/WEB-INF/lib/lizongbo.jar" basedir="${webapp.path}/WEB-INF/classes"/>
  </target>
  <target name="all" depends="jspc,compile">
  </target>

</project>

只需要设置好ant的path环境变量,然后修改build.properties。执行ant命令即可。

生成好的jar文件是lizongbo.jar。

在做为产品发布的时候,还需要清除掉${webapp.path}/WEB-INF/classes下的class文件,并且把

${webapp.path}/WEB-INF/generated_web.xml里的servlet映射,添加到${webapp.path}/WEB-INF/web.xml中。

然后就可以删除所有预编过的jsp了。

Tomcat 5.5.9中的admin 模块就是通过jsp预编译打包为catalina-admin.jar的。

D:\jakarta-tomcat-5.5.9\server\webapps\下的几个web应用,都是使用了jsp预编译。

http://www.apache.org/dist/jakarta/tomcat-5/v5.5.9/bin/jakarta-tomcat-5.5.9-admin.zip

参考以下连接,将对你可能遇到的问题有帮助:

遇到 "unmappable character for encoding GBK" 的解决。


http://www.donews.net/lizongbo/archive/2005/05/14/379810.aspx

Jasper 2 JSP Engine How To

Web Application Compilation:

http://jakarta.apache.org/tomcat/tomcat-5.5-doc/jasper-howto.html

jspc Task:

http://ant.apache.org/manual/OptionalTasks/jspc.html

weblogic中使用ant预编译jsp文件

http://dev2dev.bea.com.cn/bbs/thread.jspa?forumID=81&threadID=17465&messageID=136608

http://www.knowsky.com/2881.html