控制器组件 -- ActionServlet

我们知道 Struts 的入口是 ActionServlet. org.apache.struts.ActionServlet 类在 Struts 应用程序中负责拦截工作。所有来自客户层的请求,在交给应用程序处理之前,都会先经过 ActionServlet ActionServlet 的一个实例接受到一个 HttpRequest 对象时,无论这是通过 doGet() 方法还是 doPost() 方法受到的 , 都会调用 process() 方法来处理该请求。 ActionServlet process() 方法如下所示 :

Protected void process(HttpServletRequest request,HttpServletResponse response) throws IOException,ServletExcepion

{

RequestUtils.selectModule(request,getServletContext());

getRequestProcessor(getModuleConfig(request)).process(request,response);

}

尽管 process() 方法看起来并不复杂,但是它调用的方法却很复杂。首先,它会调用 org.apache.struts.util.RequestUtils 类的静态方法 selectModule(), 并把当前的请求和这个 Web 应用程序的 ServletContext 都传入该方法。 selectModule() 方法的工作是将 request.getServletContext() 返回的路径与每个配置应用模块的前缀相匹配,从而选出处理当前请求的应用模块。

: 如果你只用到了一个 Struts 配置文件 , 那么你就只会有一个应用程序,也就是默认的应用程序。为了让默认的应用程序和应用模块能够简单而一致的处理请求,默认应用程序可视为一个应用模块。因此 , 任何请求只要不含应用程序的后缀 (suffix), 都会被传送给默认的应用程序 , 由其处理。

扩展 ActionServlet

尽管 Struts 框架仍然允许你扩展 ActionServlet 类,但是这么做的好处已大不入前,因为它的大部分功能都已经放到新的 RequestProcessor 类里了。如果你仍然想扩展自己的 ActionSerlvet 类,那么只要创建一个扩展了 ActionServlet 的类并配置 Struts 框架让它使用你的类就可以了。看以下一个覆盖了 init() 方法的类。

 

Package dory.doo.framework;

import javax.servlet.ServeltException;

import javax.sertlvet.UnaviableException;

import org.apache.struts.action.ActionServlet;

import dory.doo.strutus.service.IStorefrontService;

import dory.doo.strutus.service.StorefrontServiceImpl;

import dory.doo.strutus.framework.util.IConstants;

import dory.doo.strutus.framework.exceptions.DatastoreException;

/**

* 扩展了 Struts ActionServlet, 以此来完成你自己特殊的初始化工作

*/

public class ExtendedActionServlet extends ActionServlet

 {

   public void init() throws ServletException

{

  // 确定你先调用了超类

  super.init();

  // 初始化持久存储服务

  try

   {

     // 创建服务接口的一个实例

     IStorefrontService serviceImpl=new StorefrontServiceImpl();

     // 把服务对象存储到应用作用域类

     getServletContext().setAttribute(IConstants.SERVICE_INTERPACE_KEY,serviceImpl);

   }

  catch(DatastoreException ex)

   {

     // 如果服务对象的初始化工作出了问题,就关闭 web 应用程序

     ex.printStackTrace();

     throw new UnavailableException(ex.getMessage());

   }

    }

 }

覆盖 init() 方法只是一个例子 , 你可以覆盖任何你想覆盖的方法 , 如果真的需要覆盖 init() 方法 , 请确定你先调用了 super.init() 方法 , 这样才会完成默认的初始化工作。

要使用自己的 ActionServlet 子类,那么必须将 web.xml 修改如下 :

 <servlet>

   <servlet-name>MyActionServlet</servlt-name>

   <servlet-class>dory.doo.framework. ExtendedActionServlet</servlet-class>

 </servlet>

Struts 初始化过程

web.xml 文件中配置的初始化参数而定, servlet 容器首次启动时 , 或者第一个对比 servlet 的请求来到时 ,servlet 容器就会加载 Stuts ActionServlet. 无论是哪种情况 ( 也不管是什么样的 Java Servlet) ,都一定要保证 inint() 得到调用,而且必须在 servlet 处理任何请求之前完成。 Struts 框架在 init() 被调用时 , 会做好所有的初始化工作。看看如下就知道了它到底干了些什么 :

