我是从JSP转来学STRUTS的,一开始的时候有很多地方不习惯。
比如对数据库的操作,在JSP中,一般是写一个javabeans来封装对数据库的连接与操作,如:
Conn.java
public class Conn { private Connection conn = null; private Statement stmt = null; private ResultSet rs = null; private String dataSource = "java:comp/env/jdbc/CpDB";
public Conn() { try { Context ctx = new InitialContext(); DataSource ds = (DataSource) ctx.lookup(dataSource); conn = ds.getConnection(); } catch (Exception e) { System.err.println(e.getMessage()); } }
public Statement createStatement() throws Exception { stmt = conn.createStatement(); return stmt; }
public ResultSet executeQuery(String sql) throws Exception { createStatement(); return stmt.executeQuery(sql); }
public int executeUpdate(String sql) throws Exception { createStatement(); return stmt.executeUpdate(sql); }
public void close() { } }
然后在JSP页面中用这样的代码:
Conn myConn = new Conn(); String sqlStr = “....”; ResultSet rs = myConn.exeuteQuery(sqlStr); .....
但是在STRUTS中,假设我们在struts-config.xml中配置了数据源,如:
<data-sources > <data-source key="org.apache.struts.action.DATA_SOURCE" type="org.apache.commons.dbcp.BasicDataSource"> <set-property property="password" value="nowind" /> <set-property property="minCount" value="2" /> <set-property property="maxCount" value="10" /> <set-property property="user" value="nowind" /> <set-property property="driverClass" value="com.microsoft.jdbc.sqlserver.SQLServerDriver" /> <set-property property="description" value="microsoft sql server" /> <set-property property="url" value="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=CpDB" /> <set-property property="readOnly" value="false" /> <set-property property="autoCommit" value="false" /> <set-property property="loginTimeout" value="" /> </data-source> </data-sources>
我们要访问这个数据源,必须要有request对象才行。
假设我们在action中访问数据库,则:
public ActionForward execute(.....) { try { DataSource = getDataSource(request,"org.apache.struts.action.DATA_SOURCE"); Connection myConnection = dataSource.getConnection(); Statement myStmt = myConnection.createStatement(); String sqlStr = "................"; ResultSet rs = myStmt.executeQuery(sqlStr); ..... }
我觉得这样,一是要写多写很多代码,二是在没有request的地方就不好操作数据库了(当然可以把request当作参数传过去,但是还是有一点麻烦)。
所以我写了一个struts的plugin类Conn.java
可以在系统启动的时候,找到数据源,实现与以前在JSP下调用JavaBeans相同的结果。
package com.strutsLogin2.util;
import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.Enumeration;
import javax.sql.DataSource;
import org.apache.struts.action.ActionServlet; import org.apache.struts.action.PlugIn; import org.apache.struts.config.ModuleConfig;
public class Conn implements PlugIn {
private static DataSource dataSource = null;
private Connection conn = null;
private PreparedStatement preStmt = null;
private Statement stmt = null;
// 得到数据源 public void init(ActionServlet servlet, ModuleConfig config) { dataSource = (DataSource) servlet.getServletContext().getAttribute( "org.apache.struts.action.DATA_SOURCE"); }
public Conn() throws SQLException { if (dataSource != null) conn = dataSource.getConnection(); }
public ResultSet executeQuery(String sql) { ResultSet rs = null; try { if (stmt == null) { stmt = conn.createStatement(); } rs = stmt.executeQuery(sql); } catch (SQLException e) { e.printStackTrace(); } return rs; }
public void executeUpdate(String sql) throws SQLException { if (stmt == null) { stmt = conn.createStatement(); } stmt.executeUpdate(sql); }
public Connection getConn() { return conn; }
public void prepareStatement(String sqlStr) throws SQLException { preStmt = conn.prepareStatement(sqlStr); }
public void setString(int index, String value) throws SQLException { preStmt.setString(index, value); }
public void setInt(int index, int value) throws SQLException { preStmt.setInt(index, value); }
public void setBoolean(int index, boolean value) throws SQLException { preStmt.setBoolean(index, value); }
public void setLong(int index, long value) throws SQLException { preStmt.setLong(index, value); }
public void setFloat(int index, float value) throws SQLException { preStmt.setFloat(index, value); }
public void setBytes(int index, byte[] value) throws SQLException { preStmt.setBytes(index, value); }
public void clearPreStmt() throws SQLException { preStmt.clearParameters(); preStmt = null; }
public ResultSet executeQuery() throws SQLException { if (preStmt != null) { return preStmt.executeQuery(); } else return null; }
public void executeUpdate() throws SQLException { if (preStmt != null) preStmt.executeUpdate(); }
public void close() { try { if (stmt != null) { stmt.close(); stmt = null; } if (preStmt != null) { preStmt.close(); preStmt = null; } if (conn != null) { conn.close(); conn = null; System.out.println("***************** a connection is closed"); } } catch (Exception e) { System.err.println(e.getMessage()); } }
public void destroy() { } }
其实很简单,关键就在于
dataSource = (DataSource) servlet.getServletContext().getAttribute( "org.apache.struts.action.DATA_SOURCE");
我们原来也可以从servlet中得到这个数据源,并不只是可以从request中得到。
我们可以用下面的代码看到: Enumeration en = servlet.getServletContext().getAttributeNames(); while (en.hasMoreElements()) { System.out.println(en.nextElement().toString()); }
它的显示结果里肯定有 org.apache.struts.action.DATA_SOURCE 这一行。 
|