posts - 22,comments - 35,trackbacks - 0
Windows XP的关机是由Shutdown.exe程序来控制的,位于Windows\System32文件夹中。如果想让Windows 2000也实现同样的效果,可以把Shutdown.exe复制到系统目录下。

比如你的电脑要在22:00关机,可以选择“开始→运行”,输入“at 22:00 Shutdown -s”,这样,到了22点电脑就会出现“系统关机”对话框,默认有30秒钟的倒计时并提示你保存工作。如果你想以倒计时的方式关机,可以输入“Shutdown.exe -s -t 3600”,这里表示60分钟后自动关机,“3600”代表60分钟。

设置好自动关机后,如果想取消的话,可以在运行中输入“shutdown -a”。另外输入“shutdown -i”,则可以打开设置自动关机对话框,对自动关机进行设置。

Shutdown.exe的参数,每个都具有特定的用途,执行每一个都会产生不同的效果,比如“-s”就表示关闭本地计算机,“-a”表示取消关机操作,下面列出了更多参数,大家可以在Shutdown.exe中按需使用。

  -f:强行关闭应用程序
  -m:\\计算机名:控制远程计算机
  -i:显示图形用户界面,但必须是Shutdown的第一个选项
  -l:注销当前用户
  -r:关机并重启
  -t:时间:设置关机倒计时
  -c:“消息内容”:输入关机对话框中的消息内容(不能超127个字符)
posted @ 2006-08-07 14:18 kelven 阅读(414) | 评论 (0)编辑 收藏
http://popkart.tiancity.com/homepage/
posted @ 2006-07-10 13:18 kelven 阅读(335) | 评论 (2)编辑 收藏
1.将数据库驱动程序的JAR文件放在Tomcat的 common/lib 中;
2.在server.xml中设置数据源,以MySQL数据库为例,如下:
在<GlobalNamingResources> </GlobalNamingResources>节点中加入,
      <Resource
      name="jdbc/DBPool"
      type="javax.sql.DataSource"
      password="root"
      driverClassName="com.mysql.jdbc.Driver"
      maxIdle="2"
      maxWait="5000"
      username="root"
      url="jdbc:mysql://127.0.0.1:3306/test"
      maxActive="4"/>
   属性说明:name,数据源名称,通常取”jdbc/XXX”的格式;
            type,”javax.sql.DataSource”;
            password,数据库用户密码;
            driveClassName,数据库驱动;
            maxIdle,最大空闲数,数据库连接的最大空闲时间。超过空闲时间,数据库连
                     接将被标记为不可用,然后被释放。设为0表示无限制。
            MaxActive,连接池的最大数据库连接数。设为0表示无限制。
            maxWait ,最大建立连接等待时间。如果超过此时间将接到异常。设为-1表示
                     无限制。
3.在你的web应用程序的web.xml中设置数据源参考,如下:
  在<web-app></web-app>节点中加入,
  <resource-ref>
    <description>MySQL DB Connection Pool</description>
    <res-ref-name>jdbc/DBPool</res-ref-name>
    <res-type>javax.sql.DataSource</res-type>
    <res-auth>Container</res-auth>
    <res-sharing-scope>Shareable</res-sharing-scope>
 </resource-ref>
  子节点说明: description,描述信息;
               res-ref-name,参考数据源名字,同上一步的属性name;
               res-type,资源类型,”javax.sql.DataSource”;
               res-auth,”Container”;
               res-sharing-scope,”Shareable”;
4.在web应用程序的context.xml中设置数据源链接,如下:
  在<Context></Context>节点中加入,
  <ResourceLink
   name="jdbc/DBPool" 
   type="javax.sql.DataSource" 
   global="jdbc/DBPool"/>
   属性说明:name,同第2步和第3步的属性name值,和子节点res-ref-name值;
             type,同样取”javax.sql.DataSource”;
             global,同name值。
 
至此,设置完成,下面是如何使用数据库连接池。
1.建立一个连接池类,DBPool.java,用来创建连接池,代码如下:
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;

public class DBPool {
    private static DataSource pool;
    static {
         Context env = null;
          try {
              env = (Context) new InitialContext().lookup("java:comp/env");
              pool = (DataSource)env.lookup("jdbc/DBPool");
              if(pool==null) 
                  System.err.println("'DBPool' is an unknown DataSource");
               } catch(NamingException ne) {
                  ne.printStackTrace();
          }
      }
    public static DataSource getPool() {
        return pool;
    }
}

2.在要用到数据库操作的类或jsp页面中,用DBPool.getPool().getConnection(),获得一个Connection对象,就可以进行数据库操作,最后别忘了对Connection对象调用close()方法,注意:这里不会关闭这个Connection,而是将这个Connection放回数据库连接池。
posted @ 2006-06-14 11:17 kelven 阅读(922) | 评论 (0)编辑 收藏

<%@ page import="java.io.*"%>
<%
String root=application.getRealPath("/");
String fileName=request.getParameter("fileName");
String filePath=request.getParameter("filePath");

response.setContentType("application/octet-stream");
response.setHeader("Content-Disposition",
"attachment; filename=\"" +fileName+ "\"");

try{
java.io.OutputStream os = response.getOutputStream(); //不加此行将只能下载文本文件.下载jpg等就会出现打不开的现象.
java.io.FileInputStream fis = new java.io.FileInputStream(root+filePath);
byte[] b = new byte[1024];
int i = 0;
while ( (i = fis.read(b)) > 0 )
{
os.write(b, 0, i);
}

fis.close();
os.flush();
os.close();
}
catch ( Exception e )
{
System.out.println ( "IOException." + e );
}
%>

java.io.FileInputStream fis = new java.io.FileInputStream(文件的真实路径);
也可以

<%
if (request.getParameter("fileUrl") != null)
{
String strFileUrl = request.getParameter("fileUrl");

//获取文件名(DealFile是自己写的一个处理文件的一个类)
DealFile dealFile = new DealFile(strFileUrl);
String filename = dealFile.getFileName();

response.setHeader("content-type","application/octet-stream");
response.setHeader("Content-Disposition","attachment;filename=\""+ filename+"\"");

BufferedInputStream bis = null;
BufferedOutputStream bos = null;
try
{
//从文件所在目录以流的方式读取文件
bis = new BufferedInputStream(new FileInputStream(getServletContext().getRealPath(strFileUrl)));

bos = new BufferedOutputStream(response.getOutputStream());

byte[] buff = new byte[2048];
int bytesRead;

while(-1 != (bytesRead = bis.read(buff, 0, buff.length)))
{
bos.write(buff,0,bytesRead);
}
bos.flush();
}
catch(final IOException e)
{
System.out.println ( "IOException." + e );
}
finally
{
if (bis != null)
bis.close();
if (bos != null)
bos.close();
}
return;
}
%>

posted @ 2006-04-14 16:04 kelven 阅读(1453) | 评论 (0)编辑 收藏