1.       Struts 框架内部的消息资源包进行初始化。这些消息资源包是用来向日志文件传输信息性,警示和错误消息的 . org.apache.struts.action.ActionResources 资源包 ( /org/acache/struts/action/ActionResources.properties 文件 ) 则用来取得这些内部消息。

2.       web.xml 文件加载控制 ActionServlet 类各项行为的初始化参数。这些参数包括 config,debug,detail 以及 convertNull

3.       web.xml 文件加载 servlet 名和 servlet 映射信息,并进行初始化。这些值可供整个 Struts 框架使用 ( 几乎都是给 JSP 标记库使用 ), 以便在 HTML 表单提交时,输出正确的 URL 目标。在此初始化期间, Struts 框架给所有使用 DTD 也会得到注册。 DTD 接下来可以用于严正配置文件。

4.       加载默认应用程序的 Struts 配置数据,并进行初始化,这些配置数据由 config 初始化参数来指定。默认的 Struts 配置文件得到解析后,会创建一个 ApplicationConfig 对象,并存储在 ServletContext 对象中。默认应用程序的 ApplicationConfig 对象会以 org.apache.struts.action.APPLICATION 这个键值存储在 ServeltContext 对象中。

5.       Struts 配置文件中为默认应用程序指定的每个消息资源都会被加载,初始化,并存储在 ServletContext 对象中适当位置 ( 依每个 message-resources 元素中指定的 key 属性而定 ) 。如果没有指定 key 属性,那么相应的消息资源会键值 org.apache.struts.action.MESSAGE 来存储。只有一个消息资源可作为默认消息资源存储,因为每个键都必须是唯一的。

6.       Struts 配置文件中所声明的每个数据源都被会被加载并初始化。如果没有指定任何 data-sources 元素,则会跳过这个步骤。

7.       Struts 配置文件中所指定的每个 plug-in( 插件 ) 元素都会被加载和初始化。对于每个 plug-in 元素所指定的类,其 itit() 方法都将被调用。

8.       一旦默认应用程序正确地完成了初始化之后, servlet init() 方法会确定是否指定了任何其他的应用模块,如果有的话,对于每个应用模块都要重复步骤 4-7

: 为了达到更好的性能,你可能会尝试为一个应用程序建立多个 Struts 控制器 servlet 。这么做几乎得不到更好的性能或扩展性, Struts 设计者也不认为这是一个好注意。 Servlet 是多线程的,因此可以让多个客户同时执行。一个 servlet 就能同时为多个客户提供服务。

 

posted @ 2006-06-30 10:14 多力宇扬 阅读(958) | 评论 (0)编辑 收藏

在web应用中实施过滤是我们常用的技术,通过过滤,可以对请求进行统一编码,对请求进行认证等.每个Fillter可能只担任很少的任务,多个Filter可以互相协作,通过这种协作,可以完成一个复杂的功能.

Fileter
声明: public interface Filter
它是Filter必须实现的接口,它包含一下的方法
. init(FilterConfig config): 这个方法初始化Filter.
. doFilter(ServletRequest request,ServletResponse,FilterChain chain): Filter的业务方法就在这里实现.
. destory(): 释放Filter占用的资源.

FilterChain
声明: public interface FilterChain
它是代码的过滤链,通过这个接口把过滤的任务在不同的Filter之间转移.它包含一个方法:
doFilter(ServletRequest,request,ServletResponse response)
通过这个方法来调用下一下Filter,如果没有吓一个Filter,那么将调用目标资源.

FilterConfig
声明: public interface FilterConfig
代表了Filter的配置,和Servlet一样,Servlet也有一些配置信息,比如名字和初始化参数等.
它包含以下的方法.
.getFilterName(): 返回Filter的名字.
.getInitParameter(String name): 获得名称为name的初始化参数
.getServletContext(): 返回这个Filter所在Servlet上下文对象.
.getInitParameterNames(): 获得Filter配置中的所有初始化参数的名字.

过滤器主要对客户端的请求和客户端的响应进行统一处理.最常见的web过滤器有权限认证过滤器,字符编码过滤器,图象处理过滤器等.

字符编码过滤器(EncodingFillter.java)
package dorydoo.util;

