Aug 13

以一个Servlet为例子说明如何从Tomcat 6的JNDI Resources中获取Data Source对象。
--------------------------------------------------------------------------
环境:
JDK 1.6
Tomcat 6
Eclipse Galileo 3.5.1
组件:
sqljdbc4.jar(可从microsoft.com下载,用于连接SQL Server)
参考:
http://tomcat.apache.org/tomcat-6.0-doc/jndi-resources-howto.html
--------------------------------------------------------------------------

1、准备library.
Copy sqljdbc4.jar到Tomcat 6的lib目录:$CATALINA_HOME/lib, 在Eclipse创建一个Java Project,引用$CATALINA_HOME/lib/servlet-api.jar和sqljdbc4.jar。

2、编写Servlet
编写一个名为JNDITest的Servlet类,代码如下:package com.Test;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.SQLException;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.sql.DataSource;
public class JNDITest extends HttpServlet
{
    public void doGet(HttpServletRequest request
              ,HttpServletResponse response) throws IOException
    {
        PrintWriter pw=response.getWriter();
        try
        {
            Context initCtx = new InitialContext();
            Context envCtx = (Context) initCtx.lookup("java:comp/env");
            DataSource ds = (DataSource)
            envCtx.lookup("jdbc/DevDB");
            Connection conn = ds.getConnection();
            pw.write("Cool,Successful!</br>"+conn.toString()+"</br>");
            conn.close();
        }
        catch(SQLException exSql)
        {
            pw.write("SQL Exception:"+exSql.getMessage()+"</br>");
        }
        catch(NamingException exNam)
        {
            pw.write("Naming Exception:"+exNam.getMessage()+"</br>");
        }
        finally
        {
            pw.flush();
            pw.close();
            pw=null;
        }
    }
}.

  代码中创建了一个简单的Servlet,在Servlet的get方法中,通过InitialContext从JNDI的名为java:comp/env(Java Environment Naming Context)中查找名为jdbc/DevDB的Resource,然后把查找到的Resource转换为Data Source,然后从该Data Source中得到用于连接数据库的Connection对象,如果获取成功,则在Web页面中输出Connection的toString(),否则输出错误信息。
  若想从JNDI中查找到相应名称的Resource,则要事先在$CATALINA_HOME/conf/server.xml或META-INF/context.xml中进行配置。
  编译以上代码得到.class文件。

3、发布Servlet
  在$CATALINA_HOME/webapps(默认WEB ROOT)路径下创建名为jndi的文件夹,然后在jndi下创建WEB-INF文件夹,把编译后的.class文件按package的路径Copy到WEB-INF下的classes目录中,根据package配置,完整路径为$CATALINA_HOME/webapps/jndi/WEB-INF/classes/com/Test/JNDITest.class;在WEB-INF下创建名为web.xml的xml文件,内容如下:<?xml version="1.0" encoding="UTF-8"?>
<web-app>
    <servlet>
      <servlet-name>JNDITest</servlet-name>
      <servlet-class>com.Test.JNDITest</servlet-class>
    </servlet>
    <servlet-mapping>
     <servlet-name>JNDITest</servlet-name>
     <url-pattern>/</url-pattern>
    </servlet-mapping>
   
    <resource-ref>
     <res-ref-name>jdbc/DevDB</res-ref-name>
     <res-type>javax.sql.DataSource</res-type>
     <res-auth>Container</res-auth>
    </resource-ref>
</web-app>  web.xml配置文件中映射了Servlet,并通过<resource-ref>节声明了我们要引用的Resource,实践证明在Tomcat6中可以不用在web.xml中声明<resource-ref>节。
  web.xml配置完成后,可以在浏览器中通过http://localhost:8080/jndi访问JNDITest Servlet,只不过还没有声明相应的资源,会看到相应的错误信息。

4、配置JNDI Resource
  Tomcat中有两个地方可以配置JNDI资源,一个是Web Application下的META-INF/context.xml文件,一个是$CATALINA_HOME/conf/server.xml文件。

  方法一:在context.xml文件中配置:
  在$CATALINA_HOME/jndi/META-INF目录下创建context.xml文件,内容如下:<?xml version="1.0" encoding="UTF-8"?>
<Context>
     <Resource name="jdbc/DevDB"
            auth="Container"
            type="javax.sql.DataSource"
            username="testuser"
            password="testpass"
            driverClassName="com.microsoft.sqlserver.jdbc.SQLServerDriver"
            url="jdbc:sqlserver://193.168.1.3:41433;databaseName=DevDB"
            maxActive="8"
            maxIdle="4"/>
