??????????????????????????????????????????????? 控制器組件 -- 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 多力宇揚 閱讀(965) | 評論 (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 多力宇揚 閱讀(303) | 評論 (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 多力宇揚 閱讀(917) | 評論 (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 多力宇揚 閱讀(610) | 評論 (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 多力宇揚 閱讀(555) | 評論 (0)編輯 收藏

          僅列出標題
          共5頁: 上一頁 1 2 3 4 5 下一頁 
          主站蜘蛛池模板: 利辛县| 海兴县| 石渠县| 仙游县| 盐源县| 邢台县| 澄江县| 宣化县| 东莞市| 乐山市| 称多县| 蓬安县| 江门市| 东光县| 碌曲县| 米脂县| 甘谷县| 宜兰市| 新巴尔虎右旗| 华蓥市| 济阳县| 闸北区| 尚志市| 八宿县| 台山市| 望奎县| 山东| 巫溪县| 泰州市| 龙门县| 方山县| 深圳市| 桦甸市| 桂平市| 岳西县| 宁远县| 和静县| 永修县| 玉溪市| 吴川市| 阳山县|