import javax.servlet.FilterChain;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.ServletException;
import javax.servlet.FilterConfig;
/**
 *
 * @author Dory Doo
 */
public class EncodingFillter implements Filter
{
    protected FilterConfig filterConfig;
    private String targetEncoding="gb2312";
    /**
     *初始化过滤器像一般的Servlet一样,它也可以获得初始化参数
    */
    public void init(FilterConfig config)throws ServletException
    {
        this.filterConfig=config;
        this.targetEncoding=config.getInitParameter("encoding");
    }
    /**
     *进行过滤处理,最最要的地方就是这里了
    */
    public void doFilter(ServletRequest srequest,ServletResponse sresponse,FilterChain chain)
    throws IOException,ServletException
    {
        System.out.println("使用以下方法进行编码:encoding="+targetEncoding);
       
        HttpServletRequest request=(HttpServletRequest)srequest;
        request.setCharacterEncoding(targetEncoding);
        //把处理权发送到下一个
        chain.doFilter(srequest,sresponse);
    }
   
    public void setFilterConfig(final FilterConfig filterConfig)
    {
        this.filterConfig=filterConfig;
    }
    //销毁过滤器
    public void destroy()
    {
        this.filterConfig=null;
    }
}
然后在web.xml中配置我们的应用.
 <web-app>
      .................
        <!--Filter Config-->
       <filter>
            <filter-name>cncoding</filter-name>
            <filter-class>dorydoo.util.EncodingFilter</filter-class>
            <init-param>
                <param-name>encoding</param-name>
                <param-value>gb2312</param-value>
            </init-param>
        </filter>  
        <filter-mapping>
            <filter-name>encoding</filter-name>
            <servlet-name>action</servlet-name>
        </filter-mapping> 
        <filter-mapping>
            <filter-name>encoding</filter-name>
            <url-pattern>/*</url-pattern>
        </filter-mapping>
      ........
 </web-app>


在来看一用户认证的过滤器(SignonFilter)
package dorydoo.util;

import javax.servlet.FilterChain;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.ServletException;
import javax.servlet.FilterConfig;
import javax.servlet.http.HttpSession;
/**
 *
 * @author DuYang
 */
public class SignonFilter implements Filter
{
    protected FilterConfig filterConfig;
    String LOGIN_PAGE="login.jsp";
    /**
     *初始化过滤器像一般的Servlet一样,它也可以获得初始化参数
    */
    public void init(FilterConfig config)throws ServletException
    {
        this.filterConfig=config;
    }
    /**
     *进行过滤处理,最最要的地方就是这里了
    */
    public void doFilter(final ServletRequest req,final ServletResponse res,FilterChain chain)
    throws IOException,ServletException
    {    
        HttpServletRequest hreq=(HttpServletRequest)req;
        HttpServletResponse hres=(HttpServletResponse)res;
        HttpSession session=hreq.getSession();
        String isLogin="";
        try
        {
            isLogin=(String)session.getAttribute("isLogin");
            if(isLogin.equals("true"))
            {
                System.out.println("在SignonFilter中验证通过");
                //验证通过继续处理
                chain.doFilter(req,res);
            }
            else
            {
                //验证不成功重新登录
                hres.sendRedirect(LOGIN_PAGE);
                System.out.println("被SignonFilter拦截一个为认证的请求");
            }
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }
    }
   
    public void setFilterConfig(final FilterConfig filterConfig)
    {
        this.filterConfig=filterConfig;
    }
    //销毁过滤器
    public void destroy()
    {
        this.filterConfig=null;
    }
}
在SignonFilter的doFilter()方法中,首先通过isLogin=(String)session.getAttribute("isLogin");判断是否登录用户,如果不是则返回到login页面.配置web.xml文件就和上面的基本上没什么差别.

posted @ 2006-06-29 11:23 多力宇扬 阅读(290) | 评论 (0)编辑 收藏