</Context>该文件中定义了一个名为jdbc/DevDB的Resource,并配置了相关的数据库连接属性及连接池信息。
  META-INF下的context.xml文件在运行时会被复制到$CATALINA_HOME/conf/[Engine name]/[Host name]/[Path name].xml文件,相对于本例就是:$CATALINA_HOME/conf/Catalina/localhost/jndi.xml。

  方法二:在server.xml文件中配置:
  也可以把JNDI Resources配置在$CATALINA_HOME/conf/server.xml文件中。配置在<Server>/<Service>/<Engine>/<Host>/<Context>节点下,需指定URL访问路径,如:...
      <Host name="localhost"  appBase="webapps"
        unpackWARs="true" autoDeploy="true"
        xmlValidation="false" xmlNamespaceAware="false">
       
        <Context path="/jndi" >
          <Resource name="jdbc/DevDB"
            auth="Container"
            type="javax.sql.DataSource"
            username="testuser"
            password="testpass"
            driverClassName="com.microsoft.sqlserver.jdbc.SQLServerDriver"
            url="jdbc:sqlserver://192.168.1.3;databaseName=DevDB"
            maxActive="8"
            maxIdle="4"/>
        </Context>
       
      </Host>
    </Engine>
  </Service>
</Server>.

  JNDI Resource配置完成后,访问Servlet所在的URL,就可以看到想要输出的"Cool,Successful!..."等信息了,表明已成功从连接池中取到数据库连接。
  注:META-INF下的context.xml和server.xml中对应于同一web path的Context节对同一个属性最好不要同时配置,否则会产生意想不到的结果。

  把JNDI Resource配置为Global:
  除上面的两种配置方法外,还可以在$CATALINA_HOME/conf/server.xml中的<Server>/<GlobalNamingResources>节配置Resource为Global Source,然后在$CATALINA_HOME/conf/server.xml中的Context节或META-INF/context.xml文件中通过ResourceLink进行引用,如下,Global Resource Name为jdbc/DevDBGlobal:...
<Server>
...
  <GlobalNamingResources>
    <Resource name="jdbc/DevDBGlobal"
        auth="Container"
        type="javax.sql.DataSource"
        username="testuser"
        password="testpass"
        driverClassName="com.microsoft.sqlserver.jdbc.SQLServerDriver"
        url="jdbc:sqlserver://192.168.1.3,41433;databaseName=DevDB"
        maxActive="8"
        maxIdle="4"/>
  </GlobalNamingResources>
...  在server.xml中的引用:...
      <Host name="localhost"  appBase="webapps"
        unpackWARs="true" autoDeploy="true"
        xmlValidation="false" xmlNamespaceAware="false">
       
        <Context path="/jndi" >
          <ResourceLink name="jdbc/DevDB" global="jdbc/DevDBGlobal" type="javax.sql.DataSource" />
        </Context>
       
      </Host>
    </Engine>
  </Service>
</Server>  在context.xml中的引用:<?xml version="1.0" encoding="UTF-8"?>
<Context>
     <ResourceLink name="jdbc/DevDB" global="jdbc/DevDBGlobal" type="javax.sql.DataSource" />
</Context>

Aug 13
在tomcat中经常会遇到Cannot load JDBC driver class 'com.mysql.jdbc.Driver' 的错误,经过查找问题,发现原因可能是以下两点,尤其是第二点,即使把mysql的jdbc驱动包放在了本项目的lib文件夹下也会出现该错误,需要再放到tomcat的common的lib目录下才能解决该问题。
1.首先应检查项目的lib目录下是否有mysql的驱动包
2.应该将mysql的驱动包放到common目录的lib文件夹下
   即 C:\Program Files\Apache Software Foundation\Tomcat 5.5\common\lib然后重启服务器即可解决问题。

希望对朋友们有所帮助。
Aug 12
公司的邮件服务器是exchange的,以前没有用手机接收过邮件,最近开了个5元的gprs包月(包30m),每月单接收天气预报总是只用9xxk的流量,连1m都不到,感觉太亏了,就像让手机接收邮件,于是找到了如下配置方案。

打开您的Windows Mobile手机 ,点击开始-->程序-->Active Sync-->菜单-->配置服务器...
服务器地址:mail.xxx.com(填写您自己的邮件服务器)
勾选 服务器需要加密的(SSL)连接 (如果你没有安装证书,就不能勾选这个选项,也只能使用CMNET网络连接,并且除WM6之外的设备不能下载附件,如果你的服务器需要证书的话,必须要安装证书才行,其实很简单,把证书文件xxx.cer复制到手机上,点击打开安装就ok了。)
单击“下一步”,输入您的用户名及密码,“域”为本站的域名:xxx.com(你的域)
你可以勾取保存密码,然后单击“下一步”
选择您需要和服务器同步的项目,在”编辑服务器设置“中选择你要和服务器同步的内容,在这里你还可以对内容进行设置,比如选中”电子邮件“,然后点下面的”设置“,这时候你可以选择同步最近几天的邮件,是否接受HTML格式,还有是否自动下载附件,如图,这是我的设置。设置完后点右上角的”ok“完成设置,单击完成,第一次会立刻连接到服务器,进行首次同步,请做好上网的连接准备。
你也可以在日程安排里选择是否自动同步,默认情况下,是任何时段都自动保持同步,如果你没有使用GPRS包月,你应该选择手动同步,如果你不想在工作时间以外的时段同步,你可以设置”高峰时段“,还有漫游时是否同步的选项。

