zoukankan      html  css  js  c++  java
  • jndi的资料

    正文)
    [使用 lomboz 开发一个 stateless session bean]

    现在我们试着用lomboz开发一个简单的ejb, 这个bean主要负责用户身份认证.数据库操
    作使用DAO技术.
    主要的需求有: 所有的用户,供应商和经理都有唯一的一个username和userid来登录,如
    果要登录,则需要使用方法login(),这个方法有两个函数,一个是username,一

    个是password, 如果身份认证通过, 则返回userid

    接下来让我们看一下完成这个ejb要做的工作:

    1. 创建一个j2ee项目叫MyStore
    2. 创建一个stateless session bean 叫 StoreAccess
    3. 添加一个业务方法,叫public String loginUser (String username, String
    password)
    4. 创建一个DAO名叫StoreAccessDAOImpl,生成DAO的接口
    5. 在DAO中,实现loginUser方法
    6. 添加回调函数,并实现
    7. 部署ejb
    8. 创建测试客户端
    9. 运行客户端,测试ejb

    ----------------------------

    1. 创建j2ee项目

    点击菜单 file->new->project, 在new project 对话框里选择java->lomboz j2ee
    wizards->lomboz j2ee project,按next,

    填入项目名MyStore, 按next,

    在java setting对话框,翻到source页面, 设置项目的源目录为MyStore/src, 输出目录
    为MyStore/bin, 按next

    在create j2ee module对话框, 翻到web module页面, 然后添加一个module名字叫Onli
    neStore

    再翻到ejb module页面, 然后添加一个module名字叫:MyStoreMgr

    再翻到targeted server页面下,添加jboss 3.2.x服务器(就是我们昨天陪的jboss4.0.0,
    因为是ejb,所以tomcat5.0.x不能用)


    2.创建stateless session bean

    创建完项目后, 点击菜单 file->new->other, 在new对话框中选择java->lomboz j2ee
    wizards->lomboz ejb creation wizard,按next

    在create ejb对话框中设定以下值:
    source folder: MyStore/src
    package: edu.sjtu.eclipse.session
    Name: StoreAccess
    ejb type: Stateless Session Bean
    然后按finish



    以下是这个bean生成的代码

    ------------------------------
    package edu.sjtu.eclipse.session;
     
    import javax.ejb.SessionBean;
     
    /**
     * @ejb.bean name="StoreAccess"
     *  jndi-name="StoreAccessBean"
     *  type="Stateless" 
     * 
     *--
     * This is needed for JOnAS.
     * If you are not using JOnAS you can safely remove the tags below.
     * @jonas.bean ejb-name="StoreAccess"
     *  jndi-name="StoreAccessBean"
     * 
     *--
     **/
     
    public abstract class StoreAccessBean implements SessionBean {
     
    }
    

    ----------------------------------

    其中注释里标明了这个ejb的name,type,和jndi-name, 这个到时候要生成部署描述符派
    用场,写到ejb-jar.xml 和 jboss.xml中去的

    如果你展开此项目的MyStoreMgr/META-INF目录,你会发现有很多***.xml,这些都是描述,
    部署ejb要用的

    接下来,我们来创建包括home,remote,DAO,helper的接口类

    打开/MyStoreMgr/META-INF/xdoclet.xml (也有的是叫ejbCreate.xml, 名字其实无所谓
    的,只要内容符合XDoclet规范就可以)

    这个文件在你生成ejb时就自动生成了, 它能帮助你生成接口和helper类


    这个node,配置了DAO信息,不用修改了

    version="3.0"
    unauthenticatedPrincipal="nobody"
    xmlencoding="UTF-8"
    destdir="${ejb.dd.dir}"
    validatexml="false"
    datasource="PLEASE_MODIFY_THIS"
    datasourcemapping="PLEASE_MODIFY_THIS"
    preferredrelationmapping="PLEASE_MODIFY_THIS"
    />

    这是jboss的配置信息,我们要做一下修改,改成:

    version="3.0"
    unauthenticatedPrincipal="nobody"
    xmlencoding="UTF-8"
    destdir="${ejb.dd.dir}"
    validatexml="false"
    datasource="java:/DefaultDS" //这个是数据源的jndi-name
    datasourcemapping="Hypersonic SQL" //映射到一个xml节点,这个
    节点定义了数据结构
    preferredrelationmapping="foreign-key" //数据库类型
    />


    3.创建DAO接口

    我们创建一个class作为DAO的实现, file -> new -> class, class的package为edu.sjt
    u.eclipse.dao, name为 edu.sjtu.eclipse,以下是自动生成的代码:

    ---------------------------------
    package edu.sjtu.eclipse.dao;
     
    public class StoreAccessDAOImpl {
     
    }
    

    ---------------------------------

    然后让一开始设计的StoreAccessBean,改一下代码:

    --------------------------------
    package edu.sjtu.eclipse.session;
     
    import javax.ejb.SessionBean;
     
    /**
     * @ejb.bean name="StoreAccess"
     *  jndi-name="StoreAccessBean"
     *  type="Stateless" 
     * 
     *--
     * This is needed for JOnAS.
     * If you are not using JOnAS you can safely remove the tags below.
     * @jonas.bean ejb-name="StoreAccess"
     *  jndi-name="StoreAccessBean"
     * 
     *--
     * @ejb.dao class="edu.sjtu.eclipse.session.StoreAccessDAO"    //添加对dao的
    访问描述
     * impl-class="edu.sjtu.eclipse.dao.StoreAccessDAOImpl"
     **/
     
    public abstract class StoreAccessBean implements SessionBean {
     
    }
    

    --------------------------------

    然后点击StoreAccessBean文件,然后右键菜单 Lomboz J2ee->add ejb to module, 这样
    就可以把我们设计的bean添加到MyStoreMgr 这个module里去了

    然后点击MyStoreMgr目录,右键菜单 Lomboz j2ee-> generate ejb classes, 此时就会
    自动生成我们所需要的classes,并放置在ejbsrc这个目录

    +ejbsrc
    + edu.sjtu.eclipse.session
    -StoreAccess.java
    -StoreAccessDAO.java
    -StoreAccessHome.java
    -StoreAccessLocal.java
    -StoreAccessLocalHome.java
    -StoreAccessSession.java
    -StoreAccessUtil.java

    4.创建business方法

    右键点击StoreAccessBean.java,菜单 lomboz j2ee -> add ejb methods, 按next
    添加一个remote的business方法: public String loginUser(String username,
    String password)

    则在这个bean里面,多了一个方法
    ----------------------------------------
        /**
         * @ejb.interface-method
         *  view-type="remote" 
         * @dao.call name="loginUser"         <- // 添加这句话,用来调用DAO
        **/
        public String loginUser(String username, String password) {
            return null;
        }
    

    ----------------------------------------

    再次Generate EJB Classes, 然后看看生成的classes和原来的有什么不同

    5.实现DAOImpl方法

    ----------------------------------------
    package edu.sjtu.eclipse.dao;
     
    import java.sql.Connection;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;
     
    import javax.naming.InitialContext;
    import javax.naming.NamingException;
    import javax.sql.DataSource;
     
    import edu.sjtu.eclipse.session.StoreAccessDAO;
     
    public class StoreAccessDAOImpl implements StoreAccessDAO {
     
        private DataSource jdbcFactory;
     
        public void init() {
     
            System.out.println("Entering StoreAccessDAOImpl.init()");
            InitialContext c = null;
     
            if (null == this.jdbcFactory) {
                try {
                    c = new InitialContext();
                    this.jdbcFactory =
                        (DataSource) c.lookup("java:comp/env/jdbc/DefaultDS");
                } catch (NamingException e) {
                    System.out.println("Error in StoreAccessDAOImpl.init()");
                }
            }
     
            System.out.println("Leaving StoreAccessDAOImpl.init()");
     
        }
     
        public String loginUser(String username, String password) {
     
            System.out.println("Entering StoreAccessDAOImpl.loginUser");
            Connection conn = null;
            PreparedStatement ps = null;
            ResultSet rs = null;
            String userID = null;
            try {
                conn = jdbcFactory.getConnection();
                String queryString =
                    "select userid from storeaccess where username = ? and 
    password = ?";
                ps = conn.prepareStatement(queryString);
                ps.setString(1, username);
                ps.setString(2, password);
                rs = ps.executeQuery();
                boolean result = rs.next();
                if (result) {
                    userID = rs.getString("userid");
                    System.out.println("Userid is " + userID);
     
                }
            } catch (SQLException e) {
                e.printStackTrace();
                System.out.println("Inside StoreAccessDAOImpl.loginUser" + e);
            } finally {
                try {
                    rs.close();
                    ps.close();
                    conn.close();
                } catch (Exception e) {
     
                }
            }
            System.out.println("Leaving StoreAccessDAOImpl.loginUser");
            return userID;
        }
     
    }
    

    ----------------------------------------

    6.在bean中设置context

    ----------------------------------------------------------------
    public abstract class StoreAccessBean implements SessionBean {
     
        /**
         * @ejb.interface-method
         *  view-type="remote" 
         * @dao.call name="loginUser"
        **/
        public String loginUser(String username, String password) {
            System.out.println("Entering StoreAccessBean");
            System.out.println("Leaving StoreAccessBean");
            return null;
        }
        
        //添加这个sessioncontext,并实现下面两个函数
        protected SessionContext ctx;
     
        public void setSessionContext(SessionContext ctx){
            this.ctx  = ctx;
        }
        
        public void unsetSessionContext(){
            this.ctx = null;
        }
    }
    

    -------------------------------------------------------------------

    然后再generate ejb classes,生效

    其实你已经发觉了, 生成出来的ejb类,如StoreAccessSession是继承了StoreAccessBean
    这个类, 而且对于bean实现的函数,会自动用super来替代.


    7. 部署bean

    添加部署的一些配置

    /**
    * @ejb.bean name="StoreAccess"
    * jndi-name="StoreAccessBean"
    * type="Stateless"
    *
    *--
    * This is needed for JOnAS.
    * If you are not using JOnAS you can safely remove the tags below.
    * @jonas.bean ejb-name="StoreAccess"
    * jndi-name="StoreAccessBean"
    *
    *--
    * @ejb.dao class="edu.sjtu.eclipse.session.StoreAccessDAO"
    * impl-class="edu.sjtu.eclipse.dao.StoreAccessDAOImpl"
    *
    * @ejb.resource-ref res-ref-name="jdbc/DefaultDS" <-- 从这行开始添

    * res-type="javax.sql.Datasource" <-- 这样它会自动
    把这些配置
    * res-auth="Container" <-- 加到ejb-jar.x
    ml
    * <-- 和jboss.xml中

    * @jboss.resource-ref res-ref-name="jdbc/DefaultDS"
    * jndi-name="java:/DefaultDS"
    *
    **/

    然后再次generating ejb classes,然后就可以测试咯~~~, 呼..., 为了做个这东西还真
    不容易

    8. 测试

    右键点击MyStoreMgr,然后菜单lomboz j2ee->run server,启动服务器

    启动完毕后, 再右键点击MyStoreMgr, lomboz j2ee-> deploy module, 这样我们做的My
    StoreMgr就部署上去了

    然后新建一个lomboz j2ee test client, 用new向导

    在创建这个client向导的对话框中,填入:

    source folder: MyStore/src
    package: edu.sjtu.eclipse.client
    Name: SessionClient
    Ejb home: edu.sjtu.eclipse.session.StoreAccessHome
    ejb interface: edu.sjtu.eclipse.session.StoreAccess
    target server: jboss 3.2.x(jboss 4.0.0)

    打开SessionClient.java, 在测试函数testBean(),加入
    --------------
    System.out.println("Request from client : ");
    System.out.println("Reply from Server: Your userid is "
            + myBean.loginUser("ECLIPSE", "PASSWD"));
    


    --------------

    然后运行这个application,从console中看到:
    Request from client :
    Reply from Server: Your userid is null

    呵呵, 数据里面没有东西的,所以是null, 如果想加的话,看看jboss的说明
    我们用的是jboss里自带的那个Hypersonic SQL
    /////////////////////////////

    第2篇

    数据库的连接配置
    2009-06-12 14:29

    1.建立基本的JDBC连接

      JDBC(Java Database Connectivity)是Java应用程序与数据库的接口规范,旨在让各数据库开发商为Java程序员提供标准的数据库应用程序编程接口(API)。JDBC定义了一个跨数据库、跨平台的通用SQL数据库API。DM JDBC 3.0驱动程序符合SUN JDBC3.0标准,兼容DM JDBC 2.0。

      DM JDBC驱动程序是DM数据库的JDBC驱动程序,它是一个能够支持基本SQL功能的通用低层应用程序编程接口,支持一般的SQL数据库访问。

      要建立JDBC连接,首先要注册数据库驱动程序。可以通过调用java.sql.DriverManager类的registerDriver方法显式注册驱动程序,也可以通过加载数据库驱动程序类隐式注册驱动程序。

      // 显示注册
      DriverManager.registerDriver(new dm.jdbc.driver.dmDriver());
      // 隐式注册
      Class.forName(“dm.jdbc.driver.DmDriver”);

      隐式注册过程中加载实现了 java.sql.Driver的类,该类中有一静态执行的代码段,在类加载的过程中向驱动管理器DriverManager注册该类。而这段静态执行的代码段其实就是上述显式注册的代码。

      注册驱动程序之后,就可以调用驱动管理器的 getConnection方法来建立连接。建立数据库连接需要指定标示不同数据库的url、登录数据库所用的用户名user和密码password。

      通过DriverManager建立连接的具体过程,如以下示例:

        String driver= "dm.jdbc.driver.DmDriver";
        String url= "jdbc:dm://localhost:12345/dbname";
        String username="username";
        String password="password";
        Connection con = null;
        try {
            // 加载JDBC驱动程序
            Class.forName(driver);
        } catch (java.lang.ClassNotFoundException e) {
            e.printStackTrace();
        }

        try {
            // 数据库连接
            con = DriverManager.getConnection(url, username, password);
        } catch (SQLException ex) {
            ex.printStackTrace();
    }

      2.iBatis的连接设置

      持久层中间件iBatis连接数据库的方式有3种,连接数据库的方式是JDBC,可以通过在XML文件中配置数据库连接,也可以在properties文件中配置。下面列出transactionManager的type为JDBC的3种连接配置。

      dataSource的type为SIMPLE的连接配置

      以下是配置数据库连接参数的properties文件sql-map-config.properties的内容:

      SimpleDataSource properties
      Use only if useSimpleConfiguration=true

      DMDBMS
        SimpleDriver=dm.jdbc.driver.DmDriver
        SimpleUrl=jdbc:dm://localhost:12345/SYSTEM
        SimpleUsername=SYSDBA
    SimplePassword=SYSDBA

      以下是配置文件sql-map-config.xml的内容:

      <?xml version="1.0" encoding="UTF-8" standalone="no"?>
      <!DOCTYPE sqlMapConfig
        PUBLIC "-//iBATIS.com//DTD SQL Map Config 2.0//EN"
        "http://www.ibatis.com/dtd/sql-map-config-2.dtd">

      <sqlMapConfig>
        <properties resource="res/config/sql-map-config.properties" />
        <settings cacheModelsEnabled="true" enhancementEnabled="true"
            maxSessions="64" maxTransactions="20" maxRequests="128"
            useStatementNamespaces="true" />
        <transactionManager type="JDBC">
            <dataSource type="SIMPLE">
                <property value="${SimpleDriver}" name="JDBC.Driver" />
                <property value="${SimpleUrl}" name="JDBC.ConnectionURL" />
                <property value="${SimpleUsername}" name="JDBC.Username" />
                <property value="${SimplePassword}" name="JDBC.Password" />
                <property value="15" name="Pool.MaximumActiveConnections" />
                <property value="15" name="Pool.MaximumidleConnections" />
                <property value="1000" name="Pool.MaximumWait" />
            </dataSource>
        </transactionManager>
        <sqlMap resource="res/sqlmap/User.xml" />
        <sqlMap resource="res/sqlmap/Role.xml" />
        <sqlMap resource="res/sqlmap/Permit.xml" />
    </sqlMapConfig>

      说明:如果要优化数据库连接池,可以在sql-map-config.xml修改相关参数:

      Pool.MaximumActiveConnections 最大连接数
      Pool.MaximumidleConnections 允许的挂起(idle)连接数
      Pool.MaximumWait 最长等待的时间
    dataSource的type为DHCP的连接配置

    <transactionManager type="JDBC">
    <dataSource type="DBCP">
    <property name="JDBC.Driver" value="${driver}"/>
    <property name="JDBC.ConnectionURL" value="${url}"/>
    <property name="JDBC.Username" value="${username}"/>
    <property name="JDBC.Password" value="${password}"/>
    <!-- Optional properties below -->
    <property name="Pool.MaximumidleConnections" value="5"/>
    <property name="Pool.MaximumWait" value="60000"/>
    <!-- Use of the validation query can be problematic.
    If you have difficulty, try without it. -->
    <property name="Pool.ValidationQuery" value="select now"/>
    <property name="Pool.LogAbandoned" value="false"/>
    <property name="Pool.RemoveAbandoned" value="false"/>
    <property name="Pool.RemoveAbandonedTimeout" value="50000"/>
    </datasource>
    </transactionManager>

      说明:上面的${driver}等连接信息定义在另外一个properties文件或XML文件中,同dataSource的type为SIMPLE的连接配置。

      dataSource的type为JNDI的连接配置

      <transactionManager type="JDBC" >
       <dataSource type="JNDI">
       <property name="DataSource" value="java:comp/env/jdbc/jpetstore"/>
       </dataSource>
      </transactionManager>

      说明:前提是在应用服务器中配置了JNDI为jdbc/jpetstore的配置。

      3.Hibernate的连接设置

      持久层中间件Hibernate,连接数据库的方式是JDBC,通过配置文件hibernate.cfg.xml配置数据库连接设置。文件hibernate.cfg.xml的配置示例如下:

      <?xml version=’1.0’ encoding=’UTF-8’?>
      <!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

      <hibernate-configuration>
        <session-factory>
            <property   name="connection.driver_class">dm.jdbc.driver.DmDriver</property>
            <property   name="connection.url">jdbc:dm://localhost:12345/SYSTEM</property>
            <property name="connection.username">SYSDBA</property>
            <property name="connection.password">SYSDBA</property>
            <property name="jdbc.fetch_size">50</property>
            <property name="jdbc.batch_size">100</property>
            <property name="c3p0.min_size">5</property>
            <property name="c3p0.max_size">100</property>
            <property name="c3p0.timeout">600</property>
            <property name="c3p0.max_statements">50</property>
            <property name="hibernate.show_sql">true</property>
            <!-- 注意: DmDialect文件需要达梦另外提供,如有需要可以致电达梦客服 -->
      <property ="dialect">org.hibernate.dialect.DmDialect</property>
            <mapping resource="com/dm/vo/User.hbm.xml" />
       </session-factory>
    </hibernate-configuration>

      4.Tomcat下配置数据连接池

      Tomcat支持通过配置文件%TOMCAT_HOME%\conf\server.xml来配置数据库连接,在Tomcat中配置DM的连接,首先需要将DM的JDBC驱动程序DmJdbcDriver.jar复制到%TOMCAT_HOME%\common\lib目录下面;然后修改配置文件server.xml,在元素的最后一个子元素后添加以下子元素内容:

      <Context path="/yourApp" reloadable="true" docBase="D:\yourApp"
            workDir=" D:\yourApp \work">
           <Logger className="org.apache.catalina.logger.FileLogger"
                         prefix="yourApp_log." suffix=".txt" timestamp="true"/>
           <Resource name="jdbc/DMDB" auth="Container" type="javax.sql.DataSource"/>
           <ResourceParams name="jdbc/DMDB">
                  <parameter>
                         <name>factory</name>
                         <value>org.apache.commons.dbcp.BasicDataSourceFactory</value>
                  </parameter>
                  <parameter>
                         <name>maxActive</name>
                         <value>50</value>
                  </parameter>
                  <parameter>
                         <name>maxIdle</name>
                         <value>20</value>
                  </parameter>
                  <parameter>
                         <name>maxWait</name>
                         <value>500</value>
                  </parameter>
                  <parameter>
                         <name>username</name>
                         <value>SYSDBA</value>
                  </parameter>
                  <parameter>
                         <name>password</name>
                         <value>SYSDBA</value>
                  </parameter>
                  <parameter>
                         <name>driverClassName</name>
                         <value>dm.jdbc.driver.DmDriver</value>
                  </parameter>
                  <parameter>
                         <name>url</name>
                         <value>jdbc:dm://localhost:12345/SYSTEM</value>
                  </parameter>
           </ResourceParams>
    </Context>

      在Web应用中可以通过下面的代码来获取数据源和数据库连接

      javax.naming.InitialContext context = new javax.naming.InitialContext();
        DataSource ds = (DataSource) context.lookup( "java:/comp/env/jdbc/DMDB" );
        connection = (Connection)ds.getConnection();

      在使用Spring、Hibernate等技术的web应用中,可能只需要将java:/comp/env/jdbc/DMDB配置在配置文件中即可。

      5.JBoss下JNDI连接

      JBoss下配置JNDI需要修改几个配置文件,需要修改的配置文件如下:

      %JBOSS_HOME% \server\default\conf\standardjaws.xml
      %JBOSS_HOME %\server\default\conf\standardjbosscmp-jdbc.xml
      %JBOSS_HOME %\server\default\deploy\ejb-deployer.xml


      另外还要增加一个文件:%JBOSS_HOME %\server\default\deploy\DM-ds.xml

      首先需要将DM的JDBC驱动程序DmJdbcDriver.jar复制到 %JBOSS_HOME% \server\default\lib目录下面。

      修改%JBOSS_HOME% \server\default\conf\standardjaws.xml,将"java:/DefaultDS"改成"java:/ DMDS "。如下:<datasource>java:/DMDS</datasource>

      修改%JBOSS_HOME%\server\default\conf\standardjbosscmp-jdbc.xml,将"java:/DefaultDS"改成"java:/DM"。如下:<datasource>java:/DMDS</datasource>

      修改%JBOSS_HOME%\server\default\deploy\ejb-deployer.xml,将DefaultDS修改为DMDS。如下:

      <depends optional-attribute-name="DataSource">
        jboss.jca:service=DataSourceBinding,name= DMDS
    </depends>

      增加文件%JBOSS_HOME% \server\default\deploy\DM-ds.xml,内容如下:

      <?xml version="1.0" encoding="UTF-8"?>
      <datasources>
    <local-tx-datasource>
        <jndi-name>DMDS</jndi-name>
        <connection-url>jdbc:dm://localhost:12345/SYSTEM</connection-url>
        <driver-class>dm.jdbc.driver.DmDriver</driver-class>
        <user-name>SYSDBA</user-name>
        <password>SYSDBA</password>
        <exception-sorter-class-name>
            org.jboss.resource.adapter.jdbc.vendor.OracleExceptionSorter
        </exception-sorter-class-name>
        <metadata>
          <type-mapping>DM</type-mapping>
        </metadata>
    </local-tx-datasource>
    </datasources>

      6.Apusic下数据源的配置

      首先需要将DM的JDBC驱动程序DmJdbcDriver.jar复制到% APUSIC_HOME % \lib目录下面。

      修改% APUSIC _HOME%\config\datasources.xml,将内容修改为:

      <datasources>
    <datasource name="DMDS"
         jndi-name="jdbc/DMDS"
         driver-class="dm.jdbc.driver.DmDriver"
         url="jdbc:dm://localhost:12345/SYSTEM" >
        <property name="user" value="SYSDBA"/>
        <property name="password" value="SYSDBA"/>
        <property name="test-before-reused" value="true"/>
        <property name="test-command" value="select now"/>
    </datasource>
      </datasources>

      总结

      以上列出了在常见的web应用服务器和数据库中间件中,通过JDBC连接达梦数据库的例子。更详细的连接方式见web应用服务器和数据库中间件的文档。

  • 相关阅读:
    项目成本管理控制成本
    项目成本管理制定预算
    完工尚需绩效指数 TCPI
    第八章 项目质量管理
    第七章:项目成本管理
    项目时间管理制定进度计划
    PV EV AC BAC EAC ETC等计算公式
    项目时间管理控制进度
    淘小宝相册图片批量下载工具
    WebBrowser.Navigate异步运行,使其与其他进程同步的方法
  • 原文地址:https://www.cnblogs.com/wangs/p/1852301.html
Copyright © 2011-2022 走看看