因为自己获得过别人的帮助,所以把自己的资源拿出来帮助别人,如果你需要这些资源,请留下email,我会在晚上一起发送给大家,这次分享的资源目录如下:(里面的都是我测试好了,都已经下载到我的本地机器上了的,所以大家放心,可能有的比较慢,还有大家需要自己去寻找最好的下载时间,因为我在下载张孝详老师的讲座的时候有的课程就比较慢有的就很快130KB/s),如果需要就赶紧吧,因为有的服务器不大稳定.
contents:
(1) MySQL数据库教程光盘
(2) LINUX视屏教程
(3).面向对象程序设计
(4).张孝详JavaScript视频讲座
(5).动态网页设计(ASP+JSP+PHP)
(6).JSP程序设计
(7).Eclipse基础教程
(8).HTML语言速成
(9).HTML协议教程
(9).xml_asp_学习光盘
(10)JAVA程序设计计算
(11)WEB应用系统设计[32讲]

暂时就分享到这里吧,以后有空了在和大家分享,有问题请博客留言或者mail To me ^_^!大多数我在下载的时候速度都达到了130KB/s,只有少数几个课程比较慢一点!例外我只能以邮件附件的形式发送给大家,请大家放心绝对安全,呵呵!

posted @ 2006-06-28 10:52 多力宇扬 阅读(860) | 评论 (10)编辑 收藏

  Tomcat从5.x开始就可以在server.xml里配置数据源,后来用到了Proxool对比了一下觉得Proxool更方便更好用,它提供了更多的方法,简单,推荐大家使用.
  下载地址:http://proxool.sourceforge.net/ 最新版本为: Proxool 0.9.0RC2
  下载后解压缩Proxool 0.9.0RC2后,把Proxool 0.9.0RC2/lib下的.jar文件部署到WEB-INF/lib下.
  看看下面的范例(example for Oracle):
  Proxool.jsp

<%@ page import="java.sql.*"%>
<%@ page contentType="text/html;charset=gb2312"%>

<html>
    <head>
        <title>Proxool.jsp</title>
    </head>
    <body>
        <h2>使用Proxool.jsp</h2>
        <%
           Connection con=null;
           Statement stmt=null;
           ResultSet rs=null;
           
           String ename="";
           
           try
           {
             Class.forName("org.logicalcobwebs.proxool.ProxoolDriver");
             con=DriverManager.getConnection("proxool.JSPBook:oracle.jdbc.driver.OracleDriver:
                       jdbc:oracle:thin:@yang:1521:orcl","scott","ss");             
             stmt=con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,
                                      ResultSet.CONCUR_UPDATABLE);
             String query="select * from emp";
             rs=stmt.executeQuery(query);
             while(rs.next())
             {
               ename=rs.getString("ename");
      %>
        从emp表中取出姓名<%=ename%><br>
      <%
             }
             stmt.close();
             con.close();
           }
           catch(SQLException e)
           {
             out.println("发生异常"+e);
           }
           finally
           {
             try
             {
               if(con!=null)
               {
                 con.close();
               }
             }
             catch(SQLException ne)
             {
               out.println("SQLException:"+ne);
             }
           }
        %>
    </bdoy>