就此ok了,我的9000成功接收电子邮件,呵呵,记录一下。
Aug 10
     在“战争”开打之前,中国政府就要明确的向全世界宣布:美国航母进入黄海举行大规模军演就意味着是对中华人民共和国的战争挑衅!假如美国一意孤行将航母战斗群开入黄海,将被视为对中国宣战!中国政府和中国人民将不惜一切代价打击来犯之敌!中国政府严正警告:如果有任何国家胆敢将战争强加于中国,并对中国领土进行轰炸,中国将被迫放弃不首先使用“核武器”的承诺”!

  孙子曰:“百战百胜,非善之善者也;不战而屈人之兵,善之善者也。故上兵伐谋,其次伐交,其次伐兵,其下攻城。”。不战而屈人之兵的手段很多,最常见的就是分化对手,激化对方内部矛盾制造内乱,中国采取鱼死网破的核威慑手段展开强大的心理攻势,必定会引起美国参众两院的恐慌,有道是:“光脚的不怕穿鞋的”这话是有道理的,很难想象美国的富人们会为区区一个朝鲜半岛的“黄海军演”丢掉富裕的生活回到石器时代吗?还有韩国和日本及其他反华势力,当他们听到中国的严正警告后必定会成了缩头乌龟,岂敢--冒灭顶之灾与美国为伍?所以说:只要守住了黄海大门,拒美国航母于黄海之外,也就体现出了中国的战争决心,在南海、东海问题上美国就不敢轻举妄动!

  中华人民共和国已经走过了六十年的历史,毛泽东他们那一代共和国的缔造者们,他们有着无坚不摧的钢强意志,有舍得一身剐的勇气,他们有着崇高的理想和坚定的信念,他们让中国的老百姓懂得了团结就是力量!这些是美帝国主义最惧怕的,这是毛泽东等老一辈共产党人为中华民族注入的新的民族精神,这种精神已经融入到了中国人的血液里,代代相传,深深地扎根在了中华大地上,一旦中华民族到了危机的时刻随时会迸发出无穷的力量!二十一世纪的共和国已今非昔比,综合国力和国防力量在不断的壮大,中国的军队有着优良的传统,中国的老百姓具有与祖国共存亡的决心!只要中国政府挺直了腰杆,别趴下!谁敢与十三亿中国人民为敌就必将让他灭亡!

Aug 7
    MyEclipse不编译使我们经常会碰到的问题,那么是什么引起MyEclipse不编译的呢?那么本文给出的方案给你介绍一下。

    这两天MyEclipse 不编译了,无论怎么更改保存, classes目录下都是空的.

    在网上找了很多文章,总结如下:

    MyEclipse不编译解决1. 确保 project->build automatically    已经被选上.

    MyEclipse不编译解决2. 如果选上了,也不好使, 使用这一招: project->clean..->选第2个clean select project, 勾上start build immediatelly

    MyEclipse不编译解决3.删除现在的项目,提前设置好编译文件输出路径,重新导入源文件,设置MyEclipse为保存时编译,然后在保存的时候就可以自动编译了

    MyEclipse不编译解决4.如果项目里引了某个不用的jar包,而那个包又被你删了,就会出现不报错但怎么也编译不出来class文件的情况,可以把所有包都删除,然后一个一个的再引入(需要的),不要一下子把所有包都引入来,没用的可能会引起不良后果.

    MyEclipse不编译解决5. 想删掉某个class文件重新生成,删除class文件后,但classes目录下的文件夹被其它程序打开,比如Total Commander。此时编译也不会通过,在problems下可能会提示“con''t delete classes ……”。关掉其它程序重新编译即可。

    MyEclipse不编译解决6.还有种情况是remove掉 JRE System Library,重新导入即可编译。但是什么原因导致的还不清楚。

    MyEclipse不编译解决7.把build path中所有包都remove掉。然后又add jars,add libraries把需要的加进去,居然又开始编译了。。。

    MyEclipse不编译解决8.project->properties->java build path->source->.../WEB-INF/src的output folder不要默认,编辑让它指向../WEB-INF/classes

    然后重新点击build工程即可自动编译。我的问题出在这里,我把这个编译目录给误删了

    MyEclipse不编译解决9.再就是最重要的要看工程下面是否缺少了work目录,由于CVS控制时不把work加如版本,所以checkout后没有这个目录,要手工加上有的工程就能自动编译了

    最开始的时候,我只找到了前面7个方法,但是他们都没有解决我的问题.无意中我打开了"Problems"标签,发现里面说缺少work目录,手工加上,然后刷新项目就可以了.

    最后两个是我在写这个总结的时候发现的.特别是第九条,对使用CVS进行版本控制的项目比较有用.

    .classpath这个xml文件要仔细看

    MyEclipse不编译的解决方案就是这些了,希望对你有帮助。

分页: 3/60 第一页 上页 1 2 3 4 5 6 7 8 9 10 下页 最后页 [ 显示模式: 摘要 | 列表 ]