在struts1。0中按照如下的方式可以实现利用datasource访问数据库,但是在struts2。0中似乎不支持getDatasource方法,请各位大虾明示如何在struts2中实现datasource访问mysql数据库:(另外在struts2中我的loginaction继承的是actionsupport类,而不是在struts1中那样继承的是action类)
LoginBean.java源代码:
package dummies.struts;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import javax.sql.DataSource;
public class LoginBean
{
private DataSource dataSource = null;
public LoginBean(DataSource dataSource)
{
this.dataSource = dataSource;
{
public boolean validateUser(String username, String password)
{
boolean valid = false;
Connection con = null;
Statement stmt = null;
ResultSet rs = null;
try
{
con = dataSource.getConnection();
stmt = con.createStatement();
rs = stmt.executeQuery(
“SELECT * FROM Users “ +
“WHERE username = ‘“ + username + “‘ “ +
“AND password = ‘“ + password + “‘“);
if (rs.next())
valid = true;
}
catch(SQLException e) {
e.printStackTrace();
}
finally {
try { if (rs != null) rs.close(); } catch (SQLException e) {};
try { if (stmt != null) stmt.close(); } catch (SQLException e) {};
try { if (con != null) con.close(); } catch (SQLException e) {};
}
return valid;
}
}LoginAction.java源代码:
package dummies.struts;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionError;
import org.apache.struts.action.ActionErrors;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
public class LoginAction extends Action
{
public ActionForward execute(ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws Exception
 {
// create a new LoginBean with valid users in it
 LoginBean lb = new LoginBean(getDataSource(request,
“musiccollection”));
// check to see if this user/password combination are valid
 if(lb.validateUser(((LoginForm)form).getUserName(),
((LoginForm)form).getPassword()))
 {
 request.setAttribute(“userName”,((LoginForm)form).getUserName());
 return (mapping.findForward(“success”));
 }
 else // username/password not validated
{
// create ActionError and save in the request
 ActionErrors errors = new ActionErrors();
 ActionError error = new ActionError(“error.login.invalid”);
 errors.add(“login”,error);
 saveErrors(request,errors);
 return (mapping.findForward(“failure”));
 }
 }
}struts-config.xml Data Source Definition
<struts-config>
<!-- ========== Data Source Definitions ================================ --
>
<data-sources>
<data-source key=”musiccollection”
 type=”org.apache.commons.dbcp.BasicDataSource”>
 <set-property property=”description” value=”Music Collection
Database”/>
<set-property property=”driverClassName” value=”com.mysql.jdbc.Driver”/>
 <set-property property=”username”
value=”theDatabaseUserName”/>
 <set-property property=”password”
value=”theDatabaseUserPassword”/>
 <set-property property=”url”
 value=”jdbc:mysql://localhost/musiccollection”/>
 <set-property property=”maxCount” value=”8”/>
 <set-property property=”minCount” value=”2”/>
 </data-source>
 </data-sources>
...
</struts-config>
我就希望在struts2中使用如struts1中datasource访问数据库的方式,不想将每次访问数据库的代码都放到不同的文件,跪求大师!!!

解决方案 »

  1.   

    我提供你四条路..不过不一定合你心意哈。毕竟现在的MVC框架都不象以前那样,把数据访问功能集成了。 1.将DataSource内置到Web容器类,比如Tomcat的话需要配置context.xml和web.xml,见Tomcat文档.
    然后自己做工具类来取得.public class DataSourceUtil
    {
        private static DataSourceUtil DSUtil;
        private DataSource ds;
        public static String URL = "";
        public static String USERNAME ="";
        public static String PASSWORD ="";
        private DataSourceUtil()
        {}
        public static DataSourceUtil getInstance()
        {
           if(DSUtil==null)
              DSUtil = new DataSourceUtil();
           return DSUtil;
        }
        
        public DataSource getDataSource()
        {
          if(this.ds==null)
           this.ds = (DataSource)new InitContext().lookup(URL); 
          return this.ds;
        }
    }
    2.集成Hibernate/Ibatis.查看Hibernate/ibatis的文档能得到代码,毕竟现在数据访问的事情还是由框架来做可以省事一些.
    3.集成Spring.这个查看Spring的文档能得到代码,现在Spring做得很广,对这些都进行了支持.
    4.不集成大的框架,自己引入DBCP连接池.配置也不是很复杂.
      

  2.   

    这个代码手写的,写垃圾了。 
        public static String USERNAME ="";
        public static String PASSWORD ="";
    这两个用不到
      

  3.   

    用spring,把datasource写在xml,读取下
    <bean id="dataSource"
    class="com.mchange.v2.c3p0.ComboPooledDataSource"
    destroy-method="close"> <property name="driverClass">
    <value>com.jnetdirect.jsql.JSQLDriver</value>
    </property> <property name="jdbcUrl">
    <value>jdbc:JSQLConnect://localhost/database=red</value>
    </property> <property name="user">
    <value>sa</value>
    </property> <property name="password">
    <value>password</value>
    </property> <property name="initialPoolSize">
    <value>10</value>
    </property>
    <property name="minPoolSize">
    <value>5</value>
    </property>
    <property name="maxPoolSize">
    <value>30</value>
    </property>
    <property name="acquireIncrement">
    <value>5</value>
    </property>
    <property name="maxIdleTime">
    <value>10</value>
    </property>
    <property name="maxStatements">
    <value>0</value>
    </property> </bean>
      

  4.   

    我想用jsp和struts加上java实现这个功能,不知道spring是个什么工具。另外也请帮忙把在java类中的实现方法给出
      

  5.   

    dsName = (String) ActionContext.getContext().getApplication().get("StudentDataSource"); //get datasource from web.xml
    System.out.println("dsName = " + dsName);
    ds = DataSourceContext.getInstance().getDataSource(dsName);
    System.out.println("get datasource = " + ds.toString());
    con = ds.getConnection();
    System.out.println("get con = " + con.toString());本人实际操作的到的结果。记得给分噢噢!!