</html>
Proxool.jsp通过Proxool连接池取得Connection,然后显示emp表格中的ename.
首先动态加载Proxool的driver:
  Class.forName("org.logicalcobwebs.proxool.ProxoolDriver);
然后将Proxool URL分为三个部分: 连接池的别名,JDBC驱动程序(DataBase JDBC Drivers),连接URL.

设定Proxool
proxool提供了许多连接池的参数,例如:连接池最多有几个Connection,最少有几个Connection,Connection生命期限等等。
Proxool主要有以下四种设定方式:
(一) 通过java.util.Properties对象来设定,例如:
Properties info=new Properties();
info.setProperty("proxool.maximum-connection-count","20");
info.setProperty("proxool.house-keeping-test-sql","select CURRENT_DATE");
info.setProperty("user","your DB username");
info.setProperty("password","your DB prassword");
String alias="Develop"; //Proxool连接池的别名,根据自己喜好随便写^_^
String driverClass="oracle.jdbc.driver.OracleDriver";
String driverUrl="jdbc:oracle:thin:@127.0.0.1:1521:DatabaseName";
String url="proxool."+alias+":"+drvierClass+":"+driverUrl;
connection=DrvierManager.getConnection(rul,info);

(二) 通过XML文件来设定,例如:
<?xml version="1.0" encoding="ISO-8859-1"?>
<!--the proxool configuration can be embedded within your own application's. Anything outside the "proxool" tag is ignored.-->
<proxool>
  <alias>Develop</alias>
  <driver-url>
    jdbc:oracle:thin:@127.0.0.1:1521:DatabaseName
  </driver-url>
  <driver-class>oracle.jdbc.driver.OracleDriver</driver-class>
  <driver-properties>
    <property name="user" value="your database name"/>
    <property name="password" value="your DB password"/>
  </driver-properties>
  <maximum-connection-count>10</maximum-connection-count>
  <house-keeping-test-sql>select CURRENT_DATE</house-keeping-test-sql>
</proxool>
然后通过JAXPConfiguration读取XML文件:
JAXPConfigurator.configure("/WEB-INF/classes/proxool.xml",false);

(三) 先通过Properties文件来设定,例如:
jdbc-0.proxool.alias=Develop
jdbc-0.proxool.drvier-url=jdbc:oracle:thin:@127.0.0.1:1521:DatabaseName
jdbc-0.proxool.driver-class=oracle.jdbc.driver.OracleDriver;
jdbc-0.user=your database username
jdbc-0.password=your database password
jdbc-0.proxool.maximum-connection-count=10
jdbc-0.proxool.house-keeping-test-sql=select CURRENT_DATE
然后通过PropertyConfigurator读取Properties文件:
PropertyConfigurator.configure("/WEB-INF/classes/Proxool.properties");

(四)在web.xml中,通过servlet来设定.方法又有三种,前两种是按照格式来的:
1.XML文件
<servlet>
  <servlet-name>ServletConfigurator</servlet-name>
  <servlet-class>
     org.logicalcobwebs.proxool.configuration.ServletConfigurator
  </servlet-class>
  <init-param>
     <param-name>xmlFile</param-name>
     <param-value>WEB-INF/classes/Proxool.xml</param-value>
  </init-param>
  <load-on-start>1</load-on-start>
</servlet>

2.Properties文件
<servlet>
  <servlet-name>ServletConfigurator</servlet-name>
  <servlet-class>
     org.logicalcobwebs.proxool.configuration.ServletConfigurator
  </servlet-class>
  <init-param>
     <param-name>propertyFile</param-name>
     <param-value>WEB-INF/classes/Proxool.properties</param-value>
  </init-param>
  <load-on-start>1</load-on-start>
</servlet>

3.Init Prameter
<servlet>
  <servlet-name>ServletConfigurator</servlet-name>
  <servlet-class>
     org.logicalcobwebs.proxool.configuration.ServletConfigurator
  </servlet-class>
  <init-param>
     <init-name>jdbc-0.proxool.alias</init-param>
     <init-value>Develop</init-value>
  </init-param>
  <init-param>
     <init-name>jdbc-0.proxool.driver-rul</init-param>
     <init-value>
        jdbc:oracle:thin:@127.0.0.1:1521:DatabaseName
     </init-value>
  </init-param>
  <init-param>
     <init-name>jdbc-0.proxool.driver-class</init-param>
     <init-value>oracle.jdbc.driver.OracleDriver</init-value>
  <init-param>
</servlet>

建议大家使用第四种方法,好处在于当Container启动时,Proxool的参数会自动设定加载到内存中,原因在于:
<servlet>
......略
<load-on-start>1</load-on-start>

一个完整的示例如下:
web.xml
<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
         version="2.4">
.......略
  <servlet>
     <servlet-name>ServletConfigurator</servlet-name>
     <servlet-class>
       org.logicalcobwebs.proxool.configuration.ServletConfigurator
     </servlet-class>
     <init-param>
       <param-name>propertyFile</param-name>
       <param-value>WEB-INF/classes/Proxool.properties</param-value>
     </init-param>
     <load-on-start>1</load-on-start>
  </servlet>
.......略
</web-app>

Proxool.proterties
jdbc-0.proxool.alias=Develop
jdbc-0.proxool.driver-class=oracle.jdbc.driver.OracleDriver
jdbc-0.proxool.driver.url=jdbc:oracle:thin:@127.0.0.1:1521:DatabaseName
jdbc-0.proxool.maximum-connection-count=10
jdbc-0.proxool.prototype-count=4
jdbc-0.proxool.house-keeping-test-sql=select CURRENT_DATE
jdbc=0.proxool.verbose=true

我们可以用下面的Test Page来进行测试
Proxool-config.jsp
____________________________________________________
<%@ page import="java.sql.*"%>
<%@ page contentType="text/html;charset=gb2312"%>

<html>
    <head>
        <title>Proxool.jsp</title>
    </head>
    <body>
        <h2>使用Proxool.jsp</h2>
        <%
           Connection con=null;
           Statement stmt=null;
           ResultSet rs=null;
           
           String ename="";
           
           try
           {
             con=DriverManager.getConnection("proxool.Develop");             
             stmt=con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,
                                      ResultSet.CONCUR_UPDATABLE);
             String query="select * from emp";
             rs=stmt.executeQuery(query);
             while(rs.next())
             {
               ename=rs.getString("ename");
      %>
        从emp表中取出姓名<%=ename%><br>
      <%
             }
             stmt.close();
             con.close();
           }
           catch(SQLException e)
           {
             out.println("发生异常"+e);
           }
           finally
           {
             try
             {
               if(con!=null)
               {
                 con.close();
               }
             }
             catch(SQLException ne)
             {
               out.println("SQLException:"+ne);
             }
           }
        %>
    </bdoy>