[http://www.javaalmanac.com] - Java开发者年鉴一书的在线版本. 要想快速查到某种Java技巧的用法及示例代码, 这是一个不错的去处.
[http://www.onjava.com] - O'Reilly的Java网站. 每周都有新文章.
[http://java.sun.com] - 官方的Java开发者网站 - 每周都有新文章发表.
[http://www.developer.com/java] - 由Gamelan.com 维护的Java技术文章网站.
[http://www.java.net] - Sun公司维护的一个Java社区网站.
[http://www.builder.com] - Cnet的Builder.com网站 - 所有的技术文章, 以Java为主.
[http://www.ibm.com/developerworks/java] - IBM的Developerworks技术网站; 这是其中的Java技术主页.
[http://www.javaworld.com] - 最早的一个Java站点. 每周更新Java技术文章.
[http://www.devx.com/java] - DevX维护的一个Java技术文章网站.
[http://www.fawcette.com/javapro] - JavaPro在线杂志网站.
[http://www.sys-con.com/java] - Java Developers Journal的在线杂志网站.
[http://www.javadesktop.org] - 位于Java.net的一个Java桌面技术社区网站.
[http://www.theserverside.com] - 这是一个讨论所有Java服务器端技术的网站.
[http://www.jars.com] - 提供Java评论服务. 包括各种framework和应用程序.
[http://www.jguru.com] - 一个非常棒的采用Q&A形式的Java技术资源社区.
[http://www.javaranch.com] - 一个论坛,得到Java问题答案的地方,初学者的好去处。
[http://www.ibiblio.org/javafaq/javafaq.html] - comp.lang.java的FAQ站点 - 收集了来自comp.lang.java新闻组的问题和答案的分类目录.
http://java.sun.com/docs/books/tutorial/] - 来自SUN公司的官方Java指南 - 对于了解几乎所有的java技术特性非常有帮助.
http://www.javablogs.com] - 互联网上最活跃的一个Java Blog网站.
http://java.about.com/] - 来自About.com的Java新闻和技术文章网站.

posted @ 2006-04-05 14:03 kelven 阅读(399) | 评论 (0)编辑 收藏
http://www.021123.com/
posted @ 2006-03-24 14:59 kelven 阅读(352) | 评论 (0)编辑 收藏
1.安装JDK1.4和jakarta-tomcat-4.1.27.exe。

  路径分别为 D:\jdk1.4 和 D:\Tomcat 4.1。
  安装Tomcat 4时,会要求填写web访问端口、用户名、密码等信息。
  web访问端口默认为8080,用户名默认为admin,密码自己填写。

  启动Tomcat4,访问http://127.0.0.1:8080/ ,就能看到Apache Tomcat/4.1.27的欢迎访问页面,页面上有一些相关介绍信息等。


2.设置数据库的驱动

  以Oracle的JDBC驱动设置为例:

  Oracle8i的驱动在\oracle\ora81\jdbc\lib\目录下。名字为classes12.zip。

  Oracle9i的驱动在\oracle9i\jdbc\lib\目录下,名字为ojdbc14.jar。

  将这个文件copy到D:\Tomcat 4.1\common\lib 下。

  注意,如果使用Oracle8i 的驱动,则需要在D:\Tomcat 4.1\common\lib 目录下将classes12.zip更名为classes12.jar,因为Tomcat4不认识zip的后缀名。


3.设置Web应用。

  新建一个文件夹,名字为mypool,位置为D:\mypool。这个D:\mypool路径将是web应用的主目录。

  打开D:\Tomcat 4.1\conf\server.xml 文件,找到如下行:
 
   <!-- Tomcat Root Context -->
     <!--
         <Context path="" docBase="ROOT" debug="0"/>
     -->
 
 
  在这下面,加入如下行:
 
  <Context path="/mypool" docBase="D:\mypool" privileged="true" reloadable="true"/>

 
  完成后,成为这个样子:

    <!-- Tomcat Root Context -->
     <!--
          <Context path="" docBase="ROOT" debug="0"/>
      -->
   
     <Context path="/mypool" docBase="D:\mypool" privileged="true" reloadable="true"/>

  保存D:\Tomcat 4.1\conf\server.xml 文件。

  配置完成后,重新启动Tomcat,就可以这样访问这个web应用了: http://127.0.0.1:8080/mypool/


4.设置Tomcat的连接池数据源。

  访问 http://127.0.0.1:8080/admin 页面,用刚才安装 Tomcat4 时填写的用户名和密码登录。

  登录成功后,会出现Tomcat 的web应用管理界面(Tomcat Web Server Administration Tool)。

  然后在左边的目录树点击“Data Sources”项,右边可以看到JNDI配置的页面。
 
  在右上角的下拉框中选择“Create New Data Source”,接下来填写配置信息:
 
  JNDI Name: jdbc/myOrcl  
  Data Source URL: jdbc:oracle:thin:@192.168.6.40:1521:dbserver
  JDBC Driver Class: oracle.jdbc.driver.OracleDriver
  User Name: myname
  Password: mypassword
  Max. Active Connections:  可用默认值
  Max. Idle Connections:    可用默认值
  Max. Wait for Connection: 可用默认值
  Validation Query: 可不填写。

  然后,按下“save”按钮保存。
  再按下“Commit Changes”按钮将配置更改提交完成。

  此时如果看看 Tomcat4 的窗口,会发现在最下面有一行文字提示:  

   Debugging -- changes saved to conf/server.xml
 
  此时 D:\Tomcat 4.1\conf\server.xml 文件的配置已经更改保存完毕。


  如果此时打开D:\Tomcat 4.1\conf\server.xml 文件,会发现server.xml 文件的内容改变了很多。
  一些注释文字都被去掉了。

  还会发现上面第三步配置Web应用的如下文字
   
   <!-- Tomcat Root Context -->
     <!--
          <Context path="" docBase="ROOT" debug="0"/>
      -->
   
     <Context path="/mypool" docBase="D:\mypool" privileged="true" reloadable="true"/>

  则被自动修改成了这样的:

     <Context className="org.apache.catalina.core.StandardContext" cachingAllowed="true" charsetMapperClass="org.apache.catalina.util.CharsetMapper" cookies="true" crossContext="false" debug="0" docBase="D:\mypool" mapperClass="org.apache.catalina.core.StandardContextMapper" path="/mypool" privileged="true" reloadable="true" swallowOutput="false" useNaming="true" wrapperClass="org.apache.catalina.core.StandardWrapper">
        </Context>

   
   好了,至此位置,对Oracle的应用连接池已经配置完毕。
   
   仔细对照server.xml 文件,会发现刚才所配置的连接池信息被放置在<GlobalNamingResources>标签中,这意味着这个信息是可以被全局引用的,大致是如下的样子:

    <GlobalNamingResources>
    <Environment name="simpleValue" override="true" type="java.lang.Integer" value="30"/>
    <Resource name="jdbc/myOrcl" scope="Shareable" type="javax.sql.DataSource"/>
    <Resource auth="Container" description="User database that can be updated and saved" name="UserDatabase" scope="Shareable" type="org.apache.catalina.UserDatabase"/>
   
    <ResourceParams name="jdbc/myOrcl">
      <parameter>
        <name>maxWait</name>
        <value>5000</value>
      </parameter>
      <parameter>
        <name>maxActive</name>
        <value>200</value>
      </parameter>
      <parameter>
        <name>password</name>
        <value>mypassword</value>
      </parameter>
      <parameter>
        <name>url</name>
        <value>jdbc:oracle:thin:@192.168.6.40:1521:dbserver</value>
      </parameter>
      <parameter>
        <name>driverClassName</name>
        <value>oracle.jdbc.driver.OracleDriver</value>
      </parameter>
      <parameter>
        <name>maxIdle</name>
        <value>20</value>
      </parameter>
      <parameter>
        <name>username</name>
        <value>myname</value>
      </parameter>
    </ResourceParams>
    <ResourceParams name="UserDatabase">
      <parameter>
        <name>factory</name>
        <value>org.apache.catalina.users.MemoryUserDatabaseFactory</value>
      </parameter>
      <parameter>
        <name>pathname</name>
        <value>conf/tomcat-users.xml</value>
      </parameter>
    </ResourceParams>
  </GlobalNamingResources>  


5.设置web应用对连接池的引用。
 
  打开D:\Tomcat 4.1\conf\server.xml 文件,找到刚才配置的web应用文字,由于刚才server.xml 文件被自动修改过,并去掉了很多注释内容,所以刚才配置的web应用

   <Context path="/mypool" docBase="D:\mypool" privileged="true" reloadable="true"/>

  被自动修改成了这样的:

     <Context className="org.apache.catalina.core.StandardContext" cachingAllowed="true" charsetMapperClass="org.apache.catalina.util.CharsetMapper" cookies="true" crossContext="false" debug="0" docBase="D:\mypool" mapperClass="org.apache.catalina.core.StandardContextMapper" path="/mypool" privileged="true" reloadable="true" swallowOutput="false" useNaming="true" wrapperClass="org.apache.catalina.core.StandardWrapper">
        </Context>

  在<Context></Context>的描述中加上本web应用对全局连接池的引用说明,如下文字:

    <ResourceLink global="jdbc/myOrcl" name="jdbc/myOrcl" type="javax.sql.DataSource"/>  

  设置完成后,web应用的描述大致如下面的样子:

    <Context className="org.apache.catalina.core.StandardContext" cachingAllowed="true" charsetMapperClass="org.apache.catalina.util.CharsetMapper" cookies="true" crossContext="false" debug="0" docBase="D:\mypool" mapperClass="org.apache.catalina.core.StandardContextMapper" path="/mypool" privileged="true" reloadable="true" swallowOutput="false" useNaming="true" wrapperClass="org.apache.catalina.core.StandardWrapper">  
   
      <ResourceLink global="jdbc/myOrcl" name="jdbc/myOrcl" type="javax.sql.DataSource"/>      
   
 </Context>


  保存D:\Tomcat 4.1\conf\server.xml 文件。

  注意,设置这个连接池的引用说明是非常重要的一步。
  一些朋友在Tomcat4中配置连接池失败的原因大都归咎与此。还有网上一些文章说这是一个Tomcat4的一个Bug。
  我用了整整两天两夜的时间才明白其中的奥秘。[:(]
  当时离疯掉只查一点点。因为毕竟配置一个连接池是很简单的。[:(]


6.一般情况下,到此,连接池的设置就完成了。

  然后需要重新启动Tomcat,这样就可以使用连接池来工作了。

  但是,看到很多文章上说,还需要设置一下web.xml才能应用。我没有设置web.xml,连接池也可以完全使用。

  现在说一下web.xml的配置方法。

  在D:\mypool中新建文件夹,命名为WEB-INF,注意是大写的字母。

  然后在D:\mypool\WEB-INF\ 下新建文件web.xml,其内容为:

  <web-app>
    <resource-ref>
        <description>Oracle DataSource example</description>
        <res-ref-name>jdbc/myOrcl</res-ref-name>
        <res-type>javax.sql.DataSource</res-type>
        <res-auth>Container</res-auth>
    </resource-ref>
  </web-app>

  保存D:\mypool\WEB-INF\web.xml 文件。


7.一个简单的应用示例。

  写了一个简单的JSP页面,用连接池来访问数据库。

内容如下:
---------------------
<%@ page contentType="text/html;charset=GBK"%>
<%@ page import="javax.naming.*"%>
<%@ page import="javax.sql.*"%>
<%@ page import="java.sql.*"%>
<%
    try
    {                  
       Context initCtx = new InitialContext();
 
       if(initCtx==null)
          throw new Exception("没有匹配的环境");

       Context ctx = (Context) initCtx.lookup("java:comp/env");
     
       //获取连接池对象                  
       Object obj = (Object) ctx.lookup("jdbc/myOrcl");  
     
      //类型转换
       javax.sql.DataSource ds = (javax.sql.DataSource)obj;
         
       if(ds==null)
          throw new Exception("没有匹配数据库");  
   
       Connection conn = ds.getConnection();
     
       Statement stmt = conn.createStatement();                  
                             
       String strSql="select * from grade";  //SQL,要保证grade数据表里面有记录。
                     
       ResultSet rs=stmt.executeQuery(strSql);

       if(rs.next())
         {                    
          out.println(rs.getString(1));                          
          out.println(rs.getString(2));                      
         }
       rs.close();      //关闭ResultSet  
       stmt.close();    //关闭Statement
       conn.close();    //将连接放回到连接池
     }

     catch(Exception ex)

     {    
         ex.printStackTrace();
         throw new SQLException("cannot get Connection pool."+ex);
     }
%>

<hr>
--------------------
 
记住,用完后的数据库连接要释放。
不然当打开的连接过多或恶意刷屏,连接池的连接数目会被用完。
当连接池的连接数目用完后,再访问jsp页面时,会在页面出现如下的错误信息,报告连接池的连接被耗尽:
java.sql.SQLException: DBCP could not obtain an idle db connection, pool exhausted




二、Win2k下Tomcat5 的连接池的配置

安装jakarta-tomcat-5.0.13.exe,假如Tomcat5的安装目录为 D:\Tomcat 5.0 。

别忘了把oracle的驱动程序classes12.jar文件copy到目录 D:\Tomcat 5.0\common\lib\ 下。

Tomcat5的连接池设置和Tomcat4 的差不多,仅说明一下不同点或需要特别注意的地方。


1. Tomcat5启动后,访问 http://127.0.0.1:8080/admin 页面,当设置完Tomcat的连接池数据源后,打开D:\Tomcat 5.0\conf\server.xml 文件,会看到配置的连接池相关信息大致如下样子:

<GlobalNamingResources>
    <Environment name="simpleValue" type="java.lang.Integer" value="30"/>
    <Resource name="jdbc/myOrcl" type="javax.sql.DataSource"/>
    <Resource auth="Container" description="User database that can be updated and saved" name="UserDatabase" type="org.apache.catalina.UserDatabase"/>
    <ResourceParams name="jdbc/myOrcl">
      <parameter>
        <name>maxWait</name>
        <value>5000</value>
      </parameter>
      <parameter>
        <name>maxActive</name>
        <value>4</value>
      </parameter>
      <parameter>
        <name>password</name>
        <value>mypassword</value>
      </parameter>
      <parameter>
        <name>url</name>
        <value>jdbc:oracle:thin:@127.0.0.1:1521:dbserver</value>
      </parameter>
      <parameter>
        <name>driverClassName</name>
        <value>oracle.jdbc.driver.OracleDriver</value>
      </parameter>
      <parameter>
        <name>maxIdle</name>
        <value>2</value>
      </parameter>
      <parameter>
        <name>username</name>
        <value>myusername</value>
      </parameter>
    </ResourceParams>
    <ResourceParams name="UserDatabase">
      <parameter>
        <name>factory</name>
        <value>org.apache.catalina.users.MemoryUserDatabaseFactory</value>
      </parameter>
      <parameter>
        <name>pathname</name>
        <value>conf/tomcat-users.xml</value>
      </parameter>
    </ResourceParams>
  </GlobalNamingResources>

可以看到,一些连接池的信息配置参数已经和Tomcat4不同了。
但大致配置步骤和方法都是一样的。


2.设置web应用对连接池的引用。

 打开D:\Tomcat 5.0\conf\Catalina\localhost\ 目录,找到和web应用同名的xml文件(mypool.xml),打开这个文件,
修该其<Context></Context>的描述信息,添加如下行:

   <ResourceLink global="jdbc/myOrcl" name="jdbc/myOrcl" type="javax.sql.DataSource"/>  

使mypool.xml文件的内容看起来大致这个:
 
   <Context docBase="D:/mypool" path="/mypool" privileged="true" reloadable="true">
     <ResourceLink global="jdbc/myOrcl" name="jdbc/myOrcl" type="javax.sql.DataSource"/>
   </Context>

然后保存mypool.xml,需要重新Tomcat5服务,使之生效。


3.JSP页面测试文件的写法也是一样的,不再赘述。

4.一些补充:

  如果web应用没有配置对连接池的引用,即没有配置<ResourceLink>,则会在访问jsp页面时出现如下错误:
    NameNotFoundException: Name jdbc is not bound in this Context

  如果缺少Oracle的JDBC驱动,则会在访问jsp页面时出现如下错误:
    java.sql.SQLException: Cannot load JDBC driver class 'oracle.jdbc.driver.OracleDriver'
posted @ 2006-03-22 11:30 kelven 阅读(1635) | 评论 (1)编辑 收藏
     摘要:         首先XMLHttpRequest不是web标准,而是大部分主流浏览器都支持的一种扩展技术。它被认为是一种异步调用的实现技术,因为它本来是被设计在后台取数据用的。在IE中它被作为一个ActiveX控件提供,而其他一些浏览器都提供一些本地API以供调用。下面是一些关于XMLHttpRequest的基本方法: 1、获...  阅读全文
posted @ 2006-02-26 13:42 kelven 阅读(387) | 评论 (0)编辑 收藏
1、女人永远也不知道男人为什么要学会坚强?
因为他们自己知道.他们虽然外表坚强.但内心很脆弱.他们永远想让自己身边的她觉得自己是最棒的.

2、女人永远也不知道男人为什么不会轻易掉眼泪?
因为他们自己知道.他们不是不会掉眼泪.只是他明白.一但眼泪掉下来了.这段感情也就结 束了.


3、女人永远也不知道男人为什么每次在心烦的时候那么喜欢抽烟?
因为他们自己知道.只有在烟雾中才能忆起他们过去美好的时光来寻求一点心里的平衡.


4、女人永远也不知道男人为什么要在分手以后还会对她嘘寒问暖?
因为他们自己知道.他们并不是想跟你做朋友.只是想挽回这段曾经属于他的感情.


5、女人永远也不知道男人为什么每次在听到她被欺负了会显得那么发狂?
因为他们自己知道.哪怕这次架打输了.躺下了.他也会觉得高兴.因为他们宁愿自己受到伤害.也不愿意看到你哭泣.


6、女人永远也不知道男人为什么在分手以后会夜夜买醉?

因为他们知道.如果今晚不麻醉自己.那么今晚只能在思念中度过.


7. 女人永远也不知道男人为什么每次出门会出手那么大方?

因为他们知道.他们宁愿自己一个人省吃检用.也不愿意你看到你被别人看不起.


8.女人永远也不知道男人为什么会那么爱对她发脾气?
因为他们自己知道.对她发脾气并不是不爱她.只是希望她在以后的路上不被别人所欺骗.

9.女人永远也不知道男人为什么会那么在意你以前的男朋友?
因为他们自己知道.并不是他们不自信.只是他们害怕有一天你会离他而去.

10. 女人永远也不知道男人为什么看到你为别人写的日记之后还会那么镇静的听你解释?

因为他们自己知道.自己并不是不想发火.只是希望能从你的口中得知到底是他重要还是别人重要?


11、女人永远也不知道男人为什么不对她说我爱你⒊个字?

因为他们知道.并不是不想说.只是他们自己明白.⒈万句我爱你用在身上也不够.

12. 女人永远也不知道男人为什么会跑到这里来发贴?
因为他们知道.希望有一天这贴能被你看见.以此来证明你对他的不理解.只有他自己心里明 白.这贴要是没人回的话.很快便会消失了.你更不知道一个男人的幸福生活来之不易,那是 他将每一个看过的贴子都顶了的缘故。


(如果你不能为你心爱的女人穿上嫁衣,请停下你解她衣扣的手)


愿天下有情人终成眷属.当你们看到这贴时心里最想的那个人也就是你们最爱的那个人!
posted @ 2006-02-25 11:50 kelven 阅读(381) | 评论 (0)编辑 收藏
Java文件中,连接SQLserver数据库时,需要一个连接数据库的驱动文件。

在你安装JDK的路径下的lib文件夹里拷贝一个文件jtds-0.6.jar,并且在环境变量里设置classpath,例如:你的jdk装在c:\jdk,那么环境变量classpath的路径应设为c:\jdk\lib\jtds-0.6.jar。(环境变量知道这么设吧?在我的电脑的属性,高级里。多个路径之间用分号隔开。)

这里提供SQLserver连接驱动文件jtds-0.6.jar,下载解压后拷贝到jdk路径下的lib文件夹里。

具体在文件中的应用:

import java.sql.*;
String url="JDBC:jtds:sqlserver://localhost:1433/‘数据库名´";
String driver="net.sourceforge.jtds.jdbc.Driver";
Class.forName(driver);
Connection conn=DriverManager.getConnection(url,"用户名","密码");
就可以连接到你的数据库了。

1433是SQLserver默认的端口号,如果要连接到其他机器上,要将localhost改为其他机器的IP地址,如192.168.0.101。


其中数据库名是你所新建的数据库的名称,用户名和密码是你登陆SQLserver是的用户名和密码。

有的人安装SQLserver时用的是Windows身份验证,那么用户名和密码都为空。如果不能登陆,或者要用SQL身份验证的话,需要修改注册表。在运行里打开regedit,然后查找loginmode(具体位置:hkey_local_machine\software\microsoft\MSSQLserver\
mssqlserver\),仅用Windows身份验证的值为1,混合身份验证的值为2。只要将1改为2,就可以用SQL身份验证了,用户名为‘sa',密码为空。
posted @ 2006-02-17 11:59 kelven 阅读(580) | 评论 (0)编辑 收藏


    String root = getServletContext().getRealPath("/");
    String path 
= request.getParameter("path");
    String name 
= request.getParameter("name");


    response.setContentType(
"unknown");
    response.addHeader(
"Content-Disposition""filename=\"" + name + "\"");


    
try
    
{
        java.io.OutputStream    os  
= response.getOutputStream();
        java.io.FileInputStream fis 
= new java.io.FileInputStream(root + path + name);


        
byte[] b = new byte[1024];
        
int    i = 0;


        
while ( (i = fis.read(b)) > 0 ) 
        
{
            os.write(b, 
0, i);
        }



        fis.close();
        os.flush();
        os.close();
    }

    
catch ( Exception e )
    
{
    }
posted @ 2006-02-16 12:21 kelven 阅读(1974) | 评论 (1)编辑 收藏
诺基亚手机限制码-1234
  保密码 -12345
  *#06#:看手机序列号。  
  *#2820# :看兰牙版本信息,需要先将蓝牙设置为打开状态。
  *#92702689# :这个也是大家常用的一条命令,用来查看系统信息。
  *#335738#:删除Email, GPRS, MMS的设置信息
  *#7370925538#:删除电子钱包的内容和 密码 ,这个比较实用,要是忘记了,你既可以用这个命令,也可以 恢复出厂 设置,不过这个更实用。
  *#7370#:软件格式化。删除存储空间的内容。
  *#7780#:一个 恢复出厂 设置的快捷操作。
  *#7220#:恢复一些功能
    *#92702689#LIFE:查系统版本
    *#0000#:查系统版本

以上是一些NOKIA机型的查询指令,不一定适合所有的NOKIA机型,但是基本上都可以使用。
posted @ 2006-02-09 12:35 kelven 阅读(1059) | 评论 (0)编辑 收藏
下载地址:http://download.17hk.com/soft.asp?softid=44   (21.6M)
                    http://www.it1848.com/Soft/cyrjxz/yyrjxz/200510/Soft_20051014114011.html (46.4M)

(WindowsXP SP2系统上SQLServer2000必须要安装SP3之后的补丁才能正常使用)

由于SQL Server Service Packs按照累积形式进行组织,因此,SP3包含了先期发布的 Service Pack 1(SP1)与 Service Pack 2(SP2)中的所有修正程序,它既可应用于全新安装的系统,也可在已经安装SP1或SP2的系统上加以应用。

  优势
  除提供最新更新内容与修正程序外,SQL Server 2000 SP3还能够为您提供以下优势:

  可维护性
  在可维护性方面的改进包括:
得以增强的错误报告功能。通过适当配置,SQL Server能够将关键性错误信息自动发送至Microsoft公司。
  得以改进的多服务器管理功能。
  用于实现监控的新增API。数据库管理员(DBA)或第三方工具可以对出现问题的进程加以诊断
  性能
  SP3引入了针对QLogic’s VI-enabled SANblade QLA2350 Fibre Channel控制器的支持能力。通过在SQL Server网络互连层上应用虚拟接口(Virtual Interface)技术,在服务器和客户端系统上针对每条消息所消耗的CPU资源得以显著降低,同时,系统整体性能得到了相应提高。
  安全性
  最新提供的安全特性与工具包括:
  针对SQL Server 2000在线图书的内容更新。SQL Server 2000在线图书为广大客户提供了用以进一步增强应用环境安全性所需的更多指导信息。
  安全修补程序。SP3针对用户反映或在持续测试过程中发现的各种已知薄弱环节提供了相应的修复程序。
  SQL Server Agent增强。SP3允许您在不具备管理员权限的情况下运行SQL Server Agent。
posted @ 2006-01-17 01:37 kelven 阅读(3212) | 评论 (1)编辑 收藏
    现在多数host装的还是MySQL 4.0x 版本以下,如果升级到了4.1x 或者移动到使用4.1x 的主机上,估计会遇到一些问题。我在这上面遇到了两个问题。
    一是数据导入。在phpMyAdmin内导入后,发现中文变成了乱码。搜索学习后,了解到需要设置数据库的collation (校勘),如果你的数据库是utf-8的,设置为utf8_general_ci就可以了。
    二是,即使正确导入了,在phpMyAdmin里也能正确显示,但页面上显示的文章内容都是“???”,而模板里面的汉字都能正常显示。这让我头疼了很久。搜索到Windix’s Weblog上有对此的说明:
    “从MySQL 4.1开始引入的多语言支持确实很棒,而且一些特性已经超过了其他的数据库系统。不过我在测试过程中发现使用适用于MySQL 4.1之前的PHP语句操作MySQL数据库会造成乱码,即使是设置过了表字符集也是如此。我读了一下新的MySQL在线手册中第十章‘Character Set Support’后终于找到了解决方法并测试通过。MySQL 4.1的字符集支持(Character Set Support)有两个方面:字符集(Character set)和排序方式(Collation)。对于字符集的支持细化到四个层次: 服务器(server),数据库(database),数据表(table)和连接(connection)。当我们按照原来的方式通过PHP存取MySQL数据库时,就算设置了表的默认字符集为utf8并且通过UTF-8编码发送查询,你会发现存入数据库的仍然是乱码。问题就出在这个connection连接层上。解决方法是在发送查询前执行一下下面这句:
SET NAMES ‘utf8′;”
    但是我依旧不知道,如何,在何处让WordPress运行这个SQL语句。后来在阿修的部落格上查到办法:
  “為著解決這個問題必須去修改wp-includes/wp-db.php內的資料連線設定。詳細的修改方式是這樣的:
$this->dbh = @mysql_connect($dbhost,$dbuser,$dbpassword);
//加上下面這行
$this->query(”SET NAMES ‘utf8′”);”
这样子终于能正常显示中文的WordPress了。虽然后来还是没用,但是觉得这个经验会对别人有用。记得有人用email和我讨论过这样子的中文显示问题,但是我那时哪里知道问题出在MySQL 4.1x上。
还有,4.1x的数据库不向下兼容,所以升级的时候要三思啊。
posted @ 2006-01-01 08:02 kelven 阅读(451) | 评论 (0)编辑 收藏
(此为个人学习心得,以后会逐渐完善)

(本例使用的数据库是:MySql)

1.当你用流读取文件或者从数据库读取数据时,取得的字符串的编码要与页面的一致,否则会乱码

例如:

public class FileOperation {

    
//path为文件的全路径
    public static String readFile(String path){
        String templateContent
="";
        
try{
            BufferedReader br
=new BufferedReader(new FileReader(path));
            String temp
=null;
            
while((temp=br.readLine())!=null){
                templateContent
=templateContent+temp+"\n";
            }

            br.close();
        }

        
catch(Exception e){
            System.out.println(
"读取文件出错");
            e.printStackTrace();
        }

        
        
return templateContent;
    }

}


(假设页面的编码为UTF-8)

调用以上函数只需要传递一个完整的文件路径就可以以字符串的形式读取文件.

......

String str
=FileOperation.readFile("d:\11.txt");

......

request.setAttribute("str",str);

......

则页面用requset.getAttribute("str")取得的中文字符将会是乱码.

解决方案:

将上段取中文字符串的代码改成:



String str
=new String(FileOperation.readFile("d:\11.txt").getBytes("UTF-8"));



request.setAttribute(
"str",str);




posted @ 2005-12-28 16:16 kelven 阅读(527) | 评论 (0)编辑 收藏
Resin的确是比较狠的应用服务器,运行速度快,配置又简单!这里介绍一下Resin2.1.12的数据库连接池配置方法。

在%ResinHome%/conf/resin.conf中找到
<!--
- Sample database pool configuration
- The JDBC name is java:comp/env/jdbc/test
-->
在其下加入相应的信息可以连接到不同的数据库。

Mysql:
<resource-ref>
<res-ref-name>jdbc/blog</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<init-param driver-name="com.caucho.jdbc.mysql.Driver"/>
<init-param url="jdbc:mysql_caucho://localhost:3306/blog"/>
<init-param user="root"/>
<init-param password="****"/>
<init-param max-connections="20"/>
<init-param max-idle-time="30"/>
</resource-ref>

将相应的驱动放到%Resin/lib/%下。

MS-Sql:
<resource-ref>
<res-ref-name>jdbc/blog</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<init-param driver-name="com.microsoft.jdbc.sqlserver.SQLServerDriver"/>
<init-param url="jdbc:microsoft:sqlserver://localhost:1433;databaseName=blog"/>
<init-param user="sa"/>
<init-param password="****"/>
<init-param max-connections="20"/>
<init-param max-idle-time="30"/>
</resource-ref>
首先要下载安装sqlserver-jdbc-驱动,然后将其lib下的三个jar文件放到%Resin/lib/%下。
posted @ 2005-12-16 12:58 kelven 阅读(587) | 评论 (0)编辑 收藏

Servlet的演变:在常规的 JSP,Servlet,JavaBean三层结构中,JSP实现View的功能,Servlet实现Controller的功能,JavaBean实现Model的实现。

在Struts中,将常规情况下的Servlet拆分与ActionServlet、FormBean、ActionBean三个部分。ActionServlet配合Struts-config.xml,专职完成页面导航,而不再负责具体的数据获取与相应逻辑,这两部分功能由FormBean和ActionBean来完成。

Struts的核心是Controller,即ActionServlet,而ActionServlet的核心就是Struts-config.xml,Struts-config.xml集中了所有页面的导航定义。对于大型的WEB项目,通过此配置文件即可迅速把握其脉络,这不管是对于前期的开发,还是后期的维护或升级都是大有裨益的。掌握Struts-config.xml是掌握Struts的关键所在。

<struts-config>

   <data-sources />

   <form-beans >
      <form-bean name="systemForm" type="com.gdglc.survey.form.SystemForm" />
      <form-bean name="FindMemberForm" type="org.apache.struts.validator.DynaValidatorForm">
         <form-property name="findName" type="java.lang.String"/>
      </form-bean>
   </form-beans>

   <global-exceptions />

   <global-forwards>
      <forward name="showMsg" path="/msg.jsp" />
   </global-forwards>

   <action-mappings>

      <action 
         path="/list" 
         type="com.gdglc.survey.action.ListAction">
         <forward name="list" path="/list.jsp"/>
      </action>

      <action
         attribute="systemForm"
         input="/admin/System_Base_List.jsp"
         name="systemForm"
         path="/systemBaseModify"
         type="com.gdglc.survey.action.SystemAction"
         scope="request"
         validate="false">
      </action>

   </action-mappings>

   <message-resources parameter="com.gdglc.application" />
  
   <plug-in className="org.apache.struts.validator.ValidatorPlugIn">
      <set-property property="pathnames" value="/WEB-INF/validator-rules.xml,/WEB-INF/validation.xml"/>
   </plug-in>

</struts-config>

每一个FormBean 都必须继承ActionForm类,FormBean是对页面请求的封装。即把HTTP request 封装在一个对象中,需要说明的一点就是多个HTTP request可以共用一个FormBean,便于维护和重用。


public final class RegUserForm extends ActionForm{

   private String logname;
   private String password;
   private String email;

   public RegUserForm(){
      logname = null;
      password = null;
      email = null;
   }

   ......

   public void reset(ActionMapping mapping, HttpServletRequest request)
   {
      logname = null;
      password = null;
      email = null;
   }

   public ActionErrors validate(ActionMapping mapping,HttpServletRequest request) 
   {
      ActionErrors errors=new ActionErrors();
      if(this.password==null)
         errors.add(ActionErrors.GLOBAL_ERROR,new ActionError("password is null!!"));
      ......
      return errors;
    }
}

FormBean的产生是为了提供数据给ActionBean,在ActionBean中可以取得FormBean中封装的数据,经相应的逻辑处理后,调用业务方法完成相应业务要求。

public final class RegUserAction extends Action
{
   public ActionForward execute(ActionMapping mapping,
                                                  ActionForm form, 
                                                  HttpServletRequest request,
                                                  HttpServletResponse response)

   {
      ......
      if(true)
         return mapping.findForwad("list");
      else {
         ActionErrors errors=new ActionErrors();
         errors.add(ActionErrors.GLOBAL_ERROR,new ActionError("...."));
         this.saveErrors(request,errors);
         return new ActionForward(mapping.getInput());
      }
   }
}

Struts优缺点
优点:


Struts跟Tomcat、Turbine等诸多Apache项目一样,是开源软件,这是它的一大优点。使开发者能更深入的了解其内部实现机制。

除此之外,Struts的优点主要集中体现在两个方面:Taglib和页面导航。Taglib是Struts的标记库,灵活动用,能大大提高开发效率。另外,就目前国内的JSP开发者而言,除了使用JSP自带的常用标记外,很少开发自己的标记,或许Struts是一个很好的起点。

关于页面导航,我认为那将是今后的一个发展方向,事实上,这样做,使系统的脉络更加清晰。通过一个配置文件,即可把握整个系统各部分之间的联系,这对于后期的维护有着莫大的好处。尤其是当另一批开发者接手这个项目时,这种优势体现得更加明显。

缺点:

Taglib是Struts的一大优势,但对于初学者而言,却需要一个持续学习的过程,甚至还会打乱你网页编写的习惯,但是,当你习惯了它时,你会觉得它真的很棒。

Struts将MVC的Controller一分为三,在获得结构更加清晰的同时,也增加了系统的复杂度。

Struts从产生到现在还不到半年,但已逐步越来越多运用于商业软件。虽然它现在还有不少缺点,但它是一种非常优秀的J2EE MVC实现方式,如果你的系统准备采用J2EE MVC架构,那么,不妨考虑一下Struts。

Struts实施经验:

1)、基于Struts架构的项目开发,首先需要有一个很好的整体规划,整个系统中包括哪几个模块,每个模块各需要多少FormBean和ActionBean等,而且最好有专人负责Struts-config.xml的管理。开发基于Struts的项目的难点在于配置管理,尤其是对Struts-config.xml的管理。

2)、如果你的项目非常紧,并且项目组中又没有富有经验的Struts开发人员,建议不要冒然采用Struts。Struts的掌握需要一个过程,对于一个熟练的JSP程序员,自学大概需要半个月左右的时间。如果结合titls,则需要更长的时间。

3)、如果你在网页中大量运用taglib,那么你的美工将做出部分牺牲。当你结合Tiles,功能增强的同时,这种牺牲尤为明显。当然,你对功能和美观的取舍由你自己决定。

4)、Taglib是一个好东西,但灵活运用它却需要一个过程,如果你不想在Taglib上花太多的时间,那么只需理解与FORM有关的几个标记,其它的标记就放着吧,以后再看,先去研究ActionServlet和Struts-config.xml,你会觉得很有成就感。

5)、Struts是否只适合于大型项目呢?No!Struts适合于各种大小的项目,当然,对于大型项目,它所体现出来的优势更加明显。

http://www.chinaitlab.com/www/news/article_show.asp?id=33092
posted @ 2005-12-15 13:33 kelven 阅读(829) | 评论 (0)编辑 收藏
Resin使用简介

使用Resin开发Java Web项目时,需要建立自己的WebApp。这里不介绍Resin Cmp/Ejb的开发和使用,只介绍用Resin开发普通的jsp\java servlet项目。在这里还要谈到resin.conf的配置。Resin中的应用可以有2种方式发布:一是在Resin的目录下发布;二是打包成War发布。

1、在Resin的目录下发布

在resin.conf中查找<web-app>标签,该标签表示一个web应用。

标签中,id属性表示该应用的Web路径。如<web-app id=’/test’>,表示该应用在Web上访问的时候应该用http://hostname/test/来访问。app-dir属性表示该应用的实际路径。如<app-dir>d:\resin\doc\test</app-dir>表示该应用在d:\resin\doc\test目录下面。默认值为根下面的和id同名的目录。Resin可以配置3种error-page:404错误也就是文件找不到错误页;Exception违例页;不能连接java引擎页。他们分别可以这样子设置。

404文件找不到页

<web-app id='/app1'>

<error-page error-code='404' location='/file_not_found.jsp'/>

</web-app>

Exception 违例页

<web-app id='/foo'>

<error-page exception-type='java.lang.NullPointerException'

location='/nullpointer.jsp'/>

</web-app>

不能连接到srun Servlet引擎错误页

该页设置和应用无关,属于服务器的设置。

<http-server>

<error-page exception-type='connection'

location='/missing_file.html'/>

</http-server>

classpath的设置

参见下面的语句:

<classpath id='WEB-INF/classes' source='WEB-INF/src' compile='true'/>

id参数的值表示classpath中编译后的classpath的存放路径;source参数的值表示classpath中java源代码的存放路径;compile中的值可能是true或者false,表示是否由Resin的srun自动编译java源代码。Classpath的设置一般和javaBean或者Servlet的使用有关。id的值表示javaBean的编译好的包存放的根,source的值表示javaBean的java源代码存放的根。Servlet相同。

Servlet的设置

参见下面的语句:

<servlet-mapping url-pattern='*.xtp' servlet-name='xtp'/>

<servlet-mapping url-pattern='*.jsp' servlet-name='jsp'/>

<servlet-mapping url-pattern='/servlet/*' servlet-name='invoker'/>

一般就是指定那些需要通过srun的解析。比如在这里,把*.jsp改成*.jss,其他不变,那么只要在访问时遇到*.jss的文件就和原来遇到*.jsp一样处理。通过这个可以指定解析的引擎,如以下的配置:

<servlet-mapping url-pattern='*.xtp' servlet-name='com.caucho.jsp.XtpServlet'/>

在Servlet中,也可以指定servlet。如

<servlet servlet-name='hello' servlet-class='test.HelloWorld'/>

<servlet-mapping url-pattern='/hello.html' servlet-name='hello'/>

在servlet-mapping中有个重要的参数case-sensitive 如果在windows上,最好配置成false,忽略大小写,从而和windows的约定一致。

Session的配置

参见如下的配置语句:

<session-config>

<session-max>4096</session-max>

<session-timeout>30</session-timeout>

<enable-cookies>true</enable-cookies>

<enable-url-rewriting>true</enable-url-rewriting>

<file-store>WEB-INF/sessions</file-store>

</session-config>

session-max :最大 session数量

session-timeout :session过期时间,以分钟为单位。

是否允许cookie :指session是否采用cookies。如果采用cookies,浏览器必须支持session才能使用,发布时建议改成false。enable-url-rewriting和enable-cookies一般配合使用。如果enable-cookies是false,enable-url-rewriting应该设成true比较合适。

file-store :该配置指示服务器是否把session作为文件存放在服务器上。如果把该项注释掉,则在你的web-app目录下的WEB-Inf/sessions目录不保存序列化后的session对象。Session还有jdbc-store配置,对应着把session通过jdbc永久保存在数据库中。其实也就是会话变量的序列化后的保存和重新载入的物理实现。在这里session还支持了多服务器的设置问题,

通过tcp-store参数设置。由于涉及到负载平衡的问题,在这里不详细叙述,只简单写一个例子:

<http-server>

<http id='a' port='80'/>

<srun id='a' host='host-a' port='6802'/>

<http id='b' port='80'/>

<srun id='b' host='host-b' port='6802'/>

<host id=''>

<web-app id=''>

<session-config>

<tcp-store/>

<always-load-session/>

</session-config>

</web-app>

</host>

</http-server>

这个例子表示session是按照tcp ring的方式传递。

temp-dir 的设置

temp-dir指的是应用的临时目录。也就是在javax.servlet.context.tempdir中用到的目录。模认是应用目录下的WEB-INF\tmp目录。

以上的设置都可以在<web-app>标签对中设置,控制某个web应用的设置。

2、打包成War发布

以下是介绍对如何在resin下使用已经打包成War的java Web应用进行发布。

其实这个是最简单也是最清晰的良好方法。在j2ee中,所有的项目都打包成ear发布。其中,Web应用打包成war,ejb应用打包成jar。在resin中,这些都可以直接部署。这里我只对打包成war的Web应用的部署做介绍。

在resin.conf中,查找这个:<war-dir id='webapps'/>。他表示war文件应该被拷贝的路径。这里指的是相对于resin的安装路径,如以上的设置表示d:\resin\webapps。只要重新启动Resin就可以了。Resin会把该war自动解包到webapps目录下。你可以在command控制台或者stdout.log中看到类似于

[2002-04-27 09:56:21.680] initializing application http://haitaiserver:8080/rwtest 的语句。这个表示该Web应用是自动安装的。只要这个应用是符合j2ee标准的Web应用,应该不会有问题。通过如上显示的路径就可以访问到这个应用。如果你到d:\resin\webapps\rwtest中浏览,你会看到Resin已经为你生成了rwtest目录,下面是META-INF和WEB-INF还有你自己的JSP\servlet 文件和目录。是完全符合j2ee的结构的。你可以在rwtest目录下建立新的jsp\servlet,一样可以被编译和解析并运行的。在实际操作中,可以使用Jbuilder 或者 WebSphere等Ide工具进行集成调试和打包,非常的方便。

使用Resin进行java Web项目的开发和调试

这里篇幅有限,不可能讲太多,我只对实际中最有用的部分做介绍。

Resin中如果定义了错误页,则出错后最常见的一大串Exception不会被看到,直接跳转到错误页。所以建议开发中先不设置错误页。jsp错误中最常见的就是Nullpoint Exception,其次是名称的拼写错误。错误也可以在Resin安装目录下的log目录下的stderr.log中找到。通过对该log文件的分析可以看到很多有用的错误信息。

在调试jsp的时候,如果定义了compile为true,jsp先被翻译成Servlet的java文件,再被编译成class文件。可以在你自己的work目录中找到该文件。java的名称在Resin中是这样子定义的:原先的jsp文件名前加下划线,再加上_jsp这个字样。所以在java 应用中的命名不要以_jsp结尾,也不要出现中文名称等字符;其实名称以_jsp为开头也是不合法的。

关于java对多国语言的支持问题,在Resin中得到了很好的解决。以jsp为例,参考Resin自动生成的java Servlet文件。只要在任何的jsp文件的最开始处增加:

<%@page contentType="text/html;charset=gb2312" %>

中文问题就解决了。察看生成的Servlet源文件片断:

response.setContentType("text/html;charset=gb2312");

request.setCharacterEncoding("GB2312");

以上为设置字符集

private static byte []_jsp_string26;

private static byte []_jsp_string27;

_jsp_string26 = "\r\n</table>\r\n<table class=\"type\">\r\n<tr>\r\n <td>".getBytes("GB2312");

_jsp_string27 = "\r\n</td><td>\r\n</tr>\r\n<!--\r\n<tr>\r\n<td>\r\".getBytes("GB2312");

以上是对页面的显示的编码。其中,getBytes(“gb2312”)是静态编码,这是Resin为了解决某些环境下还是不能正常显示而设置的。在Resin的配置文件(/conf/resin.conf)中,可以通过设置<jsp precompile='true' static-encoding='false' recompile-on-error='true'/>中的static-encoding属性为true或者false,来控制是否静态编码。其实在Resin容器的内部,所有的字符都是按照iso-8859-1来处理的。iso-8859-1是一个大字符集,虽然中文的gb2312和8859在字的定义上有不同,但是编码是包容了gb2312的。按照解决多国语言的方法,在纯英文平台上用iso-8859-1处理内部编码,而把字符的显示推向客户端的机器。所以这样只要编码是正确的,

在页面上显示中文就不存在问题。Tomcat3.2不方便的地方是Tomcat对数据库的操作中文支持不好,需要手动在java Bean或者Servlet中硬编码。通过测试,在Resin中完全没有这个问题。Tomcat4.0解决了这个问题。不过个人习惯来讲还是觉得resin在配置方面方便一些。

在Resin中可以自动解决引入的jar。这个在使用特殊的类或者第三方提供的开发包非常有用。方法非常简单:只要把该jar或者是zip拷贝到Resin安装目录下的lib目录下面,重新启动Resin,就可以了。如db2用到的db2java.zip文件,只要轻松拷贝到d:\resin\lib中就可以了。

Resin提供了对Jbuilder的集成调试。可以到:

http://www.caucho.com/projects/jbuilder/resin-jbuilder.jar免费下载到resin的jbuilder的ide扩展包。然后,把该包该名成:resin-jbuilder.jar,拷贝到jbuilder6\lib\ext目录下。然后,把Resin2.1解包安装在jbuilder6\resin-2.1目录下,就可以了。打开任何的War项目,在project上点右键,选择properties,选择Servers标签。在原来的选择框上,就可以看到多了一项Resin2.1。这样子就可以象原来用tomcat一样调试jsp\servlet了,而且比Tomcat更方便。见图2:

图2

调试方法和用Tomcat调试一样。

其他问题

使用Resin可以和apache结合使用。也就是利用apache做http服务器,而Resin做srun服务器。可以参考resin\conf\samples目录下的apache.conf。主要就是把 app-dir 设成 /usr/local/apache/htdocs(也就是apache的root)。同时在apache 中的http.conf也做了相应的设置。Resin还提供了对该过程的自动安装程式,运行resin\bin\setup,你可以在弹处的对话框中选择apache,这样子就可以了。只要你曾经安装过apache,resin可以自己找到httpd.conf文件所在的路径。

使用命令行方式启动Resin,如果改动了Resin.conf,Resin会自己重新启动适应新的配置。这个很适合初期安装时使用。

Resin对数据库缓冲池的支持很好。在这里,它提供了DBPool对缓冲池做了封装。实际使用时,只要在resin.conf这样配置:

<dbpool.sql>

<id>ORCL</id>

<driver>oracle.jdbc.driver.OracleDriver</driver>

<url>jdbc:oracle:thin:@localhost:1521:SMTH</url>

<!-- <url>jdbc:oracle:oci8:@SMTH</url> -->

<user>scott</user>

<password>tiger</password>

<max-connections>5</max-connections>

</dbpool.sql>

然后,在你的jsp或者servlet中就可以这样子使用了:

先导入 com.caucho.sql.*包,然后如下直接得到连接:

Connection conn = DBPool.getPool("ORCL").getConnection();

个人建议不要如上使用连接池,还是按照ejb的方法用从Context中直接找到的DataSource对象中得到连接通用性比较好。代码也很简单:

Context ctx = new InitialContext();

DataSource ds = (DataSource)ctx.lookup(“jdbc/EmployeeDB”);

Connection conn = ds.getConnection();

在Resin中如下配置jdbc就可以了:

<resource-ref>

<res-ref-name> jdbc/EmployeeDB</res-ref-name>

<res-type>javax.sql.DataSource</res-type>

<init-param driver-name="com.caucho.jdbc.mysql.Driver"/>

<init-param url="jdbc:mysql_caucho://localhost:3306/test"/>

<init-param user="name"/>

<init-param password="password"/>

<init-param max-connections="20"/>

<init-param max-idle-time="30"/>

</resource-ref>

用Resin Web Server开发还是比较愉快的。只是没有像Weblogic 或者WebSphere那样子提供现成的管理控制台而已。但是从稳定性和方便性来讲,Resin个人认为比Tomcat要好很多。况且Resin还有提供了resin-cmp 和 resin-ejb,功能更强大。

posted @ 2005-12-15 13:22 kelven 阅读(2067) | 评论 (0)编辑 收藏

目录

正则表达式介绍
匹配模式

字符子集
行结束符
分组和引用
Unicode支持


正则表达式语法参考
  1. 字符
  2. 逻辑操作符
  3. 向后引用
  4. 边界元字符
  5. 重复指示符
  6. 字符子集
  7. 预定义子集(元字符)
  8. 扩展子集(元字符)
  9. 扩展中文子集(元字符)
  10. POSIX字符子集(只适用于ASCII)
  11. Unicode块和分类

替换表达式
替换表达式
  1. 特殊字符
  2. 自定义替换表

匹配模式

匹配模式指得是正则表达式引擎将以何种模式匹配字符串。
模式名称
启用,禁用
缺省启用
说明
UNIX_LINES
(?d)启用,(?-d)禁用

启用Unix行模式。
在此模式下,只有 '\n'被认为是行结束符。它会影响., ^, 和 $ 的行为。

CASE_INSENSITIVE
(?i)启用,(?-i)禁用

启用忽略大小写模式。
缺省时,忽略大小写模式只会影响 ASCII字符的匹配。 而Unicode范围的忽略大小写匹配需要通过 UNICODE_CASE 标志与本标志联合使用。
启用此模式会影响匹配性能。

COMMENTS
(?x)启用,(?-x)禁用

允许空格和注释出现在正则表达式中。
在此模式下,空格被忽略,以#开始的单行注释被忽略。
MULTILINE
(?m)启用,(?-m)禁用

启用多行模式。
In multiline mode the expressions ^ and $ match just after or just before, respectively, a line terminator or the end of the input sequence. By default these expressions only match at the beginning and the end of the entire input sequence.

DOTALL
(?s)启用,(?-s)禁用

让.可以匹配行结束符。
在此模式下,元字符.可以匹配行结束符。缺省不允许如此匹配。


UNICODE_CASE
(?u)启用,(?-u)禁用

Enables Unicode-aware case folding.
When this flag is specified then case-insensitive matching, when enabled by the CASE_INSENSITIVE flag, is done in a manner consistent with the Unicode Standard. By default, case-insensitive matching assumes that only characters in the US-ASCII charset are being matched. 启用此模式会影响性能。

CANON_EQ
(?c)启用,(?-c)禁用

Enables canonical equivalence.
When this flag is specified then two characters will be considered to match if, and only if, their full canonical decompositions match. The expression "a\u030A", for example, will match the string "?" when this flag is specified. By default, matching does not take canonical equivalence into account.
启用此模式会影响性能。



字符子集

字符子集可以含有别的字符子集,并且可以通过联合操作符(缺省)和交集操作符(&&)实现组合。联合操作符表示某个子集匹配它的子子集所匹配的任意字符。交集操作符表明某个字符子集只匹配它的子子集都匹配的字符。
字符子集所能够有的操作符的优先级如下,从高到低:
  1. 转义符\x
  2. 成组符 [...]
  3. 区间符 a-z
  4. 联合符 [a-e][i-u]
  5. 交集符 [a-z&&[aeiou]]
注意:在字符子集[]内部的语法根本不同于正则表达式其它部分中的语法。例如,在字符子集内部,正则表达式 . 失去了它原有的含义,而是成了一个匹配.的元字符。

行结束符

行结束符是一个或两个字符序列,用以表明输入字符序列中一行的结束。下面的字符被认为是行结束符:
  • 一个换行符('\n')。
  • 一个回车符加上一个换行符("\r\n")。
  • 一个单独的回车符('\r')。
  • 代表下一行的字符('\u0085')。
  • 行分隔符('\u2028'),Unicode中被定义。
  • 一个分段符('\u2029),Unicode中被定义。
如果 UNIX_LINES 模式被启用,则只有换行符被认为是行结束符。
如果 MULTILINE 模式被启用,。

分组和引用

字符分组以它们的左括号的出现顺序来排序。例如在表达式((A)(B(C))),有四个分组:
  1. ((A)(B(C)))
  2. (A)
  3. (B(C))
  4. (C)
第0组永远表示表达式本身。
分组采用这样的命名方式,是因为,在一次匹配过程中,正则表达式会被匹配多次。以前的匹配子序列有可能在将来被使用;或者在匹配结束时,程序有可能需要重新获得所有匹配的子字符序列。
对于正则表达式中的某个分组而言,永远只保留最后匹配的字符序列。如果对某个分组匹配尝试失败,则会保留上次匹配成功的字符序列。例如,对于正则表达式(a(b)?)+而言,字符序列"aba",将会让分组2匹配的字符序列为"b"。
以(?开始的分组,将不会计入分组数目,也不会被后续匹配所引用。

Unicode支持

本正则表达式匹配引擎的实现遵循了《Unicode技术报告:Unicode正则表达式指南》,实现了该指南的第二层所需的功能,但是在细微处有一些简单语法修改。
Unicode块(Block)和分类(Category)通过\p和\P通配苻表示。\p{prop}匹配含有prop的输入序列,而\P{prop}匹配不含有prop的输入序列。Unicode块通过前缀In表示,如\p{InMongolian}。Unicode分类通过可选的前缀Is表示,因此\p{L}和\p{IsL}都代表Unicode分类 letters。Unicode块和分类都可以在正则表达式子集外部和内部使用。
目前支持的Unicode块和分类是《Unicode标准,第三版》中所指定的块和分类。 Unicode块名称在《Unicode 字符数据库》的第14章被定义,文件名称叫Blocks-3.txt,但是名称中的空格被去掉了。例如"Basic Latin"成了"BasicLatin"。无论是标准化的还是非标准化的分类,都在该标准的第88页的第4-5表中被全部定义。

与Perl 5正则表达式语法对比

[TBD]


正则表达式参考



字符

正则表达式字符串
匹配的字符串
X
字符X,包括 CJK ExtB 区汉字
\\
反斜杠\
\0n 八进制0n代表的字符(0<=n<=7)
\0nn
八进制0nn代表的字符(0<=n<=7)
\0mnn
八进制0mnn代表的字符(0<=m<=3,0<=n<=7)
\xhh
十六进制 0xhh所代表的字符
\uhhhh
十六进制 0xhhhh所代表的字符。注意,目前尚不支持CJK ExtB区汉字。
\t
制表符('\u0009')
\n
换行('\u000A')
\r
回车('\u000D')
\a
响铃符('\u0007')
\e
取消符Escape('\001B')
\cx
x所代表的控制字符

逻辑操作符

正则表达式字符串
匹配的字符串
XY
X后面跟随Y
X|Y
X或者Y
(X)
X作为分组表达式

向后引用

正则表达式字符串
匹配的字符串
\n
n个匹配的分组

边界元字符

边界字符
匹配的字符串
^
行首
$
行末
\b 字符边界
\B
非字符边界
\A
输入流的开始
\G
上次匹配的结束处
\Z
输入流的结束,或者是最后一个行结束符,参见行结束符
\z
输入流的结束

重复指示符

正则表达式字符串
匹配的字符串
X?
X重复一次,或者不重复
X*
X重复0次或多次
X+
X重复1次或多次
X{n}
X重复n次,不多也不少。
X{n,}
X至少重复n次
X{n,m}
X至少重复n次,至多重复m次。
注:X{n,m}、?、*、+方式可以联合使用。

字符子集

正则表达式字符串子集
匹配的字符串
组合方式
[abc]
字符a,b或c,包括 CJK ExtB 区汉字
简单子集
[^abc]
任意非a,b或c的字符。
排除
[a-zA-Z] 从a到z,或者A到Z,包含a,z,A,Z。
区间
[a-d[m-p]]
从a到d,或者m到p,等于[a-dm-p]。
联合
[a-z&&[def]]
d,e或者f。
交集
[a-z&&[^bc]]
从a到z,除了b和c,等于[ad-z]
扣除
[a-z&&[^m-p]]
从a到z,并且不包括从m到p,等于[a-lq-z]
扣除

预定义子集(元字符)

边界字符
匹配的字符串
.
任意字符,可能匹配行结束符。
\d
数字[0-9]
\D 非数字[^0-9]
\s
空白符[ \t\n\x0B\f\r]
\S
非空白符[^\s]
\w
单词符,包含有字母和数字[a-zA-Z_0-9]
\W
非单词符,不包含有字母和数字。

扩展子集(元字符)

正则表达式字符串
匹配的字符串




扩展中文子集(元字符)

名称
块名称(\p{InXXX})
简化通配符
标准Unicode块,或者汉字列表
任意双字节字符(汉字或全角符号)
\p{InQuqnJiao}
\E
任意由GBK表示的汉字,不包括GB18030扩展部分,
以及CJK ExtB区的汉字。
任意单字节字符
\p{InFQuanJiao}
\~E
任意单字节字符。
任意全角ASCII字符
\p{InQJAscii}
\H
标准HalfwidthandFullwidthForms块
任意收录在BIG5码集中的双字节字符
\p{InBig5}
\I
Big5可编码双字节字符
匹配未收录在BIG5码集中的双字节字符 \p{InFBig5}
\~I
非Big5可编码双字节字符
匹配任意汉字(不包括符号)
\p{InHanziOrCJKExtB}
\X
任意汉字,包括GB18030扩展部分。
匹配任意汉字(不包括符号)
\p{InHanzi}
\M
任意汉字,不包括GB18030扩展部分。
匹配非汉字的双字节字符
\p{InFHanzi}
\~M
任意非汉字的双字节字符,
包括GB18030扩展部分。
地支字符
\p{InDiZhi}
\U
子丑寅卯辰巳午未申酉戌亥
匹配收录在GB码集中的双字节字符
\p{InGB}
\g
收录在GB码集中的双字节字符,
不包括GB18030扩展部分。
匹配非收录在GB码集中的双字节字符
\p{InFGB}
\~g
未收录在GB码集中的双字节字符,
不包括GB18030扩展部分。
匹配收录在GBK码集中的双字节字符
\p{InGBK}
\h
收录在GBK码集中的双字节字符,
不包括GB18030扩展部分。
匹配非收录在GBK码集中的双字节字符
\p{InFGBK}
\~h
未收录在GBK码集中的双字节字符,
不包括GB18030扩展部分。
大写希腊字母
\p{InDaXila}
\K
ΑΒΓΔΕΖΗΘΙΚΛΜΝ
ΞΟΠΡΣΤΥΦΧΨΩ
日文片假名
\p{InPianJia}
\j
标准Katakana块
日文平假名
\p{InPingJia}
\J
标准Hiragana块
小写希腊字母
\p{InXiaoXila}
\k
αβγδεζηθικλμν
ξοπρστυφχψω
数学符号
\p{InMathe}
\m
±×÷∶∧∨∑∏∪∩∈∷√⊥∥∠⌒⊙
∫∮≡≌≈∽∝≠≮≯≤≥∞∵∴
中文数字
\p{InCnDigit}
\i
〇一二三四五六七八九十百千万亿兆吉京
大写中文数字
\p{InDaCnDigit}
\N
零壹贰叁肆伍陆柒捌玖拾佰仟萬亿兆吉京
全角标点符号
\p{InQJBiaoDian}
\o
、。·ˉˇ¨〃々—~‖…‘’“”〔〕
〈〉《》「」『』〖〗【】!"'(),
-.:;<=>?[]{|}`﹉﹊﹋﹌﹍﹎﹏﹐﹑﹒﹔﹕﹖﹗﹙﹚
﹛﹜﹝﹞︵︶︹︺︿﹀︽︾﹁﹂﹃﹄
︻︼︷︸︱︳︴
小写俄文字母
\p{InXiaoEWen}
\l
абвгдеёжзийклмн
опрстуфхцчшщъыьэюя
大写俄文字母
\p{InDaEWen}
\R
АБВГДЕЁЖЗИЙКЛМНО
ПРСТУФХЦЧШЩЪЫЬЭЮЯ
中文序号
\p{InCnSN}
\q
ⅠⅡⅢⅣⅤⅥⅦⅧⅨⅩⅪⅫ
ⅰⅱⅲⅳⅴⅵⅶⅷⅸⅹ
再加上Unicode标准EnclosedAlphanumerics块
天干字符
\p{InTianGan}
\T
甲乙丙丁戊己庚辛壬癸
竖排标点符号
\p{InSPBiaoDian}
\V
︵︶︹︺︿﹀︽︾﹁﹂﹃﹄︻︼︷︸︱︳︴
拼音字符
\p{InPinyin}
\y
āáǎàēéěèīíǐìōóǒòūúǔùǖǘǚǜüêɑńňɡ
GBK -> 0xA8A1- 0xA8C0
只是Unicode标准LatinExtended-A块的一部分。
注音字符
\p{InZhuyin}
\Y
标准Bopomofo块
制表字符
\p{InZhiBiao}
\C
标准BoxDrawing块。
经检查发现 textpro 的算法含有部分非标
准Unicode制表符:“∟∣≒≦≧⊿═”。

POSIX字符子集(只适用于ASCII)

正则表达式字符串
匹配的字符串
\p{Lower}
小写字母[a-z]
\p{Upper}
大写字母[A-Z]
\p{ASCII}
所有的ASCII字符[\x00-\x7F]
\p{Alpha}
大小写字母[\p{Lower}\p{Upper}]
\p{Digit}
数字[0-9]
\p{Alnum}
字母数字符,包含大小写字母和数字[\p{Alpha}\p{Digit}]
\p{Punct}
标点符号,!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~之一。
\p{Graph}
可显示字符[\p{Alnum}\p{Punct}]
\p{Print}
可打印字符[\p{Graph}]
\p{Blank}
空格或者制表符[ \t]
\p{Cntrl}
控制字符[\x00-\x1F\x7F
\p{XDigit}
十六进制数字[0-9a-fA-F]
\p{Space}
空白符[ \t\n\x0B\f\r]

Unicode块和分类


中文名称(摘自Word XP)
代码区域
BasicLatin
基本拉丁语
\u0000-\u007F
Latin-1Supplement
拉丁语-1
\u0080-\u00FF
LatinExtended-A
拉丁语扩充-A
\u0100-\u017F
LatinExtended-Bound
拉丁语扩充-B
\u0180-\u024F
IPAExtensions
国际音标扩充
\u0250-\u02AF
SpacingModifierLetters
进格的修饰字符
\u02B0-\u02FF
CombiningDiacriticalMarks
组合用发音符
\u0300-\u036F
Greek
基本希腊语
\u0370-\u03FF
Cyrillic
西里尔语
\u0400-\u04FF
Armenian

\u0530-\u058F
Hebrew

\u0590-\u05FF
Arabic

\u0600-\u06FF
Syriac

\u0700-\u074F
Thaana

\u0780-\u07BF
Devanagari

\u0900-\u097F
Bengali

\u0980-\u09FF
Gurmukhi

\u0A00-\u0A7F
Gujarati

\u0A80-\u0AFF
Oriya

\u0B00-\u0B7F
Tamil

\u0B80-\u0BFF
Telugu

\u0C00-\u0C7F
Kannada

\u0C80-\u0CFF
Malayalam

\u0D00-\u0D7F
Sinhala

\u0D800-\uDFF
Thai

\u0E00-\u0E7F
Lao

\u0E80-\u0EFF
Tibetan
藏语
\u0F00-\u0FFF
Myanmar

\u1000-\u109F
Georgian

\u10A0-\u10FF
HangulJamo

\u1100-\u11FF
Ethiopic

\u1200-\u137F
Cherokee

\u13A0-\u13FF
UnifiedCanadianAboriginalSyllabics

\u1400-\u167F
Ogham

\u1680-\u169F
Runic

\u16A0-\u16FF
Khmer

\u1780-\u17FF
Mongolian
蒙古语
\u1800-\u18AF
LatinExtendedAdditional

\u1E00-\u1EFF
GreekExtended

\u1F00-\u1FFF
GeneralPunctuation
广义标点
\u2000-\u206F
SuperscriptsandSubscripts

\u2070-\u209F
CurrencySymbols
货币符号
\u20A0-\u20CF
CombiningMarksforSymbols

\u20D0-\u20FF
LetterlikeSymbols
类似字母的符号
\u2100-\u214F
NumberForms
数字形式
\u2150-\u218F
Arrows
箭头
\u2190-\u21FF
MathematicalOperators
数学运算符
\u2200-\u22FF
MiscellaneousTechnical
零杂技术用符号
\u2300-\u23FF
ControlPictures

\u2400-\u243F
OpticalCharacterRecognition

\u2440-\u245F
EnclosedAlphanumerics
带括号的字母数字
\u2460-\u24FF
BoxDrawing
制表符
\u2500-\u257F
BlockElements
方块图形
\u2580-\u259F
GeometricShapes
几何图形
\u25A0-\u25FF
MiscellaneousSymbols
零杂丁贝符(示意符等)
\u2600-\u26FF
Dingbats

\u2700-\u27BF
BraillePatterns

\u2800-\u28FF
CJKRadicalsSupplement

\u2E80-\u2EFF
KangxiRadicals

\u2F00-\u2FDF
IdeographicDescriptionCharacters

\u2FF0-\u2FFF
CJKSymbolsandPunctuation
CJK符号和标点
\u3000-\u303F
Hiragana
平假名
\u3040-\u309F
Katakana
片假名
\u30A0-\u30FF
Bopomofo
注音
\u3100-\u312F
HangulCompatibilityJamo

\u3130-\u318F
Kanbun

\u3190-\u319F
BopomofoExtended
扩展注音
\u31A0-\u31BF
EnclosedCJKLettersandMonths
带括号的CJK字母及月份
\u3200-\u32FF
CJKCompatibility
CJK兼容字符
\u3300-\u33FF
CJKUnifiedIdeographsExtensionA
CJK统一汉字扩展-A
\u3400-\u4dBF
CJKUnifiedIdeographs
CJK统一汉字
\u4E00-\u9fAF
YiSyllables

\uA000-\uA48F
YiRadicals

\uA490-\uA4CF
HangulSyllables

\uAC00-\uD7A3
HighSurrogates

\uD800-\uDB7F
HighPrivateUseSurrogates

\uDB80-\uDBFF
LowSurrogates

\uDC00-\uDFFF
PrivateUse
专用区
\uE000-\uF8FF
CJKCompatibilityIdeographs
CJK兼容汉字
\uF900-\uFAFF
AlphabeticPresentationForms

\uFB00-\uFB4F
ArabicPresentationForms-A

\uFB50-\uFDFF
CombiningHalfMarks

\uFE20-\uFE2F
CJKCompatibilityForms
CJK兼容形式
\uFE30-\uFE4F
SmallFormVariants
小写变体
\uFE50-\uFE6F
ArabicPresentationForms-Bound

\uFE70-\ufeFF
Specials

\uFFF0-\uFFFF
HalfwidthandFullwidthForms
半形及全形字符
\uFF00-\uFFEF


分类
全称
说明
Cn

UNASSIGNED
Lu

UPPERCASE_LETTER
Ll

LOWERCASE_LETTER
Lt

TITLECASE_LETTER
Lm

MODIFIER_LETTER
Lo

OTHER_LETTER
Mn

NON_SPACING_MARK
Me

ENCLOSING_MARK
Mc

COMBINING_SPACING_MARK
Nd

DECIMAL_DIGIT_NUMBER
Nl

LETTER_NUMBER
No

OTHER_NUMBER
Zs

SPACE_SEPARATOR
Zl

LINE_SEPARATOR
Zp

PARAGRAPH_SEPARATOR
Cc

CNTRL
Cf

FORMAT
Co

PRIVATE_USE
Cs

SURROGATE
Pd

DASH_PUNCTUATION
Ps

START_PUNCTUATION
Pe

END_PUNCTUATION
Pc

CONNECTOR_PUNCTUATION
Po

OTHER_PUNCTUATION
Sm

MATH_SYMBOL
Sc

CURRENCY_SYMBOL
Sk

MODIFIER_SYMBOL
So

OTHER_SYMBOL
L

LETTER
M

MARK
N

NUMBER
Z

SEPARATOR
C

CONTROL
P

PUNCTUATION
S

SYMBOL
LD

LETTER_OR_DIGIT
L1

Latin-1
all

ALL
ASCII

ASCII
Alnum

字母数字(0-9,a-z,A-Z)
Alpha

字母(a-z,A-Z)
Blank

空格和制表符(' '|\t)
Cntrl

控制字符,不可打印
Digit

数字(0-9)
Graph

可打印且可视字母(例如空格' '是可打印的但不是可视字母,而 `a' 两者都是。)
Lower

小写字母
Print

可打印字母(非控制字符)
Punct

标符号(字母、数字、控制、空白符以外的字母),如:!@#$%}{<>,./?[]等等。
Space

空白符(' ',\t,0x09,0x0A,0x0B,0x0C,0x0D,0x20)
Upper

大写字母
XDigit

十六进制数字(0-9,a-f, A-F)





替换表达式

特殊字符
特殊字符介绍
描述
\n
换行
\b
向前删除一个字符。当这个字符位于替换串之首时,将删除匹配串之前的一个字符。若匹配串位于行首,将使匹配串所在行与前一行相合并。
\d
向后删除一个字符。当这个字符位于替换串之末时,将删除匹配串之后的一个字符。若匹配串位于行末,将使匹配串所在行与下一行相合并。
\e
插入一个ESC字符
\t
插入一个TAB字符
\n
n代表查找正则表达式中的子表达式(组)。\1代表第一个子表达式,\2代表第二个子表达式,依次类推。\0代表整个匹配到的字符串。
\v
大写下一个字母
\U
全部大写以后的字母,直到碰到其它指示符为止。
\l
小写下一个字母
\L
全部小写以后的字母,直到碰到其它指示符为止。
\E
取消所有的字母大小写指示符。


自定义替换表

在查找/替换中使用自定义替换表
有的时候,上述简单的自定义替换功能是不够的。例如,用户可能希望只把出现在括号内的源串替换为目标串。这种文本处理可以通过在查找/替换中使用自定义替换表来解决。

在查找/替换功能中使用自定义替换表的替换函数是\Tn,其中n是0-9的数字, 注意n为0表示第10张替换表。如果略去n,其效果相当于\T1,即使用第一张替换表。例如要把所有放在方括号中的汉字替换为拼音,可以查找“\[(\E)\]”,替换为“\T{\1}”。即把第一个子表达式的匹配内容按自定义替换表转换。注意,如果\T函数的参数不在替换表的源串中,\T函数的结果与源串相同,即不做任何变换。

有些情况下,用户可能希望只使用替换表的一部分内容。还是以拼音为例,前面给出的替换表中包含了拼音的音调,如果在替换时不希望加上这些音调数字,可以使用“过滤”功能。所谓过滤,其实是用一个正则表达式去分析替换表的目标串,并把其中的某个子表达式取出来。

使用“过滤”时,在“设置自定义替换表”对话框中,点“过滤”按钮,在弹出的对话框中填入一个正则表达式。再以拼音为例,表达式可以写为“(\p{Alpha}+)(\d)”,其中第一对括号中的是不含音调的拼音,第二对括号是音调。在调用\T函数时,JTextPro会在目标串中查找这个正则表达式。但是如何把其中的子表达式取出来呢?\T函数还有一个可选的下标,取第n个子表达式的值就写作\T{...}[n]。所以,把放在方括号中的汉字替换为不带调的拼音,可以查找“\[(\E)\]”,替换为“\T{\1}[1]”

posted @ 2005-12-12 13:38 kelven 阅读(959) | 评论 (0)编辑 收藏
我收集的Eclipse插件

Poperties Editor
 
http://propedit.sourceforge.jp/eclipse/updates/

eclipseME
 
http://eclipseme.org/updates/

Eclipse加速插件KeepResident
http://suif.stanford.edu/pub/keepresident/

 
MyEclipse  J2EE开发插件,支持SERVLET/JSP/EJB/数据库操纵等
www.myeclipseide.com
 
Properties Editor  编辑java的属性文件,并可以自动存盘为Unicode格式
http://propedit.sourceforge.jp/index_en.html
http://propedit.sourceforge.jp/eclipse/updates/
 
Colorer Take  为上百种类型的文件按语法着色
http://colorer.sourceforge.net/
 
XMLBuddy 编辑xml文件
www.xmlbuddy.com
 
Code Folding  加入多种代码折叠功能(比eclipse自带的更多)
http://www.coffee-bytes.com/servlet/PlatformSupport
 
Easy Explorer  从eclipse中访问选定文件、目录所在的文件夹
http://easystruts.sourceforge.net/
 
Fat Jar 打包插件,可以方便的完成各种打包任务,可以包含外部的包等
http://fjep.sourceforge.net/
 
RegEx Test 测试正则表达式
http://brosinski.com/stephan/archives/000028.php
 
JasperAssistant 报表插件(强,要钱的)
http://www.jasperassistant.com/
 
Jigloo GUI Builder JAVA的GUI编辑插件
http://cloudgarden.com/jigloo/
 
Profiler 性能跟踪、测量工具,能跟踪、测量BS程序
http://sourceforge.net/projects/eclipsecolorer/
 
AdvanQas 提供对if/else等条件语句的提示和快捷帮助(自动更改结构等)
http://eclipsecolorer.sourceforge.net/advanqas/index.html
 
Log4E     Log4j插件,提供各种和Log4j相关的任务,如为方法、类添加一个logger等
http://log4e.jayefem.de/index.php/Main_Page
 
VSSPlugin VSS插件
http://sourceforge.net/projects/vssplugin
 
Implementors   提供跳转到一个方法的实现类,而不是接中的功能(实用!)
http://eclipse-tools.sourceforge.net/implementors/
 
Call Hierarchy 显示一个方法的调用层次(被哪些方法调,调了哪些方法)
http://eclipse-tools.sourceforge.net/call-hierarchy/index.html
 
EclipseTidy 检查和格式化HTML/XML文件
http://eclipsetidy.sourceforge.net/
 
Checkclipse 检查代码的风格、写法是否符合规范
http://www.mvmsoft.de/content/plugins/checkclipse/checkclipse.htm
 
Hibernate Synchronizer Hibernate插件,自动映射等
http://www.binamics.com/hibernatesync/
 
spring updatesite 插件
http://springide.org/updatesite/

VeloEclipse  Velocity插件
http://propsorter.sourceforge.net/
 
EditorList   方便的列出所有打开的Editor
http://editorlist.sourceforge.net/
 
MemoryManager 内存占用率的监视
http://cloudgarden.com/memorymanager/

Eclipse的游戏插件
http://eclipse-games.sourceforge.net/

JBoss-IDE
http://jboss.sourceforge.net/jbosside/updates/

自动反编译class,安装后要设定class文件缺省关联到jode
http://www.technoetic.com/eclipse/update


jigloo swing/sw设计工具,里面自带的form/anchor布局很好用!
http://cloudgarden.soft-gems.net/update-site/

jinto的资源文件编辑工具,同时编辑多种语言,而且自动转换成iso8859-1编码。很好用!
http://www.guh-software.de/eclipse/

posted @ 2005-12-12 13:30 kelven 阅读(708) | 评论 (1)编辑 收藏
1. SELECT语句的子查询:
语法:     SELECT ... FROM (subquery) AS name ...

先创建一个表:
CREATE TABLE t1 (s1 INT, s2 CHAR(5), s3 FLOAT);
INSERT INTO t1 VALUES (1,'1',1.0);
INSERT INTO t1 VALUES (2,'2',2.0);

我们就可以进行以下的嵌套查询了:
SELECT sb1,sb2,sb3
       FROM (SELECT s1 AS sb1, s2 AS sb2, s3*2 AS sb3 FROM t1) AS sb
       WHERE sb1 > 1;

结果是: 2, '2', 4.0.

我们知道下面语句是不会得到正确结果的,因为对经过Group by排序的集合进行求均值是不能得到正确答案的:
SELECT AVG(SUM(column1)) FROM t1 GROUP BY column1

所以我们可以通过下面的嵌套查询实现同样的效果:
SELECT AVG(sum_column1)
       FROM (SELECT SUM(column1) AS sum_column1
             FROM t1 GROUP BY column1) AS t1;

2.行的子查询(Row Subquery):
看下面的例子:
SELECT * FROM t1 WHERE ROW(1,2) = (SELECT column1, column2 FROM t2);
这个查询是返回column1等于column2的结果行。Row函数中的1和2相当于构造参数。想必Blogjava上的同志对这些应该比较清楚,也不去详细介绍了。

3.使用Exist和Not Exist参数
这里的Exist和Not Exist用途及用法和在其他没有什么大的区别,我就简单举几个范例好了:

范例一:      SELECT DISTINCT store_type FROM Stores
                    WHERE EXISTS (SELECT * FROM Cities_Stores
                                  WHERE Cities_Stores.store_type = Stores.store_type);
范例二:   SELECT DISTINCT store_type FROM Stores
                       WHERE NOT EXISTS (SELECT * FROM Cities_Stores
                                   WHERE Cities_Stores.store_type = Stores.store_type);
范例三:  这个例子中嵌套使用了Not Exist语法,稍微注意一下:
               SELECT DISTINCT store_type FROM Stores S1
                    WHERE NOT EXISTS (
                               SELECT * FROM Cities WHERE NOT EXISTS (
                                       SELECT * FROM Cities_Stores
                                                 WHERE Cities_Stores.city = Cities.city
                                                         AND Cities_Stores.store_type = Stores.store_type));

4.条件关联关系查询:
解释起来麻烦,直接看例子吧:
SELECT column1 FROM t1 AS x
     WHERE x.column1 = (SELECT column1 FROM t2 AS x
          WHERE x.column1 = (SELECT column1 FROM t3
               WHERE x.column2 = t3.column1));
跟其他数据库做法是一样的。

5.其他使用方法和注意:
除了上面这些还有很多很多,不过就不去细讲了,因为这些跟别的数据库差不多,只是为了给大家一个参考,提提就够了。

         SELECT (SELECT s1 FROM t2) FROM t1;
         SELECT (SELECT s2 FROM t1);

支持子查询的语法有:SELECT,INSERT,UPDATE,DELETE,SET和DO。

子查询可以使用任何普通查询中使用的关键词:如DINSTINCT,GROUP BY,LIMIT,ORDER BY,UNION,ALL,UNION ALL等。可以使用<,>, <=, >=, =, <>运算符进行比较,也可以使用ANY ,IN和SOME进行集合的匹配。
posted @ 2005-10-31 21:34 kelven 阅读(446) | 评论 (0)编辑 收藏
文件的建立/检查与删除

<%@ page contentType="text/html;charset=gb2312"%>
<%@ page import="java.io.*"%>
<html>
<head>
<title>文件的建立、检查与删除</title>
</head>
<body>
<%
    String path=request.getRealPath("");
    //out.println(path);
    File f=new File(path,"File.txt");
    //out.println(f);
    //out.println(f.exists());
 
    //检查File.txt是否存在
    if(f.exists()){
        f.delete();//删除File.txt文件
        out.println(path + "\\File.txt 存在,已删除。");
    }else{
        f.createNewFile();//在当前目录下建立一个名为File.txt的文件
        out.println(path + "\\File.txt 不存在,已建立。");//输出目前所在的目录路径
     }
%>


目录的建立/检查与删除

<%@ page contentType="text/html;charset=gb2312"%>
<%@ page import="java.io.*"%>
<html>
<head>
<title>目录的建立/检查与删除</title>
</head>
<body>
<%
    String path=request.getRealPath("");
    path=path + "\\Sub";//将要建立的目录路径
    File d=new File(path);//建立代表Sub目录的File对象,并得到它的一个引用
    if(d.exists()){//检查Sub目录是否存在
        d.delete();
        ("Sub目录存在,已删除");
    }else{
        d.mkdir();//建立Sub目录
        out.println("Sub目录不存在,已建立");
    }
%>
</body>
</html>


如何在JSP中处理虚拟目录

<%@ page contentType="text/html;charset=gb2312"%>
<%@ page import="java.io.*"%>
<html>
<head>
<title>JSP中如何处理虚拟目录</title>
</head>
<body>
取得虚拟目录对应的磁盘路径<br>
Web站点主目录的位置为<font color=#ff0000><%=request.getRealPath("/")%></font><br>
JSP网页所在的目录位置<font color=#ff0000><%=request.getRealPath("./")%></font><br>
JSP网页所在目录上一层目录的位置<font color=#ff0000><%=request.getRealPath("../")%></font><br>
</body>
</html>


文件属性的取得
<%@ page contentType="text/html;charset=gb2312"%>
<%@ page import="java.util.Date,java.io.*"%>
<html>
<head>
<title>文件属性的取得</title>
</head>
<body>
<%
String path=request.getRealPath("/");
File f=new File(path,"ReadData.txt");
if(f.exists()){
%>
    <%=f.getName()%>的属性如下:<br><br>
    文件长度为:<%=f.length()%>
    <%=f.isFile()?"是文件":"不是文件"%><br>
    <%=f.isDirectory()?"是目录":"不是目录"%><br>
    <%=f.canRead()?"可读取":"不可读取"%><br>
    <%=f.canWrite()?"可写入":"不可写入"%><br>
    <%=f.isHidden()?"是隐藏文件":"不是隐藏文件"%><br>
    文件的最后修改日期为:<%=new Date(f.lastModified())%><br>
<%
}else{
    f.createNewFile();//在当前目录下建立一个名为ReaData.txt的文件
%>
    <%=f.getName()%>的属性如下:<br><br>
    文件长度为:<%=f.length()%>
    <%=f.isFile()?"是文件":"不是文件"%><br>
    <%=f.isDirectory()?"是目录":"不是目录"%><br>
    <%=f.canRead()?"可读取":"不可读取"%><br>
    <%=f.canWrite()?"可写入":"不可写入"%><br>
    <%=f.isHidden()?"是隐藏文件":"不是隐藏文件"%><br>
    文件的最后修改日期为:<%=new Date(f.lastModified())%><br>
<%
}
%>
</body>
</html>
 

取出目录中文件的方法

<%@ page contentType="text/html;charset=gb2312"%>
<%@ page import="java.io.*"%>
<html>
<head>
<title>取出目录中文件的方法--列出目录中的文件</title>
</head>
<body>
<%
    String path=request.getRealPath("/");
    File d=new File(path);//建立当前目录中文件的File对象
    File list[]=d.listFiles();//取得代表目录中所有文件的File对象数组
    out.println("<font color=#ff0000>" + path + "目录下的文件:</font><br>");
    for(int i=0;i<list.length;i++){
        if(list<I>.isFile()){
            out.println(list<I>.getName() + "<br>");
        }
    }
    out.println("<br><font color=#ff0000>" + path + "目录下的目录:</font><br>");
    for(int i=0;i<list.length;i++){
        if(list<I>.isDirectory()){
                out.println(list<I>.getName() + "<br>");
        }
    }
%>
</body>
</html>


判断是否为空白文件
<%@ page contentType="text/html;charset=gb2312"%>
<%@ page import="java.io.*"%>
<html>
<head>
<title>判断是否为空白文件</title>
</head>
<body>
<%
    String path=request.getRealPath("/");
    out.println(path);
    FileReader fr=new FileReader(path + "\\AtEnd.txt");//建立FileReader对象,并实例化为fr
    //对FileReader类生成的对象使用read()方法,可以从字符流中读取下一个字符。
    if(fr.read()==-1)//判断是否已读到文件的结尾
    {
        out.print("AtEnd.txt文件中没有数据<br>");
    }else{
        out.println("AtEnd.txt文件中有数据");
    }
    fr.close();
%>
</body>
</html>
    <B>读取所有的文件数据</B>
<ccid_nobr>
<table width="400" border="1" cellspacing="0" cellpadding="2"
bordercolorlight = "black" bordercolordark = "#FFFFFF" align="center">
<tr>
<td bgcolor="e6e6e6" class="code" style="font-size:9pt">
<pre><ccid_code> <%@ page contentType="text/html;charset=gb2312"%>
<%@ page import="java.io.*,java.lang.*"%>
<html>
<head>
<title>读取所有的文件数据</title>
</head>
<body>
<%
    String path=request.getRealPath(".");
    FileReader fr=new FileReader(path + "\\ReadData.txt");
    //关键在于读取过程中,要判断所读取的字符是否已经到了文件的末尾,并且这个字符是不是文件中的断行符,即判断该字符值是否为13


    int c=fr.read();//从文件中读取一个字符
    //判断是否已读到文件结尾
    while(c!=-1){
        out.print((char)c);//输出读到的数据
        c=fr.read();//从文件中继续读取数据
        if(c==13){//判断是否为断行字符
            out.print("<br>");//输出分行标签
            fr.skip(1);//略过一个字符
            /c=fr.read();//读取一个字符
        }
    }
    fr.close();
%>
</body>
</html>
  一行一行读取数据
<%@ page contentType="text/html;charset=gb2312"%>
<%@ page import="java.io.*"%>
<html>
<head>
<title>文件读取</title>
</head>
<body>
<%
    String path=request.getRealPath("");//取得当前目录的路径
    FileReader fr=new FileReader(path + "\\file\\inc\\t.txt");//建立FileReader对象,并实例化为fr
    BufferedReader br=new BufferedReader(fr);//建立BufferedReader对象,并实例化为br
    String Line=br.readLine();//从文件读取一行字符串
    //判断读取到的字符串是否不为空
    while(Line!=null){
        out.println(Line + "<br>");//输出从文件中读取的数据
        Line=br.readLine();//从文件中继续读取一行数据
    }
    br.close();//关闭BufferedReader对象
    fr.close();//关闭文件
%>
</body>
</html>

略过文件中的字符不读取
<%@ page contentType="text/html;charset=gb2312"%>
<%@ page import="java.io.*"%>
<html>
<head>
<title>略过字节不读取</title>
</head>
<body>
<%
    String path=request.getRealPath(".");
    FileReader fr=new FileReader(path + "\\ReadData.txt");
    fr.skip(2);//跳过2个字节
    int c=fr.read();//读取一个字节
    while(c!=-1){
        out.print((char)c);
        c=fr.read();
    }
    fr.close();
%>
</body>
</html>
  将数据写入文件
<%@ page contentType="text/html;charset=gb2312"%>
<%@ page import="java.io.*"%>
<html>
<head>
<title>将数据写入文件</title>
</head>
<body>
<%
    String path=request.getRealPath(".");
    FileWriter fw=new FileWriter(path + "\\WriteData.txt");//建立FileWriter对象,并实例化fw
    //将字符串写入文件
    fw.write("大家好!");
    fw.write("本书是《JSP编程技巧》");
    fw.write("请多多指教!");
    fw.write("email:stride@sina.com");
    fw.close();

    FileReader fr=new FileReader(path + "\\WriteData.txt");
    BufferedReader br=new BufferedReader(fr);//建立BufferedReader对象,并实例化为br
    String Line=br.readLine();
    //读取一行数据
    out.println(Line + "<br>");
    br.close();//关闭BufferedReader对象
    fr.close();
%>
</body>
</html>
  将写入文件的数据分行
<%@ page contentType="text/html;charset=gb2312"%>
<%@ page import="java.io.*"%>
<html>
<head>
<title>将写入文件的数据分行</title>
</head>
<body>
<%
    String path=request.getRealPath(".");
    FileWriter fw=new FileWriter(path + "\\WriteData.txt");
    BufferedWriter bw=new BufferedWriter(fw);
    bw.write("大家好!");
    bw.write("本书是《JSP编程技巧》。");
    bw.newLine();//断行
    bw.write("请多多指教!");
    bw.newLine();//断行
    bw.write("email: stride@sina.com");
    bw.flush();//将数据更新至文件
    fw.close();//关闭文件流
    out.println("写入文件内容为:<br>");
    FileReader fr=new FileReader(path + "\\WriteData.txt");
    BufferedReader br=new BufferedReader(fr);
    String Line=br.readLine();//读取一行数据
    while(Line!=null){
        out.println(Line + "<br>");
        Line=br.readLine();
    }
    fr.close();
%>
</body>
</html>

如何将数据追加写入到文件
<%@ page contentType="text/html;charset=gb2312"%>
<%@ page import="java.io.*"%>
<html>
<head>
<title>将写入文件的数据分行</title>
</head>
<body>
<%
 
%>
</body>
</html></I></I></I></>

posted @ 2005-10-31 21:30 kelven 阅读(363) | 评论 (0)编辑 收藏