.2008-12-15 新增Apache Commons DBCP範例
大約六、七年前剛開始初學Web Application的時候~ 那時常聽到的是Tomcat、Resin~ 至於Jetty... 嗯~ 我聞不見其名...XD
Jetty.是一個100%以Java撰寫而成並開放源碼的HTTP Server & Servlet Container~ 從三年前的「Jetty vs. Tomcat vs. Resin: A Performance Comparison」這篇文章來看~ 它的效率似乎表現不錯~ 好了~ 回歸重點~ 為什麼我對它燃起了興趣?... 二個原因,其一,到目前Hadoop 0.19.0版所內建的Servlet Container就是採用Jetty 5.1.4~ 不過根據「(#HADOOP-1650) Upgrade Jetty to 6.x - ASF JIRA」這個issue來看~ 0.20版就會變成Jetty 6.x版了~
另一個原因,由於今年年初有協助老師將一個「English Collocations」的雛型系統改寫成Web版~ 而這樣的系統其實只需要「唯讀」資料庫的內容即可~ 想將整個這樣的系統都做成「DVD-ROM」版本~ 這樣就變成可以帶著跑的Web Application了~ 方便性大大的提高~ 所以Jetty相當適合這樣的應用!!
下面簡單地記錄一下一些常用的設定及步驟:
啟動Jetty Sever
java -jar start.jar etc/jetty.xml
手動增加一個新的Web Application (含VirualHost設定)
請修改「/etc/jetty.xml」。
<New class="org.mortbay.jetty.webapp.WebAppContext"> <Arg><Ref id="Contexts"/></Arg> <Arg><SystemProperty name="jetty.home"/>/webapps/webapp</Arg> <Arg>/webapp</Arg> <Set name="defaultsDescriptor"><SystemProperty name="jetty.home" default="."/>/etc/webdefault.xml</Set> <Set name="VirtualHosts"> <Array type="java.lang.String"> <Item>localhost</Item> </Array> </Set> </New>
測試Servlet - Hello World
import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class Test extends HttpServlet { public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { res.setContentType("text/html"); PrintWriter out = res.getWriter(); out.println("<html>"); out.println("<head><title>Hello</title></head>"); out.println("<body>"); out.println("HIHI"); out.println("</body>"); out.println("</html>"); } }
修改「web.xml」
<servlet> <servlet-name>Hello</servlet-name> <servlet-class>Test</servlet-class> </servlet> <servlet-mapping> <servlet-name>Hello</servlet-name> <url-pattern>/Hello.do</url-pattern> </servlet-mapping>
最後開啟「http://localhost:8080/webapp/Hello.do」即可。
PostgreSQL - ConnectionPoolDataSource
請修改「/etc/jetty.xml」。
<New id="DSTest" class="org.mortbay.jetty.plus.naming.Resource"> <Arg>jdbc/DSTest</Arg> <Arg> <New class="org.postgresql.ds.PGConnectionPoolDataSource"> <Set name="User">postgres</Set> <Set name="Password">xxx</Set> <Set name="DatabaseName">test</Set> <Set name="ServerName">localhost</Set> <Set name="PortNumber">5432</Set> </New> </Arg> </New>
修改「web.xml」。
<resource-ref> <description>My DataSource Reference</description> <res-ref-name>jdbc/DSTest</res-ref-name> <res-type>javax.sql.DataSource</res-type> <res-auth>Container</res-auth> </resource-ref>
一個簡單的測試程式如下:
import java.io.*; import java.sql.*; import javax.sql.*; import javax.naming.*; import javax.servlet.*; import javax.servlet.http.*; public class PostgresDBTest extends HttpServlet { public void doGet (HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { res.setContentType("text/html"); PrintWriter out = res.getWriter(); Connection con = null; Statement stmt = null; ResultSet rs = null; try { ConnectionPoolDataSource source = (ConnectionPoolDataSource)new InitialContext().lookup("jdbc/DSTest"); con = source.getPooledConnection().getConnection(); stmt = con.createStatement(); rs = stmt.executeQuery("select * from test"); while(rs.next()) { out.println("Title:"+rs.getString(1)+"<br/>"); } } catch(Exception e){ e.printStackTrace(); } finally { if(con != null) { try { con.close(); }catch(SQLException e) { e.printStackTrace(); } } } } }
修改「web.xml」。
<servlet> <servlet-name>PostgresDBTest</servlet-name> <servlet-class>PostgresDBTest</servlet-class> </servlet> <servlet-mapping> <servlet-name>PostgresDBTest</servlet-name> <url-pattern>/PostgresDBTest.do</url-pattern> </servlet-mapping>
最後開啟「http://localhost:8080/webapp/PostgresDBTest.do」即可。
Apache Commons DBCP - PostgreSQL
下載下述這三個Library,並複製到「Jetty_Home/lib」底下。
請修改「/etc/jetty.xml」。
<New id="pgsqldbcp" class="org.mortbay.jetty.plus.naming.Resource"> <Arg>jdbc/Blog</Arg> <Arg> <New class="org.apache.commons.dbcp.BasicDataSource"> <Set name="driverClassName">org.postgresql.Driver</Set> <Set name="url">jdbc:postgresql://localhost/Blog</Set> <Set name="username">postgres</Set> <Set name="password">1234</Set> <Set name="maxActive">10</Set> </New> </Arg> </New>
修改「web.xml」。
<resource-ref> <description>My DataSource Reference</description> <res-ref-name>jdbc/DSTest</res-ref-name> <res-type>javax.sql.DataSource</res-type> <res-auth>Container</res-auth> </resource-ref>
測試程式如下:
import java.io.*; import java.sql.*; import javax.sql.*; import javax.naming.*; import javax.servlet.*; import javax.servlet.http.*; public class PostgresDBTest extends HttpServlet { public void doGet (HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { res.setContentType("text/html"); PrintWriter out = res.getWriter(); Connection con = null; Statement stmt = null; ResultSet rs = null; try { InitialContext ic = new InitialContext(); DataSource source = (DataSource)ic.lookup("jdbc/Blog"); con = source.getConnection(); stmt = con.createStatement(); rs = stmt.executeQuery("select * from test"); while(rs.next()) { out.println("Title:"+rs.getString(1)+"<br/>"); } } catch(Exception e){ e.printStackTrace(); } finally { if(con != null) { try { con.close(); }catch(SQLException e) { e.printStackTrace(); } } } } }