</html>
测试结果为:
=====================================
使用Proxool.jsp
从emp表中取出姓名SMITH
从emp表中取出姓名ALLEN
从emp表中取出姓名WARD
从emp表中取出姓名JONES
从emp表中取出姓名MARTIN
从emp表中取出姓名BLAKE
从emp表中取出姓名CLARK
从emp表中取出姓名SCOTT
从emp表中取出姓名KING
从emp表中取出姓名TURNER
从emp表中取出姓名ADAMS
从emp表中取出姓名JAMES
从emp表中取出姓名FORD
从emp表中取出姓名MILLER
从emp表中取出姓名feiyang
从emp表中取出姓名yang
从emp表中取出姓名feifei
从emp表中取出姓名fei

posted @ 2006-06-28 09:51 多力宇扬 阅读(598) | 评论 (0)编辑 收藏

Tomcat下JNDI的配置

    JNDI全名为Java Naming and Directory Interface.JNDI主要提供应用程序所需要资源上命名与目录服务.在Java EE环境中,JNDI扮演了一个很重要的角色,
它提供了一个接口让用户在不知道资源所在位置的情形下,取得该资源服务.
    就好比网络磁盘驱动器的功能一样。如果有人事先将另一台机器上的磁盘驱动器接到用户的机器上,用户在使用的时候根本就分辨不出现在的驱动器是存在本端,
还是在另一端的机器上,用户只需取得资源来用,根本就不知道资源在什么地方。
    JNDI这个接口基本上是LDAP,LDAP全名为Lightweight Directory Access Protocol.
    
    要设定JNDI的JDBC数据源和DBCP连接池需要做以下的工作:(for example Oracle DataBase)

    一. 安装JDBC Driver
    将你DB的JDBC Driver部署到{Tomcat_Install]\common\lib目录下。
    二. 设定Tomcat下的server.xml
    修改{Tomcat_Install|\conf\server.xml文件中你的站台标签里的<Host></Host>之间的内容.如下:
    server.xml
     <Host>
        <Context path="/Develop" docBase="Develop" debug="0" reloadable="true"               crossContext="true">
        <Resource name="jdbc/dy" auth="Container" type="javax.sql.DataSource"/>
            <ResourceParams name="jdbc/dy">
               <parameter>
                  <name>factory</name>
                  <value>org.apache.commons.dbcp.BasicDataSourceFactory</value>
               </parameter>
               <parameter>
                  <name>driverClassName</name>
                  <value>oracle.jdbc.driver.OracleDriver</value>
               </parameter>
               <parameter>
                  <name>url</name>
                  <value>jdbc:oracle:thin:@yang:1521:orcl</value>
               </parameter>               
               <parameter>
                  <name>username</name>
                  <value>scott</value>
               </parameter>
               <parameter>
                  <name>password</name>
                  <value>ss</value>
               </parameter>
               <parameter>
                  <name>maxActive</name>
                  <value>20</value>
               </parameter>
               <parameter>
                  <name>maxIdle</name>
                  <value>10</value>
               </parameter>
               <parameter>
                  <name>maxWait</name>
                  <value>-1</value>
               </parameter>                                                                 
            </ResourceParams>
        </Context>
      </Host>
  上述社定所表示的意思是在Develop站台中,定义一个JDBC数据来源,名称为jdbc/dy.
  通过以下的代码来设置的这个jdbc/dy的数据来源和DBCP连接池:
  <parameter>
     <name>factory</name>
     <value>org.apache.commons.dbcp.BasicDataSourceFactory</value>
  </parameter>
  设定使用DBCP连接池,这是有Jakarta Project组织所制定的连接池程序,它一样是OpenSource的.
参数说明:
     <Context></Context>用于设置你的站台.
     <Context>标签中的path="/Develop"代表网站名称,即: http://IP_DomaninName/Develop; docBase="Develop"代表站台的目录位置,debug则是设定debug level
     ,0表示提供最少的信息,9表示提供最都多的信息;reloadable则表示Tomcat执行时,当class,web.xml被更新时,都会自动重新加载,不需要重新启动Tomcat;
     maxActive表示连接池的最大数据库连接数;设为0表示无限制;maxIdle表示设定连接池中最小能有几个Connection,若为0表示不限制;maxWait 最大建立连接等待时间。
    如果超过此时间将接到异常,设为-1表示无限制,单位为ms;driverClassName JDBC驱动程序;url表示数据库连接字符串.

 三. 设定应用站台中的web.xml
 eg:设定Develop的web.xml如下:
  <resource-ref>
     <description>JNDI JDBC DataSource of Develop</description>   //一个描述
     <res-ref-name>jdbc/dy</res-ref-name>                        //这里必须为你之前指定的<ResourceParams name="jdbc/dy">
     <res-type>javax.sql.DataSource</res-type>
     <res-auth>Container</res-auth>
  </resource-ref>

 四. 使用JDBC数据来源获得Connection对象
   Context initContext=new InitialContext();
   Context envContext=(Context)initContext.lookup("java:/comp/env");
   或者
   Context envContext=(Context)initContext.lookup("java:comp/env");
   DataSourceds conn=(DataSource)envContext.lookup("jdbc/dy");
   conn=ds.getConnection();

按照这四个步骤做下来后,那么你就可以写个Test Page来测试一下了.
Test Page1:
_________________________________________________________________________________________________________
testpool.jsp
<!--测试JNID数据源的配置-->
<%@ page contentType="text/html;charset=gb2312"%>
<%@ page import="javax.naming.Context"%>
<%@ page import="javax.sql.DataSource"%>
<%@ page import="javax.naming.InitialContext"%>
<%@ page import="java.sql.*"%>
<%
  DataSource ds=null;
  try
  {
      Context initCtx=new InitialContext();
      Context envCtx=(Context)initCtx.lookup("java:comp/env");
      //从Context中loopup 数据源
      ds=(DataSource)envCtx.lookup("jdbc/dy");
      if(ds!=null)
      {
        out.println("已经获得DataSource!");
        out.println("<br>");
        Connection conn=ds.getConnection();
        Statement stmt=conn.createStatement();
        ResultSet rst=stmt.executeQuery("select * from emp");
        out.println("以下是从数据库里读出来的数据");
        out.println("<hr>");
        while(rst.next())
        {
          out.println("empName:"+rst.getString("ename"));
          out.println("<br>");
        }
      }
    else
        out.println("连接失败");
  }
  catch(Exception e)
  {
      out.println(e);
  }
%>
如果成功那么输出结果:
========================================
已经获得DataSource!
以下是从数据库里读出来的数据:
empName:SMITH
empName:ALLEN
empName:WARD
empName:JONES
empName:MARTIN
empName:BLAKE
empName:CLARK
empName:SCOTT
empName:KING
empName:TURNER
empName:ADAMS
empName:JAMES
empName:FORD
empName:MILLER
empName:feiyang
empName:yang
empName:feifei
empName:fei

posted @ 2006-06-28 09:48 多力宇扬 阅读(544) | 评论 (0)编辑 收藏

仅列出标题
共5页: 上一页 1 2 3 4 5 下一页